mirror of
https://gitlab.com/qemu-project/qemu
synced 2024-11-05 20:35:44 +00:00
Sparc64 user emulator fixes (Blue Swirl)
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@2063 c046a42c-6fe2-441c-8c8c-71466251a162
This commit is contained in:
parent
725cb90bf7
commit
5ef54116ea
3 changed files with 31 additions and 3 deletions
|
@ -135,11 +135,13 @@ enum
|
|||
|
||||
#define ELF_START_MMAP 0x80000000
|
||||
|
||||
#define elf_check_arch(x) ( (x) == EM_SPARC )
|
||||
#define elf_check_arch(x) ( (x) == EM_SPARCV9 )
|
||||
|
||||
#define ELF_CLASS ELFCLASS64
|
||||
#define ELF_DATA ELFDATA2MSB
|
||||
#define ELF_ARCH EM_SPARC
|
||||
#define ELF_ARCH EM_SPARCV9
|
||||
|
||||
#define STACK_BIAS 2047
|
||||
|
||||
static inline void init_thread(struct target_pt_regs *regs, struct image_info *infop)
|
||||
{
|
||||
|
@ -147,7 +149,7 @@ static inline void init_thread(struct target_pt_regs *regs, struct image_info *i
|
|||
regs->pc = infop->entry;
|
||||
regs->npc = regs->pc + 4;
|
||||
regs->y = 0;
|
||||
regs->u_regs[14] = infop->start_stack - 16 * 4;
|
||||
regs->u_regs[14] = infop->start_stack - 16 * 8 - STACK_BIAS;
|
||||
}
|
||||
|
||||
#else
|
||||
|
|
|
@ -473,11 +473,17 @@ static inline void save_window_offset(CPUSPARCState *env, int cwp1)
|
|||
|
||||
static void save_window(CPUSPARCState *env)
|
||||
{
|
||||
#ifndef TARGET_SPARC64
|
||||
unsigned int new_wim;
|
||||
new_wim = ((env->wim >> 1) | (env->wim << (NWINDOWS - 1))) &
|
||||
((1LL << NWINDOWS) - 1);
|
||||
save_window_offset(env, (env->cwp - 2) & (NWINDOWS - 1));
|
||||
env->wim = new_wim;
|
||||
#else
|
||||
save_window_offset(env, (env->cwp - 2) & (NWINDOWS - 1));
|
||||
env->cansave++;
|
||||
env->canrestore--;
|
||||
#endif
|
||||
}
|
||||
|
||||
static void restore_window(CPUSPARCState *env)
|
||||
|
@ -500,6 +506,12 @@ static void restore_window(CPUSPARCState *env)
|
|||
sp_ptr += sizeof(target_ulong);
|
||||
}
|
||||
env->wim = new_wim;
|
||||
#ifdef TARGET_SPARC64
|
||||
env->canrestore++;
|
||||
if (env->cleanwin < NWINDOWS - 1)
|
||||
env->cleanwin++;
|
||||
env->cansave--;
|
||||
#endif
|
||||
}
|
||||
|
||||
static void flush_windows(CPUSPARCState *env)
|
||||
|
@ -532,8 +544,12 @@ void cpu_loop (CPUSPARCState *env)
|
|||
trapnr = cpu_sparc_exec (env);
|
||||
|
||||
switch (trapnr) {
|
||||
#ifndef TARGET_SPARC64
|
||||
case 0x88:
|
||||
case 0x90:
|
||||
#else
|
||||
case 0x16d:
|
||||
#endif
|
||||
ret = do_syscall (env, env->gregs[1],
|
||||
env->regwptr[0], env->regwptr[1],
|
||||
env->regwptr[2], env->regwptr[3],
|
||||
|
@ -574,6 +590,12 @@ void cpu_loop (CPUSPARCState *env)
|
|||
}
|
||||
break;
|
||||
#else
|
||||
case TT_SPILL: /* window overflow */
|
||||
save_window(env);
|
||||
break;
|
||||
case TT_FILL: /* window underflow */
|
||||
restore_window(env);
|
||||
break;
|
||||
// XXX
|
||||
#endif
|
||||
case EXCP_INTERRUPT:
|
||||
|
|
|
@ -2731,6 +2731,10 @@ void cpu_reset(CPUSPARCState *env)
|
|||
env->regwptr = env->regbase + (env->cwp * 16);
|
||||
#if defined(CONFIG_USER_ONLY)
|
||||
env->user_mode_only = 1;
|
||||
#ifdef TARGET_SPARC64
|
||||
env->cleanwin = NWINDOWS - 1;
|
||||
env->cansave = NWINDOWS - 1;
|
||||
#endif
|
||||
#else
|
||||
env->psrs = 1;
|
||||
env->psrps = 1;
|
||||
|
|
Loading…
Reference in a new issue