AHCI initial commit.
[akaros.git] / kern / arch / riscv / trap.h
1 #pragma once
2
3 #ifdef __riscv64
4 # define SIZEOF_HW_TRAPFRAME (36*8)
5 #else
6 # define SIZEOF_HW_TRAPFRAME (36*4)
7 #endif
8
9 #ifndef __ASSEMBLER__
10
11 #ifndef ROS_KERN_TRAP_H
12 #error "Do not include include arch/trap.h directly"
13 #endif
14
15 #include <ros/trapframe.h>
16 #include <arch/arch.h>
17
18 /* Kernel message interrupt vector.  ignored, for the most part */
19 #define I_KERNEL_MSG 255
20 #warning "make sure this poke vector is okay"
21 /* this is for an ipi that just wakes a core, but has no handler (for now) */
22 #define I_POKE_CORE 254
23
24 static inline bool in_kernel(struct hw_trapframe *hw_tf)
25 {
26         return hw_tf->sr & SR_PS;
27 }
28
29 static inline uintptr_t get_hwtf_pc(struct hw_trapframe *hw_tf)
30 {
31         #warning "fix me"
32         return 0;
33         //return hw_tf->tf_rip;
34 }
35
36 static inline uintptr_t get_hwtf_fp(struct hw_trapframe *hw_tf)
37 {
38         /* do you even have frame pointers?  this is used for backtrace, but if you
39          * don't use FPs, we'll need to change up our parameters or something. */
40         #warning "fix me"
41         return 0;
42         //return hw_tf->tf_rbp;
43 }
44
45 static inline uintptr_t get_hwtf_sp(struct hw_trapframe *hw_tf)
46 {
47         /* do you even have frame pointers?  this is used for backtrace, but if you
48          * don't use FPs, we'll need to change up our parameters or something. */
49         #warning "fix me"
50         return 0;
51         //return hw_tf->tf_rsp;
52 }
53
54 static inline uintptr_t get_swtf_pc(struct sw_trapframe *sw_tf)
55 {
56         #warning "fix me"
57         return 0;
58         //return sw_tf->tf_rip;
59 }
60
61 static inline uintptr_t get_swtf_fp(struct sw_trapframe *sw_tf)
62 {
63         #warning "fix me"
64         return 0;
65         //return sw_tf->tf_rbp;
66 }
67
68 static inline uintptr_t get_swtf_sp(struct sw_trapframe *sw_tf)
69 {
70         #warning "fix me"
71         return 0;
72         //return sw_tf->tf_rsp;
73 }
74
75 static inline uintptr_t get_vmtf_pc(struct vm_trapframe *vm_tf)
76 {
77         #warning "fix me"
78         return 0;
79 }
80
81 static inline uintptr_t get_vmtf_fp(struct vm_trapframe *vm_tf)
82 {
83         #warning "fix me"
84         return 0;
85 }
86
87 static inline uintptr_t get_vmtf_sp(struct vm_trapframe *vm_tf)
88 {
89         #warning "fix me"
90         return 0;
91 }
92
93 static inline void __attribute__((always_inline))
94 set_stack_pointer(uintptr_t sp)
95 {
96         asm volatile("move sp, %0" : : "r"(sp) : "memory");
97 }
98
99 static inline void __attribute__((always_inline))
100 set_frame_pointer(uintptr_t fp)
101 {
102         #warning "brho is just guessing here."
103         asm volatile("move fp, %0" : : "r"(fp) : "memory");
104 }
105
106 void handle_trap(struct hw_trapframe *hw_tf);
107 int emulate_fpu(struct hw_trapframe *hw_tf);
108
109 static inline bool arch_ctx_is_partial(struct user_context *ctx)
110 {
111         return FALSE;
112 }
113
114 static inline void arch_finalize_ctx(struct user_context *ctx)
115 {
116 }
117
118 #endif