Commit 5ef54116 authored by bellard's avatar bellard
Browse files

Sparc64 user emulator fixes (Blue Swirl)


git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@2063 c046a42c-6fe2-441c-8c8c-71466251a162
parent 725cb90b
......@@ -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;
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment