Various userspace Linux compat hacks
[akaros.git] / tests / misc-compat.h
1 #ifndef MISC_COMPAT_H
2 #define MISC_COMPAT_H
3
4 #ifdef __ros__
5
6 #include <timing.h>
7
8 #define pthread_id() (pthread_self()->id)
9
10 #else
11
12 #include <stdbool.h>
13 #ifndef TRUE
14 #define TRUE    1
15 #endif
16
17 #ifndef FALSE
18 #define FALSE   0
19 #endif
20
21 #include <sys/param.h> /* MIN/MAX */
22
23 /* not quite, since akaros udelay is a busy wait */
24 #define udelay(usec) usleep(usec)
25 #define ndelay(nsec)                                                           \
26 {                                                                              \
27         struct timespec ts = {0, 0};                                               \
28         ts.tv_nsec = (nsec);                                                       \
29         nanosleep(&ts, 0);                                                         \
30 }
31
32 /* not quite a normal relax, which also pauses, but this works for all archs */
33 static inline void cpu_relax(void)
34 {
35         asm volatile("" : : : "memory");
36 }
37
38 #define pthread_id() (pthread_self())
39
40 #define vcore_id() (-1)
41
42 #define num_vcores() ((int)sysconf(_SC_NPROCESSORS_ONLN))
43
44 #define ACCESS_ONCE(x) (*(volatile typeof(x) *)&(x))
45
46 typedef void* atomic_t;
47
48 static void uth_disable_notifs(void)
49 {
50 }
51
52 static void uth_enable_notifs(void)
53 {
54 }
55
56 #define printd(args...) {}
57
58 #ifdef __x86_64__
59
60 #define mb() ({ asm volatile("mfence" ::: "memory"); })
61 #define cmb() ({ asm volatile("" ::: "memory"); })
62 #define rmb() cmb()
63 #define wmb() cmb()
64 #define wrmb() mb()
65 #define rwmb() cmb()
66
67 #endif /* __x86_64__ */
68
69 #endif /* __ros__ */
70 #endif /* MISC_COMPAT_H */