summaryrefslogtreecommitdiff
path: root/kern/console.c
diff options
context:
space:
mode:
Diffstat (limited to 'kern/console.c')
-rw-r--r--kern/console.c72
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);
}