diff options
Diffstat (limited to 'kern/console.c')
-rw-r--r-- | kern/console.c | 72 |
1 files changed, 56 insertions, 16 deletions
diff --git a/kern/console.c b/kern/console.c index c82e7dc9..1f9a8a9c 100644 --- a/kern/console.c +++ b/kern/console.c @@ -15,20 +15,21 @@ * along with this program. If not, see <http://www.gnu.org/licenses/>. */ +#include <assert.h> #include <stdbool.h> #include <stddef.h> -#include <stdio.h> #include <string.h> #include <kern/arg.h> -#include <kern/assert.h> #include <kern/error.h> #include <kern/init.h> #include <kern/console.h> #include <kern/list.h> +#include <kern/log.h> #include <kern/mutex.h> #include <kern/spinlock.h> #include <kern/thread.h> +#include <machine/boot.h> #include <machine/cpu.h> /* @@ -66,13 +67,28 @@ console_init(struct console *console, const char *name, strlcpy(console->name, name, sizeof(console->name)); } +static int +console_process_ctrl_char(struct console *console, char c) +{ + switch (c) { + case CONSOLE_SCROLL_UP: + case CONSOLE_SCROLL_DOWN: + break; + default: + return ERROR_INVAL; + } + + console->ops->putc(console, c); + return 0; +} + static void console_putc(struct console *console, char c) { unsigned long flags; spinlock_lock_intr_save(&console->lock, &flags); - console->ops->putc(console_dev, c); + console->ops->putc(console, c); spinlock_unlock_intr_restore(&console->lock, flags); } @@ -96,7 +112,11 @@ console_getc(struct console *console) error = cbuf_pop(&console->recvbuf, &c); if (!error) { - break; + error = console_process_ctrl_char(console, c); + + if (error) { + break; + } } thread_sleep(&console->lock, console, "consgetc"); @@ -110,13 +130,28 @@ out: return c; } -void __init -console_setup(void) +static int __init +console_bootstrap(void) { list_init(&console_devs); console_name = arg_value("console"); + return 0; +} + +INIT_OP_DEFINE(console_bootstrap, + INIT_OP_DEP(arg_setup, true), + INIT_OP_DEP(log_setup, true)); + +static int __init +console_setup(void) +{ + return 0; } +INIT_OP_DEFINE(console_setup, + INIT_OP_DEP(boot_setup_console, true), + INIT_OP_DEP(thread_setup, true)); + void __init console_register(struct console *console) { @@ -128,30 +163,35 @@ console_register(struct console *console) console_dev = console; } - printf("console: %s registered\n", console->name); + log_info("console: %s registered", console->name); if (console == console_dev) { - printf("console: %s selected as active console\n", console->name); + log_info("console: %s selected as active console", console->name); } } void -console_intr(struct console *console, char c) +console_intr(struct console *console, const char *s) { assert(!cpu_intr_enabled()); - spinlock_lock(&console->lock); - - if (cbuf_size(&console->recvbuf) == cbuf_capacity(&console->recvbuf)) { - goto out; + if (*s == '\0') { + return; } - cbuf_push(&console->recvbuf, c); + spinlock_lock(&console->lock); - if ((console->waiter != NULL) && (console->waiter != thread_self())) { - thread_wakeup(console->waiter); + while (*s != '\0') { + if (cbuf_size(&console->recvbuf) == cbuf_capacity(&console->recvbuf)) { + goto out; + } + + cbuf_push(&console->recvbuf, *s); + s++; } + thread_wakeup(console->waiter); + out: spinlock_unlock(&console->lock); } |