summaryrefslogtreecommitdiff
path: root/src/main.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/main.c')
-rw-r--r--src/main.c65
1 files changed, 63 insertions, 2 deletions
diff --git a/src/main.c b/src/main.c
index 839e273..4af5867 100644
--- a/src/main.c
+++ b/src/main.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2017 Richard Braun.
+ * Copyright (c) 2017-2018 Richard Braun.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
@@ -20,7 +20,10 @@
* DEALINGS IN THE SOFTWARE.
*/
+#include <stdarg.h>
#include <stdbool.h>
+#include <stddef.h>
+#include <stdint.h>
#include <stdio.h>
#include <lib/macros.h>
@@ -29,6 +32,7 @@
#include "cpu.h"
#include "i8254.h"
#include "i8259.h"
+#include "main.h"
#include "mem.h"
#include "panic.h"
#include "sw.h"
@@ -36,12 +40,63 @@
#include "timer.h"
#include "uart.h"
+#define MAIN_SHELL_STACK_SIZE 4096
+
/*
* XXX The Clang compiler apparently doesn't like the lack of prototype for
* the main function in free standing mode.
*/
void main(void);
+static struct shell_cmd_set main_shell_cmd_set;
+static struct shell main_shell;
+
+static int
+main_getc(void *io_object)
+{
+ uint8_t byte;
+ int error;
+
+ (void)io_object;
+
+ error = uart_read(&byte);
+
+ if (error) {
+ return EOF;
+ }
+
+ return byte;
+}
+
+static void
+main_vfprintf(void *io_object, const char *format, va_list ap)
+{
+ (void)io_object;
+ vprintf(format, ap);
+}
+
+static void
+main_shell_run(void *arg)
+{
+ shell_run(arg);
+}
+
+static void
+main_setup_shell(void)
+{
+ int error;
+
+ shell_cmd_set_init(&main_shell_cmd_set);
+ shell_init(&main_shell, &main_shell_cmd_set,
+ main_getc, main_vfprintf, NULL);
+ error = thread_create(NULL, main_shell_run, &main_shell, "shell",
+ MAIN_SHELL_STACK_SIZE, THREAD_MIN_PRIORITY);
+
+ if (error) {
+ panic("main: unable to create shell thread");
+ }
+}
+
/*
* This function is the main entry point for C code. It's called from
* assembly code in the boot module, very soon after control is passed
@@ -58,7 +113,7 @@ main(void)
mem_setup();
thread_setup();
timer_setup();
- shell_setup();
+ main_setup_shell();
sw_setup();
printf("X1 " QUOTE(VERSION) "\n\n");
@@ -67,3 +122,9 @@ main(void)
/* Never reached */
}
+
+struct shell_cmd_set *
+main_get_shell_cmd_set(void)
+{
+ return &main_shell_cmd_set;
+}