IRQ routing
[akaros.git] / kern / arch / riscv / trap.h
index 4dca119..0336a8f 100644 (file)
@@ -2,36 +2,52 @@
 #define ROS_ARCH_TRAP_H
 
 #ifdef __riscv64
-# define SIZEOF_TRAPFRAME_T (37*8)
+# define SIZEOF_HW_TRAPFRAME (36*8)
 #else
-# define SIZEOF_TRAPFRAME_T (37*4)
+# define SIZEOF_HW_TRAPFRAME (36*4)
 #endif
 
 #ifndef __ASSEMBLER__
 
-#include <ros/arch/trapframe.h>
+#ifndef ROS_KERN_TRAP_H
+#error "Do not include include arch/trap.h directly"
+#endif
+
+#include <ros/trapframe.h>
 #include <arch/arch.h>
 
-static inline bool in_kernel(struct trapframe *tf)
+/* Kernel message interrupt vector.  ignored, for the most part */
+#define I_KERNEL_MSG 255
+
+/* For kernel contexts, when we save/restore/move them around. */
+struct kernel_ctx {
+       /* RISCV's current pop_kernel_ctx assumes the hw_tf is the first member */
+       struct hw_trapframe             hw_tf;
+};
+
+static inline bool in_kernel(struct hw_trapframe *hw_tf)
 {
-       return tf->sr & SR_PS;
+       return hw_tf->sr & SR_PS;
 }
 
 static inline void __attribute__((always_inline))
 set_stack_pointer(uintptr_t sp)
 {
-       asm volatile("move $sp,%0" : : "r"(sp) : "memory");
+       asm volatile("move sp, %0" : : "r"(sp) : "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. */
-static inline void save_kernel_tf(struct trapframe *tf)
+static inline void save_kernel_ctx(struct kernel_ctx *ctx)
 {
-  extern void save_kernel_tf_asm(struct trapframe*);
-       save_kernel_tf_asm(tf);
+  extern void save_kernel_tf_asm(struct hw_trapframe*);
+       save_kernel_tf_asm(&ctx->hw_tf);
 }
 
+void handle_trap(struct hw_trapframe *hw_tf);
+int emulate_fpu(struct hw_trapframe *hw_tf);
+
 #endif
 
 #endif