static int __init ram_console_late_init(void) { struct proc_dir_entry *entry; struct last_reboot_reason lrr; int i; printk(KERN_ERR"ram_console_late_init\r\n"); if (ram_console_old_log == NULL) return 0; lrr.wdt_status = ram_console_old_header.hw_status; lrr.shutdown_mode = ram_console_old_header.shutdown_mode; lrr.in_idle = ram_console_old_header.in_idle; lrr.jiffies_current = ram_console_old_header.jiffies_current; lrr.jiffies_wdk_kick = ram_console_old_header.jiffies_wdk_kick; lrr.jiffies_idle = ram_console_old_header.jiffies_idle; for (i = 0; i < RR_CPU_COUNT; i++) { lrr.last_irq_enter[i] = ram_console_old_header.last_irq_enter[i]; lrr.jiffies_last_irq_enter[i] = ram_console_old_header.jiffies_last_irq_enter[i]; lrr.last_irq_exit[i] = ram_console_old_header.last_irq_exit[i]; lrr.jiffies_last_irq_exit[i] = ram_console_old_header.jiffies_last_irq_exit[i]; lrr.jiffies_last_sched[i] = ram_console_old_header.jiffies_last_sched[i]; strlcpy(lrr.last_sched_comm[i], ram_console_old_header.last_sched_comm[i], TASK_COMM_LEN); } aee_rr_last(&lrr); #ifdef CONFIG_ANDROID_RAM_CONSOLE_EARLY_INIT ram_console_old_log = kmalloc(ram_console_old_log_size, GFP_KERNEL); if (ram_console_old_log == NULL) { printk(KERN_ERR "ram_console: failed to allocate buffer for old log\n"); ram_console_old_log_size = 0; return 0; } memcpy(ram_console_old_log, ram_console_old_log_init_buffer, ram_console_old_log_size); #endif entry = create_proc_entry("last_kmsg", S_IFREG | S_IRUGO, NULL); if (!entry) { printk(KERN_ERR "ram_console: failed to create proc entry\n"); kfree(ram_console_old_log); ram_console_old_log = NULL; return 0; } entry->proc_fops = &ram_console_file_ops; entry->size = ram_console_old_log_size; return 0; }
static int __init ram_console_late_init(void) { struct proc_dir_entry *entry; struct last_reboot_reason lrr; char *ram_console_header_buffer; int str_real_len = 0; int i = 0; printk(KERN_ERR"ram_console_late_init\r\n"); if (ram_console_old_log == NULL) { printk(KERN_ERR"ram console olg log is null!\n"); return 0; } memset(&lrr, 0, sizeof(struct last_reboot_reason)); lrr.wdt_status = ram_console_old_header.hw_status; lrr.fiq_step = ram_console_old_header.fiq_step; for(i = 0; i < NR_CPUS; i++) { lrr.last_irq_enter[i] = ram_console_old_header.last_irq_enter[i]; lrr.jiffies_last_irq_enter[i] = ram_console_old_header.jiffies_last_irq_enter[i]; lrr.last_irq_exit[i] = ram_console_old_header.last_irq_exit[i]; lrr.jiffies_last_irq_exit[i] = ram_console_old_header.jiffies_last_irq_exit[i]; lrr.jiffies_last_sched[i] = ram_console_old_header.jiffies_last_sched[i]; strlcpy(lrr.last_sched_comm[i], ram_console_old_header.last_sched_comm[i], TASK_COMM_LEN); lrr.hotplug_data1[i] = ram_console_old_header.hotplug_data1[i]; lrr.hotplug_data2[i] = ram_console_old_header.hotplug_data2[i]; } aee_rr_last(&lrr); ram_console_header_buffer = kmalloc(RAM_CONSOLE_HEADER_STR_LEN, GFP_KERNEL); if(ram_console_header_buffer == NULL) { printk(KERN_ERR "ram_console: failed to allocate buffer for header buffer.\n"); return 0; } str_real_len = sprintf(ram_console_header_buffer,"ram console header, hw_status: %u, fiq step %u.\n", ram_console_old_header.hw_status, ram_console_old_header.fiq_step); str_real_len += sprintf(ram_console_header_buffer + str_real_len,"bin log %d.\n", ram_console_old_header.bin_log_count); ram_console_old_log = kmalloc(ram_console_old_log_size + str_real_len, GFP_KERNEL); if(ram_console_old_log == NULL) { printk(KERN_ERR "ram_console: failed to allocate buffer for old log\n"); ram_console_old_log_size = 0; kfree(ram_console_header_buffer); return 0; } memcpy(ram_console_old_log, ram_console_header_buffer, str_real_len); memcpy(ram_console_old_log + str_real_len, ram_console_old_log_init_buffer, ram_console_old_log_size); kfree(ram_console_header_buffer); kfree(ram_console_old_log_init_buffer); entry = create_proc_entry("last_kmsg", S_IFREG | S_IRUGO, NULL); if(!entry) { printk(KERN_ERR "ram_console: failed to create proc entry\n"); kfree(ram_console_old_log); ram_console_old_log = NULL; return 0; } ram_console_old_log_size += str_real_len; entry->proc_fops = &ram_console_file_ops; entry->size = ram_console_old_log_size; return 0; }
static int __init ram_console_late_init(void) { struct proc_dir_entry *entry; struct last_reboot_reason lrr; char *ram_console_header_buffer; int str_real_len = 0; int i = 0; #ifdef MTK_EMMC_SUPPORT #ifdef CONFIG_MTK_AEE_IPANIC #ifdef MTK_GPT_SCHEME_SUPPORT int err; static struct task_struct *thread; thread = kthread_run(emmc_read_last_kmsg, 0, "read_poweroff_log"); if (IS_ERR(thread)) { err = PTR_ERR(thread); pr_err("failed to create kernel thread: %d\n", err); } #else emmc_read_last_kmsg(); #endif #endif #endif if (ram_console_old_log == NULL) { pr_err("ram console old log is null!\n"); return 0; } memset(&lrr, 0, sizeof(struct last_reboot_reason)); lrr.wdt_status = ram_console_old_header.hw_status; lrr.fiq_step = ram_console_old_header.fiq_step; lrr.reboot_mode = ram_console_old_header.reboot_mode; for (i = 0; i < NR_CPUS; i++) { lrr.last_irq_enter[i] = ram_console_old_header.last_irq_enter[i]; lrr.jiffies_last_irq_enter[i] = ram_console_old_header.jiffies_last_irq_enter[i]; lrr.last_irq_exit[i] = ram_console_old_header.last_irq_exit[i]; lrr.jiffies_last_irq_exit[i] = ram_console_old_header.jiffies_last_irq_exit[i]; lrr.jiffies_last_sched[i] = ram_console_old_header.jiffies_last_sched[i]; strlcpy(lrr.last_sched_comm[i], ram_console_old_header.last_sched_comm[i], TASK_COMM_LEN); lrr.hotplug_data1[i] = ram_console_old_header.hotplug_data1[i]; lrr.hotplug_data2[i] = i ? 0 : ram_console_old_header.hotplug_data2; lrr.hotplug_data3[i] = i ? 0 : ram_console_old_header.hotplug_data3; } lrr.mcdi_wfi = ram_console_old_header.mcdi_wfi; for (i = 0; i < NR_CPUS; i++) lrr.cpu_dormant[i] = ram_console_old_header.cpu_dormant[i]; aee_rr_last(&lrr); ram_console_header_buffer = kmalloc(RAM_CONSOLE_HEADER_STR_LEN, GFP_KERNEL); if (ram_console_header_buffer == NULL) { pr_err("ram_console: failed to allocate buffer for header buffer.\n"); return 0; } str_real_len = sprintf(ram_console_header_buffer, "ram console header, hw_status: %u, fiq step %u.\n", ram_console_old_header.hw_status, ram_console_old_header.fiq_step); str_real_len += sprintf(ram_console_header_buffer + str_real_len, "bin log %d.\n", ram_console_old_header.bin_log_count); ram_console_old_log = kmalloc(ram_console_old_log_size + str_real_len, GFP_KERNEL); if (ram_console_old_log == NULL) { pr_err("ram_console: failed to allocate buffer for old log\n"); ram_console_old_log_size = 0; kfree(ram_console_header_buffer); return 0; } memcpy(ram_console_old_log, ram_console_header_buffer, str_real_len); memcpy(ram_console_old_log + str_real_len, ram_console_old_log_init_buffer, ram_console_old_log_size); kfree(ram_console_header_buffer); kfree(ram_console_old_log_init_buffer); entry = proc_create("last_kmsg", 0444, NULL, &ram_console_file_ops); if (!entry) { pr_err("ram_console: failed to create proc entry\n"); kfree(ram_console_old_log); ram_console_old_log = NULL; return 0; } ram_console_old_log_size += str_real_len; return 0; }