Fixes SCP wakeup latency
[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 #warning "make sure this poke vector is okay"
22 /* this is for an ipi that just wakes a core, but has no handler (for now) */
23 #define I_POKE_CORE 254
24
25 /* For kernel contexts, when we save/restore/move them around. */
26 struct kernel_ctx {
27         /* RISCV's current pop_kernel_ctx assumes the hw_tf is the first member */
28         struct hw_trapframe             hw_tf;
29 };
30
31 static inline bool in_kernel(struct hw_trapframe *hw_tf)
32 {
33         return hw_tf->sr & SR_PS;
34 }
35
36 static inline uintptr_t get_hwtf_pc(struct hw_trapframe *hw_tf)
37 {
38         #warning "fix me"
39         return 0;
40         //return hw_tf->tf_rip;
41 }
42
43 static inline uintptr_t get_hwtf_fp(struct hw_trapframe *hw_tf)
44 {
45         /* do you even have frame pointers?  this is used for backtrace, but if you
46          * don't use FPs, we'll need to change up our parameters or something. */
47         #warning "fix me"
48         return 0;
49         //return hw_tf->tf_rbp;
50 }
51
52 static inline void __attribute__((always_inline))
53 set_stack_pointer(uintptr_t sp)
54 {
55         asm volatile("move sp, %0" : : "r"(sp) : "memory");
56 }
57
58 static inline void __attribute__((always_inline))
59 set_frame_pointer(uintptr_t fp)
60 {
61         #warning "brho is just guessing here."
62         asm volatile("move fp, %0" : : "r"(fp) : "memory");
63 }
64
65 /* Save's the current kernel context into tf, setting the PC to the end of this
66  * function.  Note the kernel doesn't need to save a lot.
67  * Implemented with extern function to cause compiler to clobber most regs. */
68 static inline void save_kernel_ctx(struct kernel_ctx *ctx)
69 {
70   extern void save_kernel_tf_asm(struct hw_trapframe*);
71         save_kernel_tf_asm(&ctx->hw_tf);
72 }
73
74 void handle_trap(struct hw_trapframe *hw_tf);
75 int emulate_fpu(struct hw_trapframe *hw_tf);
76
77 #endif
78
79 #endif