Added back harts support
[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 // this is how we get our thread id on entry.
9 register int __hart_self_on_entry asm ("eax");
10
11 // The actual hart_self() function is a global symbol that invokes this routine.
12 static inline int
13 __hart_self()
14 {
15         // TODO: use some kind of thread-local storage to speed this up!
16         return (int)ros_syscall(SYS_getvcoreid,0,0,0,0,0);
17 }
18
19 static inline void
20 __hart_set_stack_pointer(void* sp)
21 {
22         asm volatile ("mov %0,%%esp" : : "r"(sp) : "memory","esp");
23 }
24
25 static inline void
26 __hart_relax()
27 {
28         asm volatile ("pause" : : : "memory");
29 }
30
31 static inline int
32 __hart_swap(int* addr, int val)
33 {
34         asm volatile ("xchg %0, (%2)" : "=r"(val) : "0"(val),"r"(addr) : "memory");
35         return val;
36 }
37
38 #endif
39
40 #endif