Defines new struct user_context (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_TRAPFRAME_T (36*8)
6 #else
7 # define SIZEOF_TRAPFRAME_T (36*4)
8 #endif
9
10 #ifndef __ASSEMBLER__
11
12 #include <ros/trapframe.h>
13 #include <arch/arch.h>
14
15 /* Kernel message interrupt vector.  ignored, for the most part */
16 #define I_KERNEL_MSG 255
17
18 static inline bool in_kernel(struct trapframe *tf)
19 {
20         return tf->sr & SR_PS;
21 }
22
23 static inline void __attribute__((always_inline))
24 set_stack_pointer(uintptr_t sp)
25 {
26         asm volatile("move sp, %0" : : "r"(sp) : "memory");
27 }
28
29 /* Save's the current kernel context into tf, setting the PC to the end of this
30  * function.  Note the kernel doesn't need to save a lot.
31  * Implemented with extern function to cause compiler to clobber most regs. */
32 static inline void save_kernel_tf(struct trapframe *tf)
33 {
34   extern void save_kernel_tf_asm(struct trapframe*);
35         save_kernel_tf_asm(tf);
36 }
37
38 void handle_trap(struct trapframe *tf);
39 int emulate_fpu(struct trapframe *tf);
40
41 #endif
42
43 #endif