From fe68dbb743bce5cd2c90080a4df5c0d9a29b769c Mon Sep 17 00:00:00 2001 From: Alexis Engelke Date: Sat, 23 Jan 2021 14:28:27 +0100 Subject: [PATCH] decode: Fix LOCK handling for MOV CR/DR --- decode.c | 4 ++-- tests/test_decode.c | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/decode.c b/decode.c index eac0109..3c8cc35 100644 --- a/decode.c +++ b/decode.c @@ -334,7 +334,7 @@ prefix_end: op_modrm->type = FD_OT_REG; op_modrm->reg = modrm | (prefix_rex & PREFIX_REXB ? 8 : 0); op_modrm->misc = FD_RT_GPL; - goto op_sizes; + goto skip_modrm; } if (UNLIKELY(DESC_HAS_IMPLICIT(desc))) @@ -425,6 +425,7 @@ prefix_end: } } } +skip_modrm: if (UNLIKELY(DESC_HAS_VEXREG(desc))) { @@ -564,7 +565,6 @@ prefix_end: instr->flags |= FD_FLAG_LOCK; } -op_sizes:; uint8_t operand_sizes[4] = { 1 << DESC_SIZE_FIX1(desc) >> 1, 1 << DESC_SIZE_FIX2(desc), op_size, vec_size }; diff --git a/tests/test_decode.c b/tests/test_decode.c index 492d959..1cb73ea 100644 --- a/tests/test_decode.c +++ b/tests/test_decode.c @@ -106,6 +106,7 @@ main(int argc, char** argv) TEST64("\x48\x0f\x20\xd0", "mov rax, cr2"); // cr2 + REX.W TEST64("\x44\x0f\x20\x08", "UD"); // cr9 TEST64("\x44\x0f\x21\x00", "UD"); // dr8 + TEST32("\xf0\x0f\x20\x00", "UD"); // LOCK TEST("\x8c\xc0", "mov ax, es"); TEST64("\x44\x8c\xc0", "mov ax, es"); TEST64("\x44\x8c\xf0", "UD"); // no segment register 6