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 ...@@ -135,11 +135,13 @@ enum
#define ELF_START_MMAP 0x80000000 #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_CLASS ELFCLASS64
#define ELF_DATA ELFDATA2MSB #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) 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 ...@@ -147,7 +149,7 @@ static inline void init_thread(struct target_pt_regs *regs, struct image_info *i
regs->pc = infop->entry; regs->pc = infop->entry;
regs->npc = regs->pc + 4; regs->npc = regs->pc + 4;
regs->y = 0; regs->y = 0;
regs->u_regs[14] = infop->start_stack - 16 * 4; regs->u_regs[14] = infop->start_stack - 16 * 8 - STACK_BIAS;
} }
#else #else
......
...@@ -473,11 +473,17 @@ static inline void save_window_offset(CPUSPARCState *env, int cwp1) ...@@ -473,11 +473,17 @@ static inline void save_window_offset(CPUSPARCState *env, int cwp1)
static void save_window(CPUSPARCState *env) static void save_window(CPUSPARCState *env)
{ {
#ifndef TARGET_SPARC64
unsigned int new_wim; unsigned int new_wim;
new_wim = ((env->wim >> 1) | (env->wim << (NWINDOWS - 1))) & new_wim = ((env->wim >> 1) | (env->wim << (NWINDOWS - 1))) &
((1LL << NWINDOWS) - 1); ((1LL << NWINDOWS) - 1);
save_window_offset(env, (env->cwp - 2) & (NWINDOWS - 1)); save_window_offset(env, (env->cwp - 2) & (NWINDOWS - 1));
env->wim = new_wim; 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) static void restore_window(CPUSPARCState *env)
...@@ -500,6 +506,12 @@ static void restore_window(CPUSPARCState *env) ...@@ -500,6 +506,12 @@ static void restore_window(CPUSPARCState *env)
sp_ptr += sizeof(target_ulong); sp_ptr += sizeof(target_ulong);
} }
env->wim = new_wim; 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) static void flush_windows(CPUSPARCState *env)
...@@ -532,8 +544,12 @@ void cpu_loop (CPUSPARCState *env) ...@@ -532,8 +544,12 @@ void cpu_loop (CPUSPARCState *env)
trapnr = cpu_sparc_exec (env); trapnr = cpu_sparc_exec (env);
switch (trapnr) { switch (trapnr) {
#ifndef TARGET_SPARC64
case 0x88: case 0x88:
case 0x90: case 0x90:
#else
case 0x16d:
#endif
ret = do_syscall (env, env->gregs[1], ret = do_syscall (env, env->gregs[1],
env->regwptr[0], env->regwptr[1], env->regwptr[0], env->regwptr[1],
env->regwptr[2], env->regwptr[3], env->regwptr[2], env->regwptr[3],
...@@ -574,6 +590,12 @@ void cpu_loop (CPUSPARCState *env) ...@@ -574,6 +590,12 @@ void cpu_loop (CPUSPARCState *env)
} }
break; break;
#else #else
case TT_SPILL: /* window overflow */
save_window(env);
break;
case TT_FILL: /* window underflow */
restore_window(env);
break;
// XXX // XXX
#endif #endif
case EXCP_INTERRUPT: case EXCP_INTERRUPT:
......
...@@ -2731,6 +2731,10 @@ void cpu_reset(CPUSPARCState *env) ...@@ -2731,6 +2731,10 @@ void cpu_reset(CPUSPARCState *env)
env->regwptr = env->regbase + (env->cwp * 16); env->regwptr = env->regbase + (env->cwp * 16);
#if defined(CONFIG_USER_ONLY) #if defined(CONFIG_USER_ONLY)
env->user_mode_only = 1; env->user_mode_only = 1;
#ifdef TARGET_SPARC64
env->cleanwin = NWINDOWS - 1;
env->cansave = NWINDOWS - 1;
#endif
#else #else
env->psrs = 1; env->psrs = 1;
env->psrps = 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