Fix: lab3 on-board problems
This commit is contained in:
@@ -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;
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|||||||
@@ -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;
|
||||||
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
Reference in New Issue
Block a user