Add a helper to get a context's SP
authorBarret Rhoden <brho@cs.berkeley.edu>
Wed, 20 Apr 2016 22:16:39 +0000 (15:16 -0700)
committerBarret Rhoden <brho@cs.berkeley.edu>
Mon, 2 May 2016 21:11:15 +0000 (17:11 -0400)
Used in debugging.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
kern/arch/riscv/trap.h
kern/arch/x86/trap64.h
kern/include/trap.h
kern/src/trap.c

index fbe8aff..46fae1f 100644 (file)
@@ -42,6 +42,15 @@ static inline uintptr_t get_hwtf_fp(struct hw_trapframe *hw_tf)
        //return hw_tf->tf_rbp;
 }
 
+static inline uintptr_t get_hwtf_sp(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_rsp;
+}
+
 static inline uintptr_t get_swtf_pc(struct sw_trapframe *sw_tf)
 {
        #warning "fix me"
@@ -56,6 +65,13 @@ static inline uintptr_t get_swtf_fp(struct sw_trapframe *sw_tf)
        //return sw_tf->tf_rbp;
 }
 
+static inline uintptr_t get_swtf_sp(struct sw_trapframe *sw_tf)
+{
+       #warning "fix me"
+       return 0;
+       //return sw_tf->tf_rsp;
+}
+
 static inline uintptr_t get_vmtf_pc(struct vm_trapframe *vm_tf)
 {
        #warning "fix me"
@@ -68,6 +84,12 @@ static inline uintptr_t get_vmtf_fp(struct vm_trapframe *vm_tf)
        return 0;
 }
 
+static inline uintptr_t get_vmtf_sp(struct vm_trapframe *vm_tf)
+{
+       #warning "fix me"
+       return 0;
+}
+
 static inline void __attribute__((always_inline))
 set_stack_pointer(uintptr_t sp)
 {
index 5c29a05..1c9b8ae 100644 (file)
@@ -30,6 +30,11 @@ static inline uintptr_t get_hwtf_fp(struct hw_trapframe *hw_tf)
        return hw_tf->tf_rbp;
 }
 
+static inline uintptr_t get_hwtf_sp(struct hw_trapframe *hw_tf)
+{
+       return hw_tf->tf_rsp;
+}
+
 static inline uintptr_t get_swtf_pc(struct sw_trapframe *sw_tf)
 {
        return sw_tf->tf_rip;
@@ -40,6 +45,11 @@ static inline uintptr_t get_swtf_fp(struct sw_trapframe *sw_tf)
        return sw_tf->tf_rbp;
 }
 
+static inline uintptr_t get_swtf_sp(struct sw_trapframe *sw_tf)
+{
+       return sw_tf->tf_rsp;
+}
+
 static inline uintptr_t get_vmtf_pc(struct vm_trapframe *vm_tf)
 {
        return vm_tf->tf_rip;
@@ -50,6 +60,11 @@ static inline uintptr_t get_vmtf_fp(struct vm_trapframe *vm_tf)
        return vm_tf->tf_rbp;
 }
 
+static inline uintptr_t get_vmtf_sp(struct vm_trapframe *vm_tf)
+{
+       return vm_tf->tf_rsp;
+}
+
 static inline void x86_advance_ip(struct hw_trapframe *hw_tf, size_t bytes)
 {
        hw_tf->tf_rip += bytes;
index b18050b..ab26759 100644 (file)
@@ -42,6 +42,7 @@ void __arch_reflect_trap_hwtf(struct hw_trapframe *hw_tf, unsigned int trap_nr,
 
 uintptr_t get_user_ctx_pc(struct user_context *ctx);
 uintptr_t get_user_ctx_fp(struct user_context *ctx);
+uintptr_t get_user_ctx_sp(struct user_context *ctx);
 
 /* Partial contexts are those where the full context is split between the parts
  * in the struct and the parts still loaded in hardware.
index 636f54e..f36ce77 100644 (file)
@@ -119,6 +119,20 @@ uintptr_t get_user_ctx_fp(struct user_context *ctx)
        }
 }
 
+uintptr_t get_user_ctx_sp(struct user_context *ctx)
+{
+       switch (ctx->type) {
+       case ROS_HW_CTX:
+               return get_hwtf_sp(&ctx->tf.hw_tf);
+       case ROS_SW_CTX:
+               return get_swtf_sp(&ctx->tf.sw_tf);
+       case ROS_VM_CTX:
+               return get_vmtf_sp(&ctx->tf.vm_tf);
+       default:
+               panic("Bad context type %d for ctx %p\n", ctx->type, ctx);
+       }
+}
+
 /* Helper, copies the current context to to_ctx. */
 void copy_current_ctx_to(struct user_context *to_ctx)
 {