set_frame_pointer() for reset stacks
authorBarret Rhoden <brho@cs.berkeley.edu>
Thu, 22 May 2014 23:08:21 +0000 (16:08 -0700)
committerBarret Rhoden <brho@cs.berkeley.edu>
Thu, 22 May 2014 23:08:21 +0000 (16:08 -0700)
Helps with backtraces, so we can check for FP = 0.

kern/arch/riscv/trap.h
kern/arch/x86/trap.h
kern/src/smp.c

index 0336a8f..088f92d 100644 (file)
@@ -36,6 +36,13 @@ set_stack_pointer(uintptr_t sp)
        asm volatile("move sp, %0" : : "r"(sp) : "memory");
 }
 
+static inline void __attribute__((always_inline))
+set_frame_pointer(uintptr_t fp)
+{
+       #warning "brho is just guessing here."
+       asm volatile("move fp, %0" : : "r"(fp) : "memory");
+}
+
 /* Save's the current kernel context into tf, setting the PC to the end of this
  * function.  Note the kernel doesn't need to save a lot.
  * Implemented with extern function to cause compiler to clobber most regs. */
index a49c0fa..066d488 100644 (file)
@@ -185,6 +185,14 @@ set_stack_pointer(uintptr_t sp)
        asm volatile("mov %0,%%"X86_REG_SP"" : : "r"(sp) : "memory", X86_REG_SP);
 }
 
+static inline void __attribute__((always_inline))
+set_frame_pointer(uintptr_t fp)
+{
+       /* note we can't list BP as a clobber - the compiler will flip out.  makes
+        * me wonder if clobbering SP above makes a difference (probably not) */
+       asm volatile("mov %0,%%"X86_REG_BP"" : : "r"(fp) : "memory");
+}
+
 extern segdesc_t *gdt;
 
 #ifdef CONFIG_X86_64
index e425e57..afd7e9a 100644 (file)
@@ -79,6 +79,7 @@ void smp_idle(void)
 {
        #ifdef CONFIG_RESET_STACKS
        set_stack_pointer(get_stack_top());
+       set_frame_pointer(0);
        #endif /* CONFIG_RESET_STACKS */
        __smp_idle();
        assert(0);