diff --git a/build/jam/BuildSetup b/build/jam/BuildSetup index 1e924f0d75..d0897176ab 100644 --- a/build/jam/BuildSetup +++ b/build/jam/BuildSetup @@ -391,8 +391,10 @@ switch $(HAIKU_ARCH) { # Kernel lives in the top 2GB of the address space, use kernel code # model. Also disable the red zone, which cannot be used in kernel # code due to interrupts. - HAIKU_KERNEL_CCFLAGS += -mcmodel=kernel -mno-red-zone ; - HAIKU_KERNEL_C++FLAGS += -mcmodel=kernel -mno-red-zone ; + HAIKU_KERNEL_CCFLAGS += -mcmodel=kernel -mno-red-zone + -fno-omit-frame-pointer ; + HAIKU_KERNEL_C++FLAGS += -mcmodel=kernel -mno-red-zone + -fno-omit-frame-pointer ; HAIKU_KERNEL_PIC_LINKFLAGS += -z max-page-size=0x1000 ; # Bootloader is 32-bit. diff --git a/src/system/kernel/arch/x86/64/arch.S b/src/system/kernel/arch/x86/64/arch.S index fcf7d26916..eb51f75691 100644 --- a/src/system/kernel/arch/x86/64/arch.S +++ b/src/system/kernel/arch/x86/64/arch.S @@ -32,6 +32,13 @@ FUNCTION(x86_fxsave_swap): FUNCTION_END(x86_fxsave_swap) +/* addr_t x86_read_ebp(); */ +FUNCTION(x86_read_ebp): + mov %rbp, %rax + ret +FUNCTION_END(x86_read_ebp) + + /* uint64 x86_read_msr(uint32 register); */ FUNCTION(x86_read_msr): mov %edi, %ecx diff --git a/src/system/kernel/arch/x86/64/stubs.cpp b/src/system/kernel/arch/x86/64/stubs.cpp index 1802e922e2..fc77e25637 100644 --- a/src/system/kernel/arch/x86/64/stubs.cpp +++ b/src/system/kernel/arch/x86/64/stubs.cpp @@ -85,10 +85,32 @@ arch_debug_save_registers(struct arch_debug_registers* registers) } +struct stack_frame { + struct stack_frame *previous; + addr_t return_address; +}; + + void arch_debug_stack_trace(void) { + addr_t rbp = x86_read_ebp(); + kprintf("frame caller\n"); + + for (int32 callIndex = 0;; callIndex++) { + if (rbp == 0) + break; + + stack_frame* frame = (stack_frame*)rbp; + if (frame->return_address == 0) + break; + + kprintf("%2d %016lx (+%4ld) %016lx\n", callIndex, rbp, + (addr_t)frame->previous - rbp, frame->return_address); + + rbp = (addr_t)frame->previous; + } } @@ -168,6 +190,8 @@ arch_debug_call_with_fault_handler(cpu_ent* cpu, jmp_buf jumpBuffer, void (*function)(void*), void* parameter) { // To be implemented in asm, not here. + + function(parameter); }