Commit e6bf7d70b5a459f96f0b2cbc677926eebe685c84

Authored by blueswir1
1 parent 2cade6a3

Fix saving and loading of trap state

git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@4883 c046a42c-6fe2-441c-8c8c-71466251a162
target-sparc/helper.c
@@ -742,6 +742,14 @@ void do_interrupt(CPUState *env) @@ -742,6 +742,14 @@ void do_interrupt(CPUState *env)
742 return; 742 return;
743 } 743 }
744 #endif 744 #endif
  745 + if (env->tl < MAXTL - 1) {
  746 + env->tl++;
  747 + } else {
  748 + env->pstate |= PS_RED;
  749 + if (env->tl != MAXTL)
  750 + env->tl++;
  751 + }
  752 + env->tsptr = &env->ts[env->tl];
745 env->tsptr->tstate = ((uint64_t)GET_CCR(env) << 32) | 753 env->tsptr->tstate = ((uint64_t)GET_CCR(env) << 32) |
746 ((env->asi & 0xff) << 24) | ((env->pstate & 0xf3f) << 8) | 754 ((env->asi & 0xff) << 24) | ((env->pstate & 0xf3f) << 8) |
747 GET_CWP64(env); 755 GET_CWP64(env);
@@ -758,14 +766,6 @@ void do_interrupt(CPUState *env) @@ -758,14 +766,6 @@ void do_interrupt(CPUState *env)
758 cpu_set_cwp(env, cpu_cwp_inc(env, env->cwp + 1)); 766 cpu_set_cwp(env, cpu_cwp_inc(env, env->cwp + 1));
759 env->tbr &= ~0x7fffULL; 767 env->tbr &= ~0x7fffULL;
760 env->tbr |= ((env->tl > 1) ? 1 << 14 : 0) | (intno << 5); 768 env->tbr |= ((env->tl > 1) ? 1 << 14 : 0) | (intno << 5);
761 - if (env->tl < MAXTL - 1) {  
762 - env->tl++;  
763 - } else {  
764 - env->pstate |= PS_RED;  
765 - if (env->tl != MAXTL)  
766 - env->tl++;  
767 - }  
768 - env->tsptr = &env->ts[env->tl];  
769 env->pc = env->tbr; 769 env->pc = env->tbr;
770 env->npc = env->pc + 4; 770 env->npc = env->pc + 4;
771 env->exception_index = 0; 771 env->exception_index = 0;
target-sparc/op_helper.c
@@ -2680,26 +2680,26 @@ void helper_wrpstate(target_ulong new_state) @@ -2680,26 +2680,26 @@ void helper_wrpstate(target_ulong new_state)
2680 2680
2681 void helper_done(void) 2681 void helper_done(void)
2682 { 2682 {
2683 - env->tl--;  
2684 - env->tsptr = &env->ts[env->tl];  
2685 env->pc = env->tsptr->tpc; 2683 env->pc = env->tsptr->tpc;
2686 env->npc = env->tsptr->tnpc + 4; 2684 env->npc = env->tsptr->tnpc + 4;
2687 PUT_CCR(env, env->tsptr->tstate >> 32); 2685 PUT_CCR(env, env->tsptr->tstate >> 32);
2688 env->asi = (env->tsptr->tstate >> 24) & 0xff; 2686 env->asi = (env->tsptr->tstate >> 24) & 0xff;
2689 change_pstate((env->tsptr->tstate >> 8) & 0xf3f); 2687 change_pstate((env->tsptr->tstate >> 8) & 0xf3f);
2690 PUT_CWP64(env, env->tsptr->tstate & 0xff); 2688 PUT_CWP64(env, env->tsptr->tstate & 0xff);
  2689 + env->tl--;
  2690 + env->tsptr = &env->ts[env->tl];
2691 } 2691 }
2692 2692
2693 void helper_retry(void) 2693 void helper_retry(void)
2694 { 2694 {
2695 - env->tl--;  
2696 - env->tsptr = &env->ts[env->tl];  
2697 env->pc = env->tsptr->tpc; 2695 env->pc = env->tsptr->tpc;
2698 env->npc = env->tsptr->tnpc; 2696 env->npc = env->tsptr->tnpc;
2699 PUT_CCR(env, env->tsptr->tstate >> 32); 2697 PUT_CCR(env, env->tsptr->tstate >> 32);
2700 env->asi = (env->tsptr->tstate >> 24) & 0xff; 2698 env->asi = (env->tsptr->tstate >> 24) & 0xff;
2701 change_pstate((env->tsptr->tstate >> 8) & 0xf3f); 2699 change_pstate((env->tsptr->tstate >> 8) & 0xf3f);
2702 PUT_CWP64(env, env->tsptr->tstate & 0xff); 2700 PUT_CWP64(env, env->tsptr->tstate & 0xff);
  2701 + env->tl--;
  2702 + env->tsptr = &env->ts[env->tl];
2703 } 2703 }
2704 #endif 2704 #endif
2705 2705