summaryrefslogtreecommitdiffstats
path: root/target-sparc
diff options
context:
space:
mode:
authorblueswir12008-07-17 21:17:19 +0200
committerblueswir12008-07-17 21:17:19 +0200
commite6bf7d70b5a459f96f0b2cbc677926eebe685c84 (patch)
tree588a5f287852858223eed1f5a88921cbcfd18188 /target-sparc
parentSupport for address masking (diff)
downloadqemu-e6bf7d70b5a459f96f0b2cbc677926eebe685c84.tar.gz
qemu-e6bf7d70b5a459f96f0b2cbc677926eebe685c84.tar.xz
qemu-e6bf7d70b5a459f96f0b2cbc677926eebe685c84.zip
Fix saving and loading of trap state
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@4883 c046a42c-6fe2-441c-8c8c-71466251a162
Diffstat (limited to 'target-sparc')
-rw-r--r--target-sparc/helper.c16
-rw-r--r--target-sparc/op_helper.c8
2 files changed, 12 insertions, 12 deletions
diff --git a/target-sparc/helper.c b/target-sparc/helper.c
index 14364fb91f..baf761a056 100644
--- a/target-sparc/helper.c
+++ b/target-sparc/helper.c
@@ -742,6 +742,14 @@ void do_interrupt(CPUState *env)
return;
}
#endif
+ if (env->tl < MAXTL - 1) {
+ env->tl++;
+ } else {
+ env->pstate |= PS_RED;
+ if (env->tl != MAXTL)
+ env->tl++;
+ }
+ env->tsptr = &env->ts[env->tl];
env->tsptr->tstate = ((uint64_t)GET_CCR(env) << 32) |
((env->asi & 0xff) << 24) | ((env->pstate & 0xf3f) << 8) |
GET_CWP64(env);
@@ -758,14 +766,6 @@ void do_interrupt(CPUState *env)
cpu_set_cwp(env, cpu_cwp_inc(env, env->cwp + 1));
env->tbr &= ~0x7fffULL;
env->tbr |= ((env->tl > 1) ? 1 << 14 : 0) | (intno << 5);
- if (env->tl < MAXTL - 1) {
- env->tl++;
- } else {
- env->pstate |= PS_RED;
- if (env->tl != MAXTL)
- env->tl++;
- }
- env->tsptr = &env->ts[env->tl];
env->pc = env->tbr;
env->npc = env->pc + 4;
env->exception_index = 0;
diff --git a/target-sparc/op_helper.c b/target-sparc/op_helper.c
index b168f9cff0..3f508278ea 100644
--- a/target-sparc/op_helper.c
+++ b/target-sparc/op_helper.c
@@ -2680,26 +2680,26 @@ void helper_wrpstate(target_ulong new_state)
void helper_done(void)
{
- env->tl--;
- env->tsptr = &env->ts[env->tl];
env->pc = env->tsptr->tpc;
env->npc = env->tsptr->tnpc + 4;
PUT_CCR(env, env->tsptr->tstate >> 32);
env->asi = (env->tsptr->tstate >> 24) & 0xff;
change_pstate((env->tsptr->tstate >> 8) & 0xf3f);
PUT_CWP64(env, env->tsptr->tstate & 0xff);
+ env->tl--;
+ env->tsptr = &env->ts[env->tl];
}
void helper_retry(void)
{
- env->tl--;
- env->tsptr = &env->ts[env->tl];
env->pc = env->tsptr->tpc;
env->npc = env->tsptr->tnpc;
PUT_CCR(env, env->tsptr->tstate >> 32);
env->asi = (env->tsptr->tstate >> 24) & 0xff;
change_pstate((env->tsptr->tstate >> 8) & 0xf3f);
PUT_CWP64(env, env->tsptr->tstate & 0xff);
+ env->tl--;
+ env->tsptr = &env->ts[env->tl];
}
#endif