Commit ed23fbd91c182b0629783b202edbd9a8a1bd6369
1 parent
e6afc2f4
Add correct stack bias if a 64 bit stack is used
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@5113 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
1 changed file
with
9 additions
and
0 deletions
linux-user/main.c
@@ -758,6 +758,7 @@ void cpu_loop(CPUARMState *env) | @@ -758,6 +758,7 @@ void cpu_loop(CPUARMState *env) | ||
758 | #endif | 758 | #endif |
759 | 759 | ||
760 | #ifdef TARGET_SPARC | 760 | #ifdef TARGET_SPARC |
761 | +#define SPARC64_STACK_BIAS 2047 | ||
761 | 762 | ||
762 | //#define DEBUG_WIN | 763 | //#define DEBUG_WIN |
763 | 764 | ||
@@ -780,6 +781,10 @@ static inline void save_window_offset(CPUSPARCState *env, int cwp1) | @@ -780,6 +781,10 @@ static inline void save_window_offset(CPUSPARCState *env, int cwp1) | ||
780 | abi_ulong sp_ptr; | 781 | abi_ulong sp_ptr; |
781 | 782 | ||
782 | sp_ptr = env->regbase[get_reg_index(env, cwp1, 6)]; | 783 | sp_ptr = env->regbase[get_reg_index(env, cwp1, 6)]; |
784 | +#ifdef TARGET_SPARC64 | ||
785 | + if (sp_ptr & 3) | ||
786 | + sp_ptr += SPARC64_STACK_BIAS; | ||
787 | +#endif | ||
783 | #if defined(DEBUG_WIN) | 788 | #if defined(DEBUG_WIN) |
784 | printf("win_overflow: sp_ptr=0x" TARGET_ABI_FMT_lx " save_cwp=%d\n", | 789 | printf("win_overflow: sp_ptr=0x" TARGET_ABI_FMT_lx " save_cwp=%d\n", |
785 | sp_ptr, cwp1); | 790 | sp_ptr, cwp1); |
@@ -822,6 +827,10 @@ static void restore_window(CPUSPARCState *env) | @@ -822,6 +827,10 @@ static void restore_window(CPUSPARCState *env) | ||
822 | /* restore the invalid window */ | 827 | /* restore the invalid window */ |
823 | cwp1 = cpu_cwp_inc(env, env->cwp + 1); | 828 | cwp1 = cpu_cwp_inc(env, env->cwp + 1); |
824 | sp_ptr = env->regbase[get_reg_index(env, cwp1, 6)]; | 829 | sp_ptr = env->regbase[get_reg_index(env, cwp1, 6)]; |
830 | +#ifdef TARGET_SPARC64 | ||
831 | + if (sp_ptr & 3) | ||
832 | + sp_ptr += SPARC64_STACK_BIAS; | ||
833 | +#endif | ||
825 | #if defined(DEBUG_WIN) | 834 | #if defined(DEBUG_WIN) |
826 | printf("win_underflow: sp_ptr=0x" TARGET_ABI_FMT_lx " load_cwp=%d\n", | 835 | printf("win_underflow: sp_ptr=0x" TARGET_ABI_FMT_lx " load_cwp=%d\n", |
827 | sp_ptr, cwp1); | 836 | sp_ptr, cwp1); |