Add new x86 instruction groups
- VM: Virtual Machine
- INT: Interrupts
- IRET: Interupt returns
- CALL: Subroutine call
- RET: Subroutine return
Includes a special case for writes to port 0xb2, which triggers an SMI
diff --git a/arch/X86/X86Mapping.c b/arch/X86/X86Mapping.c
index 2d95c48..97abc18 100644
--- a/arch/X86/X86Mapping.c
+++ b/arch/X86/X86Mapping.c
@@ -3372,55 +3372,55 @@
{
X86_CALL16m, X86_INS_CALL,
#ifndef CAPSTONE_DIET
- { X86_REG_ESP, 0 }, { 0 }, { X86_GRP_NOT64BITMODE, 0 }, 0, 0
+ { X86_REG_ESP, 0 }, { 0 }, { X86_GRP_NOT64BITMODE, X86_GRP_CALL, 0 }, 0, 0
#endif
},
{
X86_CALL16r, X86_INS_CALL,
#ifndef CAPSTONE_DIET
- { X86_REG_ESP, 0 }, { 0 }, { X86_GRP_NOT64BITMODE, 0 }, 0, 0
+ { X86_REG_ESP, 0 }, { 0 }, { X86_GRP_NOT64BITMODE, X86_GRP_CALL, 0 }, 0, 0
#endif
},
{
X86_CALL32m, X86_INS_CALL,
#ifndef CAPSTONE_DIET
- { X86_REG_ESP, 0 }, { 0 }, { X86_GRP_NOT64BITMODE, 0 }, 0, 0
+ { X86_REG_ESP, 0 }, { 0 }, { X86_GRP_NOT64BITMODE, X86_GRP_CALL, 0 }, 0, 0
#endif
},
{
X86_CALL32r, X86_INS_CALL,
#ifndef CAPSTONE_DIET
- { X86_REG_ESP, 0 }, { 0 }, { X86_GRP_NOT64BITMODE, 0 }, 0, 0
+ { X86_REG_ESP, 0 }, { 0 }, { X86_GRP_NOT64BITMODE, X86_GRP_CALL, 0 }, 0, 0
#endif
},
{
X86_CALL64m, X86_INS_CALL,
#ifndef CAPSTONE_DIET
- { X86_REG_RSP, 0 }, { 0 }, { X86_GRP_MODE64, 0 }, 0, 0
+ { X86_REG_RSP, 0 }, { 0 }, { X86_GRP_MODE64, X86_GRP_CALL, 0 }, 0, 0
#endif
},
{
X86_CALL64pcrel32, X86_INS_CALL,
#ifndef CAPSTONE_DIET
- { X86_REG_RSP, 0 }, { 0 }, { X86_GRP_MODE64, 0 }, 0, 0
+ { X86_REG_RSP, 0 }, { 0 }, { X86_GRP_MODE64, X86_GRP_CALL, 0 }, 0, 0
#endif
},
{
X86_CALL64r, X86_INS_CALL,
#ifndef CAPSTONE_DIET
- { X86_REG_RSP, 0 }, { 0 }, { X86_GRP_MODE64, 0 }, 0, 0
+ { X86_REG_RSP, 0 }, { 0 }, { X86_GRP_MODE64, X86_GRP_CALL, 0 }, 0, 0
#endif
},
{
X86_CALLpcrel16, X86_INS_CALL,
#ifndef CAPSTONE_DIET
- { X86_REG_ESP, 0 }, { 0 }, { 0 }, 0, 0
+ { X86_REG_ESP, 0 }, { 0 }, { X86_GRP_CALL, 0 }, 0, 0
#endif
},
{
X86_CALLpcrel32, X86_INS_CALL,
#ifndef CAPSTONE_DIET
- { X86_REG_ESP, 0 }, { 0 }, { X86_GRP_NOT64BITMODE, 0 }, 0, 0
+ { X86_REG_ESP, 0 }, { 0 }, { X86_GRP_NOT64BITMODE, X86_GRP_CALL, 0 }, 0, 0
#endif
},
{
@@ -3474,7 +3474,7 @@
{
X86_CLGI, X86_INS_CLGI,
#ifndef CAPSTONE_DIET
- { 0 }, { 0 }, { 0 }, 0, 0
+ { 0 }, { 0 }, { X86_GRP_VM, 0 }, 0, 0
#endif
},
{
@@ -5298,31 +5298,31 @@
{
X86_FARCALL16i, X86_INS_LCALL,
#ifndef CAPSTONE_DIET
- { X86_REG_ESP, 0 }, { 0 }, { 0 }, 0, 0
+ { X86_REG_ESP, 0 }, { 0 }, { X86_GRP_CALL, 0 }, 0, 0
#endif
},
{
X86_FARCALL16m, X86_INS_LCALL,
#ifndef CAPSTONE_DIET
- { X86_REG_ESP, 0 }, { 0 }, { 0 }, 0, 0
+ { X86_REG_ESP, 0 }, { 0 }, { X86_GRP_CALL, 0 }, 0, 0
#endif
},
{
X86_FARCALL32i, X86_INS_LCALL,
#ifndef CAPSTONE_DIET
- { X86_REG_ESP, 0 }, { 0 }, { 0 }, 0, 0
+ { X86_REG_ESP, 0 }, { 0 }, { X86_GRP_CALL, 0 }, 0, 0
#endif
},
{
X86_FARCALL32m, X86_INS_LCALL,
#ifndef CAPSTONE_DIET
- { X86_REG_ESP, 0 }, { 0 }, { 0 }, 0, 0
+ { X86_REG_ESP, 0 }, { 0 }, { X86_GRP_CALL, 0 }, 0, 0
#endif
},
{
X86_FARCALL64, X86_INS_LCALL,
#ifndef CAPSTONE_DIET
- { X86_REG_RSP, 0 }, { 0 }, { 0 }, 0, 0
+ { X86_REG_RSP, 0 }, { 0 }, { X86_GRP_CALL, 0 }, 0, 0
#endif
},
{
@@ -6216,25 +6216,25 @@
{
X86_INT, X86_INS_INT,
#ifndef CAPSTONE_DIET
- { 0 }, { 0 }, { 0 }, 0, 0
+ { 0 }, { 0 }, { X86_GRP_INT, 0 }, 0, 0
#endif
},
{
X86_INT1, X86_INS_INT1,
#ifndef CAPSTONE_DIET
- { 0 }, { X86_REG_EFLAGS, 0 }, { 0 }, 0, 0
+ { 0 }, { X86_REG_EFLAGS, 0 }, { X86_GRP_INT, 0 }, 0, 0
#endif
},
{
X86_INT3, X86_INS_INT3,
#ifndef CAPSTONE_DIET
- { 0 }, { 0 }, { 0 }, 0, 0
+ { 0 }, { 0 }, { X86_GRP_INT, 0 }, 0, 0
#endif
},
{
X86_INTO, X86_INS_INTO,
#ifndef CAPSTONE_DIET
- { X86_REG_EFLAGS, 0 }, { 0 }, { 0 }, 0, 0
+ { X86_REG_EFLAGS, 0 }, { 0 }, { X86_GRP_INT, 0 }, 0, 0
#endif
},
{
@@ -6264,13 +6264,13 @@
{
X86_INVLPGA32, X86_INS_INVLPGA,
#ifndef CAPSTONE_DIET
- { X86_REG_EAX, X86_REG_ECX, 0 }, { 0 }, { X86_GRP_NOT64BITMODE, 0 }, 0, 0
+ { X86_REG_EAX, X86_REG_ECX, 0 }, { 0 }, { X86_GRP_NOT64BITMODE, X86_GRP_VM, 0 }, 0, 0
#endif
},
{
X86_INVLPGA64, X86_INS_INVLPGA,
#ifndef CAPSTONE_DIET
- { X86_REG_RAX, X86_REG_ECX, 0 }, { 0 }, { X86_GRP_MODE64, 0 }, 0, 0
+ { X86_REG_RAX, X86_REG_ECX, 0 }, { 0 }, { X86_GRP_MODE64, X86_GRP_VM, 0 }, 0, 0
#endif
},
{
@@ -6300,19 +6300,19 @@
{
X86_IRET16, X86_INS_IRET,
#ifndef CAPSTONE_DIET
- { 0 }, { 0 }, { 0 }, 0, 0
+ { 0 }, { 0 }, { X86_GRP_RET, 0 }, 0, 0
#endif
},
{
X86_IRET32, X86_INS_IRETD,
#ifndef CAPSTONE_DIET
- { 0 }, { 0 }, { 0 }, 0, 0
+ { 0 }, { 0 }, { X86_GRP_RET, 0 }, 0, 0
#endif
},
{
X86_IRET64, X86_INS_IRETQ,
#ifndef CAPSTONE_DIET
- { 0 }, { 0 }, { X86_GRP_MODE64, 0 }, 0, 0
+ { 0 }, { 0 }, { X86_GRP_MODE64, X86_GRP_RET, 0 }, 0, 0
#endif
},
{
@@ -8160,37 +8160,37 @@
{
X86_LRETIL, X86_INS_RETF,
#ifndef CAPSTONE_DIET
- { 0 }, { 0 }, { 0 }, 0, 0
+ { 0 }, { 0 }, { X86_GRP_RET, 0 }, 0, 0
#endif
},
{
X86_LRETIQ, X86_INS_RETFQ,
#ifndef CAPSTONE_DIET
- { 0 }, { 0 }, { X86_GRP_MODE64, 0 }, 0, 0
+ { 0 }, { 0 }, { X86_GRP_MODE64, X86_GRP_RET, 0 }, 0, 0
#endif
},
{
X86_LRETIW, X86_INS_RETF,
#ifndef CAPSTONE_DIET
- { 0 }, { 0 }, { 0 }, 0, 0
+ { 0 }, { 0 }, { X86_GRP_RET, 0 }, 0, 0
#endif
},
{
X86_LRETL, X86_INS_RETF,
#ifndef CAPSTONE_DIET
- { 0 }, { 0 }, { 0 }, 0, 0
+ { 0 }, { 0 }, { X86_GRP_RET, 0 }, 0, 0
#endif
},
{
X86_LRETQ, X86_INS_RETFQ,
#ifndef CAPSTONE_DIET
- { 0 }, { 0 }, { X86_GRP_MODE64, 0 }, 0, 0
+ { 0 }, { 0 }, { X86_GRP_MODE64, X86_GRP_RET, 0 }, 0, 0
#endif
},
{
X86_LRETW, X86_INS_RETF,
#ifndef CAPSTONE_DIET
- { 0 }, { 0 }, { 0 }, 0, 0
+ { 0 }, { 0 }, { X86_GRP_RET, 0 }, 0, 0
#endif
},
{
@@ -14352,37 +14352,37 @@
{
X86_RETIL, X86_INS_RET,
#ifndef CAPSTONE_DIET
- { 0 }, { 0 }, { X86_GRP_NOT64BITMODE, 0 }, 0, 0
+ { 0 }, { 0 }, { X86_GRP_NOT64BITMODE, X86_GRP_RET, 0 }, 0, 0
#endif
},
{
X86_RETIQ, X86_INS_RET,
#ifndef CAPSTONE_DIET
- { 0 }, { 0 }, { X86_GRP_MODE64, 0 }, 0, 0
+ { 0 }, { 0 }, { X86_GRP_MODE64, X86_GRP_RET, 0 }, 0, 0
#endif
},
{
X86_RETIW, X86_INS_RET,
#ifndef CAPSTONE_DIET
- { 0 }, { 0 }, { 0 }, 0, 0
+ { 0 }, { 0 }, { X86_GRP_RET, 0 }, 0, 0
#endif
},
{
X86_RETL, X86_INS_RET,
#ifndef CAPSTONE_DIET
- { 0 }, { 0 }, { X86_GRP_NOT64BITMODE, 0 }, 0, 0
+ { 0 }, { 0 }, { X86_GRP_NOT64BITMODE, X86_GRP_RET, 0 }, 0, 0
#endif
},
{
X86_RETQ, X86_INS_RET,
#ifndef CAPSTONE_DIET
- { 0 }, { 0 }, { X86_GRP_MODE64, 0 }, 0, 0
+ { 0 }, { 0 }, { X86_GRP_MODE64, X86_GRP_RET, 0 }, 0, 0
#endif
},
{
X86_RETW, X86_INS_RET,
#ifndef CAPSTONE_DIET
- { 0 }, { 0 }, { 0 }, 0, 0
+ { 0 }, { 0 }, { X86_GRP_RET, 0 }, 0, 0
#endif
},
{
@@ -16200,7 +16200,7 @@
{
X86_SKINIT, X86_INS_SKINIT,
#ifndef CAPSTONE_DIET
- { X86_REG_EAX, 0 }, { 0 }, { 0 }, 0, 0
+ { X86_REG_EAX, 0 }, { 0 }, { X86_GRP_VM, 0 }, 0, 0
#endif
},
{
@@ -16362,7 +16362,7 @@
{
X86_STGI, X86_INS_STGI,
#ifndef CAPSTONE_DIET
- { 0 }, { 0 }, { 0 }, 0, 0
+ { 0 }, { 0 }, { X86_GRP_VM, 0 }, 0, 0
#endif
},
{
@@ -16854,13 +16854,13 @@
{
X86_SYSCALL, X86_INS_SYSCALL,
#ifndef CAPSTONE_DIET
- { 0 }, { 0 }, { 0 }, 0, 0
+ { 0 }, { 0 }, { X86_GRP_INT, 0 }, 0, 0
#endif
},
{
X86_SYSENTER, X86_INS_SYSENTER,
#ifndef CAPSTONE_DIET
- { 0 }, { 0 }, { 0 }, 0, 0
+ { 0 }, { 0 }, { X86_GRP_INT, 0 }, 0, 0
#endif
},
{
@@ -22674,19 +22674,19 @@
{
X86_VMCALL, X86_INS_VMCALL,
#ifndef CAPSTONE_DIET
- { 0 }, { 0 }, { 0 }, 0, 0
+ { 0 }, { 0 }, { X86_GRP_VM, 0 }, 0, 0
#endif
},
{
X86_VMCLEARm, X86_INS_VMCLEAR,
#ifndef CAPSTONE_DIET
- { 0 }, { 0 }, { 0 }, 0, 0
+ { 0 }, { 0 }, { X86_GRP_VM, 0 }, 0, 0
#endif
},
{
X86_VMFUNC, X86_INS_VMFUNC,
#ifndef CAPSTONE_DIET
- { 0 }, { 0 }, { 0 }, 0, 0
+ { 0 }, { 0 }, { X86_GRP_VM, 0 }, 0, 0
#endif
},
{
@@ -22920,25 +22920,25 @@
{
X86_VMLAUNCH, X86_INS_VMLAUNCH,
#ifndef CAPSTONE_DIET
- { 0 }, { 0 }, { 0 }, 0, 0
+ { 0 }, { 0 }, { X86_GRP_VM, 0 }, 0, 0
#endif
},
{
X86_VMLOAD32, X86_INS_VMLOAD,
#ifndef CAPSTONE_DIET
- { X86_REG_EAX, 0 }, { 0 }, { X86_GRP_NOT64BITMODE, 0 }, 0, 0
+ { X86_REG_EAX, 0 }, { 0 }, { X86_GRP_NOT64BITMODE, X86_GRP_VM, 0 }, 0, 0
#endif
},
{
X86_VMLOAD64, X86_INS_VMLOAD,
#ifndef CAPSTONE_DIET
- { X86_REG_RAX, 0 }, { 0 }, { X86_GRP_MODE64, 0 }, 0, 0
+ { X86_REG_RAX, 0 }, { 0 }, { X86_GRP_MODE64, X86_GRP_VM, 0 }, 0, 0
#endif
},
{
X86_VMMCALL, X86_INS_VMMCALL,
#ifndef CAPSTONE_DIET
- { 0 }, { 0 }, { 0 }, 0, 0
+ { 0 }, { 0 }, { X86_GRP_VM, 0 }, 0, 0
#endif
},
{
@@ -24072,67 +24072,67 @@
{
X86_VMPTRLDm, X86_INS_VMPTRLD,
#ifndef CAPSTONE_DIET
- { 0 }, { 0 }, { 0 }, 0, 0
+ { 0 }, { 0 }, { X86_GRP_VM, 0 }, 0, 0
#endif
},
{
X86_VMPTRSTm, X86_INS_VMPTRST,
#ifndef CAPSTONE_DIET
- { 0 }, { 0 }, { 0 }, 0, 0
+ { 0 }, { 0 }, { X86_GRP_VM, 0 }, 0, 0
#endif
},
{
X86_VMREAD32rm, X86_INS_VMREAD,
#ifndef CAPSTONE_DIET
- { 0 }, { 0 }, { X86_GRP_NOT64BITMODE, 0 }, 0, 0
+ { 0 }, { 0 }, { X86_GRP_NOT64BITMODE, X86_GRP_VM, 0 }, 0, 0
#endif
},
{
X86_VMREAD32rr, X86_INS_VMREAD,
#ifndef CAPSTONE_DIET
- { 0 }, { 0 }, { X86_GRP_NOT64BITMODE, 0 }, 0, 0
+ { 0 }, { 0 }, { X86_GRP_NOT64BITMODE, X86_GRP_VM, 0 }, 0, 0
#endif
},
{
X86_VMREAD64rm, X86_INS_VMREAD,
#ifndef CAPSTONE_DIET
- { 0 }, { 0 }, { X86_GRP_MODE64, 0 }, 0, 0
+ { 0 }, { 0 }, { X86_GRP_MODE64, X86_GRP_VM, 0 }, 0, 0
#endif
},
{
X86_VMREAD64rr, X86_INS_VMREAD,
#ifndef CAPSTONE_DIET
- { 0 }, { 0 }, { X86_GRP_MODE64, 0 }, 0, 0
+ { 0 }, { 0 }, { X86_GRP_MODE64, X86_GRP_VM, 0 }, 0, 0
#endif
},
{
X86_VMRESUME, X86_INS_VMRESUME,
#ifndef CAPSTONE_DIET
- { 0 }, { 0 }, { 0 }, 0, 0
+ { 0 }, { 0 }, { X86_GRP_VM, 0 }, 0, 0
#endif
},
{
X86_VMRUN32, X86_INS_VMRUN,
#ifndef CAPSTONE_DIET
- { X86_REG_EAX, 0 }, { 0 }, { X86_GRP_NOT64BITMODE, 0 }, 0, 0
+ { X86_REG_EAX, 0 }, { 0 }, { X86_GRP_NOT64BITMODE, X86_GRP_VM, 0 }, 0, 0
#endif
},
{
X86_VMRUN64, X86_INS_VMRUN,
#ifndef CAPSTONE_DIET
- { X86_REG_RAX, 0 }, { 0 }, { X86_GRP_MODE64, 0 }, 0, 0
+ { X86_REG_RAX, 0 }, { 0 }, { X86_GRP_MODE64, X86_GRP_VM, 0 }, 0, 0
#endif
},
{
X86_VMSAVE32, X86_INS_VMSAVE,
#ifndef CAPSTONE_DIET
- { X86_REG_EAX, 0 }, { 0 }, { X86_GRP_NOT64BITMODE, 0 }, 0, 0
+ { X86_REG_EAX, 0 }, { 0 }, { X86_GRP_NOT64BITMODE, X86_GRP_VM, 0 }, 0, 0
#endif
},
{
X86_VMSAVE64, X86_INS_VMSAVE,
#ifndef CAPSTONE_DIET
- { X86_REG_RAX, 0 }, { 0 }, { X86_GRP_MODE64, 0 }, 0, 0
+ { X86_REG_RAX, 0 }, { 0 }, { X86_GRP_MODE64, X86_GRP_VM, 0 }, 0, 0
#endif
},
{
@@ -24294,37 +24294,37 @@
{
X86_VMWRITE32rm, X86_INS_VMWRITE,
#ifndef CAPSTONE_DIET
- { 0 }, { 0 }, { X86_GRP_NOT64BITMODE, 0 }, 0, 0
+ { 0 }, { 0 }, { X86_GRP_NOT64BITMODE, X86_GRP_VM, 0 }, 0, 0
#endif
},
{
X86_VMWRITE32rr, X86_INS_VMWRITE,
#ifndef CAPSTONE_DIET
- { 0 }, { 0 }, { X86_GRP_NOT64BITMODE, 0 }, 0, 0
+ { 0 }, { 0 }, { X86_GRP_NOT64BITMODE, X86_GRP_VM, 0 }, 0, 0
#endif
},
{
X86_VMWRITE64rm, X86_INS_VMWRITE,
#ifndef CAPSTONE_DIET
- { 0 }, { 0 }, { X86_GRP_MODE64, 0 }, 0, 0
+ { 0 }, { 0 }, { X86_GRP_MODE64, X86_GRP_VM, 0 }, 0, 0
#endif
},
{
X86_VMWRITE64rr, X86_INS_VMWRITE,
#ifndef CAPSTONE_DIET
- { 0 }, { 0 }, { X86_GRP_MODE64, 0 }, 0, 0
+ { 0 }, { 0 }, { X86_GRP_MODE64, X86_GRP_VM, 0 }, 0, 0
#endif
},
{
X86_VMXOFF, X86_INS_VMXOFF,
#ifndef CAPSTONE_DIET
- { 0 }, { 0 }, { 0 }, 0, 0
+ { 0 }, { 0 }, { X86_GRP_VM, 0 }, 0, 0
#endif
},
{
X86_VMXON, X86_INS_VMXON,
#ifndef CAPSTONE_DIET
- { 0 }, { 0 }, { 0 }, 0, 0
+ { 0 }, { 0 }, { X86_GRP_VM, 0 }, 0, 0
#endif
},
{
@@ -31620,7 +31620,7 @@
{
X86_W64ALLOCA, X86_INS_CALL,
#ifndef CAPSTONE_DIET
- { X86_REG_RSP, 0 }, { X86_REG_RAX, X86_REG_R10, X86_REG_R11, X86_REG_RSP, X86_REG_EFLAGS, 0 }, { 0 }, 0, 0
+ { X86_REG_RSP, 0 }, { X86_REG_RAX, X86_REG_R10, X86_REG_R11, X86_REG_RSP, X86_REG_EFLAGS, 0 }, { X86_GRP_CALL, 0 }, 0, 0
#endif
},
{
@@ -33605,55 +33605,55 @@
{
X86_CALL16m, X86_INS_CALL,
#ifndef CAPSTONE_DIET
- { X86_REG_ESP, 0 }, { 0 }, { X86_GRP_NOT64BITMODE, 0 }, 0, 0
+ { X86_REG_ESP, 0 }, { 0 }, { X86_GRP_NOT64BITMODE, X86_GRP_CALL, 0 }, 0, 0
#endif
},
{
X86_CALL16r, X86_INS_CALL,
#ifndef CAPSTONE_DIET
- { X86_REG_ESP, 0 }, { 0 }, { X86_GRP_NOT64BITMODE, 0 }, 0, 0
+ { X86_REG_ESP, 0 }, { 0 }, { X86_GRP_NOT64BITMODE, X86_GRP_CALL, 0 }, 0, 0
#endif
},
{
X86_CALL32m, X86_INS_CALL,
#ifndef CAPSTONE_DIET
- { X86_REG_ESP, 0 }, { 0 }, { X86_GRP_NOT64BITMODE, 0 }, 0, 0
+ { X86_REG_ESP, 0 }, { 0 }, { X86_GRP_NOT64BITMODE, X86_GRP_CALL, 0 }, 0, 0
#endif
},
{
X86_CALL32r, X86_INS_CALL,
#ifndef CAPSTONE_DIET
- { X86_REG_ESP, 0 }, { 0 }, { X86_GRP_NOT64BITMODE, 0 }, 0, 0
+ { X86_REG_ESP, 0 }, { 0 }, { X86_GRP_NOT64BITMODE, X86_GRP_CALL, 0 }, 0, 0
#endif
},
{
X86_CALL64m, X86_INS_CALL,
#ifndef CAPSTONE_DIET
- { X86_REG_RSP, 0 }, { 0 }, { X86_GRP_MODE64, 0 }, 0, 0
+ { X86_REG_RSP, 0 }, { 0 }, { X86_GRP_MODE64, X86_GRP_CALL, 0 }, 0, 0
#endif
},
{
X86_CALL64pcrel32, X86_INS_CALL,
#ifndef CAPSTONE_DIET
- { X86_REG_RSP, 0 }, { 0 }, { X86_GRP_MODE64, 0 }, 0, 0
+ { X86_REG_RSP, 0 }, { 0 }, { X86_GRP_MODE64, X86_GRP_CALL, 0 }, 0, 0
#endif
},
{
X86_CALL64r, X86_INS_CALL,
#ifndef CAPSTONE_DIET
- { X86_REG_RSP, 0 }, { 0 }, { X86_GRP_MODE64, 0 }, 0, 0
+ { X86_REG_RSP, 0 }, { 0 }, { X86_GRP_MODE64, X86_GRP_CALL, 0 }, 0, 0
#endif
},
{
X86_CALLpcrel16, X86_INS_CALL,
#ifndef CAPSTONE_DIET
- { X86_REG_ESP, 0 }, { 0 }, { 0 }, 0, 0
+ { X86_REG_ESP, 0 }, { 0 }, { X86_GRP_CALL, 0 }, 0, 0
#endif
},
{
X86_CALLpcrel32, X86_INS_CALL,
#ifndef CAPSTONE_DIET
- { X86_REG_ESP, 0 }, { 0 }, { X86_GRP_NOT64BITMODE, 0 }, 0, 0
+ { X86_REG_ESP, 0 }, { 0 }, { X86_GRP_NOT64BITMODE, X86_GRP_CALL, 0 }, 0, 0
#endif
},
{
@@ -33695,7 +33695,7 @@
{
X86_CLGI, X86_INS_CLGI,
#ifndef CAPSTONE_DIET
- { 0 }, { 0 }, { 0 }, 0, 0
+ { 0 }, { 0 }, { X86_GRP_VM, 0 }, 0, 0
#endif
},
{
@@ -34787,31 +34787,31 @@
{
X86_FARCALL16i, X86_INS_LCALL,
#ifndef CAPSTONE_DIET
- { X86_REG_ESP, 0 }, { 0 }, { 0 }, 0, 0
+ { X86_REG_ESP, 0 }, { 0 }, { X86_GRP_CALL, 0 }, 0, 0
#endif
},
{
X86_FARCALL16m, X86_INS_LCALL,
#ifndef CAPSTONE_DIET
- { X86_REG_ESP, 0 }, { 0 }, { 0 }, 0, 0
+ { X86_REG_ESP, 0 }, { 0 }, { X86_GRP_CALL, 0 }, 0, 0
#endif
},
{
X86_FARCALL32i, X86_INS_LCALL,
#ifndef CAPSTONE_DIET
- { X86_REG_ESP, 0 }, { 0 }, { 0 }, 0, 0
+ { X86_REG_ESP, 0 }, { 0 }, { X86_GRP_CALL, 0 }, 0, 0
#endif
},
{
X86_FARCALL32m, X86_INS_LCALL,
#ifndef CAPSTONE_DIET
- { X86_REG_ESP, 0 }, { 0 }, { 0 }, 0, 0
+ { X86_REG_ESP, 0 }, { 0 }, { X86_GRP_CALL, 0 }, 0, 0
#endif
},
{
X86_FARCALL64, X86_INS_LCALL,
#ifndef CAPSTONE_DIET
- { X86_REG_RSP, 0 }, { 0 }, { 0 }, 0, 0
+ { X86_REG_RSP, 0 }, { 0 }, { X86_GRP_CALL, 0 }, 0, 0
#endif
},
{
@@ -35219,25 +35219,25 @@
{
X86_INT, X86_INS_INT,
#ifndef CAPSTONE_DIET
- { 0 }, { 0 }, { 0 }, 0, 0
+ { 0 }, { 0 }, { X86_GRP_INT, 0 }, 0, 0
#endif
},
{
X86_INT1, X86_INS_INT1,
#ifndef CAPSTONE_DIET
- { 0 }, { X86_REG_EFLAGS, 0 }, { 0 }, 0, 0
+ { 0 }, { X86_REG_EFLAGS, 0 }, { X86_GRP_INT, 0 }, 0, 0
#endif
},
{
X86_INT3, X86_INS_INT3,
#ifndef CAPSTONE_DIET
- { 0 }, { 0 }, { 0 }, 0, 0
+ { 0 }, { 0 }, { X86_GRP_INT, 0 }, 0, 0
#endif
},
{
X86_INTO, X86_INS_INTO,
#ifndef CAPSTONE_DIET
- { X86_REG_EFLAGS, 0 }, { 0 }, { 0 }, 0, 0
+ { X86_REG_EFLAGS, 0 }, { 0 }, { X86_GRP_INT, 0 }, 0, 0
#endif
},
{
@@ -35267,13 +35267,13 @@
{
X86_INVLPGA32, X86_INS_INVLPGA,
#ifndef CAPSTONE_DIET
- { X86_REG_EAX, X86_REG_ECX, 0 }, { 0 }, { X86_GRP_NOT64BITMODE, 0 }, 0, 0
+ { X86_REG_EAX, X86_REG_ECX, 0 }, { 0 }, { X86_GRP_NOT64BITMODE, X86_GRP_VM, 0 }, 0, 0
#endif
},
{
X86_INVLPGA64, X86_INS_INVLPGA,
#ifndef CAPSTONE_DIET
- { X86_REG_RAX, X86_REG_ECX, 0 }, { 0 }, { X86_GRP_MODE64, 0 }, 0, 0
+ { X86_REG_RAX, X86_REG_ECX, 0 }, { 0 }, { X86_GRP_MODE64, X86_GRP_VM, 0 }, 0, 0
#endif
},
{
@@ -35303,19 +35303,19 @@
{
X86_IRET16, X86_INS_IRET,
#ifndef CAPSTONE_DIET
- { 0 }, { 0 }, { 0 }, 0, 0
+ { 0 }, { 0 }, { X86_GRP_RET, 0 }, 0, 0
#endif
},
{
X86_IRET32, X86_INS_IRETD,
#ifndef CAPSTONE_DIET
- { 0 }, { 0 }, { 0 }, 0, 0
+ { 0 }, { 0 }, { X86_GRP_RET, 0 }, 0, 0
#endif
},
{
X86_IRET64, X86_INS_IRETQ,
#ifndef CAPSTONE_DIET
- { 0 }, { 0 }, { X86_GRP_MODE64, 0 }, 0, 0
+ { 0 }, { 0 }, { X86_GRP_MODE64, X86_GRP_RET, 0 }, 0, 0
#endif
},
{
@@ -36347,37 +36347,37 @@
{
X86_LRETIL, X86_INS_RETF,
#ifndef CAPSTONE_DIET
- { 0 }, { 0 }, { 0 }, 0, 0
+ { 0 }, { 0 }, { X86_GRP_RET, 0 }, 0, 0
#endif
},
{
X86_LRETIQ, X86_INS_RETFQ,
#ifndef CAPSTONE_DIET
- { 0 }, { 0 }, { X86_GRP_MODE64, 0 }, 0, 0
+ { 0 }, { 0 }, { X86_GRP_MODE64, X86_GRP_RET, 0 }, 0, 0
#endif
},
{
X86_LRETIW, X86_INS_RETF,
#ifndef CAPSTONE_DIET
- { 0 }, { 0 }, { 0 }, 0, 0
+ { 0 }, { 0 }, { X86_GRP_RET, 0 }, 0, 0
#endif
},
{
X86_LRETL, X86_INS_RETF,
#ifndef CAPSTONE_DIET
- { 0 }, { 0 }, { 0 }, 0, 0
+ { 0 }, { 0 }, { X86_GRP_RET, 0 }, 0, 0
#endif
},
{
X86_LRETQ, X86_INS_RETFQ,
#ifndef CAPSTONE_DIET
- { 0 }, { 0 }, { X86_GRP_MODE64, 0 }, 0, 0
+ { 0 }, { 0 }, { X86_GRP_MODE64, X86_GRP_RET, 0 }, 0, 0
#endif
},
{
X86_LRETW, X86_INS_RETF,
#ifndef CAPSTONE_DIET
- { 0 }, { 0 }, { 0 }, 0, 0
+ { 0 }, { 0 }, { X86_GRP_RET, 0 }, 0, 0
#endif
},
{
@@ -38633,37 +38633,37 @@
{
X86_RETIL, X86_INS_RET,
#ifndef CAPSTONE_DIET
- { 0 }, { 0 }, { X86_GRP_NOT64BITMODE, 0 }, 0, 0
+ { 0 }, { 0 }, { X86_GRP_NOT64BITMODE, X86_GRP_RET, 0 }, 0, 0
#endif
},
{
X86_RETIQ, X86_INS_RET,
#ifndef CAPSTONE_DIET
- { 0 }, { 0 }, { X86_GRP_MODE64, 0 }, 0, 0
+ { 0 }, { 0 }, { X86_GRP_MODE64, X86_GRP_RET, 0 }, 0, 0
#endif
},
{
X86_RETIW, X86_INS_RET,
#ifndef CAPSTONE_DIET
- { 0 }, { 0 }, { 0 }, 0, 0
+ { 0 }, { 0 }, { X86_GRP_RET, 0 }, 0, 0
#endif
},
{
X86_RETL, X86_INS_RET,
#ifndef CAPSTONE_DIET
- { 0 }, { 0 }, { X86_GRP_NOT64BITMODE, 0 }, 0, 0
+ { 0 }, { 0 }, { X86_GRP_NOT64BITMODE, X86_GRP_RET, 0 }, 0, 0
#endif
},
{
X86_RETQ, X86_INS_RET,
#ifndef CAPSTONE_DIET
- { 0 }, { 0 }, { X86_GRP_MODE64, 0 }, 0, 0
+ { 0 }, { 0 }, { X86_GRP_MODE64, X86_GRP_RET, 0 }, 0, 0
#endif
},
{
X86_RETW, X86_INS_RET,
#ifndef CAPSTONE_DIET
- { 0 }, { 0 }, { 0 }, 0, 0
+ { 0 }, { 0 }, { X86_GRP_RET, 0 }, 0, 0
#endif
},
{
@@ -40253,7 +40253,7 @@
{
X86_SKINIT, X86_INS_SKINIT,
#ifndef CAPSTONE_DIET
- { X86_REG_EAX, 0 }, { 0 }, { 0 }, 0, 0
+ { X86_REG_EAX, 0 }, { 0 }, { X86_GRP_VM, 0 }, 0, 0
#endif
},
{
@@ -40337,7 +40337,7 @@
{
X86_STGI, X86_INS_STGI,
#ifndef CAPSTONE_DIET
- { 0 }, { 0 }, { 0 }, 0, 0
+ { 0 }, { 0 }, { X86_GRP_VM, 0 }, 0, 0
#endif
},
{
@@ -40613,13 +40613,13 @@
{
X86_SYSCALL, X86_INS_SYSCALL,
#ifndef CAPSTONE_DIET
- { 0 }, { 0 }, { 0 }, 0, 0
+ { 0 }, { 0 }, { X86_GRP_INT, 0 }, 0, 0
#endif
},
{
X86_SYSENTER, X86_INS_SYSENTER,
#ifndef CAPSTONE_DIET
- { 0 }, { 0 }, { 0 }, 0, 0
+ { 0 }, { 0 }, { X86_GRP_INT, 0 }, 0, 0
#endif
},
{
@@ -40937,151 +40937,151 @@
{
X86_VMCALL, X86_INS_VMCALL,
#ifndef CAPSTONE_DIET
- { 0 }, { 0 }, { 0 }, 0, 0
+ { 0 }, { 0 }, { X86_GRP_VM, 0 }, 0, 0
#endif
},
{
X86_VMCLEARm, X86_INS_VMCLEAR,
#ifndef CAPSTONE_DIET
- { 0 }, { 0 }, { 0 }, 0, 0
+ { 0 }, { 0 }, { X86_GRP_VM, 0 }, 0, 0
#endif
},
{
X86_VMFUNC, X86_INS_VMFUNC,
#ifndef CAPSTONE_DIET
- { 0 }, { 0 }, { 0 }, 0, 0
+ { 0 }, { 0 }, { X86_GRP_VM, 0 }, 0, 0
#endif
},
{
X86_VMLAUNCH, X86_INS_VMLAUNCH,
#ifndef CAPSTONE_DIET
- { 0 }, { 0 }, { 0 }, 0, 0
+ { 0 }, { 0 }, { X86_GRP_VM, 0 }, 0, 0
#endif
},
{
X86_VMLOAD32, X86_INS_VMLOAD,
#ifndef CAPSTONE_DIET
- { X86_REG_EAX, 0 }, { 0 }, { X86_GRP_NOT64BITMODE, 0 }, 0, 0
+ { X86_REG_EAX, 0 }, { 0 }, { X86_GRP_NOT64BITMODE, X86_GRP_VM, 0 }, 0, 0
#endif
},
{
X86_VMLOAD64, X86_INS_VMLOAD,
#ifndef CAPSTONE_DIET
- { X86_REG_RAX, 0 }, { 0 }, { X86_GRP_MODE64, 0 }, 0, 0
+ { X86_REG_RAX, 0 }, { 0 }, { X86_GRP_MODE64, X86_GRP_VM, 0 }, 0, 0
#endif
},
{
X86_VMMCALL, X86_INS_VMMCALL,
#ifndef CAPSTONE_DIET
- { 0 }, { 0 }, { 0 }, 0, 0
+ { 0 }, { 0 }, { X86_GRP_VM, 0 }, 0, 0
#endif
},
{
X86_VMPTRLDm, X86_INS_VMPTRLD,
#ifndef CAPSTONE_DIET
- { 0 }, { 0 }, { 0 }, 0, 0
+ { 0 }, { 0 }, { X86_GRP_VM, 0 }, 0, 0
#endif
},
{
X86_VMPTRSTm, X86_INS_VMPTRST,
#ifndef CAPSTONE_DIET
- { 0 }, { 0 }, { 0 }, 0, 0
+ { 0 }, { 0 }, { X86_GRP_VM, 0 }, 0, 0
#endif
},
{
X86_VMREAD32rm, X86_INS_VMREAD,
#ifndef CAPSTONE_DIET
- { 0 }, { 0 }, { X86_GRP_NOT64BITMODE, 0 }, 0, 0
+ { 0 }, { 0 }, { X86_GRP_NOT64BITMODE, X86_GRP_VM, 0 }, 0, 0
#endif
},
{
X86_VMREAD32rr, X86_INS_VMREAD,
#ifndef CAPSTONE_DIET
- { 0 }, { 0 }, { X86_GRP_NOT64BITMODE, 0 }, 0, 0
+ { 0 }, { 0 }, { X86_GRP_NOT64BITMODE, X86_GRP_VM, 0 }, 0, 0
#endif
},
{
X86_VMREAD64rm, X86_INS_VMREAD,
#ifndef CAPSTONE_DIET
- { 0 }, { 0 }, { X86_GRP_MODE64, 0 }, 0, 0
+ { 0 }, { 0 }, { X86_GRP_MODE64, X86_GRP_VM, 0 }, 0, 0
#endif
},
{
X86_VMREAD64rr, X86_INS_VMREAD,
#ifndef CAPSTONE_DIET
- { 0 }, { 0 }, { X86_GRP_MODE64, 0 }, 0, 0
+ { 0 }, { 0 }, { X86_GRP_MODE64, X86_GRP_VM, 0 }, 0, 0
#endif
},
{
X86_VMRESUME, X86_INS_VMRESUME,
#ifndef CAPSTONE_DIET
- { 0 }, { 0 }, { 0 }, 0, 0
+ { 0 }, { 0 }, { X86_GRP_VM, 0 }, 0, 0
#endif
},
{
X86_VMRUN32, X86_INS_VMRUN,
#ifndef CAPSTONE_DIET
- { X86_REG_EAX, 0 }, { 0 }, { X86_GRP_NOT64BITMODE, 0 }, 0, 0
+ { X86_REG_EAX, 0 }, { 0 }, { X86_GRP_NOT64BITMODE, X86_GRP_VM, 0 }, 0, 0
#endif
},
{
X86_VMRUN64, X86_INS_VMRUN,
#ifndef CAPSTONE_DIET
- { X86_REG_RAX, 0 }, { 0 }, { X86_GRP_MODE64, 0 }, 0, 0
+ { X86_REG_RAX, 0 }, { 0 }, { X86_GRP_MODE64, X86_GRP_VM, 0 }, 0, 0
#endif
},
{
X86_VMSAVE32, X86_INS_VMSAVE,
#ifndef CAPSTONE_DIET
- { X86_REG_EAX, 0 }, { 0 }, { X86_GRP_NOT64BITMODE, 0 }, 0, 0
+ { X86_REG_EAX, 0 }, { 0 }, { X86_GRP_NOT64BITMODE, X86_GRP_VM, 0 }, 0, 0
#endif
},
{
X86_VMSAVE64, X86_INS_VMSAVE,
#ifndef CAPSTONE_DIET
- { X86_REG_RAX, 0 }, { 0 }, { X86_GRP_MODE64, 0 }, 0, 0
+ { X86_REG_RAX, 0 }, { 0 }, { X86_GRP_MODE64, X86_GRP_VM, 0 }, 0, 0
#endif
},
{
X86_VMWRITE32rm, X86_INS_VMWRITE,
#ifndef CAPSTONE_DIET
- { 0 }, { 0 }, { X86_GRP_NOT64BITMODE, 0 }, 0, 0
+ { 0 }, { 0 }, { X86_GRP_NOT64BITMODE, X86_GRP_VM, 0 }, 0, 0
#endif
},
{
X86_VMWRITE32rr, X86_INS_VMWRITE,
#ifndef CAPSTONE_DIET
- { 0 }, { 0 }, { X86_GRP_NOT64BITMODE, 0 }, 0, 0
+ { 0 }, { 0 }, { X86_GRP_NOT64BITMODE, X86_GRP_VM, 0 }, 0, 0
#endif
},
{
X86_VMWRITE64rm, X86_INS_VMWRITE,
#ifndef CAPSTONE_DIET
- { 0 }, { 0 }, { X86_GRP_MODE64, 0 }, 0, 0
+ { 0 }, { 0 }, { X86_GRP_MODE64, X86_GRP_VM, 0 }, 0, 0
#endif
},
{
X86_VMWRITE64rr, X86_INS_VMWRITE,
#ifndef CAPSTONE_DIET
- { 0 }, { 0 }, { X86_GRP_MODE64, 0 }, 0, 0
+ { 0 }, { 0 }, { X86_GRP_MODE64, X86_GRP_VM, 0 }, 0, 0
#endif
},
{
X86_VMXOFF, X86_INS_VMXOFF,
#ifndef CAPSTONE_DIET
- { 0 }, { 0 }, { 0 }, 0, 0
+ { 0 }, { 0 }, { X86_GRP_VM, 0 }, 0, 0
#endif
},
{
X86_VMXON, X86_INS_VMXON,
#ifndef CAPSTONE_DIET
- { 0 }, { 0 }, { 0 }, 0, 0
+ { 0 }, { 0 }, { X86_GRP_VM, 0 }, 0, 0
#endif
},
{
X86_W64ALLOCA, X86_INS_CALL,
#ifndef CAPSTONE_DIET
- { X86_REG_RSP, 0 }, { X86_REG_RAX, X86_REG_R10, X86_REG_R11, X86_REG_RSP, X86_REG_EFLAGS, 0 }, { 0 }, 0, 0
+ { X86_REG_RSP, 0 }, { X86_REG_RAX, X86_REG_R10, X86_REG_R11, X86_REG_RSP, X86_REG_EFLAGS, X86_GRP_CALL, 0 }, { 0 }, 0, 0
#endif
},
{
@@ -41709,6 +41709,22 @@
insn->detail->groups[insn->detail->groups_count] = X86_GRP_JUMP;
insn->detail->groups_count++;
}
+
+ switch (insns[i].id) {
+ case X86_OUT8ir:
+ case X86_OUT16ir:
+ case X86_OUT32ir:
+ if (insn->detail->x86.operands[0].imm == -78) {
+ // Writing to port 0xb2 causes an SMI on most platforms
+ // See: http://cs.gmu.edu/~tr-admin/papers/GMU-CS-TR-2011-8.pdf
+ insn->detail->groups[insn->detail->groups_count] = X86_GRP_INT;
+ insn->detail->groups_count++;
+ }
+ break;
+
+ default:
+ break;
+ }
#endif
}
}
diff --git a/bindings/java/capstone/X86_const.java b/bindings/java/capstone/X86_const.java
index 02f4e3d..b9ff3a6 100644
--- a/bindings/java/capstone/X86_const.java
+++ b/bindings/java/capstone/X86_const.java
@@ -1549,5 +1549,10 @@
public static final int X86_GRP_16BITMODE = 32;
public static final int X86_GRP_NOT64BITMODE = 33;
public static final int X86_GRP_JUMP = 34;
- public static final int X86_GRP_MAX = 35;
-}
\ No newline at end of file
+ public static final int X86_GRP_VM = 35;
+ public static final int X86_GRP_INT = 36;
+ public static final int X86_GRP_IRET = 37;
+ public static final int X86_GRP_CALL = 38;
+ public static final int X86_GRP_RET = 39;
+ public static final int X86_GRP_MAX = 40;
+}
diff --git a/bindings/python/capstone/x86_const.py b/bindings/python/capstone/x86_const.py
index 1d01ccf..25dd5fb 100644
--- a/bindings/python/capstone/x86_const.py
+++ b/bindings/python/capstone/x86_const.py
@@ -1546,4 +1546,9 @@
X86_GRP_16BITMODE = 32
X86_GRP_NOT64BITMODE = 33
X86_GRP_JUMP = 34
-X86_GRP_MAX = 35
+X86_GRP_VM = 35
+X86_GRP_INT = 36
+X86_GRP_IRET = 37
+X86_GRP_CALL = 38
+X86_GRP_RET = 39
+X86_GRP_MAX = 40
diff --git a/include/x86.h b/include/x86.h
index 116d9b1..d27ddf8 100644
--- a/include/x86.h
+++ b/include/x86.h
@@ -62,7 +62,7 @@
X86_REG_R12B, X86_REG_R13B, X86_REG_R14B, X86_REG_R15B, X86_REG_R8D,
X86_REG_R9D, X86_REG_R10D, X86_REG_R11D, X86_REG_R12D, X86_REG_R13D,
X86_REG_R14D, X86_REG_R15D, X86_REG_R8W, X86_REG_R9W, X86_REG_R10W,
- X86_REG_R11W, X86_REG_R12W, X86_REG_R13W, X86_REG_R14W, X86_REG_R15W,
+ X86_REG_R11W, X86_REG_R12W, X86_REG_R13W, X86_REG_R14W, X86_REG_R15W,
X86_REG_MAX // <-- mark the end of the list of registers
} x86_reg;
@@ -141,7 +141,7 @@
// SIB base register, or X86_REG_INVALID when irrelevant.
x86_reg sib_base;
- // Number of operands of this instruction,
+ // Number of operands of this instruction,
// or 0 when instruction has no operand.
uint8_t op_count;
@@ -1454,6 +1454,11 @@
X86_GRP_NOT64BITMODE,
X86_GRP_JUMP, // all jump instructions (conditional+direct+indirect jumps)
+ X86_GRP_VM, // all virtualization instructions (VT-x + AMD-V)
+ X86_GRP_INT, // all interrupt instructions (int+syscall)
+ X86_GRP_IRET, // all interrupt return instructions
+ X86_GRP_CALL, // all call instructions
+ X86_GRP_RET, // all call return instructions
X86_GRP_MAX
} x86_insn_group;