diff options
author | Richard Braun <rbraun@sceen.net> | 2017-05-28 16:32:01 +0200 |
---|---|---|
committer | Richard Braun <rbraun@sceen.net> | 2017-05-28 17:11:32 +0200 |
commit | a72801f115413cd3eab46857545ab527f31abb2b (patch) | |
tree | 5d475ef0717a2e77fbf1a9d60e2586068d9a9ee7 /kern/console.c | |
parent | 7fba7f7b2fe1106e442cf4150c1e6f7ffa4492a3 (diff) |
kern/console: implement console selection
Diffstat (limited to 'kern/console.c')
-rw-r--r-- | kern/console.c | 61 |
1 files changed, 47 insertions, 14 deletions
diff --git a/kern/console.c b/kern/console.c index 138a4248..eb1306f8 100644 --- a/kern/console.c +++ b/kern/console.c @@ -15,16 +15,48 @@ * along with this program. If not, see <http://www.gnu.org/licenses/>. */ +#include <stdbool.h> #include <stddef.h> +#include <stdio.h> +#include <string.h> +#include <kern/arg.h> #include <kern/assert.h> #include <kern/init.h> #include <kern/console.h> #include <kern/list.h> #include <kern/spinlock.h> +/* + * Registered consoles. + */ static struct list console_devs; -static struct spinlock console_lock; + +/* + * Active console device. + */ +static struct console *console_dev; + +static const char *console_name __initdata; + +static bool __init +console_name_match(const char *name) +{ + if (console_name == NULL) { + return true; + } + + return (strcmp(console_name, name) == 0); +} + +void __init +console_init(struct console *console, const char *name, + console_putc_fn putc) +{ + spinlock_init(&console->lock); + console->putc = putc; + strlcpy(console->name, name, sizeof(console->name)); +} static void console_putc(struct console *console, char c) @@ -40,30 +72,31 @@ void __init console_setup(void) { list_init(&console_devs); - spinlock_init(&console_lock); + console_name = arg_value("console"); } void __init console_register(struct console *console) { - assert(console->putc != NULL); - - spinlock_lock(&console_lock); list_insert_tail(&console_devs, &console->node); - spinlock_unlock(&console_lock); + + if ((console_dev == NULL) && console_name_match(console->name)) { + console_dev = console; + } + + printf("console: %s registered\n", console->name); + + if (console == console_dev) { + printf("console: %s selected as active console\n", console->name); + } } void console_write_char(char c) { - struct console *console; - unsigned long flags; - - spinlock_lock_intr_save(&console_lock, &flags); - - list_for_each_entry(&console_devs, console, node) { - console_putc(console, c); + if (console_dev == NULL) { + return; } - spinlock_unlock_intr_restore(&console_lock, flags); + console_putc(console_dev, c); } |