diff --git a/include/socks/console.h b/include/socks/console.h index fee6ea3..0414719 100644 --- a/include/socks/console.h +++ b/include/socks/console.h @@ -43,6 +43,9 @@ struct console { extern kern_status_t console_register(struct console *con); extern kern_status_t console_unregister(struct console *con); +extern struct queue *get_consoles(unsigned long *flags); +extern void put_consoles(struct queue *consoles, unsigned long flags); + extern void console_write(struct console *con, const char *s, unsigned int len); extern int console_read(struct console *con, char *s, unsigned int len); diff --git a/kernel/console.c b/kernel/console.c index 0dd1a1c..29abaad 100644 --- a/kernel/console.c +++ b/kernel/console.c @@ -29,11 +29,23 @@ kern_status_t console_unregister(struct console *con) spin_lock_irqsave(&consoles_lock, &flags); queue_delete(&consoles, &con->c_list); - + spin_unlock_irqrestore(&consoles_lock, flags); return KERN_OK; } +struct queue *get_consoles(unsigned long *flags) +{ + spin_lock_irqsave(&consoles_lock, flags); + return &consoles; +} + +void put_consoles(struct queue *consoles, unsigned long flags) +{ + (void)consoles; + spin_unlock_irqrestore(&consoles_lock, flags); +} + void console_write(struct console *con, const char *s, unsigned int len) { if (con->c_write) { diff --git a/kernel/printk.c b/kernel/printk.c index 88e46ce..12c5a34 100644 --- a/kernel/printk.c +++ b/kernel/printk.c @@ -21,11 +21,21 @@ static unsigned int log_buffer_writep = 0; static void flush_log_buffer(void) { + /* if (!early_console) { return; } - + 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); + } + + put_consoles(consoles, flags); log_buffer_readp = log_buffer_writep; } @@ -41,7 +51,7 @@ static void save_log_message(const char *msg) if (msg[i] == '\0') { break; } - + log_buffer[log_buffer_writep++] = msg[i++]; } } @@ -73,6 +83,6 @@ int printk(const char *format, ...) spin_unlock_irqrestore(&log_buffer_lock, flags); flush_log_buffer(); - + return 0; }