From 93bbddf364478e6bb0c66f0956981d9924e68f88 Mon Sep 17 00:00:00 2001 From: Yi-Ting Shih Date: Tue, 1 Apr 2025 23:38:06 +0800 Subject: [PATCH] Fix: lab3 on-board problems --- include/logger.h | 2 +- kernel/exception_table.S | 21 ++++++++++----------- kernel/lib/ringbuffer.c | 12 ++++++++++-- kernel/lib/shell.c | 31 ++++++++++++++++++++++++++----- kernel/lib/timer.c | 12 ++++++++++++ kernel/lib/uart.c | 1 + kernel/main.c | 4 ++-- 7 files changed, 62 insertions(+), 21 deletions(-) diff --git a/include/logger.h b/include/logger.h index f9ed13f..3cec69d 100644 --- a/include/logger.h +++ b/include/logger.h @@ -19,7 +19,7 @@ static inline char *_logger_string(char *dest, const char *src) } static inline char *_logger_hex(char *dest, uint64_t x) { - for (int n, c = 28; c >= 0; c -= 4) { + for (int n, c = 60; c >= 0; c -= 4) { n = (x >> c) & 0xf; n += (n > 9) ? 0x37 : 0x30; *dest++ = (char)n; diff --git a/kernel/exception_table.S b/kernel/exception_table.S index c205beb..e41b73d 100644 --- a/kernel/exception_table.S +++ b/kernel/exception_table.S @@ -2,7 +2,7 @@ // save general registers to stack .macro save_all - sub sp, sp, 36 * 8 + sub sp, sp, 34 * 8 stp x0, x1, [sp, 16 * 0] stp x2, x3, [sp, 16 * 1] stp x4, x5, [sp, 16 * 2] @@ -18,17 +18,22 @@ stp x24, x25, [sp, 16 * 12] stp x26, x27, [sp, 16 * 13] stp x28, x29, [sp, 16 * 14] - stp x30, lr, [sp, 16 * 15] mrs x0, spsr_el1 mrs x1, elr_el1 mrs x2, esr_el1 - stp x0, x1, [sp, 16 * 16] - str x2, [sp, 16 * 17] + stp x0, x1, [sp, 16 * 15] + stp x2, lr, [sp, 16 * 16] .endm // load general registers from stack .macro load_all + ldp x0, x1, [sp, 16 * 15] + ldp x2, lr, [sp, 16 * 16] + msr spsr_el1, x0 + msr elr_el1, x1 + msr esr_el1, x2 + ldp x0, x1, [sp, 16 * 0] ldp x2, x3, [sp, 16 * 1] ldp x4, x5, [sp, 16 * 2] @@ -44,14 +49,8 @@ ldp x24, x25, [sp, 16 * 12] ldp x26, x27, [sp, 16 * 13] ldp x28, x29, [sp, 16 * 14] - ldp x30, lr, [sp, 16 * 15] - ldp x0, x1, [sp, 16 * 16] - ldr x2, [sp, 16 * 17] - msr spsr_el1, x0 - msr elr_el1, x1 - msr esr_el1, x2 - add sp, sp, 36 * 8 + add sp, sp, 34 * 8 .endm _null_handler: diff --git a/kernel/lib/ringbuffer.c b/kernel/lib/ringbuffer.c index 9cd6009..db62c88 100644 --- a/kernel/lib/ringbuffer.c +++ b/kernel/lib/ringbuffer.c @@ -24,11 +24,11 @@ int ringbuffer_push(ringbuffer_t *buf, uint8_t val) return ERR_OUT_OF_BOUND; *buf->write++ = val; - ++buf->size; if (buf->write == buf->data + buf->cap) buf->write = buf->data; + ++buf->size; return NO_ERROR; } @@ -38,10 +38,18 @@ uint8_t ringbuffer_bump(ringbuffer_t *buf) exit(ERR_INVALID_OP); uint8_t ret = *buf->read++; - --buf->size; if (buf->read == buf->data + buf->cap) buf->read = buf->data; + --buf->size; return ret; } + +uint8_t ringbuffer_peek(ringbuffer_t *buf) +{ + if (buf->size == 0) + exit(ERR_INVALID_OP); + + return *buf->read; +} diff --git a/kernel/lib/shell.c b/kernel/lib/shell.c index 1e2f6fe..6024d41 100644 --- a/kernel/lib/shell.c +++ b/kernel/lib/shell.c @@ -159,20 +159,41 @@ void _reboot(void) _reset(1 << 16); } +char *_shell_buf = (char *)0x0; +int _shell_sz = 0; + +static inline +int _shell_operations(char ch) +{ + switch (ch) { + case 0x7f: + if (_shell_sz > 0) { + --_shell_sz; + uart_puts("\b \b"); + } + return true; + default: + } + return false; +} + int shell(file_node_t *initrd_root) { uart_puts("# "); - char *buf = kmalloc(INPUT_BUFLEN * sizeof(char)), ch; - int sz = 0; + char ch; + _shell_buf = kmalloc(INPUT_BUFLEN * sizeof(char)); + _shell_sz = 0; while ((ch = uart_getc()) != '\n') { - buf[sz++] = ch; + if (_shell_operations(ch)) + continue; + _shell_buf[_shell_sz++] = ch; uart_putb((const uint8_t *)&ch, 1); } uart_puts(ENDL); - buf[sz] = ' '; + _shell_buf[_shell_sz] = ' '; vector_t *args = make_vector(0); - for (char *saveptr = 0x0, *tok = strtok_r(buf, " ", &saveptr); + for (char *saveptr = 0x0, *tok = strtok_r(_shell_buf, " ", &saveptr); tok; tok = strtok_r((char *)0x0, " ", &saveptr)) { VEC_PUSH(args, tok); LOG(tok); diff --git a/kernel/lib/timer.c b/kernel/lib/timer.c index bdbac99..f800b17 100644 --- a/kernel/lib/timer.c +++ b/kernel/lib/timer.c @@ -61,6 +61,16 @@ void _set_timer_interrrupt() } } +static inline +void _traverse(timer_t *t) +{ + if (!t) return; + DEBUG_EXCEP(t->data.firing_tick); + t->data.func(t->data.param); + _traverse(t->_l); + _traverse(t->_r); +} + void add_task(task_t task) { DEBUG_EXCEP("add task"); @@ -74,6 +84,8 @@ void add_task(task_t task) }; global_timer = _merge(global_timer, newtimer); + + _traverse(global_timer); _set_timer_interrrupt(); } diff --git a/kernel/lib/uart.c b/kernel/lib/uart.c index f2894a6..efe6248 100644 --- a/kernel/lib/uart.c +++ b/kernel/lib/uart.c @@ -162,6 +162,7 @@ size_t uart_getb_async(uint8_t *bytes, size_t len) for (; recvlen < len; ++bytes, ++recvlen) { while (!uart_readbuf->size) wfe(); // wait for interrupt + *bytes = ringbuffer_bump(uart_readbuf); } diff --git a/kernel/main.c b/kernel/main.c index 74433a9..07a8602 100644 --- a/kernel/main.c +++ b/kernel/main.c @@ -62,8 +62,8 @@ void main(void *dtb) file_node_t *initrd_root = 0x0; init(dtb, &initrd_root); - LOG("system booting in"); - _print_time(0x0); + // LOG("system booting in"); + // _print_time(0x0); uint64_t el; R_SYSREG(el, CurrentEL);