diff options
| author | Lizzy Fleckenstein <lizzy@vlhl.dev> | 2023-12-19 09:19:43 +0100 |
|---|---|---|
| committer | Lizzy Fleckenstein <lizzy@vlhl.dev> | 2023-12-19 09:24:31 +0100 |
| commit | 3102878c86c810c0bf877d72aceefeb28a44271d (patch) | |
| tree | b6232392ff6dc2903567a79828b4a713ababc76f /stage3 | |
| parent | a6b460d3b1b0909e0c7b388f1a55365bf24c6b7b (diff) | |
| download | cuddles-3102878c86c810c0bf877d72aceefeb28a44271d.tar.xz | |
improve debugging
Diffstat (limited to 'stage3')
| -rw-r--r-- | stage3/font.c | 4 | ||||
| -rw-r--r-- | stage3/interrupts.c | 117 | ||||
| -rw-r--r-- | stage3/isr.lua | 48 | ||||
| -rw-r--r-- | stage3/main.c | 14 | ||||
| -rw-r--r-- | stage3/shell.c | 4 | ||||
| -rw-r--r-- | stage3/string.c | 37 | ||||
| -rw-r--r-- | stage3/string.h | 5 |
7 files changed, 191 insertions, 38 deletions
diff --git a/stage3/font.c b/stage3/font.c index ca3a420..31b771e 100644 --- a/stage3/font.c +++ b/stage3/font.c @@ -116,10 +116,10 @@ void print_char(char c) cursor_x = 0; break; - /*case '\t': + case '\t': render_char(' '); cursor_x = (cursor_x + TAB_SIZE) & ~(TAB_SIZE - 1); - break;*/ + break; case '\b': if (cursor_x > 0) { diff --git a/stage3/interrupts.c b/stage3/interrupts.c index 2713cfa..edfe431 100644 --- a/stage3/interrupts.c +++ b/stage3/interrupts.c @@ -5,11 +5,13 @@ #include "pic.h" #include "thread.h" #include "io.h" +#include "string.h" +extern str dbg_map, dbg_disas; extern u64 idt_entries[256]; // isr.asm typedef struct __attribute__((packed)) { - u64 rax, rdx, rcx, rsi, rdi, r8, r9, r10, r11; + u64 rax, rbx, rcx, rdx, rbp, rdi, rsi, r8, r9, r10, r11, r12, r13, r14, r15; u64 which, error_code; u64 rip, cs, rflags, rsp, ss; } interrupt_frame; @@ -46,11 +48,112 @@ static str exception[32] = { static void dump_frame(interrupt_frame *frame) { - print(S("rip = ")); print_hex(frame->rip); print_char('\n'); - print(S("cs = ")); print_hex(frame->cs); print_char('\n'); - print(S("rflags = ")); print_hex(frame->rflags); print_char('\n'); - print(S("rsp = ")); print_hex(frame->rsp); print_char('\n'); - print(S("ss = ")); print_hex(frame->ss); print_char('\n'); + print(S("rip = ")); + print_hex(frame->rip); + + if (dbg_map.data != nil) { + str entry = NILS; + str iter = dbg_map; + while (iter.len > 0) { + str line = str_walk(&iter, S("\n")); + line = str_eat(line, S(" ")); + if (!str_start(line, S("0x"))) + continue; + line = str_advance(line, 2); + + u64 addr; + usize adv = str_parse_num(line, 16, &addr); + if (adv == 0) + continue; + line = str_advance(line, adv); + + if (addr > frame->rip) + break; + + line = str_eat(line, S(" ")); + if (line.len > 0) + entry = line; + } + + if (entry.len > 0) { + print(S(" in ")); + print(entry); + } + } + + if (dbg_disas.data != nil) { + str iter = dbg_disas; + while (iter.len > 0) { + str line = str_walk(&iter, S("\n")); + u64 addr; + if (!str_parse_num(str_eat(line, S(" ")), 16, &addr)) + continue; + if (addr == frame->rip) { + print(S("\n")); + print(line); + break; + } + } + } + + print(S("\n")); + + struct { + u8 bit; + str name; + } flags[] = { + { 0, S("CF") }, + { 2, S("PF") }, + { 4, S("AF") }, + { 6, S("ZF") }, + { 7, S("SF") }, + { 8, S("TF") }, + { 9, S("IF") }, + { 10, S("DF") }, + { 11, S("OF") }, + { 16, S("RF") }, + { 17, S("VM") }, + { 18, S("AC") }, + { 19, S("VIF") }, + { 20, S("ID") }, + }; + + print(S("rflags = ")); + + usize f = 0; + for (usize i = 0; i < 63; i++) { + bool has_name = f < sizeof flags / sizeof *flags && flags[f].bit == i; + + if (frame->rflags & ((u64) 1 << i)) { + if (has_name) + print(flags[f].name); + else + print_dec(i); + print(S(" ")); + } + + if (has_name) + f++; + } + + print(S("\n")); + +#define REG(X) print(S(#X)); if (S(#X).len == 2) print(S(" ")); print(S(" = ")); print_num_pad(frame->X, 16, 16, ' '); +#define REGS(A, B) REG(A) print(S(" ")); REG(B) print(S("\n")); + + REGS(rax, rbx) + REGS(rcx, rdx) + REGS(rsp, rbp) + REGS(rdi, rsi) + REGS(r8, r9) + REGS(r10, r11) + REGS(r12, r13) + REGS(r14, r15) + REGS(r14, r15) + REGS(ss, cs) + +#undef REG +#undef REGS } void interrupt_handler(interrupt_frame *frame) @@ -67,7 +170,7 @@ void interrupt_handler(interrupt_frame *frame) } print_char('\n'); - if (frame->which == 13) { + if (frame->which == 14) { str bits[8] = { S("present"), S("write"), diff --git a/stage3/isr.lua b/stage3/isr.lua index 83515a5..3c88c5e 100644 --- a/stage3/isr.lua +++ b/stage3/isr.lua @@ -25,29 +25,41 @@ end print([[ isr_common: - push r11 - push r10 - push r9 - push r8 - push rdi - push rsi - push rcx - push rdx - push rax + push r15 + push r14 + push r13 + push r12 + push r11 + push r10 + push r9 + push r8 + push rsi + push rdi + push rbp + push rdx + push rcx + push rbx + push rax cld mov rdi, rsp call interrupt_handler - pop rax - pop rdx - pop rcx - pop rsi - pop rdi - pop r8 - pop r9 - pop r10 - pop r11 + pop rax + pop rbx + pop rcx + pop rdx + pop rbp + pop rdi + pop rsi + pop r8 + pop r9 + pop r10 + pop r11 + pop r12 + pop r13 + pop r14 + pop r15 add rsp, 16 diff --git a/stage3/main.c b/stage3/main.c index 10fde84..c2ae4c8 100644 --- a/stage3/main.c +++ b/stage3/main.c @@ -12,6 +12,8 @@ #include "ps2.h" #include "thread.h" #include "shell.h" +#include "fs.h" +#include "gfx.h" char keymap[256] = { '\0' }; @@ -53,6 +55,9 @@ void keyboard_handler() } } +str dbg_map = NILS; +str dbg_disas = NILS; + void kmain() { heap_init(); @@ -97,6 +102,12 @@ void kmain() print(S("\n")); } + print(S("gfx framebuffer at ")); + print_hex(gfx_info->framebuffer); + print(S("-")); + print_hex((u64) gfx_info->framebuffer + gfx_info->pitch * gfx_info->height); + print(S("\n")); + interrupts_init(); pic_init(); thread_init(); @@ -104,6 +115,9 @@ void kmain() ata_init(); ps2_init(); + dbg_map = fs_read(S("dbg/kernel.map")); + dbg_disas = fs_read(S("dbg/kernel.dis.asm")); + shell_run_cmd(S("run init")); thread *keyboard_thread = thread_create(S("keyboard"), &keyboard_handler); diff --git a/stage3/shell.c b/stage3/shell.c index b0e1fce..dfcea43 100644 --- a/stage3/shell.c +++ b/stage3/shell.c @@ -101,7 +101,7 @@ static void cmd_run(str arg) } else { str iter = f; for (;;) { - str cmd = str_split_walk(&iter, S("\n")); + str cmd = str_walk(&iter, S("\n")); if (cmd.data == nil) break; shell_run_cmd(cmd); @@ -189,7 +189,7 @@ static command registry[] = { void shell_run_cmd(str cmd) { - str prog = str_split_walk(&cmd, S(" \t")); + str prog = str_walk(&cmd, S(" \t")); if (prog.len == 0) return; diff --git a/stage3/string.c b/stage3/string.c index 2f95b99..836f6a3 100644 --- a/stage3/string.c +++ b/stage3/string.c @@ -39,22 +39,22 @@ usize str_parse_num(str s, u8 base, u64 *x) if (c >= '0' && c <= '9') d = c - '0'; else if (c >= 'a' && c <= 'z') - d = c - 'a'; - else if (c >= 'A' && c <= 'z') - d = c - 'A'; + d = c - 'a' + 10; + else if (c >= 'A' && c <= 'Z') + d = c - 'A' + 10; else return i; if (d >= base) return i; - *x = *x * base + d; + *x = (*x) * base + d; } return s.len; } -str str_split_walk(str *s, str sep) +str str_walk(str *s, str sep) { if (s->len == 0) return NILS; @@ -62,11 +62,32 @@ str str_split_walk(str *s, str sep) usize x = str_find(*s, sep); usize o = x + (x < s->len); - s->len -= o; - s->data += o; + *s = str_advance(*s, o); if (x == 0) - return str_split_walk(s, sep); + return str_walk(s, sep); else return (str) { x, s->data - o }; } + +str str_eat(str s, str tokens) +{ + while (s.len > 0 && match_char(s.data[0], tokens)) + s = str_advance(s, 1); + return s; +} + +str str_advance(str s, usize x) +{ + s.len -= x; + s.data += x; + return s; +} + +bool str_start(str s, str start) +{ + if (s.len < start.len) + return false; + s.len = start.len; + return str_cmp(s, start) == 0; +} diff --git a/stage3/string.h b/stage3/string.h index 8375136..fc91522 100644 --- a/stage3/string.h +++ b/stage3/string.h @@ -6,6 +6,9 @@ isize str_cmp(str s1, str s2); usize str_find(str s, str tokens); usize str_parse_num(str s, u8 base, u64 *x); -str str_split_walk(str *s, str sep); +str str_walk(str *s, str sep); +str str_eat(str s, str tokens); +str str_advance(str s, usize x); +bool str_start(str s, str start); #endif |
