added 1 changeset to branch 'refs/remotes/xyzzy-github/x86_64' old head: 0da10c8b51f9ec443a53873b37d07fab30a5734e new head: 898b29e3628ba9252c527e6296b88cf71d37b863 ---------------------------------------------------------------------------- 898b29e: Added temporary stack trace function to x86_64. Will be merged with the x86 one later on. Requires -fno-omit-frame-pointer on the kernel build flags, GCC defaults to not generating stack frames on x86_64. [ Alex Smith <alex@xxxxxxxxxxxxxxxx> ] ---------------------------------------------------------------------------- Commit: 898b29e3628ba9252c527e6296b88cf71d37b863 Author: Alex Smith <alex@xxxxxxxxxxxxxxxx> Date: Thu Jul 5 14:35:43 2012 UTC ---------------------------------------------------------------------------- 3 files changed, 35 insertions(+), 2 deletions(-) build/jam/BuildSetup | 6 ++++-- src/system/kernel/arch/x86/64/arch.S | 7 +++++++ src/system/kernel/arch/x86/64/stubs.cpp | 24 ++++++++++++++++++++++++ ---------------------------------------------------------------------------- diff --git a/build/jam/BuildSetup b/build/jam/BuildSetup index 1e924f0..d089717 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 fcf7d26..eb51f75 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 1802e92..fc77e25 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); }