Fix: lab3 on-board problems

This commit is contained in:
2025-04-01 23:38:06 +08:00
parent 2d572cea4d
commit 93bbddf364
7 changed files with 62 additions and 21 deletions

View File

@@ -19,7 +19,7 @@ static inline char *_logger_string(char *dest, const char *src)
} }
static inline char *_logger_hex(char *dest, uint64_t x) 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 = (x >> c) & 0xf;
n += (n > 9) ? 0x37 : 0x30; n += (n > 9) ? 0x37 : 0x30;
*dest++ = (char)n; *dest++ = (char)n;

View File

@@ -2,7 +2,7 @@
// save general registers to stack // save general registers to stack
.macro save_all .macro save_all
sub sp, sp, 36 * 8 sub sp, sp, 34 * 8
stp x0, x1, [sp, 16 * 0] stp x0, x1, [sp, 16 * 0]
stp x2, x3, [sp, 16 * 1] stp x2, x3, [sp, 16 * 1]
stp x4, x5, [sp, 16 * 2] stp x4, x5, [sp, 16 * 2]
@@ -18,17 +18,22 @@
stp x24, x25, [sp, 16 * 12] stp x24, x25, [sp, 16 * 12]
stp x26, x27, [sp, 16 * 13] stp x26, x27, [sp, 16 * 13]
stp x28, x29, [sp, 16 * 14] stp x28, x29, [sp, 16 * 14]
stp x30, lr, [sp, 16 * 15]
mrs x0, spsr_el1 mrs x0, spsr_el1
mrs x1, elr_el1 mrs x1, elr_el1
mrs x2, esr_el1 mrs x2, esr_el1
stp x0, x1, [sp, 16 * 16] stp x0, x1, [sp, 16 * 15]
str x2, [sp, 16 * 17] stp x2, lr, [sp, 16 * 16]
.endm .endm
// load general registers from stack // load general registers from stack
.macro load_all .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 x0, x1, [sp, 16 * 0]
ldp x2, x3, [sp, 16 * 1] ldp x2, x3, [sp, 16 * 1]
ldp x4, x5, [sp, 16 * 2] ldp x4, x5, [sp, 16 * 2]
@@ -44,14 +49,8 @@
ldp x24, x25, [sp, 16 * 12] ldp x24, x25, [sp, 16 * 12]
ldp x26, x27, [sp, 16 * 13] ldp x26, x27, [sp, 16 * 13]
ldp x28, x29, [sp, 16 * 14] ldp x28, x29, [sp, 16 * 14]
ldp x30, lr, [sp, 16 * 15]
ldp x0, x1, [sp, 16 * 16] add sp, sp, 34 * 8
ldr x2, [sp, 16 * 17]
msr spsr_el1, x0
msr elr_el1, x1
msr esr_el1, x2
add sp, sp, 36 * 8
.endm .endm
_null_handler: _null_handler:

View File

@@ -24,11 +24,11 @@ int ringbuffer_push(ringbuffer_t *buf, uint8_t val)
return ERR_OUT_OF_BOUND; return ERR_OUT_OF_BOUND;
*buf->write++ = val; *buf->write++ = val;
++buf->size;
if (buf->write == buf->data + buf->cap) if (buf->write == buf->data + buf->cap)
buf->write = buf->data; buf->write = buf->data;
++buf->size;
return NO_ERROR; return NO_ERROR;
} }
@@ -38,10 +38,18 @@ uint8_t ringbuffer_bump(ringbuffer_t *buf)
exit(ERR_INVALID_OP); exit(ERR_INVALID_OP);
uint8_t ret = *buf->read++; uint8_t ret = *buf->read++;
--buf->size;
if (buf->read == buf->data + buf->cap) if (buf->read == buf->data + buf->cap)
buf->read = buf->data; buf->read = buf->data;
--buf->size;
return ret; return ret;
} }
uint8_t ringbuffer_peek(ringbuffer_t *buf)
{
if (buf->size == 0)
exit(ERR_INVALID_OP);
return *buf->read;
}

View File

@@ -159,20 +159,41 @@ void _reboot(void)
_reset(1 << 16); _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) int shell(file_node_t *initrd_root)
{ {
uart_puts("# "); uart_puts("# ");
char *buf = kmalloc(INPUT_BUFLEN * sizeof(char)), ch; char ch;
int sz = 0; _shell_buf = kmalloc(INPUT_BUFLEN * sizeof(char));
_shell_sz = 0;
while ((ch = uart_getc()) != '\n') { 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_putb((const uint8_t *)&ch, 1);
} }
uart_puts(ENDL); uart_puts(ENDL);
buf[sz] = ' '; _shell_buf[_shell_sz] = ' ';
vector_t *args = make_vector(0); 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)) { tok; tok = strtok_r((char *)0x0, " ", &saveptr)) {
VEC_PUSH(args, tok); VEC_PUSH(args, tok);
LOG(tok); LOG(tok);

View File

@@ -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) void add_task(task_t task)
{ {
DEBUG_EXCEP("add task"); DEBUG_EXCEP("add task");
@@ -74,6 +84,8 @@ void add_task(task_t task)
}; };
global_timer = _merge(global_timer, newtimer); global_timer = _merge(global_timer, newtimer);
_traverse(global_timer);
_set_timer_interrrupt(); _set_timer_interrrupt();
} }

View File

@@ -162,6 +162,7 @@ size_t uart_getb_async(uint8_t *bytes, size_t len)
for (; recvlen < len; ++bytes, ++recvlen) { for (; recvlen < len; ++bytes, ++recvlen) {
while (!uart_readbuf->size) while (!uart_readbuf->size)
wfe(); // wait for interrupt wfe(); // wait for interrupt
*bytes = ringbuffer_bump(uart_readbuf); *bytes = ringbuffer_bump(uart_readbuf);
} }

View File

@@ -62,8 +62,8 @@ void main(void *dtb)
file_node_t *initrd_root = 0x0; file_node_t *initrd_root = 0x0;
init(dtb, &initrd_root); init(dtb, &initrd_root);
LOG("system booting in"); // LOG("system booting in");
_print_time(0x0); // _print_time(0x0);
uint64_t el; uint64_t el;
R_SYSREG(el, CurrentEL); R_SYSREG(el, CurrentEL);