Skip to content

Commit ae91a42

Browse files
authored
[X86][MC] Reject out-of-range control and debug registers encoded with APX (#82584)
Fixes #82557. APX specification states that the high bits found in REX2 used to encode GPRs can also be used to encode control and debug registers, although all of them will #UD. Therefore, when disassembling we reject attempts to create control or debug registers with a value of 16 or more. See page 22 of the [specification](https://www.intel.com/content/www/us/en/developer/articles/technical/advanced-performance-extensions-apx.html): > Note that the R, X and B register identifiers can also address non-GPR register types, such as vector registers, control registers and debug registers. When any of them does, the highest-order bits REX2.R4, REX2.X4 or REX2.B4 are generally ignored, except when the register being addressed is a control or debug register. [...] The exception is that REX2.R4 and REX2.R3 [*sic*] are not ignored when the R register identifier addresses a control or debug register. Furthermore, if any attempt is made to access a non-existent control register (CR*) or debug register (DR*) using the REX2 prefix and one of the following instructions: “MOV CR*, r64”, “MOV r64, CR*”, “MOV DR*, r64”, “MOV r64, DR*”. #UD is raised. The invalid encodings are 64-bit only because `0xd5` is a valid instruction in 32-bit mode.
1 parent 1c2456d commit ae91a42

File tree

2 files changed

+8
-0
lines changed

2 files changed

+8
-0
lines changed

llvm/lib/Target/X86/Disassembler/X86Disassembler.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -819,8 +819,12 @@ static int readModRM(struct InternalInstruction *insn) {
819819
*valid = 0; \
820820
return prefix##_ES + (index & 7); \
821821
case TYPE_DEBUGREG: \
822+
if (index > 15) \
823+
*valid = 0; \
822824
return prefix##_DR0 + index; \
823825
case TYPE_CONTROLREG: \
826+
if (index > 15) \
827+
*valid = 0; \
824828
return prefix##_CR0 + index; \
825829
case TYPE_MVSIBX: \
826830
return prefix##_XMM0 + index; \

llvm/test/MC/Disassembler/X86/x86-64-err.txt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,10 @@
55
# 32: into
66
0xce
77

8+
# 64: invalid instruction encoding
9+
0xd5,0xc5,0x20,0xef
10+
# 64: invalid instruction encoding
11+
0xd5,0xc5,0x21,0xef
812
# 64: invalid instruction encoding
913
0xc4,0x62,0xf9,0x18,0x20
1014
# 64: invalid instruction encoding

0 commit comments

Comments
 (0)