[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