Changes BITMASK_FOR_EACH to a macro
[akaros.git] / user / parlib / include / i686 / arch.h
1 #ifndef PARLIB_ARCH_H
2 #define PARLIB_ARCH_H
3
4 #include <ros/arch/trapframe.h>
5 #include <ros/arch/mmu.h>
6 #include <ros/common.h>
7 #include <string.h>
8
9 #define internal_function   __attribute ((regparm (3), stdcall))
10
11 #define ARCH_CL_SIZE 64
12
13 /* Make sure you subtract off/save enough space at the top of the stack for
14  * whatever you compiler might want to use when calling a noreturn function or
15  * to handle a HW spill or whatever. */
16 static __inline void __attribute__((always_inline))
17 set_stack_pointer(void* sp)
18 {
19         asm volatile ("mov %0,%%esp" : : "r"(sp) : "memory","esp");
20 }
21
22 static __inline void
23 breakpoint(void)
24 {
25         __asm __volatile("int3");
26 }
27
28 static __inline uint64_t
29 read_tsc(void)
30 {
31         uint64_t tsc;
32         __asm __volatile("rdtsc" : "=A" (tsc));
33         return tsc;
34 }
35
36 static __inline void
37 cpuid(uint32_t info1, uint32_t info2, uint32_t *eaxp, uint32_t *ebxp,
38       uint32_t *ecxp, uint32_t *edxp)
39 {
40         uint32_t eax, ebx, ecx, edx;
41         /* Can select with both eax (info1) and ecx (info2) */
42         asm volatile("cpuid" 
43                 : "=a" (eax), "=b" (ebx), "=c" (ecx), "=d" (edx)
44                 : "a" (info1), "c" (info2));
45         if (eaxp)
46                 *eaxp = eax;
47         if (ebxp)
48                 *ebxp = ebx;
49         if (ecxp)
50                 *ecxp = ecx;
51         if (edxp)
52                 *edxp = edx;
53 }
54
55 static __inline uint64_t
56 read_tsc_serialized(void)
57 {
58         uint64_t tsc;
59         cpuid(0x0, 0x0, 0, 0, 0, 0);
60         tsc = read_tsc();
61         return tsc;
62 }
63
64 static __inline void
65 cpu_relax(void)
66 {
67         asm volatile("pause" : : : "memory");
68 }
69
70 static __inline uint64_t                                                                             
71 read_pmc(uint32_t index)
72 {                                                                                                    
73     uint64_t pmc;
74
75     __asm __volatile("rdpmc" : "=A" (pmc) : "c" (index)); 
76     return pmc;                                                                                      
77 }
78
79
80 #endif /* PARLIB_ARCH_H */