diff --git a/src/kernel/boot.s b/src/kernel/boot.s index 67fed39..23d5ea0 100644 --- a/src/kernel/boot.s +++ b/src/kernel/boot.s @@ -19,6 +19,9 @@ _start: cli mov rsp, stack_end + push 0 ; signal end of stack with 0 return address + + mov rbp, rsp extern kernel_main call kernel_main @@ -40,6 +43,7 @@ interrupts_disable: ret section .bss +align 0x100 stack_begin: resb 0x4000 ; 16KiB stack space stack_end: diff --git a/src/kernel/debug.s b/src/kernel/debug.s index 187f6b7..3fd9258 100644 --- a/src/kernel/debug.s +++ b/src/kernel/debug.s @@ -10,3 +10,20 @@ global _halt _halt: hlt jmp _halt + + +global get_frame +get_frame: + mov rcx, rbp + +.loop: + mov rax, [rcx + 8] + mov rcx, [rcx] + cmp rdi, 0 + je .done + + sub rdi, 1 + jmp .loop + +.done: + ret diff --git a/src/kernel/interrupts.cpp b/src/kernel/interrupts.cpp index 7e122de..726e99c 100644 --- a/src/kernel/interrupts.cpp +++ b/src/kernel/interrupts.cpp @@ -208,6 +208,8 @@ struct registers #define print_reg(name, value) cons->printf(" %s: %lx\n", name, (value)); +extern "C" uint64_t get_frame(int frame); + void isr_handler(registers regs) { @@ -277,6 +279,15 @@ isr_handler(registers regs) print_reg(" ef", regs.eflags); print_reg("esp", regs.user_esp); print_reg(" ss", regs.ss); + + cons->puts("\n"); + + int frame = 0; + uint64_t bp = get_frame(0); + while (bp) { + cons->printf(" frame %2d: %lx\n", frame, bp); + bp = get_frame(++frame); + } while(1) asm("hlt"); } diff --git a/src/kernel/main.cpp b/src/kernel/main.cpp index fde2989..2bdc246 100644 --- a/src/kernel/main.cpp +++ b/src/kernel/main.cpp @@ -50,6 +50,10 @@ init_console(const popcorn_data *header) log::enable(logs::devices, log::level::debug); } +void do_error_3() { int x = 1 / 0; } +void do_error_2() { do_error_3(); } +void do_error_1() { do_error_2(); } + void kernel_main(popcorn_data *header) { @@ -80,7 +84,7 @@ kernel_main(popcorn_data *header) log::info(logs::boot, "CPU Family %x Model %x Stepping %x", cpu.family(), cpu.model(), cpu.stepping()); - // int x = 1 / 0; + // do_error_1(); // __asm__ __volatile__("int $15"); g_console.puts("boogity!"); diff --git a/wscript b/wscript index bddeb8a..4e1f74e 100644 --- a/wscript +++ b/wscript @@ -58,7 +58,7 @@ def configure(ctx): '-ffreestanding', '-nodefaultlibs', '-fno-builtin', - '-fomit-frame-pointer', + '-fno-omit-frame-pointer', '-mno-red-zone', ] @@ -103,7 +103,7 @@ def configure(ctx): ctx.env.append_value('CXXFLAGS', baseflags) ctx.env.append_value('CXXFLAGS', warnflags) ctx.env.append_value('CXXFLAGS', [ - '-ggdb', + '-g', '-std=c++14', '-fno-exceptions', '-fno-rtti',