0df458c2866f2eff79605baddb4f21cc96d4847f
[akaros.git] / kern / arch / sparc / sparc.h
1 #ifndef ROS_INC_SPARC_H
2 #define ROS_INC_SPARC_H
3
4 #define CORE_ID_REG     %asr15
5 #define NUM_CORES_REG   %asr14
6 #define MEMSIZE_MB_REG  %asr13
7
8 #define PSR_CWP         0x0000001F
9 #define PSR_ET          0x00000020
10 #define PSR_PS          0x00000040
11 #define PSR_S           0x00000080
12 #define PSR_PIL         0x00000F00
13 #define PSR_EF          0x00001000
14 #define PSR_EC          0x00002000
15 #define PSR_RESERVED    0x000FC000
16 #define PSR_ICC         0x00F00000
17 #define PSR_VER         0x0F000000
18 #define PSR_IMPL        0xF0000000
19
20 #ifndef __ASSEMBLER__
21
22 #define STR(arg) #arg
23 #define XSTR(arg) STR(arg)
24
25 #include <arch/types.h>
26 #include <arch/trap.h>
27 #include <arch/frontend.h>
28
29 static __inline uint32_t read_psr(void) __attribute__((always_inline));
30 static __inline uint32_t read_wim(void) __attribute__((always_inline));
31 static __inline uint32_t read_tbr(void) __attribute__((always_inline));
32 static __inline uint32_t read_mmu_reg(uint32_t which) __attribute__((always_inline));
33 static __inline uint32_t read_y(void) __attribute__((always_inline));
34 static __inline uint32_t read_fsr(void) __attribute__((always_inline));
35 static __inline uint64_t read_perfctr(uint32_t which) __attribute__((always_inline));
36 static __inline void write_psr(uint32_t val) __attribute__((always_inline));
37 static __inline void write_wim(uint32_t val) __attribute__((always_inline));
38 static __inline void write_tbr(uint32_t val) __attribute__((always_inline));
39 static __inline void write_mmu_reg(uint32_t which, uint32_t val) __attribute__((always_inline));
40 static __inline void write_y(uint32_t val) __attribute__((always_inline));
41 static __inline void write_fsr(uint32_t val) __attribute__((always_inline));
42 static __inline uint32_t memsize_mb(void) __attribute__((always_inline));
43 static __inline uint32_t mmu_probe(uint32_t va) __attribute__((always_inline));
44
45 uint32_t send_active_message(uint32_t dst, amr_t pc, uint32_t arg0, uint32_t arg1, uint32_t arg2);
46 void flush_windows();
47
48 #define store_alternate(addr,asi,data) ({ uint32_t __my_addr = (addr); uint32_t __my_data = (data); __asm__ __volatile__ ("sta %0,[%1] %2" : : "r"(__my_data),"r"(__my_addr),"i"(asi)); })
49 #define load_alternate(addr,asi) ({ uint32_t __my_addr = (addr); uint32_t __my_data; __asm__ __volatile__ ("lda [%1] %2,%0" : "=r"(__my_data) : "r"(__my_addr),"i"(asi)); __my_data; })
50
51 static __inline uint32_t
52 read_psr(void)
53 {
54         uint32_t reg;
55         asm volatile ("mov %%psr,%0" : "=r"(reg));
56         return reg;
57 }
58
59 static __inline uint32_t
60 read_wim(void)
61 {
62         uint32_t reg;
63         asm volatile ("mov %%wim,%0" : "=r"(reg));
64         return reg;
65 }
66
67 static __inline uint32_t
68 read_tbr(void)
69 {
70         uint32_t reg;
71         asm volatile ("mov %%tbr,%0" : "=r"(reg));
72         return reg;
73 }
74
75 static __inline uint32_t
76 read_mmu_reg(uint32_t which)
77 {
78         return load_alternate(which,4);
79 }
80
81 static __inline uint32_t
82 read_y(void)
83 {
84         uint32_t reg;
85         asm volatile ("mov %%y,%0" : "=r"(reg));
86         return reg;
87 }
88
89 static __inline uint32_t
90 read_fsr(void)
91 {
92         uint32_t reg;
93         asm volatile ("st %%fsr,%0" : "=m"(reg));
94         return reg;
95 }
96
97 static __inline uint64_t
98 read_perfctr(uint32_t which)
99 {
100         uint32_t hi,lo;
101         intptr_t addr = which<<3;
102         hi = load_alternate(addr,2);
103         lo = load_alternate(addr+4,2);
104         return (((uint64_t)hi) << 32) | lo;
105 }
106
107 static __inline void
108 write_psr(uint32_t val)
109 {
110         asm volatile ("mov %0,%%psr; nop;nop;nop" : : "r"(val) : "memory");
111 }
112
113 static __inline void
114 write_wim(uint32_t val)
115 {
116         asm volatile ("mov %0,%%wim; nop;nop;nop" : : "r"(val) : "memory");
117 }
118
119 static __inline void
120 write_tbr(uint32_t val)
121 {
122         asm volatile ("mov %0,%%tbr; nop;nop;nop" : : "r"(val) : "memory");
123 }
124
125 static __inline void
126 write_mmu_reg(uint32_t which, uint32_t val)
127 {
128         store_alternate(which,4,val);
129 }
130
131 static __inline void
132 write_y(uint32_t val)
133 {
134         asm volatile ("mov %0,%%y; nop;nop;nop" : : "r"(val) : "memory");
135 }
136
137 static __inline void
138 write_fsr(uint32_t val)
139 {
140         asm volatile ("ld %0,%%fsr; nop;nop;nop" : : "m"(val) : "memory");
141 }
142
143 static __inline uint32_t
144 memsize_mb(void)
145 {
146         uint32_t reg;
147         __asm__ __volatile__("mov %" XSTR(MEMSIZE_MB_REG) ",%0" : "=r"(reg));
148         return reg;
149 }
150
151 static __inline uint32_t
152 num_cores(void)
153 {
154         uint32_t reg;
155         __asm__ __volatile__("mov %" XSTR(NUM_CORES_REG) ",%0" : "=r"(reg));
156         return reg;
157 }
158
159 static __inline uint32_t
160 mmu_probe(uint32_t va)
161 {
162         return load_alternate(va & ~0xFFF | 0x400, 3);
163 }
164
165 #endif /* !__ASSEMBLER__ */
166
167 #endif /* !ROS_INC_X86_H */