Revision 61382a50 cpu-all.h
b/cpu-all.h | ||
---|---|---|
20 | 20 |
#ifndef CPU_ALL_H |
21 | 21 |
#define CPU_ALL_H |
22 | 22 |
|
23 |
/* all CPU memory access use these macros */ |
|
24 |
static inline int ldub(void *ptr) |
|
23 |
/* CPU memory access without any memory or io remapping */ |
|
24 |
|
|
25 |
static inline int ldub_raw(void *ptr) |
|
25 | 26 |
{ |
26 | 27 |
return *(uint8_t *)ptr; |
27 | 28 |
} |
28 | 29 |
|
29 |
static inline int ldsb(void *ptr) |
|
30 |
static inline int ldsb_raw(void *ptr)
|
|
30 | 31 |
{ |
31 | 32 |
return *(int8_t *)ptr; |
32 | 33 |
} |
33 | 34 |
|
34 |
static inline void stb(void *ptr, int v) |
|
35 |
static inline void stb_raw(void *ptr, int v)
|
|
35 | 36 |
{ |
36 | 37 |
*(uint8_t *)ptr = v; |
37 | 38 |
} |
... | ... | |
42 | 43 |
#if defined(WORDS_BIGENDIAN) || defined(__arm__) |
43 | 44 |
|
44 | 45 |
/* conservative code for little endian unaligned accesses */ |
45 |
static inline int lduw(void *ptr) |
|
46 |
static inline int lduw_raw(void *ptr)
|
|
46 | 47 |
{ |
47 | 48 |
#ifdef __powerpc__ |
48 | 49 |
int val; |
... | ... | |
54 | 55 |
#endif |
55 | 56 |
} |
56 | 57 |
|
57 |
static inline int ldsw(void *ptr) |
|
58 |
static inline int ldsw_raw(void *ptr)
|
|
58 | 59 |
{ |
59 | 60 |
#ifdef __powerpc__ |
60 | 61 |
int val; |
... | ... | |
66 | 67 |
#endif |
67 | 68 |
} |
68 | 69 |
|
69 |
static inline int ldl(void *ptr) |
|
70 |
static inline int ldl_raw(void *ptr)
|
|
70 | 71 |
{ |
71 | 72 |
#ifdef __powerpc__ |
72 | 73 |
int val; |
... | ... | |
78 | 79 |
#endif |
79 | 80 |
} |
80 | 81 |
|
81 |
static inline uint64_t ldq(void *ptr) |
|
82 |
static inline uint64_t ldq_raw(void *ptr)
|
|
82 | 83 |
{ |
83 | 84 |
uint8_t *p = ptr; |
84 | 85 |
uint32_t v1, v2; |
85 |
v1 = ldl(p); |
|
86 |
v2 = ldl(p + 4); |
|
86 |
v1 = ldl_raw(p);
|
|
87 |
v2 = ldl_raw(p + 4);
|
|
87 | 88 |
return v1 | ((uint64_t)v2 << 32); |
88 | 89 |
} |
89 | 90 |
|
90 |
static inline void stw(void *ptr, int v) |
|
91 |
static inline void stw_raw(void *ptr, int v)
|
|
91 | 92 |
{ |
92 | 93 |
#ifdef __powerpc__ |
93 | 94 |
__asm__ __volatile__ ("sthbrx %1,0,%2" : "=m" (*(uint16_t *)ptr) : "r" (v), "r" (ptr)); |
... | ... | |
98 | 99 |
#endif |
99 | 100 |
} |
100 | 101 |
|
101 |
static inline void stl(void *ptr, int v) |
|
102 |
static inline void stl_raw(void *ptr, int v)
|
|
102 | 103 |
{ |
103 | 104 |
#ifdef __powerpc__ |
104 | 105 |
__asm__ __volatile__ ("stwbrx %1,0,%2" : "=m" (*(uint32_t *)ptr) : "r" (v), "r" (ptr)); |
... | ... | |
111 | 112 |
#endif |
112 | 113 |
} |
113 | 114 |
|
114 |
static inline void stq(void *ptr, uint64_t v) |
|
115 |
static inline void stq_raw(void *ptr, uint64_t v)
|
|
115 | 116 |
{ |
116 | 117 |
uint8_t *p = ptr; |
117 |
stl(p, (uint32_t)v); |
|
118 |
stl(p + 4, v >> 32); |
|
118 |
stl_raw(p, (uint32_t)v);
|
|
119 |
stl_raw(p + 4, v >> 32);
|
|
119 | 120 |
} |
120 | 121 |
|
121 | 122 |
/* float access */ |
122 | 123 |
|
123 |
static inline float ldfl(void *ptr) |
|
124 |
static inline float ldfl_raw(void *ptr)
|
|
124 | 125 |
{ |
125 | 126 |
union { |
126 | 127 |
float f; |
127 | 128 |
uint32_t i; |
128 | 129 |
} u; |
129 |
u.i = ldl(ptr); |
|
130 |
u.i = ldl_raw(ptr);
|
|
130 | 131 |
return u.f; |
131 | 132 |
} |
132 | 133 |
|
133 |
static inline void stfl(void *ptr, float v) |
|
134 |
static inline void stfl_raw(void *ptr, float v)
|
|
134 | 135 |
{ |
135 | 136 |
union { |
136 | 137 |
float f; |
137 | 138 |
uint32_t i; |
138 | 139 |
} u; |
139 | 140 |
u.f = v; |
140 |
stl(ptr, u.i); |
|
141 |
stl_raw(ptr, u.i);
|
|
141 | 142 |
} |
142 | 143 |
|
143 | 144 |
|
144 | 145 |
#if defined(__arm__) && !defined(WORDS_BIGENDIAN) |
145 | 146 |
|
146 | 147 |
/* NOTE: arm is horrible as double 32 bit words are stored in big endian ! */ |
147 |
static inline double ldfq(void *ptr) |
|
148 |
static inline double ldfq_raw(void *ptr)
|
|
148 | 149 |
{ |
149 | 150 |
union { |
150 | 151 |
double d; |
151 | 152 |
uint32_t tab[2]; |
152 | 153 |
} u; |
153 |
u.tab[1] = ldl(ptr); |
|
154 |
u.tab[0] = ldl(ptr + 4); |
|
154 |
u.tab[1] = ldl_raw(ptr);
|
|
155 |
u.tab[0] = ldl_raw(ptr + 4);
|
|
155 | 156 |
return u.d; |
156 | 157 |
} |
157 | 158 |
|
158 |
static inline void stfq(void *ptr, double v) |
|
159 |
static inline void stfq_raw(void *ptr, double v)
|
|
159 | 160 |
{ |
160 | 161 |
union { |
161 | 162 |
double d; |
162 | 163 |
uint32_t tab[2]; |
163 | 164 |
} u; |
164 | 165 |
u.d = v; |
165 |
stl(ptr, u.tab[1]); |
|
166 |
stl(ptr + 4, u.tab[0]); |
|
166 |
stl_raw(ptr, u.tab[1]);
|
|
167 |
stl_raw(ptr + 4, u.tab[0]);
|
|
167 | 168 |
} |
168 | 169 |
|
169 | 170 |
#else |
170 |
static inline double ldfq(void *ptr) |
|
171 |
static inline double ldfq_raw(void *ptr)
|
|
171 | 172 |
{ |
172 | 173 |
union { |
173 | 174 |
double d; |
174 | 175 |
uint64_t i; |
175 | 176 |
} u; |
176 |
u.i = ldq(ptr); |
|
177 |
u.i = ldq_raw(ptr);
|
|
177 | 178 |
return u.d; |
178 | 179 |
} |
179 | 180 |
|
180 |
static inline void stfq(void *ptr, double v) |
|
181 |
static inline void stfq_raw(void *ptr, double v)
|
|
181 | 182 |
{ |
182 | 183 |
union { |
183 | 184 |
double d; |
184 | 185 |
uint64_t i; |
185 | 186 |
} u; |
186 | 187 |
u.d = v; |
187 |
stq(ptr, u.i); |
|
188 |
stq_raw(ptr, u.i);
|
|
188 | 189 |
} |
189 | 190 |
#endif |
190 | 191 |
|
191 | 192 |
#elif defined(TARGET_WORDS_BIGENDIAN) && !defined(WORDS_BIGENDIAN) |
192 | 193 |
|
193 |
static inline int lduw(void *ptr) |
|
194 |
static inline int lduw_raw(void *ptr)
|
|
194 | 195 |
{ |
195 | 196 |
uint8_t *b = (uint8_t *) ptr; |
196 | 197 |
return (b[0]<<8|b[1]); |
197 | 198 |
} |
198 | 199 |
|
199 |
static inline int ldsw(void *ptr) |
|
200 |
static inline int ldsw_raw(void *ptr)
|
|
200 | 201 |
{ |
201 | 202 |
int8_t *b = (int8_t *) ptr; |
202 | 203 |
return (b[0]<<8|b[1]); |
203 | 204 |
} |
204 | 205 |
|
205 |
static inline int ldl(void *ptr) |
|
206 |
static inline int ldl_raw(void *ptr)
|
|
206 | 207 |
{ |
207 | 208 |
uint8_t *b = (uint8_t *) ptr; |
208 | 209 |
return (b[0]<<24|b[1]<<16|b[2]<<8|b[3]); |
209 | 210 |
} |
210 | 211 |
|
211 |
static inline uint64_t ldq(void *ptr) |
|
212 |
static inline uint64_t ldq_raw(void *ptr)
|
|
212 | 213 |
{ |
213 | 214 |
uint32_t a,b; |
214 | 215 |
a = ldl (ptr); |
... | ... | |
216 | 217 |
return (((uint64_t)a<<32)|b); |
217 | 218 |
} |
218 | 219 |
|
219 |
static inline void stw(void *ptr, int v) |
|
220 |
static inline void stw_raw(void *ptr, int v)
|
|
220 | 221 |
{ |
221 | 222 |
uint8_t *d = (uint8_t *) ptr; |
222 | 223 |
d[0] = v >> 8; |
223 | 224 |
d[1] = v; |
224 | 225 |
} |
225 | 226 |
|
226 |
static inline void stl(void *ptr, int v) |
|
227 |
static inline void stl_raw(void *ptr, int v)
|
|
227 | 228 |
{ |
228 | 229 |
uint8_t *d = (uint8_t *) ptr; |
229 | 230 |
d[0] = v >> 24; |
... | ... | |
232 | 233 |
d[3] = v; |
233 | 234 |
} |
234 | 235 |
|
235 |
static inline void stq(void *ptr, uint64_t v) |
|
236 |
static inline void stq_raw(void *ptr, uint64_t v)
|
|
236 | 237 |
{ |
237 | 238 |
stl (ptr, v); |
238 | 239 |
stl (ptr+4, v >> 32); |
... | ... | |
240 | 241 |
|
241 | 242 |
#else |
242 | 243 |
|
243 |
static inline int lduw(void *ptr) |
|
244 |
static inline int lduw_raw(void *ptr)
|
|
244 | 245 |
{ |
245 | 246 |
return *(uint16_t *)ptr; |
246 | 247 |
} |
247 | 248 |
|
248 |
static inline int ldsw(void *ptr) |
|
249 |
static inline int ldsw_raw(void *ptr)
|
|
249 | 250 |
{ |
250 | 251 |
return *(int16_t *)ptr; |
251 | 252 |
} |
252 | 253 |
|
253 |
static inline int ldl(void *ptr) |
|
254 |
static inline int ldl_raw(void *ptr)
|
|
254 | 255 |
{ |
255 | 256 |
return *(uint32_t *)ptr; |
256 | 257 |
} |
257 | 258 |
|
258 |
static inline uint64_t ldq(void *ptr) |
|
259 |
static inline uint64_t ldq_raw(void *ptr)
|
|
259 | 260 |
{ |
260 | 261 |
return *(uint64_t *)ptr; |
261 | 262 |
} |
262 | 263 |
|
263 |
static inline void stw(void *ptr, int v) |
|
264 |
static inline void stw_raw(void *ptr, int v)
|
|
264 | 265 |
{ |
265 | 266 |
*(uint16_t *)ptr = v; |
266 | 267 |
} |
267 | 268 |
|
268 |
static inline void stl(void *ptr, int v) |
|
269 |
static inline void stl_raw(void *ptr, int v)
|
|
269 | 270 |
{ |
270 | 271 |
*(uint32_t *)ptr = v; |
271 | 272 |
} |
272 | 273 |
|
273 |
static inline void stq(void *ptr, uint64_t v) |
|
274 |
static inline void stq_raw(void *ptr, uint64_t v)
|
|
274 | 275 |
{ |
275 | 276 |
*(uint64_t *)ptr = v; |
276 | 277 |
} |
277 | 278 |
|
278 | 279 |
/* float access */ |
279 | 280 |
|
280 |
static inline float ldfl(void *ptr) |
|
281 |
static inline float ldfl_raw(void *ptr)
|
|
281 | 282 |
{ |
282 | 283 |
return *(float *)ptr; |
283 | 284 |
} |
284 | 285 |
|
285 |
static inline double ldfq(void *ptr) |
|
286 |
static inline double ldfq_raw(void *ptr)
|
|
286 | 287 |
{ |
287 | 288 |
return *(double *)ptr; |
288 | 289 |
} |
289 | 290 |
|
290 |
static inline void stfl(void *ptr, float v) |
|
291 |
static inline void stfl_raw(void *ptr, float v)
|
|
291 | 292 |
{ |
292 | 293 |
*(float *)ptr = v; |
293 | 294 |
} |
294 | 295 |
|
295 |
static inline void stfq(void *ptr, double v) |
|
296 |
static inline void stfq_raw(void *ptr, double v)
|
|
296 | 297 |
{ |
297 | 298 |
*(double *)ptr = v; |
298 | 299 |
} |
299 | 300 |
#endif |
300 | 301 |
|
302 |
/* MMU memory access macros */ |
|
303 |
|
|
304 |
#if defined(CONFIG_USER_ONLY) |
|
305 |
|
|
306 |
/* if user mode, no other memory access functions */ |
|
307 |
#define ldub(p) ldub_raw(p) |
|
308 |
#define ldsb(p) ldsb_raw(p) |
|
309 |
#define lduw(p) lduw_raw(p) |
|
310 |
#define ldsw(p) ldsw_raw(p) |
|
311 |
#define ldl(p) ldl_raw(p) |
|
312 |
#define ldq(p) ldq_raw(p) |
|
313 |
#define ldfl(p) ldfl_raw(p) |
|
314 |
#define ldfq(p) ldfq_raw(p) |
|
315 |
#define stb(p, v) stb_raw(p, v) |
|
316 |
#define stw(p, v) stw_raw(p, v) |
|
317 |
#define stl(p, v) stl_raw(p, v) |
|
318 |
#define stq(p, v) stq_raw(p, v) |
|
319 |
#define stfl(p, v) stfl_raw(p, v) |
|
320 |
#define stfq(p, v) stfq_raw(p, v) |
|
321 |
|
|
322 |
#define ldub_code(p) ldub_raw(p) |
|
323 |
#define ldsb_code(p) ldsb_raw(p) |
|
324 |
#define lduw_code(p) lduw_raw(p) |
|
325 |
#define ldsw_code(p) ldsw_raw(p) |
|
326 |
#define ldl_code(p) ldl_raw(p) |
|
327 |
|
|
328 |
#define ldub_kernel(p) ldub_raw(p) |
|
329 |
#define ldsb_kernel(p) ldsb_raw(p) |
|
330 |
#define lduw_kernel(p) lduw_raw(p) |
|
331 |
#define ldsw_kernel(p) ldsw_raw(p) |
|
332 |
#define ldl_kernel(p) ldl_raw(p) |
|
333 |
#define stb_kernel(p, v) stb_raw(p, v) |
|
334 |
#define stw_kernel(p, v) stw_raw(p, v) |
|
335 |
#define stl_kernel(p, v) stl_raw(p, v) |
|
336 |
#define stq_kernel(p, v) stq_raw(p, v) |
|
337 |
|
|
338 |
#endif /* defined(CONFIG_USER_ONLY) */ |
|
339 |
|
|
301 | 340 |
/* page related stuff */ |
302 | 341 |
|
303 | 342 |
#define TARGET_PAGE_SIZE (1 << TARGET_PAGE_BITS) |
Also available in: Unified diff