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.
This commit is contained in:
Alex Smith
2012-07-05 15:35:43 +01:00
parent 0da10c8b51
commit 898b29e362
3 changed files with 35 additions and 2 deletions
+4 -2
View File
@@ -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.
+7
View File
@@ -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
+24
View File
@@ -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);
}