[PATCH 2/2] ntoskrnl.exe: Support 'xor Ev, Gv' opcode for x86_64.

Paul Gofman pgofman at codeweavers.com
Fri May 22 07:37:51 CDT 2020


Signed-off-by: Paul Gofman <pgofman at codeweavers.com>
---
 dlls/ntoskrnl.exe/instr.c | 13 +++++++++++++
 1 file changed, 13 insertions(+)

diff --git a/dlls/ntoskrnl.exe/instr.c b/dlls/ntoskrnl.exe/instr.c
index 848a566d02..68140c09ef 100644
--- a/dlls/ntoskrnl.exe/instr.c
+++ b/dlls/ntoskrnl.exe/instr.c
@@ -39,6 +39,7 @@ enum instr_op
 {
     INSTR_OP_MOV,
     INSTR_OP_OR,
+    INSTR_OP_XOR,
 };
 
 #ifdef __i386__
@@ -526,6 +527,10 @@ static void store_reg_word( CONTEXT *context, BYTE regmodrm, const BYTE *addr, i
             for (i = 0; i < op_size; ++i)
                 reg[i] |= addr[i];
             break;
+        case INSTR_OP_XOR:
+            for (i = 0; i < op_size; ++i)
+                reg[i] ^= addr[i];
+            break;
     }
 }
 
@@ -544,6 +549,9 @@ static void store_reg_byte( CONTEXT *context, BYTE regmodrm, const BYTE *addr, i
         case INSTR_OP_OR:
             *reg |= *addr;
             break;
+        case INSTR_OP_XOR:
+            *reg ^= *addr;
+            break;
     }
 }
 
@@ -838,6 +846,7 @@ static DWORD emulate_instruction( EXCEPTION_RECORD *rec, CONTEXT *context )
     case 0x8a: /* mov Eb, Gb */
     case 0x8b: /* mov Ev, Gv */
     case 0x0b: /* or  Ev, Gv */
+    case 0x33: /* xor Ev, Gv */
     {
         BYTE *data = INSTR_GetOperandAddr( context, instr + 1, prefixlen + 1, long_addr,
                                            rex, segprefix, &len );
@@ -861,6 +870,10 @@ static DWORD emulate_instruction( EXCEPTION_RECORD *rec, CONTEXT *context )
                     store_reg_word( context, instr[1], wine_user_shared_data + offset,
                             long_op, rex, INSTR_OP_OR );
                     break;
+                case 0x33:
+                    store_reg_word( context, instr[1], wine_user_shared_data + offset,
+                            long_op, rex, INSTR_OP_XOR );
+                    break;
             }
             context->Rip += prefixlen + len + 1;
             return ExceptionContinueExecution;
-- 
2.26.2




More information about the wine-devel mailing list