Commit 5ef54116ea1c576995f0074b71400bf7bda08cf1

Authored by bellard
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
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;
... ...