Ticket #2135: ramconsole-2.patch

File ramconsole-2.patch, 2.1 KB (added by lindi, 10 years ago)

new version, do not print contents of ramconsole on boot, let userland handle it

  • kernel/printk.c

    diff --git a/kernel/printk.c b/kernel/printk.c
    index ca33b20..615ba73 100644
    a b  
    3737 
    3838#include <asm/uaccess.h> 
    3939#include <asm/plat-s3c24xx/neo1973.h> 
     40#include <asm/io.h> 
    4041 
    4142/* 
    4243 * Architectures can override it: 
    static char *log_buf = __log_buf; 
    147148static int log_buf_len = __LOG_BUF_LEN; 
    148149static unsigned logged_chars; /* Number of chars produced since last read+clear operation */ 
    149150 
     151struct ramconsole_header { 
     152        __u32 magic; 
     153        unsigned start; 
     154        unsigned end; 
     155        unsigned len; 
     156        char data[1]; 
     157}; 
     158static struct ramconsole_header *ramconsole; 
     159 
    150160static int __init log_buf_len_setup(char *str) 
    151161{ 
    152162        unsigned size = memparse(str, &str); 
    static void emit_log_char(char c) 
    502512                con_start = log_end - log_buf_len; 
    503513        if (logged_chars < log_buf_len) 
    504514                logged_chars++; 
     515        if (ramconsole) { 
     516                ramconsole->data[ramconsole->end % ramconsole->len] = c; 
     517                ramconsole->end++; 
     518                if (ramconsole->end - ramconsole->start > ramconsole->len) 
     519                        ramconsole->start = ramconsole->end - ramconsole->len; 
     520        } 
    505521} 
    506522 
    507523/* 
    bool printk_timed_ratelimit(unsigned long *caller_jiffies, 
    13601376        return false; 
    13611377} 
    13621378EXPORT_SYMBOL(printk_timed_ratelimit); 
     1379 
     1380static int __init ramconsole_start(void) 
     1381{ 
     1382        unsigned i; 
     1383        struct ramconsole_header *log; 
     1384 
     1385        log = ioremap(0x30000000 + (127<<20), 1024*1024); 
     1386        if (!log) { 
     1387                printk(KERN_WARNING "ramconsole: ioremap failed\n"); 
     1388                return 1; 
     1389        } 
     1390 
     1391        if (log->magic == 0xffffffff) { 
     1392                printk(KERN_NOTICE "ramconsole: found uninitialized memory, initializing ramconsole\n"); 
     1393                log->magic = 0x12345678; 
     1394                log->start = 0; 
     1395                log->end = 0; 
     1396                log->len = 1024*512; 
     1397        } else if (log->magic == 0x12345678) { 
     1398                log->len = 1024*512; 
     1399                printk(KERN_NOTICE "ramconsole: found existing ramconsole.\n", log->len); 
     1400                if (log->end - log->start > log->len) { 
     1401                        printk(KERN_WARNING "ramconsole: end - start > len\n"); 
     1402                        log->start = log->end - log->len; 
     1403                } 
     1404        } else { 
     1405                printk(KERN_WARNING "ramconsole: invalid magic %08x\n", log->magic); 
     1406                return 1; 
     1407        } 
     1408 
     1409        ramconsole = log; 
     1410        return 1; 
     1411} 
     1412late_initcall(ramconsole_start); 
    13631413#endif