diff --git a/kernel/console.c b/kernel/console.c index 0195379..39cf0ac 100644 --- a/kernel/console.c +++ b/kernel/console.c @@ -1,9 +1,9 @@ #include -#include -#include #include +#include +#include -static struct queue consoles; +static struct queue consoles = {0}; static spin_lock_t consoles_lock = SPIN_LOCK_INIT; static void unregister_boot_consoles(void) @@ -11,7 +11,8 @@ static void unregister_boot_consoles(void) struct queue_entry *cur = queue_first(&consoles); while (cur) { struct queue_entry *next = cur->qe_next; - struct console *con = QUEUE_CONTAINER(struct console, c_list, cur); + struct console *con + = QUEUE_CONTAINER(struct console, c_list, cur); if (con->c_flags & CON_BOOT) { queue_delete(&consoles, cur); } @@ -25,7 +26,8 @@ kern_status_t console_register(struct console *con) unsigned long flags; spin_lock_irqsave(&consoles_lock, &flags); - queue_foreach (struct console, cur, &consoles, c_list) { + queue_foreach(struct console, cur, &consoles, c_list) + { if (!strcmp(cur->c_name, con->c_name)) { spin_unlock_irqrestore(&consoles_lock, flags); return KERN_NAME_EXISTS; diff --git a/kernel/printk.c b/kernel/printk.c index aea015d..431c7ea 100644 --- a/kernel/printk.c +++ b/kernel/printk.c @@ -1,7 +1,7 @@ -#include -#include #include #include +#include +#include #include #define LOG_BUFFER_SIZE 0x40000 @@ -23,16 +23,21 @@ static void flush_log_buffer(void) { /* if (!early_console) { - return; + return; } - console_write(early_console, log_buffer + log_buffer_readp, log_buffer_writep - log_buffer_readp); + console_write(early_console, log_buffer + log_buffer_readp, + log_buffer_writep - log_buffer_readp); */ unsigned long flags; struct queue *consoles = get_consoles(&flags); - queue_foreach(struct console, con, consoles, c_list) { - console_write(con, log_buffer + log_buffer_readp, log_buffer_writep - log_buffer_readp); + queue_foreach(struct console, con, consoles, c_list) + { + console_write( + con, + log_buffer + log_buffer_readp, + log_buffer_writep - log_buffer_readp); } put_consoles(consoles, flags); @@ -61,20 +66,33 @@ void early_printk_init(struct console *con) early_console = con; } +static void print_msg_direct(const char *s, size_t len) +{ + unsigned long flags; + struct queue *consoles = get_consoles(&flags); + queue_foreach(struct console, con, consoles, c_list) + { + console_write(con, s, len); + } + + put_consoles(consoles, flags); +} + int printk(const char *format, ...) { char msg[LOG_MSG_SIZE]; va_list arg; va_start(arg, format); - int len = vsnprintf(msg, sizeof msg - 1, format, arg); + int len = vsnprintf(msg, sizeof msg - 1, format, arg); va_end(arg); msg[len] = '\n'; msg[len + 1] = '\0'; if (log_buffer_writep == LOG_BUFFER_SIZE - 1) { - console_write(early_console, msg, len + 1); + print_msg_direct(msg, len + 1); + return 0; } unsigned long flags; @@ -84,5 +102,5 @@ int printk(const char *format, ...) flush_log_buffer(); - return 0; + return 0; }