Mark Wielaard a53018
commit fb6f7abcbc92506d302fb18a2c5fc853d2929248
Mark Wielaard a53018
Author: Carl Love <cel@us.ibm.com>
Mark Wielaard a53018
Date:   Tue Jun 9 10:42:03 2020 -0500
Mark Wielaard a53018
Mark Wielaard a53018
    Power PC Fix extraction of the L field for sync instruction
Mark Wielaard a53018
    
Mark Wielaard a53018
    The L field is currently a two bit[22:21] field in ISA 3.0. The size of the
Mark Wielaard a53018
    L field has changed over time.
Mark Wielaard a53018
    
Mark Wielaard a53018
    Currently the ISA 3.0 Valgrind sync instruction support code sets the
Mark Wielaard a53018
    flag_L for the instruction L field to a five bit value that includes bits
Mark Wielaard a53018
    that are marked reserved the sync instruction.  This patch fixes the issue for ISA 3.0
Mark Wielaard a53018
    to only setting flag_L the specified two bits.
Mark Wielaard a53018
    
Mark Wielaard a53018
    Valgrind bugzilla:   https://bugs.kde.org/show_bug.cgi?id=422677
Mark Wielaard a53018
Mark Wielaard a53018
diff --git a/VEX/priv/guest_ppc_toIR.c b/VEX/priv/guest_ppc_toIR.c
Mark Wielaard a53018
index 582c59ec0..c4965a19e 100644
Mark Wielaard a53018
--- a/VEX/priv/guest_ppc_toIR.c
Mark Wielaard a53018
+++ b/VEX/priv/guest_ppc_toIR.c
Mark Wielaard a53018
@@ -8777,7 +8777,7 @@ static Bool dis_memsync ( UInt theInstr )
Mark Wielaard a53018
    /* X-Form, XL-Form */
Mark Wielaard a53018
    UChar opc1    = ifieldOPC(theInstr);
Mark Wielaard a53018
    UInt  b11to25 = IFIELD(theInstr, 11, 15);
Mark Wielaard a53018
-   UChar flag_L  = ifieldRegDS(theInstr);
Mark Wielaard a53018
+   UChar flag_L  = IFIELD(theInstr, 21, 2);   //ISA 3.0
Mark Wielaard a53018
    UInt  b11to20 = IFIELD(theInstr, 11, 10);
Mark Wielaard a53018
    UInt  M0      = IFIELD(theInstr, 11, 5);
Mark Wielaard a53018
    UChar rD_addr = ifieldRegDS(theInstr);