diff options
Diffstat (limited to 'src/main.c')
-rw-r--r-- | src/main.c | 65 |
1 files changed, 63 insertions, 2 deletions
@@ -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; +} |