Helpers for extracting PC/FP from hwtfs
authorBarret Rhoden <brho@cs.berkeley.edu>
Wed, 28 May 2014 19:16:38 +0000 (12:16 -0700)
committerBarret Rhoden <brho@cs.berkeley.edu>
Wed, 28 May 2014 19:16:38 +0000 (12:16 -0700)
This might not work, depending on how RISCV works.  In which case, we'll
need to adjust our BT functions.

kern/arch/riscv/trap.h
kern/arch/x86/trap.c
kern/arch/x86/trap32.h
kern/arch/x86/trap64.h
kern/drivers/dev/kprof.c

index 088f92d..99daf57 100644 (file)
@@ -30,6 +30,22 @@ static inline bool in_kernel(struct hw_trapframe *hw_tf)
        return hw_tf->sr & SR_PS;
 }
 
+static inline uintptr_t get_hwtf_pc(struct hw_trapframe *hw_tf)
+{
+       #warning "fix me"
+       return 0;
+       //return hw_tf->tf_rip;
+}
+
+static inline uintptr_t get_hwtf_fp(struct hw_trapframe *hw_tf)
+{
+       /* do you even have frame pointers?  this is used for backtrace, but if you
+        * don't use FPs, we'll need to change up our parameters or something. */
+       #warning "fix me"
+       return 0;
+       //return hw_tf->tf_rbp;
+}
+
 static inline void __attribute__((always_inline))
 set_stack_pointer(uintptr_t sp)
 {
index 00dc58d..bf5bd35 100644 (file)
@@ -231,7 +231,7 @@ void backtrace_kframe(struct hw_trapframe *hw_tf)
        struct per_cpu_info *pcpui = &per_cpu_info[core_id()];
        pcpui->__lock_checking_enabled--;
        printk("\nBacktrace of faulting kernel context on Core %d:\n", core_id());
-       backtrace_frame(x86_get_hwtf_pc(hw_tf), x86_get_hwtf_fp(hw_tf));
+       backtrace_frame(get_hwtf_pc(hw_tf), get_hwtf_fp(hw_tf));
        pcpui->__lock_checking_enabled++;
 }
 
index e56ed11..4a67b23 100644 (file)
@@ -24,6 +24,16 @@ static inline bool in_kernel(struct hw_trapframe *hw_tf)
        return (hw_tf->tf_cs & ~3) == GD_KT;
 }
 
+static inline uintptr_t get_hwtf_pc(struct hw_trapframe *hw_tf)
+{
+       return hw_tf->tf_eip;
+}
+
+static inline uintptr_t get_hwtf_fp(struct hw_trapframe *hw_tf)
+{
+       return hw_tf->tf_regs.reg_ebp;
+}
+
 static inline void save_kernel_ctx(struct kernel_ctx *ctx)
 {
        /* Save the regs and the future esp. */
@@ -107,14 +117,4 @@ static inline void x86_set_stacktop_tss(struct taskstate *tss, uintptr_t top)
        tss->ts_ss0 = GD_KD;
 }
 
-static inline uintptr_t x86_get_hwtf_pc(struct hw_trapframe *hw_tf)
-{
-       return hw_tf->tf_eip;
-}
-
-static inline uintptr_t x86_get_hwtf_fp(struct hw_trapframe *hw_tf)
-{
-       return hw_tf->tf_regs.reg_ebp;
-}
-
 #endif /* ROS_KERN_ARCH_TRAP32_H */
index 9034768..38d6370 100644 (file)
@@ -26,6 +26,16 @@ static inline bool in_kernel(struct hw_trapframe *hw_tf)
        return (hw_tf->tf_cs & ~3) == GD_KT;
 }
 
+static inline uintptr_t get_hwtf_pc(struct hw_trapframe *hw_tf)
+{
+       return hw_tf->tf_rip;
+}
+
+static inline uintptr_t get_hwtf_fp(struct hw_trapframe *hw_tf)
+{
+       return hw_tf->tf_rbp;
+}
+
 /* Using SW contexts for now, for x86_64 */
 static inline void save_kernel_ctx(struct kernel_ctx *ctx)
 {
@@ -115,14 +125,4 @@ static inline void x86_set_stacktop_tss(struct taskstate *tss, uintptr_t top)
        tss->ts_rsp0 = top;
 }
 
-static inline uintptr_t x86_get_hwtf_pc(struct hw_trapframe *hw_tf)
-{
-       return hw_tf->tf_rip;
-}
-
-static inline uintptr_t x86_get_hwtf_fp(struct hw_trapframe *hw_tf)
-{
-       return hw_tf->tf_rbp;
-}
-
 #endif /* ROS_KERN_ARCH_TRAP64_H */
index 042d86e..aacb676 100644 (file)
@@ -142,7 +142,7 @@ static void setup_timers(void)
        }
        void kprof_irq_handler(struct hw_trapframe *hw_tf, void *data)
        {
-               kproftimer(x86_get_hwtf_pc(hw_tf));     /* TODO arch */
+               kproftimer(get_hwtf_pc(hw_tf));
        }
        struct timer_chain *tchain = &per_cpu_info[core_id()].tchain;
        struct alarm_waiter *waiter = kmalloc(sizeof(struct alarm_waiter), 0);