Commit 5ef54116ea1c576995f0074b71400bf7bda08cf1
1 parent
725cb90b
Sparc64 user emulator fixes (Blue Swirl)
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@2063 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
3 changed files
with
31 additions
and
3 deletions
linux-user/elfload.c
| ... | ... | @@ -135,11 +135,13 @@ enum |
| 135 | 135 | |
| 136 | 136 | #define ELF_START_MMAP 0x80000000 |
| 137 | 137 | |
| 138 | -#define elf_check_arch(x) ( (x) == EM_SPARC ) | |
| 138 | +#define elf_check_arch(x) ( (x) == EM_SPARCV9 ) | |
| 139 | 139 | |
| 140 | 140 | #define ELF_CLASS ELFCLASS64 |
| 141 | 141 | #define ELF_DATA ELFDATA2MSB |
| 142 | -#define ELF_ARCH EM_SPARC | |
| 142 | +#define ELF_ARCH EM_SPARCV9 | |
| 143 | + | |
| 144 | +#define STACK_BIAS 2047 | |
| 143 | 145 | |
| 144 | 146 | static inline void init_thread(struct target_pt_regs *regs, struct image_info *infop) |
| 145 | 147 | { |
| ... | ... | @@ -147,7 +149,7 @@ static inline void init_thread(struct target_pt_regs *regs, struct image_info *i |
| 147 | 149 | regs->pc = infop->entry; |
| 148 | 150 | regs->npc = regs->pc + 4; |
| 149 | 151 | regs->y = 0; |
| 150 | - regs->u_regs[14] = infop->start_stack - 16 * 4; | |
| 152 | + regs->u_regs[14] = infop->start_stack - 16 * 8 - STACK_BIAS; | |
| 151 | 153 | } |
| 152 | 154 | |
| 153 | 155 | #else | ... | ... |
linux-user/main.c
| ... | ... | @@ -473,11 +473,17 @@ static inline void save_window_offset(CPUSPARCState *env, int cwp1) |
| 473 | 473 | |
| 474 | 474 | static void save_window(CPUSPARCState *env) |
| 475 | 475 | { |
| 476 | +#ifndef TARGET_SPARC64 | |
| 476 | 477 | unsigned int new_wim; |
| 477 | 478 | new_wim = ((env->wim >> 1) | (env->wim << (NWINDOWS - 1))) & |
| 478 | 479 | ((1LL << NWINDOWS) - 1); |
| 479 | 480 | save_window_offset(env, (env->cwp - 2) & (NWINDOWS - 1)); |
| 480 | 481 | env->wim = new_wim; |
| 482 | +#else | |
| 483 | + save_window_offset(env, (env->cwp - 2) & (NWINDOWS - 1)); | |
| 484 | + env->cansave++; | |
| 485 | + env->canrestore--; | |
| 486 | +#endif | |
| 481 | 487 | } |
| 482 | 488 | |
| 483 | 489 | static void restore_window(CPUSPARCState *env) |
| ... | ... | @@ -500,6 +506,12 @@ static void restore_window(CPUSPARCState *env) |
| 500 | 506 | sp_ptr += sizeof(target_ulong); |
| 501 | 507 | } |
| 502 | 508 | env->wim = new_wim; |
| 509 | +#ifdef TARGET_SPARC64 | |
| 510 | + env->canrestore++; | |
| 511 | + if (env->cleanwin < NWINDOWS - 1) | |
| 512 | + env->cleanwin++; | |
| 513 | + env->cansave--; | |
| 514 | +#endif | |
| 503 | 515 | } |
| 504 | 516 | |
| 505 | 517 | static void flush_windows(CPUSPARCState *env) |
| ... | ... | @@ -532,8 +544,12 @@ void cpu_loop (CPUSPARCState *env) |
| 532 | 544 | trapnr = cpu_sparc_exec (env); |
| 533 | 545 | |
| 534 | 546 | switch (trapnr) { |
| 547 | +#ifndef TARGET_SPARC64 | |
| 535 | 548 | case 0x88: |
| 536 | 549 | case 0x90: |
| 550 | +#else | |
| 551 | + case 0x16d: | |
| 552 | +#endif | |
| 537 | 553 | ret = do_syscall (env, env->gregs[1], |
| 538 | 554 | env->regwptr[0], env->regwptr[1], |
| 539 | 555 | env->regwptr[2], env->regwptr[3], |
| ... | ... | @@ -574,6 +590,12 @@ void cpu_loop (CPUSPARCState *env) |
| 574 | 590 | } |
| 575 | 591 | break; |
| 576 | 592 | #else |
| 593 | + case TT_SPILL: /* window overflow */ | |
| 594 | + save_window(env); | |
| 595 | + break; | |
| 596 | + case TT_FILL: /* window underflow */ | |
| 597 | + restore_window(env); | |
| 598 | + break; | |
| 577 | 599 | // XXX |
| 578 | 600 | #endif |
| 579 | 601 | case EXCP_INTERRUPT: | ... | ... |
target-sparc/translate.c
| ... | ... | @@ -2731,6 +2731,10 @@ void cpu_reset(CPUSPARCState *env) |
| 2731 | 2731 | env->regwptr = env->regbase + (env->cwp * 16); |
| 2732 | 2732 | #if defined(CONFIG_USER_ONLY) |
| 2733 | 2733 | env->user_mode_only = 1; |
| 2734 | +#ifdef TARGET_SPARC64 | |
| 2735 | + env->cleanwin = NWINDOWS - 1; | |
| 2736 | + env->cansave = NWINDOWS - 1; | |
| 2737 | +#endif | |
| 2734 | 2738 | #else |
| 2735 | 2739 | env->psrs = 1; |
| 2736 | 2740 | env->psrps = 1; | ... | ... |