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:
@@ -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.
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user