kernel: write to all registered consoles with printk()
This commit is contained in:
@@ -43,6 +43,9 @@ struct console {
|
|||||||
extern kern_status_t console_register(struct console *con);
|
extern kern_status_t console_register(struct console *con);
|
||||||
extern kern_status_t console_unregister(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 void console_write(struct console *con, const char *s, unsigned int len);
|
||||||
extern int console_read(struct console *con, char *s, unsigned int len);
|
extern int console_read(struct console *con, char *s, unsigned int len);
|
||||||
|
|
||||||
|
|||||||
@@ -29,11 +29,23 @@ kern_status_t console_unregister(struct console *con)
|
|||||||
spin_lock_irqsave(&consoles_lock, &flags);
|
spin_lock_irqsave(&consoles_lock, &flags);
|
||||||
|
|
||||||
queue_delete(&consoles, &con->c_list);
|
queue_delete(&consoles, &con->c_list);
|
||||||
|
|
||||||
spin_unlock_irqrestore(&consoles_lock, flags);
|
spin_unlock_irqrestore(&consoles_lock, flags);
|
||||||
return KERN_OK;
|
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)
|
void console_write(struct console *con, const char *s, unsigned int len)
|
||||||
{
|
{
|
||||||
if (con->c_write) {
|
if (con->c_write) {
|
||||||
|
|||||||
@@ -21,11 +21,21 @@ static unsigned int log_buffer_writep = 0;
|
|||||||
|
|
||||||
static void flush_log_buffer(void)
|
static void flush_log_buffer(void)
|
||||||
{
|
{
|
||||||
|
/*
|
||||||
if (!early_console) {
|
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);
|
||||||
|
}
|
||||||
|
|
||||||
|
put_consoles(consoles, flags);
|
||||||
log_buffer_readp = log_buffer_writep;
|
log_buffer_readp = log_buffer_writep;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -41,7 +51,7 @@ static void save_log_message(const char *msg)
|
|||||||
if (msg[i] == '\0') {
|
if (msg[i] == '\0') {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
log_buffer[log_buffer_writep++] = msg[i++];
|
log_buffer[log_buffer_writep++] = msg[i++];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -73,6 +83,6 @@ int printk(const char *format, ...)
|
|||||||
spin_unlock_irqrestore(&log_buffer_lock, flags);
|
spin_unlock_irqrestore(&log_buffer_lock, flags);
|
||||||
|
|
||||||
flush_log_buffer();
|
flush_log_buffer();
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user