Add parlib/common.h
[akaros.git] / user / parlib / include / riscv / arch.h
1 #ifndef PARLIB_ARCH_H
2 #define PARLIB_ARCH_H
3
4 #include <parlib/common.h>
5 #include <ros/trapframe.h>
6 #include <ros/arch/arch.h>
7
8 __BEGIN_DECLS
9
10 #define internal_function
11
12 #define ARCH_CL_SIZE 64
13
14 static __inline void
15 set_stack_pointer(void* sp)
16 {
17         asm volatile ("move sp, %0" : : "r"(sp) : "memory");
18 }
19
20 static __inline void
21 breakpoint(void)
22 {
23         asm volatile ("break");
24 }
25
26 static __inline uint64_t
27 read_tsc(void)
28 {
29         unsigned long cycles;
30         asm ("rdcycle %0" : "=r"(cycles));
31         return (uint64_t)cycles;
32 }
33
34 static __inline uint64_t
35 read_tsc_serialized(void)
36 {
37         return read_tsc();
38 }
39
40 static __inline void
41 cpu_relax(void)
42 {
43         long ctr;
44         asm volatile("li %0, 8; 1: addi %0, %0, -1; bnez %0, 1b" : "=r"(ctr) : : "memory");
45 }
46
47 static inline void save_fp_state(struct ancillary_state* silly)
48 {
49         uint32_t fsr = read_fsr();
50
51         asm("fsd fs0,%0" : "=m"(silly->fpr[0]));
52         asm("fsd fs1,%0" : "=m"(silly->fpr[1]));
53         asm("fsd fs2,%0" : "=m"(silly->fpr[2]));
54         asm("fsd fs3,%0" : "=m"(silly->fpr[3]));
55         asm("fsd fs4,%0" : "=m"(silly->fpr[4]));
56         asm("fsd fs5,%0" : "=m"(silly->fpr[5]));
57         asm("fsd fs6,%0" : "=m"(silly->fpr[6]));
58         asm("fsd fs7,%0" : "=m"(silly->fpr[7]));
59         asm("fsd fs8,%0" : "=m"(silly->fpr[8]));
60         asm("fsd fs9,%0" : "=m"(silly->fpr[9]));
61         asm("fsd fs10,%0" : "=m"(silly->fpr[10]));
62         asm("fsd fs11,%0" : "=m"(silly->fpr[11]));
63         asm("fsd fs12,%0" : "=m"(silly->fpr[12]));
64         asm("fsd fs13,%0" : "=m"(silly->fpr[13]));
65         asm("fsd fs14,%0" : "=m"(silly->fpr[14]));
66         asm("fsd fs15,%0" : "=m"(silly->fpr[15]));
67
68         silly->fsr = fsr;
69 }
70
71 static inline void restore_fp_state(struct ancillary_state* silly)
72 {
73         uint32_t fsr = silly->fsr;
74
75         asm("fld fs0,%0" : : "m"(silly->fpr[0]));
76         asm("fld fs1,%0" : : "m"(silly->fpr[1]));
77         asm("fld fs2,%0" : : "m"(silly->fpr[2]));
78         asm("fld fs3,%0" : : "m"(silly->fpr[3]));
79         asm("fld fs4,%0" : : "m"(silly->fpr[4]));
80         asm("fld fs5,%0" : : "m"(silly->fpr[5]));
81         asm("fld fs6,%0" : : "m"(silly->fpr[6]));
82         asm("fld fs7,%0" : : "m"(silly->fpr[7]));
83         asm("fld fs8,%0" : : "m"(silly->fpr[8]));
84         asm("fld fs9,%0" : : "m"(silly->fpr[9]));
85         asm("fld fs10,%0" : : "m"(silly->fpr[10]));
86         asm("fld fs11,%0" : : "m"(silly->fpr[11]));
87         asm("fld fs12,%0" : : "m"(silly->fpr[12]));
88         asm("fld fs13,%0" : : "m"(silly->fpr[13]));
89         asm("fld fs14,%0" : : "m"(silly->fpr[14]));
90         asm("fld fs15,%0" : : "m"(silly->fpr[15]));
91
92         write_fsr(fsr);
93 }
94
95 __END_DECLS
96
97 #endif /* PARLIB_ARCH_H */