[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH V2 3/3] target-arm: Fix VFP register byte order in G
From: |
Fabien Chouteau |
Subject: |
[Qemu-devel] [PATCH V2 3/3] target-arm: Fix VFP register byte order in GDB remote |
Date: |
Tue, 19 Mar 2013 12:21:27 +0100 |
>From GDB Remote Serial Protocol doc:
"The bytes with the register are transmitted in target byte order."
Signed-off-by: Fabien Chouteau <address@hidden>
---
target-arm/helper.c | 23 ++++++++++++++++-------
1 file changed, 16 insertions(+), 7 deletions(-)
diff --git a/target-arm/helper.c b/target-arm/helper.c
index e97e1a5..1ba25e1 100644
--- a/target-arm/helper.c
+++ b/target-arm/helper.c
@@ -16,18 +16,22 @@ static int vfp_gdb_get_reg(CPUARMState *env, uint8_t *buf,
int reg)
{
int nregs;
- /* VFP data registers are always little-endian. */
nregs = arm_feature(env, ARM_FEATURE_VFP3) ? 32 : 16;
if (reg < nregs) {
- stfq_le_p(buf, env->vfp.regs[reg]);
+ stfq_p(buf, env->vfp.regs[reg]);
return 8;
}
if (arm_feature(env, ARM_FEATURE_NEON)) {
/* Aliases for Q regs. */
nregs += 16;
if (reg < nregs) {
- stfq_le_p(buf, env->vfp.regs[(reg - 32) * 2]);
- stfq_le_p(buf + 8, env->vfp.regs[(reg - 32) * 2 + 1]);
+#ifdef TARGET_WORDS_BIGENDIAN
+ stfq_p(buf, env->vfp.regs[(reg - 32) * 2 + 1]);
+ stfq_p(buf + 8, env->vfp.regs[(reg - 32) * 2]);
+#else
+ stfq_p(buf, env->vfp.regs[(reg - 32) * 2]);
+ stfq_p(buf + 8, env->vfp.regs[(reg - 32) * 2 + 1]);
+#endif /* TARGET_WORDS_BIGENDIAN */
return 16;
}
}
@@ -45,14 +49,19 @@ static int vfp_gdb_set_reg(CPUARMState *env, uint8_t *buf,
int reg)
nregs = arm_feature(env, ARM_FEATURE_VFP3) ? 32 : 16;
if (reg < nregs) {
- env->vfp.regs[reg] = ldfq_le_p(buf);
+ env->vfp.regs[reg] = ldfq_p(buf);
return 8;
}
if (arm_feature(env, ARM_FEATURE_NEON)) {
nregs += 16;
if (reg < nregs) {
- env->vfp.regs[(reg - 32) * 2] = ldfq_le_p(buf);
- env->vfp.regs[(reg - 32) * 2 + 1] = ldfq_le_p(buf + 8);
+#ifdef TARGET_WORDS_BIGENDIAN
+ env->vfp.regs[(reg - 32) * 2 + 1] = ldfq_p(buf);
+ env->vfp.regs[(reg - 32) * 2] = ldfq_p(buf + 8);
+#else
+ env->vfp.regs[(reg - 32) * 2] = ldfq_p(buf);
+ env->vfp.regs[(reg - 32) * 2 + 1] = ldfq_p(buf + 8);
+#endif /* TARGET_WORDS_BIGENDIAN */
return 16;
}
}
--
1.7.9.5