Commit e6bf7d70b5a459f96f0b2cbc677926eebe685c84
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
Showing
2 changed files
with
12 additions
and
12 deletions
target-sparc/helper.c
... | ... | @@ -742,6 +742,14 @@ void do_interrupt(CPUState *env) |
742 | 742 | return; |
743 | 743 | } |
744 | 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 | 753 | env->tsptr->tstate = ((uint64_t)GET_CCR(env) << 32) | |
746 | 754 | ((env->asi & 0xff) << 24) | ((env->pstate & 0xf3f) << 8) | |
747 | 755 | GET_CWP64(env); |
... | ... | @@ -758,14 +766,6 @@ void do_interrupt(CPUState *env) |
758 | 766 | cpu_set_cwp(env, cpu_cwp_inc(env, env->cwp + 1)); |
759 | 767 | env->tbr &= ~0x7fffULL; |
760 | 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 | 769 | env->pc = env->tbr; |
770 | 770 | env->npc = env->pc + 4; |
771 | 771 | env->exception_index = 0; | ... | ... |
target-sparc/op_helper.c
... | ... | @@ -2680,26 +2680,26 @@ void helper_wrpstate(target_ulong new_state) |
2680 | 2680 | |
2681 | 2681 | void helper_done(void) |
2682 | 2682 | { |
2683 | - env->tl--; | |
2684 | - env->tsptr = &env->ts[env->tl]; | |
2685 | 2683 | env->pc = env->tsptr->tpc; |
2686 | 2684 | env->npc = env->tsptr->tnpc + 4; |
2687 | 2685 | PUT_CCR(env, env->tsptr->tstate >> 32); |
2688 | 2686 | env->asi = (env->tsptr->tstate >> 24) & 0xff; |
2689 | 2687 | change_pstate((env->tsptr->tstate >> 8) & 0xf3f); |
2690 | 2688 | PUT_CWP64(env, env->tsptr->tstate & 0xff); |
2689 | + env->tl--; | |
2690 | + env->tsptr = &env->ts[env->tl]; | |
2691 | 2691 | } |
2692 | 2692 | |
2693 | 2693 | void helper_retry(void) |
2694 | 2694 | { |
2695 | - env->tl--; | |
2696 | - env->tsptr = &env->ts[env->tl]; | |
2697 | 2695 | env->pc = env->tsptr->tpc; |
2698 | 2696 | env->npc = env->tsptr->tnpc; |
2699 | 2697 | PUT_CCR(env, env->tsptr->tstate >> 32); |
2700 | 2698 | env->asi = (env->tsptr->tstate >> 24) & 0xff; |
2701 | 2699 | change_pstate((env->tsptr->tstate >> 8) & 0xf3f); |
2702 | 2700 | PUT_CWP64(env, env->tsptr->tstate & 0xff); |
2701 | + env->tl--; | |
2702 | + env->tsptr = &env->ts[env->tl]; | |
2703 | 2703 | } |
2704 | 2704 | #endif |
2705 | 2705 | ... | ... |