Checkin of Andrews stuff needed to compile glibc
[akaros.git] / kern / arch / i386 / ros / hart.h
1 #ifndef _ROS_ARCH_HART_H
2 #define _ROS_ARCH_HART_H
3
4 #include <parlib.h>
5
6 // The actual hart_self() function is a global symbol that invokes this routine.
7 static inline int
8 __hart_self()
9 {
10         // TODO: use some kind of thread-local storage to speed this up!
11         return (int)syscall(SYS_getvcoreid,0,0,0,0,0);
12 }
13
14 static inline void
15 __hart_set_stack_pointer(void* sp)
16 {
17         FIXME
18 }
19
20 static inline void
21 __hart_relax()
22 {
23         asm volatile ("pause" : : : "memory");
24 }
25
26 static inline int
27 __hart_swap(int* addr, int val)
28 {
29         asm volatile ("xchg %0, (%2)" : "=r"(val) : "0"(val),"r"(addr) : "memory");
30         return val;
31 }
32
33 #endif