|
Mark Wielaard |
5f750d |
commit cbc52cfe6658f89f6857febf2b1e5c9edab7f397
|
|
Mark Wielaard |
5f750d |
Author: carll <carll@8f6e269a-dfd6-0310-a8e1-e2731360e62c>
|
|
Mark Wielaard |
5f750d |
Date: Wed Sep 16 23:01:04 2015 +0000
|
|
Mark Wielaard |
5f750d |
|
|
Mark Wielaard |
5f750d |
Add support for the Power PC mbar instruction.
|
|
Mark Wielaard |
5f750d |
|
|
Mark Wielaard |
5f750d |
This patch fixes bugzilla 352768.
|
|
Mark Wielaard |
5f750d |
|
|
Mark Wielaard |
5f750d |
|
|
Mark Wielaard |
5f750d |
git-svn-id: svn://svn.valgrind.org/vex/trunk@3190 8f6e269a-dfd6-0310-a8e1-e2731360e62c
|
|
Mark Wielaard |
5f750d |
|
|
Mark Wielaard |
5f750d |
diff --git a/VEX/priv/guest_ppc_toIR.c b/VEX/priv/guest_ppc_toIR.c
|
|
Mark Wielaard |
5f750d |
index a0ee34a..6a0b6d8 100644
|
|
Mark Wielaard |
5f750d |
--- a/VEX/priv/guest_ppc_toIR.c
|
|
Mark Wielaard |
5f750d |
+++ b/VEX/priv/guest_ppc_toIR.c
|
|
Mark Wielaard |
5f750d |
@@ -6369,6 +6369,7 @@ static Bool dis_memsync ( UInt theInstr )
|
|
Mark Wielaard |
5f750d |
UInt b11to25 = IFIELD(theInstr, 11, 15);
|
|
Mark Wielaard |
5f750d |
UChar flag_L = ifieldRegDS(theInstr);
|
|
Mark Wielaard |
5f750d |
UInt b11to20 = IFIELD(theInstr, 11, 10);
|
|
Mark Wielaard |
5f750d |
+ UInt M0 = IFIELD(theInstr, 11, 5);
|
|
Mark Wielaard |
5f750d |
UChar rD_addr = ifieldRegDS(theInstr);
|
|
Mark Wielaard |
5f750d |
UChar rS_addr = rD_addr;
|
|
Mark Wielaard |
5f750d |
UChar rA_addr = ifieldRegA(theInstr);
|
|
Mark Wielaard |
5f750d |
@@ -6399,12 +6400,20 @@ static Bool dis_memsync ( UInt theInstr )
|
|
Mark Wielaard |
5f750d |
/* X-Form */
|
|
Mark Wielaard |
5f750d |
case 0x1F:
|
|
Mark Wielaard |
5f750d |
switch (opc2) {
|
|
Mark Wielaard |
5f750d |
- case 0x356: // eieio (Enforce In-Order Exec of I/O, PPC32 p394)
|
|
Mark Wielaard |
5f750d |
- if (b11to25 != 0 || b0 != 0) {
|
|
Mark Wielaard |
5f750d |
- vex_printf("dis_memsync(ppc)(eiei0,b11to25|b0)\n");
|
|
Mark Wielaard |
5f750d |
- return False;
|
|
Mark Wielaard |
5f750d |
+ case 0x356: // eieio or mbar (Enforce In-Order Exec of I/O, PPC32 p394)
|
|
Mark Wielaard |
5f750d |
+ if (M0 == 0) {
|
|
Mark Wielaard |
5f750d |
+ if (b11to20 != 0 || b0 != 0) {
|
|
Mark Wielaard |
5f750d |
+ vex_printf("dis_memsync(ppc)(eieio,b11to20|b0)\n");
|
|
Mark Wielaard |
5f750d |
+ return False;
|
|
Mark Wielaard |
5f750d |
+ }
|
|
Mark Wielaard |
5f750d |
+ DIP("eieio\n");
|
|
Mark Wielaard |
5f750d |
+ } else {
|
|
Mark Wielaard |
5f750d |
+ if (b11to20 != 0 || b0 != 0) {
|
|
Mark Wielaard |
5f750d |
+ vex_printf("dis_memsync(ppc)(mbar,b11to20|b0)\n");
|
|
Mark Wielaard |
5f750d |
+ return False;
|
|
Mark Wielaard |
5f750d |
+ }
|
|
Mark Wielaard |
5f750d |
+ DIP("mbar %d\n", M0);
|
|
Mark Wielaard |
5f750d |
}
|
|
Mark Wielaard |
5f750d |
- DIP("eieio\n");
|
|
Mark Wielaard |
5f750d |
/* Insert a memory fence, just to be on the safe side. */
|
|
Mark Wielaard |
5f750d |
stmt( IRStmt_MBE(Imbe_Fence) );
|
|
Mark Wielaard |
5f750d |
break;
|