Add parlib/common.h
[akaros.git] / user / parlib / include / x86 / arch.h
1 #ifndef PARLIB_ARCH_H
2 #define PARLIB_ARCH_H
3
4 #include <ros/trapframe.h>
5 #include <ros/arch/mmu.h>
6 #include <parlib/common.h>
7 #include <string.h>
8
9 __BEGIN_DECLS
10
11 #define ARCH_CL_SIZE 64
12 #ifdef __x86_64__
13
14 #define internal_function 
15 #define X86_REG_BP                                      "rbp"
16 #define X86_REG_SP                                      "rsp"
17 #define X86_REG_IP                                      "rip"
18 #define X86_REG_AX                                      "rax"
19 #define X86_REG_BX                                      "rbx"
20 #define X86_REG_CX                                      "rcx"
21 #define X86_REG_DX                                      "rdx"
22
23 #else /* 32 bit */
24
25 #define internal_function   __attribute ((regparm (3), stdcall))
26 #define X86_REG_BP                                      "ebp"
27 #define X86_REG_SP                                      "esp"
28 #define X86_REG_IP                                      "eip"
29 #define X86_REG_AX                                      "eax"
30 #define X86_REG_BX                                      "ebx"
31 #define X86_REG_CX                                      "ecx"
32 #define X86_REG_DX                                      "edx"
33
34 #endif /* 64bit / 32bit */
35
36 /* Make sure you subtract off/save enough space at the top of the stack for
37  * whatever you compiler might want to use when calling a noreturn function or
38  * to handle a HW spill or whatever. */
39 static inline void __attribute__((always_inline))
40 set_stack_pointer(void *sp)
41 {
42         asm volatile("mov %0,%%"X86_REG_SP"" : : "r"(sp) : "memory", X86_REG_SP);
43 }
44
45 static inline void breakpoint(void)
46 {
47         asm volatile("int3");
48 }
49
50 static inline uint64_t read_tsc(void)
51 {
52         uint32_t edx, eax;
53         asm volatile("rdtsc" : "=d"(edx), "=a"(eax));
54         return (uint64_t)edx << 32 | eax;
55 }
56
57 /* Check out k/a/x86/rdtsc_test.c for more info */
58 static inline uint64_t read_tsc_serialized(void)
59 {
60         asm volatile("lfence"); /* mfence on amd */
61         return read_tsc();
62 }
63
64 static inline void cpu_relax(void)
65 {
66         asm volatile("pause" : : : "memory");
67 }
68
69 static inline void save_fp_state(struct ancillary_state *silly)
70 {
71         asm volatile("fxsave %0" : : "m"(*silly));
72 }
73
74 static inline void restore_fp_state(struct ancillary_state *silly)
75 {
76         asm volatile("fxrstor %0" : : "m"(*silly));
77 }
78
79 __END_DECLS
80
81 #endif /* PARLIB_ARCH_H */