diff options
author | Richard Braun <rbraun@sceen.net> | 2018-07-24 01:24:16 +0200 |
---|---|---|
committer | Richard Braun <rbraun@sceen.net> | 2018-07-24 01:24:16 +0200 |
commit | 4ae79cffba89c9f619dc65414291db9ae71208a4 (patch) | |
tree | ea5de4cf9ea3dba211ca79ff9559212d1ebe6b24 /src | |
parent | 2ba647b61c77c6b84a9bd2bcd611ebb2d61f64f1 (diff) |
Diffstat (limited to 'src')
-rw-r--r-- | src/main.c | 65 | ||||
-rw-r--r-- | src/main.h | 30 | ||||
-rw-r--r-- | src/sw.c | 23 |
3 files changed, 108 insertions, 10 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; +} diff --git a/src/main.h b/src/main.h new file mode 100644 index 0000000..62d342a --- /dev/null +++ b/src/main.h @@ -0,0 +1,30 @@ +/* + * Copyright (c) 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"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef MAIN_H +#define MAIN_H + +#include <lib/shell.h> + +struct shell_cmd_set * main_get_shell_cmd_set(void); + +#endif /* MAIN_H */ @@ -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"), @@ -33,6 +33,7 @@ #include <lib/shell.h> #include "condvar.h" +#include "main.h" #include "mutex.h" #include "panic.h" #include "sw.h" @@ -198,8 +199,9 @@ out: } static void -sw_shell_start(int argc, char **argv) +sw_shell_start(struct shell *shell, int argc, char **argv) { + (void)shell; (void)argc; (void)argv; @@ -207,8 +209,9 @@ sw_shell_start(int argc, char **argv) } static void -sw_shell_stop(int argc, char **argv) +sw_shell_stop(struct shell *shell, int argc, char **argv) { + (void)shell; (void)argc; (void)argv; @@ -216,8 +219,9 @@ sw_shell_stop(int argc, char **argv) } static void -sw_shell_resume(int argc, char **argv) +sw_shell_resume(struct shell *shell, int argc, char **argv) { + (void)shell; (void)argc; (void)argv; @@ -225,8 +229,9 @@ sw_shell_resume(int argc, char **argv) } static void -sw_shell_read(int argc, char **argv) +sw_shell_read(struct shell *shell, int argc, char **argv) { + (void)shell; (void)argc; (void)argv; @@ -234,11 +239,13 @@ sw_shell_read(int argc, char **argv) } static void -sw_shell_wait(int argc, char **argv) +sw_shell_wait(struct shell *shell, int argc, char **argv) { unsigned long seconds; int ret; + (void)shell; + if (argc != 2) { goto error; } @@ -253,7 +260,7 @@ sw_shell_wait(int argc, char **argv) return; error: - printf("sw_wait: error: invalid arguments\n"); + shell_printf(shell, "sw_wait: error: invalid arguments\n"); } static struct shell_cmd sw_shell_cmds[] = { @@ -283,5 +290,5 @@ sw_setup(void) panic("sw: error: unable to create stopwatch"); } - SHELL_REGISTER_CMDS(sw_shell_cmds); + SHELL_REGISTER_CMDS(sw_shell_cmds, main_get_shell_cmd_set()); } |