diff options
Diffstat (limited to 'kernel/printk/printk.c')
| -rw-r--r-- | kernel/printk/printk.c | 68 |
1 files changed, 68 insertions, 0 deletions
diff --git a/kernel/printk/printk.c b/kernel/printk/printk.c index 0f4c0848..239e1a24 100644 --- a/kernel/printk/printk.c +++ b/kernel/printk/printk.c @@ -55,6 +55,10 @@ #include "console_cmdline.h" #include "braille.h" +//lenovo sw, yexh1, add lastkmsg feature +#include <asm/le_rkm.h> +//lenovo sw, yexh1, end + #ifdef CONFIG_EARLY_PRINTK_DIRECT extern void printascii(char *); #endif @@ -912,8 +916,16 @@ void __init setup_log_buf(int early) if (!early && !new_log_buf_len) log_buf_add_cpu(); +//lenovo sw, yexh1, add lastkmsg feature if (!new_log_buf_len) + { +#ifdef CONFIG_LENOVO_DEBUG_RKM + rkm_init_log_buf_header(__log_buf,log_buf_len); +#endif return; + } +//lenovo sw, yexh1, end + if (early) { new_log_buf = @@ -1272,6 +1284,62 @@ static int syslog_print_all(char __user *buf, int size, bool clear) return len; } +//lenovo sw, yexh1, add lastkmsg feature +#ifdef CONFIG_LENOVO_DEBUG_RKM +int kernel_log_buf_text_parser(char *kernel_log_buf, char *text_buf, int size) +{ + char *parser_text_buf; + char *buf = text_buf; + int total_size = size; + struct printk_log *msg; + int len = 0; + int log_idx = 0; + enum log_flags log_prev = LOG_NOCONS; + + if((kernel_log_buf == NULL) || (text_buf == NULL)) + { + return -EINVAL; + } + + parser_text_buf = kmalloc(LOG_LINE_MAX + PREFIX_MAX, GFP_KERNEL); + if (!parser_text_buf) + return -ENOMEM; + + while (size > 0) { + size_t n; + + msg = (struct printk_log *)(kernel_log_buf + log_idx); + /* + * A length == 0 record is the end of buffer marker. Wrap around and + * read the message at the start of the buffer. + */ + if (!msg->len) + break; + + n = msg_print_text(msg, log_prev, false, parser_text_buf, + LOG_LINE_MAX + PREFIX_MAX); + + if ((len+n) >= total_size) + break; + + log_prev = msg->flags; + + log_idx = log_idx + msg->len; + + memcpy(buf, parser_text_buf, n); + + len += n; + size -= n; + buf += n; + } + + kfree(parser_text_buf); + return len; +} +#endif +//lenovo sw, yexh1, end + + int do_syslog(int type, char __user *buf, int len, bool from_file) { bool clear = false; |
