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