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; | ... | ... |