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); |