Skip to content

Commit

Permalink
Add lookup tables for ZydisRegister and ZydisRegisterClass (zyant…
Browse files Browse the repository at this point in the history
…ific#283)

* Add lookup tables for `ZydisRegister` and `ZydisRegisterClass` (zyantific#282)
  • Loading branch information
flobernd authored Dec 9, 2021
1 parent c804b8f commit 49005dd
Show file tree
Hide file tree
Showing 7 changed files with 418 additions and 116 deletions.
19 changes: 19 additions & 0 deletions include/Zydis/Generated/EnumRegister.h
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ typedef enum ZydisRegister_
ZYDIS_REGISTER_R13B,
ZYDIS_REGISTER_R14B,
ZYDIS_REGISTER_R15B,

// General purpose registers 16-bit
ZYDIS_REGISTER_AX,
ZYDIS_REGISTER_CX,
Expand All @@ -43,6 +44,7 @@ typedef enum ZydisRegister_
ZYDIS_REGISTER_R13W,
ZYDIS_REGISTER_R14W,
ZYDIS_REGISTER_R15W,

// General purpose registers 32-bit
ZYDIS_REGISTER_EAX,
ZYDIS_REGISTER_ECX,
Expand All @@ -60,6 +62,7 @@ typedef enum ZydisRegister_
ZYDIS_REGISTER_R13D,
ZYDIS_REGISTER_R14D,
ZYDIS_REGISTER_R15D,

// General purpose registers 64-bit
ZYDIS_REGISTER_RAX,
ZYDIS_REGISTER_RCX,
Expand All @@ -77,6 +80,7 @@ typedef enum ZydisRegister_
ZYDIS_REGISTER_R13,
ZYDIS_REGISTER_R14,
ZYDIS_REGISTER_R15,

// Floating point legacy registers
ZYDIS_REGISTER_ST0,
ZYDIS_REGISTER_ST1,
Expand All @@ -89,6 +93,7 @@ typedef enum ZydisRegister_
ZYDIS_REGISTER_X87CONTROL,
ZYDIS_REGISTER_X87STATUS,
ZYDIS_REGISTER_X87TAG,

// Floating point multimedia registers
ZYDIS_REGISTER_MM0,
ZYDIS_REGISTER_MM1,
Expand All @@ -98,6 +103,7 @@ typedef enum ZydisRegister_
ZYDIS_REGISTER_MM5,
ZYDIS_REGISTER_MM6,
ZYDIS_REGISTER_MM7,

// Floating point vector registers 128-bit
ZYDIS_REGISTER_XMM0,
ZYDIS_REGISTER_XMM1,
Expand Down Expand Up @@ -131,6 +137,7 @@ typedef enum ZydisRegister_
ZYDIS_REGISTER_XMM29,
ZYDIS_REGISTER_XMM30,
ZYDIS_REGISTER_XMM31,

// Floating point vector registers 256-bit
ZYDIS_REGISTER_YMM0,
ZYDIS_REGISTER_YMM1,
Expand Down Expand Up @@ -164,6 +171,7 @@ typedef enum ZydisRegister_
ZYDIS_REGISTER_YMM29,
ZYDIS_REGISTER_YMM30,
ZYDIS_REGISTER_YMM31,

// Floating point vector registers 512-bit
ZYDIS_REGISTER_ZMM0,
ZYDIS_REGISTER_ZMM1,
Expand Down Expand Up @@ -197,6 +205,7 @@ typedef enum ZydisRegister_
ZYDIS_REGISTER_ZMM29,
ZYDIS_REGISTER_ZMM30,
ZYDIS_REGISTER_ZMM31,

// Matrix registers
ZYDIS_REGISTER_TMM0,
ZYDIS_REGISTER_TMM1,
Expand All @@ -206,26 +215,31 @@ typedef enum ZydisRegister_
ZYDIS_REGISTER_TMM5,
ZYDIS_REGISTER_TMM6,
ZYDIS_REGISTER_TMM7,

// Flags registers
ZYDIS_REGISTER_FLAGS,
ZYDIS_REGISTER_EFLAGS,
ZYDIS_REGISTER_RFLAGS,

// Instruction-pointer registers
ZYDIS_REGISTER_IP,
ZYDIS_REGISTER_EIP,
ZYDIS_REGISTER_RIP,

// Segment registers
ZYDIS_REGISTER_ES,
ZYDIS_REGISTER_CS,
ZYDIS_REGISTER_SS,
ZYDIS_REGISTER_DS,
ZYDIS_REGISTER_FS,
ZYDIS_REGISTER_GS,

// Table registers
ZYDIS_REGISTER_GDTR,
ZYDIS_REGISTER_LDTR,
ZYDIS_REGISTER_IDTR,
ZYDIS_REGISTER_TR,

// Test registers
ZYDIS_REGISTER_TR0,
ZYDIS_REGISTER_TR1,
Expand All @@ -235,6 +249,7 @@ typedef enum ZydisRegister_
ZYDIS_REGISTER_TR5,
ZYDIS_REGISTER_TR6,
ZYDIS_REGISTER_TR7,

// Control registers
ZYDIS_REGISTER_CR0,
ZYDIS_REGISTER_CR1,
Expand All @@ -252,6 +267,7 @@ typedef enum ZydisRegister_
ZYDIS_REGISTER_CR13,
ZYDIS_REGISTER_CR14,
ZYDIS_REGISTER_CR15,

// Debug registers
ZYDIS_REGISTER_DR0,
ZYDIS_REGISTER_DR1,
Expand All @@ -269,6 +285,7 @@ typedef enum ZydisRegister_
ZYDIS_REGISTER_DR13,
ZYDIS_REGISTER_DR14,
ZYDIS_REGISTER_DR15,

// Mask registers
ZYDIS_REGISTER_K0,
ZYDIS_REGISTER_K1,
Expand All @@ -278,13 +295,15 @@ typedef enum ZydisRegister_
ZYDIS_REGISTER_K5,
ZYDIS_REGISTER_K6,
ZYDIS_REGISTER_K7,

// Bound registers
ZYDIS_REGISTER_BND0,
ZYDIS_REGISTER_BND1,
ZYDIS_REGISTER_BND2,
ZYDIS_REGISTER_BND3,
ZYDIS_REGISTER_BNDCFG,
ZYDIS_REGISTER_BNDSTATUS,

// Uncategorized
ZYDIS_REGISTER_MXCSR,
ZYDIS_REGISTER_PKRU,
Expand Down
4 changes: 4 additions & 0 deletions include/Zydis/Register.h
Original file line number Diff line number Diff line change
Expand Up @@ -159,6 +159,10 @@ typedef enum ZydisRegisterClass_
* Segment registers.
*/
ZYDIS_REGCLASS_SEGMENT,
/**
* Table registers.
*/
ZYDIS_REGCLASS_TABLE,
/**
* Test registers.
*/
Expand Down
2 changes: 1 addition & 1 deletion src/Encoder.c
Original file line number Diff line number Diff line change
Expand Up @@ -1258,7 +1258,7 @@ ZyanBool ZydisIsRegisterOperandCompatible(ZydisEncoderInstructionMatch *match,
const ZydisRegisterClass reg_class = ZydisRegisterGetClass(user_op->reg.value);
const ZydisRegisterWidth reg_width = ZydisRegisterClassGetWidth(match->request->machine_mode,
reg_class);
if (reg_width == 0 && (reg_class != ZYDIS_REGCLASS_MASK))
if (reg_width == 0)
{
return ZYAN_FALSE;
}
Expand Down
1 change: 0 additions & 1 deletion src/Generated/EnumRegister.inc
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
static const ZydisShortString STR_REGISTER[] =
{
ZYDIS_MAKE_SHORTSTRING("none"),

// General purpose registers 8-bit
ZYDIS_MAKE_SHORTSTRING("al"),
ZYDIS_MAKE_SHORTSTRING("cl"),
Expand Down
23 changes: 23 additions & 0 deletions src/Generated/RegisterClassLookup.inc
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
static const ZydisRegisterClassLookupItem REG_CLASS_LOOKUP[] =
{
/* INVALID */ { ZYDIS_REGISTER_NONE, ZYDIS_REGISTER_NONE, 0, 0 },
/* GPR8 */ { ZYDIS_REGISTER_AL, ZYDIS_REGISTER_R15B, 8, 8 },
/* GPR16 */ { ZYDIS_REGISTER_AX, ZYDIS_REGISTER_R15W, 16, 16 },
/* GPR32 */ { ZYDIS_REGISTER_EAX, ZYDIS_REGISTER_R15D, 32, 32 },
/* GPR64 */ { ZYDIS_REGISTER_RAX, ZYDIS_REGISTER_R15, 0, 64 },
/* X87 */ { ZYDIS_REGISTER_ST0, ZYDIS_REGISTER_ST7, 80, 80 },
/* MMX */ { ZYDIS_REGISTER_MM0, ZYDIS_REGISTER_MM7, 64, 64 },
/* XMM */ { ZYDIS_REGISTER_XMM0, ZYDIS_REGISTER_XMM31, 128, 128 },
/* YMM */ { ZYDIS_REGISTER_YMM0, ZYDIS_REGISTER_YMM31, 256, 256 },
/* ZMM */ { ZYDIS_REGISTER_ZMM0, ZYDIS_REGISTER_ZMM31, 512, 512 },
/* TMM */ { ZYDIS_REGISTER_TMM0, ZYDIS_REGISTER_TMM7, 8192, 8192 },
/* FLAGS */ { ZYDIS_REGISTER_NONE, ZYDIS_REGISTER_NONE, 0, 0 },
/* IP */ { ZYDIS_REGISTER_NONE, ZYDIS_REGISTER_NONE, 0, 0 },
/* SEGMENT */ { ZYDIS_REGISTER_ES, ZYDIS_REGISTER_GS, 16, 16 },
/* TABLE */ { ZYDIS_REGISTER_NONE, ZYDIS_REGISTER_NONE, 0, 0 },
/* TEST */ { ZYDIS_REGISTER_TR0, ZYDIS_REGISTER_TR7, 32, 32 },
/* CONTROL */ { ZYDIS_REGISTER_CR0, ZYDIS_REGISTER_CR15, 32, 64 },
/* DEBUG */ { ZYDIS_REGISTER_DR0, ZYDIS_REGISTER_DR15, 32, 64 },
/* MASK */ { ZYDIS_REGISTER_K0, ZYDIS_REGISTER_K7, 64, 64 },
/* BOUND */ { ZYDIS_REGISTER_BND0, ZYDIS_REGISTER_BND3, 128, 128 }
};
Loading

0 comments on commit 49005dd

Please sign in to comment.