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 |