|
From: <sv...@va...> - 2015-06-24 18:47:47
|
Author: petarj
Date: Wed Jun 24 19:47:39 2015
New Revision: 3156
Log:
mips64: do not use 64-bit loads for lwl/lwr instructions
As reported in BZ #346562, lwl/lwr were implemented incorrectly using
64-bit loads. This has led to incorrect "invalid read of size 8"
warnings. This patch fixes it, and it does some formatting to make the
code more readable.
Original version of the patch proposed by Crestez Dan Leonard.
Modified:
trunk/priv/guest_mips_toIR.c
Modified: trunk/priv/guest_mips_toIR.c
==============================================================================
--- trunk/priv/guest_mips_toIR.c (original)
+++ trunk/priv/guest_mips_toIR.c Wed Jun 24 19:47:39 2015
@@ -13788,40 +13788,27 @@
t1 = newTemp(Ity_I64);
#if defined (_MIPSEL)
assign(t1, binop(Iop_Add64, getIReg(rs), mkU64(extend_s_16to64(imm))));
- /* t2 = word addr */
- /* t4 = addr mod 4 */
- LWX_SWX_PATTERN64;
-
- /* t3 = word content - shifted */
- t3 = newTemp(Ity_I32);
- assign(t3, binop(Iop_Shl32, mkNarrowTo32(ty, load(Ity_I64,
- mkexpr(t2))), narrowTo(Ity_I8, binop(Iop_Shl32,
- binop(Iop_Sub32, mkU32(0x03), mkexpr(t4)), mkU8(3)))));
-
- /* rt content - adjusted */
- t5 = newTemp(Ity_I32);
- assign(t5, binop(Iop_And32,
- mkNarrowTo32(ty, getIReg(rt)),
- binop(Iop_Shr32,
- mkU32(0x00FFFFFF),
- narrowTo(Ity_I8, binop(Iop_Mul32,
- mkU32(0x08),
- mkexpr(t4))))));
-
- putIReg(rt, mkWidenFrom32(ty, binop(Iop_Or32, mkexpr(t5),
- mkexpr(t3)), True));
#elif defined (_MIPSEB)
- assign(t1, binop(Iop_Xor64, mkU64(0x3),
- binop(Iop_Add64, getIReg(rs), mkU64(extend_s_16to64(imm)))));
+ assign(t1, binop(Iop_Xor64,
+ mkU64(0x03),
+ binop(Iop_Add64,
+ getIReg(rs),
+ mkU64(extend_s_16to64(imm)))));
+#endif
/* t2 = word addr */
/* t4 = addr mod 4 */
LWX_SWX_PATTERN64;
/* t3 = word content - shifted */
t3 = newTemp(Ity_I32);
- assign(t3, binop(Iop_Shl32, unop(Iop_64HIto32, load(Ity_I64,
- mkexpr(t2))), narrowTo(Ity_I8, binop(Iop_Shl32,
- binop(Iop_Sub32, mkU32(0x03), mkexpr(t4)), mkU8(3)))));
+ assign(t3, binop(Iop_Shl32,
+ load(Ity_I32, mkexpr(t2)),
+ narrowTo(Ity_I8,
+ binop(Iop_Shl32,
+ binop(Iop_Sub32,
+ mkU32(0x03),
+ mkexpr(t4)),
+ mkU8(3)))));
/* rt content - adjusted */
t5 = newTemp(Ity_I32);
@@ -13835,7 +13822,6 @@
putIReg(rt, mkWidenFrom32(ty, binop(Iop_Or32, mkexpr(t5),
mkexpr(t3)), True));
-#endif
} else {
/* t1 = addr */
t1 = newTemp(Ity_I32);
@@ -13877,34 +13863,23 @@
t1 = newTemp(Ity_I64);
#if defined (_MIPSEL)
assign(t1, binop(Iop_Add64, getIReg(rs), mkU64(extend_s_16to64(imm))));
- /* t2 = word addr */
- /* t4 = addr mod 8 */
- LWX_SWX_PATTERN64;
-
- /* t3 = word content - shifted */
- t3 = newTemp(Ity_I32);
- assign(t3, binop(Iop_Shr32, mkNarrowTo32(ty, load(Ity_I64,mkexpr(t2))),
- narrowTo(Ity_I8, binop(Iop_Shl32, mkexpr(t4), mkU8(3)))));
-
- /* rt content - adjusted */
- t5 = newTemp(Ity_I32);
- assign(t5, binop(Iop_And32, mkNarrowTo32(ty, getIReg(rt)),
- unop(Iop_Not32, binop(Iop_Shr32, mkU32(0xFFFFFFFF),
- narrowTo(Ity_I8, binop(Iop_Shl32, mkexpr(t4), mkU8(0x3)))))));
-
- putIReg(rt, mkWidenFrom32(ty, binop(Iop_Or32, mkexpr(t5),
- mkexpr(t3)), True));
#elif defined (_MIPSEB)
- assign(t1, binop(Iop_Xor64, mkU64(0x3), binop(Iop_Add64, getIReg(rs),
- mkU64(extend_s_16to64(imm)))));
+ assign(t1, binop(Iop_Xor64,
+ mkU64(0x3),
+ binop(Iop_Add64,
+ getIReg(rs),
+ mkU64(extend_s_16to64(imm)))));
+#endif
/* t2 = word addr */
/* t4 = addr mod 4 */
LWX_SWX_PATTERN64;
/* t3 = word content - shifted */
t3 = newTemp(Ity_I32);
- assign(t3, binop(Iop_Shr32, unop(Iop_64HIto32, load(Ity_I64,mkexpr(t2))),
- narrowTo(Ity_I8, binop(Iop_Shl32, mkexpr(t4), mkU8(3)))));
+ assign(t3, binop(Iop_Shr32,
+ load(Ity_I32, mkexpr(t2)),
+ narrowTo(Ity_I8,
+ binop(Iop_Shl32, mkexpr(t4), mkU8(0x03)))));
/* rt content - adjusted */
t5 = newTemp(Ity_I32);
@@ -13914,7 +13889,6 @@
putIReg(rt, mkWidenFrom32(ty, binop(Iop_Or32, mkexpr(t5),
mkexpr(t3)), True));
-#endif
} else {
/* t1 = addr */
|