Commit 93ac68bca5a3332ffacd7bf10e7b9c4cfdab6374
1 parent
1e43adfc
sparc emulation target (thanx to Thomas M. Ogrisegg)
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@388 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
4 changed files
with
115 additions
and
12 deletions
cpu-all.h
@@ -188,6 +188,56 @@ static inline void stfq(void *ptr, double v) | @@ -188,6 +188,56 @@ static inline void stfq(void *ptr, double v) | ||
188 | } | 188 | } |
189 | #endif | 189 | #endif |
190 | 190 | ||
191 | +#elif defined(TARGET_WORDS_BIGENDIAN) && !defined(WORDS_BIGENDIAN) | ||
192 | + | ||
193 | +static inline int lduw(void *ptr) | ||
194 | +{ | ||
195 | + uint8_t *b = (uint8_t *) ptr; | ||
196 | + return (b[0]<<8|b[1]); | ||
197 | +} | ||
198 | + | ||
199 | +static inline int ldsw(void *ptr) | ||
200 | +{ | ||
201 | + int8_t *b = (int8_t *) ptr; | ||
202 | + return (b[0]<<8|b[1]); | ||
203 | +} | ||
204 | + | ||
205 | +static inline int ldl(void *ptr) | ||
206 | +{ | ||
207 | + uint8_t *b = (uint8_t *) ptr; | ||
208 | + return (b[0]<<24|b[1]<<16|b[2]<<8|b[3]); | ||
209 | +} | ||
210 | + | ||
211 | +static inline uint64_t ldq(void *ptr) | ||
212 | +{ | ||
213 | + uint32_t a,b; | ||
214 | + a = ldl (ptr); | ||
215 | + b = ldl (ptr+4); | ||
216 | + return (((uint64_t)a<<32)|b); | ||
217 | +} | ||
218 | + | ||
219 | +static inline void stw(void *ptr, int v) | ||
220 | +{ | ||
221 | + uint8_t *d = (uint8_t *) ptr; | ||
222 | + d[0] = v >> 8; | ||
223 | + d[1] = v; | ||
224 | +} | ||
225 | + | ||
226 | +static inline void stl(void *ptr, int v) | ||
227 | +{ | ||
228 | + uint8_t *d = (uint8_t *) ptr; | ||
229 | + d[0] = v >> 24; | ||
230 | + d[1] = v >> 16; | ||
231 | + d[2] = v >> 8; | ||
232 | + d[3] = v; | ||
233 | +} | ||
234 | + | ||
235 | +static inline void stq(void *ptr, uint64_t v) | ||
236 | +{ | ||
237 | + stl (ptr, v); | ||
238 | + stl (ptr+4, v >> 32); | ||
239 | +} | ||
240 | + | ||
191 | #else | 241 | #else |
192 | 242 | ||
193 | static inline int lduw(void *ptr) | 243 | static inline int lduw(void *ptr) |
@@ -297,6 +347,15 @@ void page_unprotect_range(uint8_t *data, unsigned long data_size); | @@ -297,6 +347,15 @@ void page_unprotect_range(uint8_t *data, unsigned long data_size); | ||
297 | #define cpu_interrupt cpu_arm_interrupt | 347 | #define cpu_interrupt cpu_arm_interrupt |
298 | #define cpu_signal_handler cpu_arm_signal_handler | 348 | #define cpu_signal_handler cpu_arm_signal_handler |
299 | 349 | ||
350 | +#elif defined(TARGET_SPARC) | ||
351 | + | ||
352 | +#define CPUState CPUSPARCState | ||
353 | +#define cpu_init cpu_sparc_init | ||
354 | +#define cpu_exec cpu_sparc_exec | ||
355 | +#define cpu_gen_code cpu_sparc_gen_code | ||
356 | +#define cpu_interrupt cpu_sparc_interrupt | ||
357 | +#define cpu_signal_handler cpu_sparc_signal_handler | ||
358 | + | ||
300 | #else | 359 | #else |
301 | 360 | ||
302 | #error unsupported target CPU | 361 | #error unsupported target CPU |
cpu-exec.c
@@ -18,19 +18,13 @@ | @@ -18,19 +18,13 @@ | ||
18 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | 18 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
19 | */ | 19 | */ |
20 | #include "config.h" | 20 | #include "config.h" |
21 | -#ifdef TARGET_I386 | ||
22 | -#include "exec-i386.h" | ||
23 | -#endif | ||
24 | -#ifdef TARGET_ARM | ||
25 | -#include "exec-arm.h" | ||
26 | -#endif | ||
27 | - | 21 | +#include "exec.h" |
28 | #include "disas.h" | 22 | #include "disas.h" |
29 | 23 | ||
30 | //#define DEBUG_EXEC | 24 | //#define DEBUG_EXEC |
31 | //#define DEBUG_SIGNAL | 25 | //#define DEBUG_SIGNAL |
32 | 26 | ||
33 | -#if defined(TARGET_ARM) | 27 | +#if defined(TARGET_ARM) || defined(TARGET_SPARC) |
34 | /* XXX: unify with i386 target */ | 28 | /* XXX: unify with i386 target */ |
35 | void cpu_loop_exit(void) | 29 | void cpu_loop_exit(void) |
36 | { | 30 | { |
@@ -136,6 +130,7 @@ int cpu_exec(CPUState *env1) | @@ -136,6 +130,7 @@ int cpu_exec(CPUState *env1) | ||
136 | env->VF = (psr << 3) & 0x80000000; | 130 | env->VF = (psr << 3) & 0x80000000; |
137 | env->cpsr = psr & ~0xf0000000; | 131 | env->cpsr = psr & ~0xf0000000; |
138 | } | 132 | } |
133 | +#elif defined(TARGET_SPARC) | ||
139 | #else | 134 | #else |
140 | #error unsupported target CPU | 135 | #error unsupported target CPU |
141 | #endif | 136 | #endif |
@@ -229,6 +224,8 @@ int cpu_exec(CPUState *env1) | @@ -229,6 +224,8 @@ int cpu_exec(CPUState *env1) | ||
229 | env->cpsr = compute_cpsr(); | 224 | env->cpsr = compute_cpsr(); |
230 | cpu_arm_dump_state(env, logfile, 0); | 225 | cpu_arm_dump_state(env, logfile, 0); |
231 | env->cpsr &= ~0xf0000000; | 226 | env->cpsr &= ~0xf0000000; |
227 | +#elif defined(TARGET_SPARC) | ||
228 | + cpu_sparc_dump_state (env, logfile, 0); | ||
232 | #else | 229 | #else |
233 | #error unsupported target CPU | 230 | #error unsupported target CPU |
234 | #endif | 231 | #endif |
@@ -246,6 +243,14 @@ int cpu_exec(CPUState *env1) | @@ -246,6 +243,14 @@ int cpu_exec(CPUState *env1) | ||
246 | flags = 0; | 243 | flags = 0; |
247 | cs_base = 0; | 244 | cs_base = 0; |
248 | pc = (uint8_t *)env->regs[15]; | 245 | pc = (uint8_t *)env->regs[15]; |
246 | +#elif defined(TARGET_SPARC) | ||
247 | + flags = 0; | ||
248 | + cs_base = 0; | ||
249 | + if (env->npc) { | ||
250 | + env->pc = env->npc; | ||
251 | + env->npc = 0; | ||
252 | + } | ||
253 | + pc = (uint8_t *) env->pc; | ||
249 | #else | 254 | #else |
250 | #error unsupported CPU | 255 | #error unsupported CPU |
251 | #endif | 256 | #endif |
@@ -358,6 +363,7 @@ int cpu_exec(CPUState *env1) | @@ -358,6 +363,7 @@ int cpu_exec(CPUState *env1) | ||
358 | #endif | 363 | #endif |
359 | #elif defined(TARGET_ARM) | 364 | #elif defined(TARGET_ARM) |
360 | env->cpsr = compute_cpsr(); | 365 | env->cpsr = compute_cpsr(); |
366 | +#elif defined(TARGET_SPARC) | ||
361 | #else | 367 | #else |
362 | #error unsupported target CPU | 368 | #error unsupported target CPU |
363 | #endif | 369 | #endif |
@@ -488,6 +494,12 @@ static inline int handle_cpu_signal(unsigned long pc, unsigned long address, | @@ -488,6 +494,12 @@ static inline int handle_cpu_signal(unsigned long pc, unsigned long address, | ||
488 | /* XXX: do more */ | 494 | /* XXX: do more */ |
489 | return 0; | 495 | return 0; |
490 | } | 496 | } |
497 | +#elif defined(TARGET_SPARC) | ||
498 | +static inline int handle_cpu_signal(unsigned long pc, unsigned long address, | ||
499 | + int is_write, sigset_t *old_set) | ||
500 | +{ | ||
501 | + return 0; | ||
502 | +} | ||
491 | #else | 503 | #else |
492 | #error unsupported target CPU | 504 | #error unsupported target CPU |
493 | #endif | 505 | #endif |
disas.c
@@ -142,6 +142,8 @@ void disas(FILE *out, void *code, unsigned long size, int is_host, int flags) | @@ -142,6 +142,8 @@ void disas(FILE *out, void *code, unsigned long size, int is_host, int flags) | ||
142 | print_insn = print_insn_i386; | 142 | print_insn = print_insn_i386; |
143 | #elif defined(TARGET_ARM) | 143 | #elif defined(TARGET_ARM) |
144 | print_insn = print_insn_arm; | 144 | print_insn = print_insn_arm; |
145 | +#elif defined(TARGET_SPARC) | ||
146 | + print_insn = print_insn_sparc; | ||
145 | #else | 147 | #else |
146 | fprintf(out, "Asm output not supported on this arch\n"); | 148 | fprintf(out, "Asm output not supported on this arch\n"); |
147 | return; | 149 | return; |
linux-user/main.c
1 | /* | 1 | /* |
2 | - * qemu main | 2 | + * qemu user main |
3 | * | 3 | * |
4 | * Copyright (c) 2003 Fabrice Bellard | 4 | * Copyright (c) 2003 Fabrice Bellard |
5 | * | 5 | * |
@@ -38,7 +38,7 @@ static const char *interp_prefix = CONFIG_QEMU_PREFIX; | @@ -38,7 +38,7 @@ static const char *interp_prefix = CONFIG_QEMU_PREFIX; | ||
38 | const char interp[] __attribute__((section(".interp"))) = "/lib/ld-linux.so.2"; | 38 | const char interp[] __attribute__((section(".interp"))) = "/lib/ld-linux.so.2"; |
39 | #endif | 39 | #endif |
40 | 40 | ||
41 | -/* for recent libc, we add these dummies symbol which are not declared | 41 | +/* for recent libc, we add these dummy symbols which are not declared |
42 | when generating a linked object (bug in ld ?) */ | 42 | when generating a linked object (bug in ld ?) */ |
43 | #if __GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 3) | 43 | #if __GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 3) |
44 | long __init_array_start[0]; | 44 | long __init_array_start[0]; |
@@ -299,10 +299,37 @@ void cpu_loop(CPUARMState *env) | @@ -299,10 +299,37 @@ void cpu_loop(CPUARMState *env) | ||
299 | 299 | ||
300 | #endif | 300 | #endif |
301 | 301 | ||
302 | +#ifdef TARGET_SPARC | ||
303 | + | ||
304 | +void cpu_loop (CPUSPARCState *env) | ||
305 | +{ | ||
306 | + int trapnr; | ||
307 | + | ||
308 | + while (1) { | ||
309 | + trapnr = cpu_sparc_exec (env); | ||
310 | + | ||
311 | + switch (trapnr) { | ||
312 | + case 0x8: case 0x10: | ||
313 | + env->regwptr[0] = do_syscall (env, env->gregs[1], | ||
314 | + env->regwptr[0], env->regwptr[1], env->regwptr[2], | ||
315 | + env->regwptr[3], env->regwptr[4], env->regwptr[13]); | ||
316 | + if (env->regwptr[0] >= 0xffffffe0) | ||
317 | + env->psr |= PSR_CARRY; | ||
318 | + break; | ||
319 | + default: | ||
320 | + printf ("Invalid trap: %d\n", trapnr); | ||
321 | + exit (1); | ||
322 | + } | ||
323 | + process_pending_signals (env); | ||
324 | + } | ||
325 | +} | ||
326 | + | ||
327 | +#endif | ||
328 | + | ||
302 | void usage(void) | 329 | void usage(void) |
303 | { | 330 | { |
304 | - printf("qemu version " QEMU_VERSION ", Copyright (c) 2003 Fabrice Bellard\n" | ||
305 | - "usage: qemu [-h] [-d] [-L path] [-s size] program [arguments...]\n" | 331 | + printf("qemu-" TARGET_ARCH " version " QEMU_VERSION ", Copyright (c) 2003 Fabrice Bellard\n" |
332 | + "usage: qemu-" TARGET_ARCH " [-h] [-d] [-L path] [-s size] program [arguments...]\n" | ||
306 | "Linux CPU emulator (compiled for %s emulation)\n" | 333 | "Linux CPU emulator (compiled for %s emulation)\n" |
307 | "\n" | 334 | "\n" |
308 | "-h print this help\n" | 335 | "-h print this help\n" |
@@ -497,6 +524,9 @@ int main(int argc, char **argv) | @@ -497,6 +524,9 @@ int main(int argc, char **argv) | ||
497 | } | 524 | } |
498 | env->cpsr = regs->uregs[16]; | 525 | env->cpsr = regs->uregs[16]; |
499 | } | 526 | } |
527 | +#elif defined(TARGET_SPARC) | ||
528 | + env->pc = regs->u_regs[0]; | ||
529 | + env->regwptr[6] = regs->u_regs[1]-0x40; | ||
500 | #else | 530 | #else |
501 | #error unsupported target CPU | 531 | #error unsupported target CPU |
502 | #endif | 532 | #endif |