aboutsummaryrefslogtreecommitdiff
path: root/target-sparc
diff options
context:
space:
mode:
authorblueswir1 <blueswir1@c046a42c-6fe2-441c-8c8c-71466251a162>2007-07-07 20:53:22 +0000
committerblueswir1 <blueswir1@c046a42c-6fe2-441c-8c8c-71466251a162>2007-07-07 20:53:22 +0000
commit17d996e1f1de8057b3bb88b753e65735a6d8f191 (patch)
treeb7be26128bdefe59daf660ae4bf976b1a0bafc8d /target-sparc
parentdc011987f266878ad29009e4fdbc27f666ab31d2 (diff)
downloadqemu-17d996e1f1de8057b3bb88b753e65735a6d8f191.zip
qemu-17d996e1f1de8057b3bb88b753e65735a6d8f191.tar.gz
qemu-17d996e1f1de8057b3bb88b753e65735a6d8f191.tar.bz2
Report normalised CWP values to userland and GDB, not internal representation
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@3052 c046a42c-6fe2-441c-8c8c-71466251a162
Diffstat (limited to 'target-sparc')
-rw-r--r--target-sparc/cpu.h10
-rw-r--r--target-sparc/op.c4
-rw-r--r--target-sparc/op_helper.c6
3 files changed, 13 insertions, 7 deletions
diff --git a/target-sparc/cpu.h b/target-sparc/cpu.h
index a3d762f..06b5865 100644
--- a/target-sparc/cpu.h
+++ b/target-sparc/cpu.h
@@ -288,11 +288,17 @@ void cpu_set_cwp(CPUSPARCState *env1, int new_cwp);
} while (0)
#ifdef TARGET_SPARC64
-#define GET_CCR(env) ((env->xcc << 4) | (env->psr & PSR_ICC))
+#define GET_CCR(env) (((env->xcc >> 20) << 4) | ((env->psr & PSR_ICC) >> 20))
#define PUT_CCR(env, val) do { int _tmp = val; \
- env->xcc = _tmp >> 4; \
+ env->xcc = (_tmp >> 4) << 20; \
env->psr = (_tmp & 0xf) << 20; \
} while (0)
+#define GET_CWP64(env) (NWINDOWS - 1 - (env)->cwp)
+#define PUT_CWP64(env, val) do { \
+ env->cwp = NWINDOWS - 1 - ((val) & 0xff); \
+ cpu_set_cwp(env, env->cwp); \
+ } while(0)
+
#endif
int cpu_sparc_signal_handler(int host_signum, void *pinfo, void *puc);
diff --git a/target-sparc/op.c b/target-sparc/op.c
index c0aee8f..4ab0667 100644
--- a/target-sparc/op.c
+++ b/target-sparc/op.c
@@ -1184,12 +1184,12 @@ void OPPROTO op_wrpstate(void)
// order.
void OPPROTO op_rdcwp(void)
{
- T0 = NWINDOWS - 1 - env->cwp;
+ T0 = GET_CWP64(env);
}
void OPPROTO op_wrcwp(void)
{
- env->cwp = NWINDOWS - 1 - T0;
+ PUT_CWP64(env, T0);
}
/* XXX: use another pointer for %iN registers to avoid slow wrapping
diff --git a/target-sparc/op_helper.c b/target-sparc/op_helper.c
index 11134cf..cd93727 100644
--- a/target-sparc/op_helper.c
+++ b/target-sparc/op_helper.c
@@ -871,7 +871,7 @@ void do_done(void)
PUT_CCR(env, env->tstate[env->tl] >> 32);
env->asi = (env->tstate[env->tl] >> 24) & 0xff;
env->pstate = (env->tstate[env->tl] >> 8) & 0xfff;
- set_cwp(env->tstate[env->tl] & 0xff);
+ PUT_CWP64(env, env->tstate[env->tl] & 0xff);
}
void do_retry(void)
@@ -882,7 +882,7 @@ void do_retry(void)
PUT_CCR(env, env->tstate[env->tl] >> 32);
env->asi = (env->tstate[env->tl] >> 24) & 0xff;
env->pstate = (env->tstate[env->tl] >> 8) & 0xfff;
- set_cwp(env->tstate[env->tl] & 0xff);
+ PUT_CWP64(env, env->tstate[env->tl] & 0xff);
}
#endif
@@ -952,7 +952,7 @@ void do_interrupt(int intno)
}
#endif
env->tstate[env->tl] = ((uint64_t)GET_CCR(env) << 32) | ((env->asi & 0xff) << 24) |
- ((env->pstate & 0xfff) << 8) | (env->cwp & 0xff);
+ ((env->pstate & 0xfff) << 8) | GET_CWP64(env);
env->tpc[env->tl] = env->pc;
env->tnpc[env->tl] = env->npc;
env->tt[env->tl] = intno;