Massive cleanup of SPARC kernel entry code
[akaros.git] / user / include / sparc / arch.h
1 #ifndef PARLIB_ARCH_H
2 #define PARLIB_ARCH_H
3
4 #include <ros/common.h>
5
6 #define internal_function
7
8 #define __RAMP__
9 #define ARCH_CL_SIZE 128
10
11 double do_fdiv(double,double);
12 double do_fsqrt(double);
13 double do_recip(double);
14 double do_rsqrt(double);
15
16 static __inline void
17 set_stack_pointer(void* sp)
18 {
19         sp = (char*)sp - 96;
20         __asm__ __volatile__ ("mov %0,%%sp" : : "r"(sp));
21 }
22
23 static __inline void
24 breakpoint(void)
25 {
26         asm volatile ("ta 0x7f");
27 }
28
29 static __inline uint64_t
30 read_perfctr(uint32_t cpu, uint32_t which)
31 {
32         register uint32_t hi asm("o0"), lo asm("o1");
33         uintptr_t addr = cpu<<10 | which<<3;
34
35         asm volatile("mov %2,%%o0; ta 9"
36                      : "=r"(hi),"=r"(lo) : "r"(addr));
37         return (((uint64_t)hi) << 32) | lo;
38 }
39
40 static __inline uint64_t
41 read_tsc(void)
42 {
43         return read_perfctr(0,0);
44 }
45
46 static __inline void
47 cpu_relax(void)
48 {
49         int ctr = 8;
50         asm volatile("1: deccc %0; bne 1b; nop" :
51                      "=r"(ctr) : "0"(ctr) : "cc","memory");
52 }
53
54 #endif /* PARLIB_ARCH_H */