Procdata uses user_contexts (XCC)
[akaros.git] / kern / arch / riscv / trap.h
1 #ifndef ROS_ARCH_TRAP_H
2 #define ROS_ARCH_TRAP_H
3
4 #ifdef __riscv64
5 # define SIZEOF_HW_TRAPFRAME (36*8)
6 #else
7 # define SIZEOF_HW_TRAPFRAME (36*4)
8 #endif
9
10 #ifndef __ASSEMBLER__
11
12 #ifndef ROS_KERN_TRAP_H
13 #error "Do not include include arch/trap.h directly"
14 #endif
15
16 #include <ros/trapframe.h>
17 #include <arch/arch.h>
18
19 /* Kernel message interrupt vector.  ignored, for the most part */
20 #define I_KERNEL_MSG 255
21
22 static inline bool in_kernel(struct hw_trapframe *hw_tf)
23 {
24         return hw_tf->sr & SR_PS;
25 }
26
27 static inline void __attribute__((always_inline))
28 set_stack_pointer(uintptr_t sp)
29 {
30         asm volatile("move sp, %0" : : "r"(sp) : "memory");
31 }
32
33 /* Save's the current kernel context into tf, setting the PC to the end of this
34  * function.  Note the kernel doesn't need to save a lot.
35  * Implemented with extern function to cause compiler to clobber most regs. */
36 static inline void save_kernel_ctx(struct kernel_ctx *ctx)
37 {
38   extern void save_kernel_tf_asm(struct hw_trapframe*);
39         save_kernel_tf_asm(&ctx->hw_tf);
40 }
41
42 void handle_trap(struct hw_trapframe *hw_tf);
43 int emulate_fpu(struct hw_trapframe *hw_tf);
44
45 #endif
46
47 #endif