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
|
# 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
|
# model. Also disable the red zone, which cannot be used in kernel
|
||||||
# code due to interrupts.
|
# code due to interrupts.
|
||||||
HAIKU_KERNEL_CCFLAGS += -mcmodel=kernel -mno-red-zone ;
|
HAIKU_KERNEL_CCFLAGS += -mcmodel=kernel -mno-red-zone
|
||||||
HAIKU_KERNEL_C++FLAGS += -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 ;
|
HAIKU_KERNEL_PIC_LINKFLAGS += -z max-page-size=0x1000 ;
|
||||||
|
|
||||||
# Bootloader is 32-bit.
|
# Bootloader is 32-bit.
|
||||||
|
|||||||
@@ -32,6 +32,13 @@ FUNCTION(x86_fxsave_swap):
|
|||||||
FUNCTION_END(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); */
|
/* uint64 x86_read_msr(uint32 register); */
|
||||||
FUNCTION(x86_read_msr):
|
FUNCTION(x86_read_msr):
|
||||||
mov %edi, %ecx
|
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
|
void
|
||||||
arch_debug_stack_trace(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)
|
void (*function)(void*), void* parameter)
|
||||||
{
|
{
|
||||||
// To be implemented in asm, not here.
|
// To be implemented in asm, not here.
|
||||||
|
|
||||||
|
function(parameter);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user