Zydis  v3.0.0
SharedData.h
1 /***************************************************************************************************
2 
3  Zyan Disassembler Library (Zydis)
4 
5  Original Author : Florian Bernd
6 
7  * Permission is hereby granted, free of charge, to any person obtaining a copy
8  * of this software and associated documentation files (the "Software"), to deal
9  * in the Software without restriction, including without limitation the rights
10  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
11  * copies of the Software, and to permit persons to whom the Software is
12  * furnished to do so, subject to the following conditions:
13  *
14  * The above copyright notice and this permission notice shall be included in all
15  * copies or substantial portions of the Software.
16  *
17  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
20  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
23  * SOFTWARE.
24 
25 ***************************************************************************************************/
26 
27 #ifndef ZYDIS_INTERNAL_SHAREDDATA_H
28 #define ZYDIS_INTERNAL_SHAREDDATA_H
29 
30 #include <Zycore/Defines.h>
31 #include <Zydis/Mnemonic.h>
32 #include <Zydis/Register.h>
33 #include <Zydis/SharedTypes.h>
34 #include <Zydis/DecoderTypes.h>
35 
36 #ifdef __cplusplus
37 extern "C" {
38 #endif
39 
40 /* ============================================================================================== */
41 /* Enums and types */
42 /* ============================================================================================== */
43 
44 // MSVC does not like types other than (un-)signed int for bit-fields
45 #ifdef ZYAN_MSVC
46 # pragma warning(push)
47 # pragma warning(disable:4214)
48 #endif
49 
50 #pragma pack(push, 1)
51 
52 /* ---------------------------------------------------------------------------------------------- */
53 /* Operand definition */
54 /* ---------------------------------------------------------------------------------------------- */
55 
59 typedef enum ZydisSemanticOperandType_
60 {
61  ZYDIS_SEMANTIC_OPTYPE_UNUSED,
62  ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG,
63  ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_MEM,
64  ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_IMM1,
65  ZYDIS_SEMANTIC_OPTYPE_GPR8,
66  ZYDIS_SEMANTIC_OPTYPE_GPR16,
67  ZYDIS_SEMANTIC_OPTYPE_GPR32,
68  ZYDIS_SEMANTIC_OPTYPE_GPR64,
69  ZYDIS_SEMANTIC_OPTYPE_GPR16_32_64,
70  ZYDIS_SEMANTIC_OPTYPE_GPR32_32_64,
71  ZYDIS_SEMANTIC_OPTYPE_GPR16_32_32,
72  ZYDIS_SEMANTIC_OPTYPE_GPR_ASZ,
73  ZYDIS_SEMANTIC_OPTYPE_FPR,
74  ZYDIS_SEMANTIC_OPTYPE_MMX,
75  ZYDIS_SEMANTIC_OPTYPE_XMM,
76  ZYDIS_SEMANTIC_OPTYPE_YMM,
77  ZYDIS_SEMANTIC_OPTYPE_ZMM,
78  ZYDIS_SEMANTIC_OPTYPE_BND,
79  ZYDIS_SEMANTIC_OPTYPE_SREG,
80  ZYDIS_SEMANTIC_OPTYPE_CR,
81  ZYDIS_SEMANTIC_OPTYPE_DR,
82  ZYDIS_SEMANTIC_OPTYPE_MASK,
83  ZYDIS_SEMANTIC_OPTYPE_MEM,
84  ZYDIS_SEMANTIC_OPTYPE_MEM_VSIBX,
85  ZYDIS_SEMANTIC_OPTYPE_MEM_VSIBY,
86  ZYDIS_SEMANTIC_OPTYPE_MEM_VSIBZ,
87  ZYDIS_SEMANTIC_OPTYPE_IMM,
88  ZYDIS_SEMANTIC_OPTYPE_REL,
89  ZYDIS_SEMANTIC_OPTYPE_PTR,
90  ZYDIS_SEMANTIC_OPTYPE_AGEN,
91  ZYDIS_SEMANTIC_OPTYPE_MOFFS,
92  ZYDIS_SEMANTIC_OPTYPE_MIB,
93 
97  ZYDIS_SEMANTIC_OPTYPE_MAX_VALUE = ZYDIS_SEMANTIC_OPTYPE_MIB,
101  ZYDIS_SEMANTIC_OPTYPE_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_SEMANTIC_OPTYPE_MAX_VALUE)
102 } ZydisSemanticOperandType;
103 
104 /* ---------------------------------------------------------------------------------------------- */
105 
109 typedef enum ZydisInternalElementType_
110 {
111  ZYDIS_IELEMENT_TYPE_INVALID,
112  ZYDIS_IELEMENT_TYPE_VARIABLE,
113  ZYDIS_IELEMENT_TYPE_STRUCT,
114  ZYDIS_IELEMENT_TYPE_INT,
115  ZYDIS_IELEMENT_TYPE_UINT,
116  ZYDIS_IELEMENT_TYPE_INT1,
117  ZYDIS_IELEMENT_TYPE_INT8,
118  ZYDIS_IELEMENT_TYPE_INT16,
119  ZYDIS_IELEMENT_TYPE_INT32,
120  ZYDIS_IELEMENT_TYPE_INT64,
121  ZYDIS_IELEMENT_TYPE_UINT8,
122  ZYDIS_IELEMENT_TYPE_UINT16,
123  ZYDIS_IELEMENT_TYPE_UINT32,
124  ZYDIS_IELEMENT_TYPE_UINT64,
125  ZYDIS_IELEMENT_TYPE_UINT128,
126  ZYDIS_IELEMENT_TYPE_UINT256,
127  ZYDIS_IELEMENT_TYPE_FLOAT16,
128  ZYDIS_IELEMENT_TYPE_FLOAT32,
129  ZYDIS_IELEMENT_TYPE_FLOAT64,
130  ZYDIS_IELEMENT_TYPE_FLOAT80,
131  ZYDIS_IELEMENT_TYPE_BCD80,
132  ZYDIS_IELEMENT_TYPE_CC3,
133  ZYDIS_IELEMENT_TYPE_CC5,
134 
138  ZYDIS_IELEMENT_TYPE_MAX_VALUE = ZYDIS_IELEMENT_TYPE_CC5,
142  ZYDIS_IELEMENT_TYPE_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_IELEMENT_TYPE_MAX_VALUE)
143 } ZydisInternalElementType;
144 
145 /* ---------------------------------------------------------------------------------------------- */
146 
150 typedef enum ZydisImplicitRegisterType_
151 {
152  ZYDIS_IMPLREG_TYPE_STATIC,
153  ZYDIS_IMPLREG_TYPE_GPR_OSZ,
154  ZYDIS_IMPLREG_TYPE_GPR_ASZ,
155  ZYDIS_IMPLREG_TYPE_GPR_SSZ,
156  ZYDIS_IMPLREG_TYPE_IP_ASZ,
157  ZYDIS_IMPLREG_TYPE_IP_SSZ,
158  ZYDIS_IMPLREG_TYPE_FLAGS_SSZ,
159 
163  ZYDIS_IMPLREG_TYPE_MAX_VALUE = ZYDIS_IMPLREG_TYPE_FLAGS_SSZ,
167  ZYDIS_IMPLREG_TYPE_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_IMPLREG_TYPE_MAX_VALUE)
168 } ZydisImplicitRegisterType;
169 
170 /* ---------------------------------------------------------------------------------------------- */
171 
175 typedef enum ZydisImplicitMemBase_
176 {
177  ZYDIS_IMPLMEM_BASE_AGPR_REG,
178  ZYDIS_IMPLMEM_BASE_AGPR_RM,
179  ZYDIS_IMPLMEM_BASE_AAX,
180  ZYDIS_IMPLMEM_BASE_ADX,
181  ZYDIS_IMPLMEM_BASE_ABX,
182  ZYDIS_IMPLMEM_BASE_ASP,
183  ZYDIS_IMPLMEM_BASE_ABP,
184  ZYDIS_IMPLMEM_BASE_ASI,
185  ZYDIS_IMPLMEM_BASE_ADI,
186 
190  ZYDIS_IMPLMEM_BASE_MAX_VALUE = ZYDIS_IMPLMEM_BASE_ADI,
194  ZYDIS_IMPLMEM_BASE_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_IMPLMEM_BASE_MAX_VALUE)
195 } ZydisImplicitMemBase;
196 
197 /* ---------------------------------------------------------------------------------------------- */
198 
199 // MSVC does not correctly execute the `pragma pack(1)` compiler-directive, if we use the correct
200 // enum types
201 ZYAN_STATIC_ASSERT(ZYDIS_SEMANTIC_OPTYPE_REQUIRED_BITS <= 8);
202 ZYAN_STATIC_ASSERT(ZYDIS_OPERAND_VISIBILITY_REQUIRED_BITS <= 8);
203 ZYAN_STATIC_ASSERT(ZYDIS_OPERAND_ACTION_REQUIRED_BITS <= 8);
204 ZYAN_STATIC_ASSERT(ZYDIS_IELEMENT_TYPE_REQUIRED_BITS <= 8);
205 ZYAN_STATIC_ASSERT(ZYDIS_OPERAND_ENCODING_REQUIRED_BITS <= 8);
206 ZYAN_STATIC_ASSERT(ZYDIS_IMPLREG_TYPE_REQUIRED_BITS <= 8);
207 ZYAN_STATIC_ASSERT(ZYDIS_REGISTER_REQUIRED_BITS <= 16);
208 ZYAN_STATIC_ASSERT(ZYDIS_IMPLMEM_BASE_REQUIRED_BITS <= 8);
209 
214 {
215  ZyanU8 type ZYAN_BITFIELD(ZYDIS_SEMANTIC_OPTYPE_REQUIRED_BITS);
216  ZyanU8 visibility ZYAN_BITFIELD(ZYDIS_OPERAND_VISIBILITY_REQUIRED_BITS);
217  ZyanU8 actions ZYAN_BITFIELD(ZYDIS_OPERAND_ACTION_REQUIRED_BITS);
218  ZyanU16 size[3];
219  ZyanU8 element_type ZYAN_BITFIELD(ZYDIS_IELEMENT_TYPE_REQUIRED_BITS);
220  union
221  {
222  ZyanU8 encoding ZYAN_BITFIELD(ZYDIS_OPERAND_ENCODING_REQUIRED_BITS);
223  struct
224  {
225  ZyanU8 type ZYAN_BITFIELD(ZYDIS_IMPLREG_TYPE_REQUIRED_BITS);
226  union
227  {
228  ZyanU16 reg ZYAN_BITFIELD(ZYDIS_REGISTER_REQUIRED_BITS);
229  ZyanU8 id ZYAN_BITFIELD(6);
230  } reg;
231  } reg;
232  struct
233  {
234  ZyanU8 seg ZYAN_BITFIELD(3);
235  ZyanU8 base ZYAN_BITFIELD(ZYDIS_IMPLMEM_BASE_REQUIRED_BITS);
236  } mem;
237  } op;
239 
240 /* ---------------------------------------------------------------------------------------------- */
241 /* Instruction definition */
242 /* ---------------------------------------------------------------------------------------------- */
243 
247 typedef enum ZydisReadWriteAction_
248 {
249  ZYDIS_RW_ACTION_NONE,
250  ZYDIS_RW_ACTION_READ,
251  ZYDIS_RW_ACTION_WRITE,
252  ZYDIS_RW_ACTION_READWRITE,
253 
257  ZYDIS_RW_ACTION_MAX_VALUE = ZYDIS_RW_ACTION_READWRITE,
261  ZYDIS_RW_ACTION_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_RW_ACTION_MAX_VALUE)
262 } ZydisReadWriteAction;
263 
264 /* ---------------------------------------------------------------------------------------------- */
265 
269 typedef enum ZydisRegisterConstraint_
270 {
271  ZYDIS_REG_CONSTRAINTS_UNUSED,
272  ZYDIS_REG_CONSTRAINTS_NONE,
273  ZYDIS_REG_CONSTRAINTS_GPR,
274  ZYDIS_REG_CONSTRAINTS_SR_DEST,
275  ZYDIS_REG_CONSTRAINTS_SR,
276  ZYDIS_REG_CONSTRAINTS_CR,
277  ZYDIS_REG_CONSTRAINTS_DR,
278  ZYDIS_REG_CONSTRAINTS_MASK,
279  ZYDIS_REG_CONSTRAINTS_BND,
280  ZYDIS_REG_CONSTRAINTS_VSIB,
281 
285  ZYDIS_REG_CONSTRAINTS_MAX_VALUE = ZYDIS_REG_CONSTRAINTS_VSIB,
289  ZYDIS_REG_CONSTRAINTS_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_REG_CONSTRAINTS_MAX_VALUE)
290 } ZydisRegisterConstraint;
291 
292 /* ---------------------------------------------------------------------------------------------- */
293 
297 typedef enum ZydisInternalVectorLength_
298 {
299  ZYDIS_IVECTOR_LENGTH_DEFAULT,
300  ZYDIS_IVECTOR_LENGTH_FIXED_128,
301  ZYDIS_IVECTOR_LENGTH_FIXED_256,
302  ZYDIS_IVECTOR_LENGTH_FIXED_512,
303 
307  ZYDIS_IVECTOR_LENGTH_MAX_VALUE = ZYDIS_IVECTOR_LENGTH_FIXED_512,
311  ZYDIS_IVECTOR_LENGTH_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_IVECTOR_LENGTH_MAX_VALUE)
312 } ZydisInternalVectorLength;
313 
314 /* ---------------------------------------------------------------------------------------------- */
315 
319 typedef enum ZydisInternalElementSize_
320 {
321  ZYDIS_IELEMENT_SIZE_INVALID,
322  ZYDIS_IELEMENT_SIZE_8,
323  ZYDIS_IELEMENT_SIZE_16,
324  ZYDIS_IELEMENT_SIZE_32,
325  ZYDIS_IELEMENT_SIZE_64,
326  ZYDIS_IELEMENT_SIZE_128,
327 
331  ZYDIS_IELEMENT_SIZE_MAX_VALUE = ZYDIS_IELEMENT_SIZE_128,
335  ZYDIS_IELEMENT_SIZE_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_IELEMENT_SIZE_MAX_VALUE)
336 } ZydisInternalElementSize;
337 
338 /* ---------------------------------------------------------------------------------------------- */
339 
343 typedef enum ZydisEVEXFunctionality_
344 {
345  ZYDIS_EVEX_FUNC_INVALID,
349  ZYDIS_EVEX_FUNC_BC,
353  ZYDIS_EVEX_FUNC_RC,
357  ZYDIS_EVEX_FUNC_SAE,
358 
362  ZYDIS_EVEX_FUNC_MAX_VALUE = ZYDIS_EVEX_FUNC_SAE,
366  ZYDIS_EVEX_FUNC_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_EVEX_FUNC_MAX_VALUE)
367 } ZydisEVEXFunctionality;
368 
369 /* ---------------------------------------------------------------------------------------------- */
370 
374 typedef enum ZydisEVEXTupleType_
375 {
376  ZYDIS_TUPLETYPE_INVALID,
380  ZYDIS_TUPLETYPE_FV,
384  ZYDIS_TUPLETYPE_HV,
388  ZYDIS_TUPLETYPE_FVM,
392  ZYDIS_TUPLETYPE_T1S,
396  ZYDIS_TUPLETYPE_T1F,
400  ZYDIS_TUPLETYPE_T1_4X,
404  ZYDIS_TUPLETYPE_GSCAT,
408  ZYDIS_TUPLETYPE_T2,
412  ZYDIS_TUPLETYPE_T4,
416  ZYDIS_TUPLETYPE_T8,
420  ZYDIS_TUPLETYPE_HVM,
424  ZYDIS_TUPLETYPE_QVM,
428  ZYDIS_TUPLETYPE_OVM,
432  ZYDIS_TUPLETYPE_M128,
436  ZYDIS_TUPLETYPE_DUP,
437 
441  ZYDIS_TUPLETYPE_MAX_VALUE = ZYDIS_TUPLETYPE_DUP,
445  ZYDIS_TUPLETYPE_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_TUPLETYPE_MAX_VALUE)
446 } ZydisEVEXTupleType;
447 
448 /* ---------------------------------------------------------------------------------------------- */
449 
453 typedef enum ZydisMVEXFunctionality_
454 {
458  ZYDIS_MVEX_FUNC_IGNORED,
462  ZYDIS_MVEX_FUNC_INVALID,
466  ZYDIS_MVEX_FUNC_RC,
470  ZYDIS_MVEX_FUNC_SAE,
474  ZYDIS_MVEX_FUNC_F_32,
478  ZYDIS_MVEX_FUNC_I_32,
482  ZYDIS_MVEX_FUNC_F_64,
486  ZYDIS_MVEX_FUNC_I_64,
490  ZYDIS_MVEX_FUNC_SWIZZLE_32,
494  ZYDIS_MVEX_FUNC_SWIZZLE_64,
498  ZYDIS_MVEX_FUNC_SF_32,
502  ZYDIS_MVEX_FUNC_SF_32_BCST,
506  ZYDIS_MVEX_FUNC_SF_32_BCST_4TO16,
510  ZYDIS_MVEX_FUNC_SF_64,
514  ZYDIS_MVEX_FUNC_SI_32,
518  ZYDIS_MVEX_FUNC_SI_32_BCST,
522  ZYDIS_MVEX_FUNC_SI_32_BCST_4TO16,
526  ZYDIS_MVEX_FUNC_SI_64,
530  ZYDIS_MVEX_FUNC_UF_32,
534  ZYDIS_MVEX_FUNC_UF_64,
538  ZYDIS_MVEX_FUNC_UI_32,
542  ZYDIS_MVEX_FUNC_UI_64,
546  ZYDIS_MVEX_FUNC_DF_32,
550  ZYDIS_MVEX_FUNC_DF_64,
554  ZYDIS_MVEX_FUNC_DI_32,
558  ZYDIS_MVEX_FUNC_DI_64,
559 
563  ZYDIS_MVEX_FUNC_MAX_VALUE = ZYDIS_MVEX_FUNC_DI_64,
567  ZYDIS_MVEX_FUNC_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_MVEX_FUNC_MAX_VALUE)
568 } ZydisMVEXFunctionality;
569 
570 /* ---------------------------------------------------------------------------------------------- */
571 
575 typedef enum ZydisVEXStaticBroadcast
576 {
577  ZYDIS_VEX_STATIC_BROADCAST_NONE,
578  ZYDIS_VEX_STATIC_BROADCAST_1_TO_2,
579  ZYDIS_VEX_STATIC_BROADCAST_1_TO_4,
580  ZYDIS_VEX_STATIC_BROADCAST_1_TO_8,
581  ZYDIS_VEX_STATIC_BROADCAST_1_TO_16,
582  ZYDIS_VEX_STATIC_BROADCAST_1_TO_32,
583  ZYDIS_VEX_STATIC_BROADCAST_2_TO_4,
584 
588  ZYDIS_VEX_STATIC_BROADCAST_MAX_VALUE = ZYDIS_VEX_STATIC_BROADCAST_2_TO_4,
592  ZYDIS_VEX_STATIC_BROADCAST_REQUIRED_BITS =
593  ZYAN_BITS_TO_REPRESENT(ZYDIS_VEX_STATIC_BROADCAST_MAX_VALUE)
594 } ZydisVEXStaticBroadcast;
595 
596 /* ---------------------------------------------------------------------------------------------- */
597 
601 typedef enum ZydisEVEXStaticBroadcast_
602 {
603  ZYDIS_EVEX_STATIC_BROADCAST_NONE,
604  ZYDIS_EVEX_STATIC_BROADCAST_1_TO_2,
605  ZYDIS_EVEX_STATIC_BROADCAST_1_TO_4,
606  ZYDIS_EVEX_STATIC_BROADCAST_1_TO_8,
607  ZYDIS_EVEX_STATIC_BROADCAST_1_TO_16,
608  ZYDIS_EVEX_STATIC_BROADCAST_1_TO_32,
609  ZYDIS_EVEX_STATIC_BROADCAST_1_TO_64,
610  ZYDIS_EVEX_STATIC_BROADCAST_2_TO_4,
611  ZYDIS_EVEX_STATIC_BROADCAST_2_TO_8,
612  ZYDIS_EVEX_STATIC_BROADCAST_2_TO_16,
613  ZYDIS_EVEX_STATIC_BROADCAST_4_TO_8,
614  ZYDIS_EVEX_STATIC_BROADCAST_4_TO_16,
615  ZYDIS_EVEX_STATIC_BROADCAST_8_TO_16,
616 
620  ZYDIS_EVEX_STATIC_BROADCAST_MAX_VALUE = ZYDIS_EVEX_STATIC_BROADCAST_8_TO_16,
624  ZYDIS_EVEX_STATIC_BROADCAST_REQUIRED_BITS =
625  ZYAN_BITS_TO_REPRESENT(ZYDIS_EVEX_STATIC_BROADCAST_MAX_VALUE)
626 } ZydisEVEXStaticBroadcast;
627 
628 /* ---------------------------------------------------------------------------------------------- */
629 
633 typedef enum ZydisMVEXStaticBroadcast_
634 {
635  ZYDIS_MVEX_STATIC_BROADCAST_NONE,
636  ZYDIS_MVEX_STATIC_BROADCAST_1_TO_8,
637  ZYDIS_MVEX_STATIC_BROADCAST_1_TO_16,
638  ZYDIS_MVEX_STATIC_BROADCAST_4_TO_8,
639  ZYDIS_MVEX_STATIC_BROADCAST_4_TO_16,
640 
644  ZYDIS_MVEX_STATIC_BROADCAST_MAX_VALUE = ZYDIS_MVEX_STATIC_BROADCAST_4_TO_16,
648  ZYDIS_MVEX_STATIC_BROADCAST_REQUIRED_BITS =
649  ZYAN_BITS_TO_REPRESENT(ZYDIS_MVEX_STATIC_BROADCAST_MAX_VALUE)
650 } ZydisMVEXStaticBroadcast;
651 
652 /* ---------------------------------------------------------------------------------------------- */
653 
657 typedef enum ZydisMaskPolicy_
658 {
659  ZYDIS_MASK_POLICY_INVALID,
664  ZYDIS_MASK_POLICY_ALLOWED,
668  ZYDIS_MASK_POLICY_REQUIRED,
672  ZYDIS_MASK_POLICY_FORBIDDEN,
673 
677  ZYDIS_MASK_POLICY_MAX_VALUE = ZYDIS_MASK_POLICY_FORBIDDEN,
681  ZYDIS_MASK_POLICY_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_MASK_POLICY_MAX_VALUE)
682 } ZydisMaskPolicy;
683 
684 /* ---------------------------------------------------------------------------------------------- */
685 
689 typedef enum ZydisMaskOverride_
690 {
691  ZYDIS_MASK_OVERRIDE_DEFAULT,
692  ZYDIS_MASK_OVERRIDE_ZEROING,
693  ZYDIS_MASK_OVERRIDE_CONTROL,
694 
698  ZYDIS_MASK_OVERRIDE_MAX_VALUE = ZYDIS_MASK_OVERRIDE_CONTROL,
702  ZYDIS_MASK_OVERRIDE_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_MASK_OVERRIDE_MAX_VALUE)
703 } ZydisMaskOverride;
704 
705 /* ---------------------------------------------------------------------------------------------- */
706 
707 // MSVC does not correctly execute the `pragma pack(1)` compiler-directive, if we use the correct
708 // enum types
709 ZYAN_STATIC_ASSERT(ZYDIS_MNEMONIC_REQUIRED_BITS <= 16);
710 ZYAN_STATIC_ASSERT(ZYDIS_CATEGORY_REQUIRED_BITS <= 8);
711 ZYAN_STATIC_ASSERT(ZYDIS_ISA_SET_REQUIRED_BITS <= 8);
712 ZYAN_STATIC_ASSERT(ZYDIS_ISA_EXT_REQUIRED_BITS <= 8);
713 ZYAN_STATIC_ASSERT(ZYDIS_BRANCH_TYPE_REQUIRED_BITS <= 8);
714 ZYAN_STATIC_ASSERT(ZYDIS_EXCEPTION_CLASS_REQUIRED_BITS <= 8);
715 ZYAN_STATIC_ASSERT(ZYDIS_REG_CONSTRAINTS_REQUIRED_BITS <= 8);
716 ZYAN_STATIC_ASSERT(ZYDIS_RW_ACTION_REQUIRED_BITS <= 8);
717 
718 #ifndef ZYDIS_MINIMAL_MODE
719 # define ZYDIS_INSTRUCTION_DEFINITION_BASE \
720  ZyanU16 mnemonic ZYAN_BITFIELD(ZYDIS_MNEMONIC_REQUIRED_BITS); \
721  ZyanU8 operand_count ZYAN_BITFIELD( 4); \
722  ZyanU16 operand_reference ZYAN_BITFIELD(15); \
723  ZyanU8 operand_size_map ZYAN_BITFIELD( 3); \
724  ZyanU8 address_size_map ZYAN_BITFIELD( 2); \
725  ZyanU8 flags_reference ZYAN_BITFIELD( 7); \
726  ZyanBool requires_protected_mode ZYAN_BITFIELD( 1); \
727  ZyanU8 category ZYAN_BITFIELD(ZYDIS_CATEGORY_REQUIRED_BITS); \
728  ZyanU8 isa_set ZYAN_BITFIELD(ZYDIS_ISA_SET_REQUIRED_BITS); \
729  ZyanU8 isa_ext ZYAN_BITFIELD(ZYDIS_ISA_EXT_REQUIRED_BITS); \
730  ZyanU8 branch_type ZYAN_BITFIELD(ZYDIS_BRANCH_TYPE_REQUIRED_BITS); \
731  ZyanU8 exception_class ZYAN_BITFIELD(ZYDIS_EXCEPTION_CLASS_REQUIRED_BITS); \
732  ZyanU8 constr_REG ZYAN_BITFIELD(ZYDIS_REG_CONSTRAINTS_REQUIRED_BITS); \
733  ZyanU8 constr_RM ZYAN_BITFIELD(ZYDIS_REG_CONSTRAINTS_REQUIRED_BITS); \
734  ZyanU8 cpu_state ZYAN_BITFIELD(ZYDIS_RW_ACTION_REQUIRED_BITS); \
735  ZyanU8 fpu_state ZYAN_BITFIELD(ZYDIS_RW_ACTION_REQUIRED_BITS); \
736  ZyanU8 xmm_state ZYAN_BITFIELD(ZYDIS_RW_ACTION_REQUIRED_BITS)
737 #else
738 # define ZYDIS_INSTRUCTION_DEFINITION_BASE \
739  ZyanU16 mnemonic ZYAN_BITFIELD(ZYDIS_MNEMONIC_REQUIRED_BITS); \
740  ZyanU8 operand_size_map ZYAN_BITFIELD( 3); \
741  ZyanU8 address_size_map ZYAN_BITFIELD( 2); \
742  ZyanBool requires_protected_mode ZYAN_BITFIELD( 1); \
743  ZyanU8 constr_REG ZYAN_BITFIELD(ZYDIS_REG_CONSTRAINTS_REQUIRED_BITS); \
744  ZyanU8 constr_RM ZYAN_BITFIELD(ZYDIS_REG_CONSTRAINTS_REQUIRED_BITS)
745 #endif
746 
747 #define ZYDIS_INSTRUCTION_DEFINITION_BASE_VECTOR \
748  ZYDIS_INSTRUCTION_DEFINITION_BASE; \
749  ZyanU8 constr_NDSNDD ZYAN_BITFIELD(ZYDIS_REG_CONSTRAINTS_REQUIRED_BITS)
750 
751 #define ZYDIS_INSTRUCTION_DEFINITION_BASE_VECTOR_INTEL \
752  ZYDIS_INSTRUCTION_DEFINITION_BASE_VECTOR; \
753  ZyanBool is_gather ZYAN_BITFIELD( 1)
754 
759 {
760  ZYDIS_INSTRUCTION_DEFINITION_BASE;
762 
767 {
768  ZYDIS_INSTRUCTION_DEFINITION_BASE;
769 #ifndef ZYDIS_MINIMAL_MODE
770  ZyanBool is_privileged ZYAN_BITFIELD( 1);
771 #endif
772  ZyanBool accepts_LOCK ZYAN_BITFIELD( 1);
773 #ifndef ZYDIS_MINIMAL_MODE
774  ZyanBool accepts_REP ZYAN_BITFIELD( 1);
775  ZyanBool accepts_REPEREPZ ZYAN_BITFIELD( 1);
776  ZyanBool accepts_REPNEREPNZ ZYAN_BITFIELD( 1);
777  ZyanBool accepts_BOUND ZYAN_BITFIELD( 1);
778  ZyanBool accepts_XACQUIRE ZYAN_BITFIELD( 1);
779  ZyanBool accepts_XRELEASE ZYAN_BITFIELD( 1);
780  ZyanBool accepts_hle_without_lock ZYAN_BITFIELD( 1);
781  ZyanBool accepts_branch_hints ZYAN_BITFIELD( 1);
782  ZyanBool accepts_segment ZYAN_BITFIELD( 1);
783 #endif
785 
790 {
791  ZYDIS_INSTRUCTION_DEFINITION_BASE;
793 
798 {
799  ZYDIS_INSTRUCTION_DEFINITION_BASE_VECTOR;
801 
802 // MSVC does not correctly execute the `pragma pack(1)` compiler-directive, if we use the correct
803 // enum types
804 ZYAN_STATIC_ASSERT(ZYDIS_VEX_STATIC_BROADCAST_REQUIRED_BITS <= 8);
805 
810 {
811  ZYDIS_INSTRUCTION_DEFINITION_BASE_VECTOR_INTEL;
812 #ifndef ZYDIS_MINIMAL_MODE
813  ZyanU8 broadcast ZYAN_BITFIELD(ZYDIS_VEX_STATIC_BROADCAST_REQUIRED_BITS);
814 #endif
816 
817 #ifndef ZYDIS_DISABLE_AVX512
818 
819 // MSVC does not correctly execute the `pragma pack(1)` compiler-directive, if we use the correct
820 // enum types
821 ZYAN_STATIC_ASSERT(ZYDIS_IVECTOR_LENGTH_REQUIRED_BITS <= 8);
822 ZYAN_STATIC_ASSERT(ZYDIS_TUPLETYPE_REQUIRED_BITS <= 8);
823 ZYAN_STATIC_ASSERT(ZYDIS_IELEMENT_SIZE_REQUIRED_BITS <= 8);
824 ZYAN_STATIC_ASSERT(ZYDIS_EVEX_FUNC_REQUIRED_BITS <= 8);
825 ZYAN_STATIC_ASSERT(ZYDIS_MASK_POLICY_REQUIRED_BITS <= 8);
826 ZYAN_STATIC_ASSERT(ZYDIS_MASK_OVERRIDE_REQUIRED_BITS <= 8);
827 ZYAN_STATIC_ASSERT(ZYDIS_EVEX_STATIC_BROADCAST_REQUIRED_BITS <= 8);
828 
833 {
834  ZYDIS_INSTRUCTION_DEFINITION_BASE_VECTOR_INTEL;
835 #ifndef ZYDIS_MINIMAL_MODE
836  ZyanU8 vector_length ZYAN_BITFIELD(ZYDIS_IVECTOR_LENGTH_REQUIRED_BITS);
837  ZyanU8 tuple_type ZYAN_BITFIELD(ZYDIS_TUPLETYPE_REQUIRED_BITS);
838  ZyanU8 element_size ZYAN_BITFIELD(ZYDIS_IELEMENT_SIZE_REQUIRED_BITS);
839  ZyanU8 functionality ZYAN_BITFIELD(ZYDIS_EVEX_FUNC_REQUIRED_BITS);
840 #endif
841  ZyanU8 mask_policy ZYAN_BITFIELD(ZYDIS_MASK_POLICY_REQUIRED_BITS);
842  ZyanBool accepts_zero_mask ZYAN_BITFIELD( 1);
843 #ifndef ZYDIS_MINIMAL_MODE
844  ZyanU8 mask_override ZYAN_BITFIELD(ZYDIS_MASK_OVERRIDE_REQUIRED_BITS);
845  ZyanU8 broadcast ZYAN_BITFIELD(ZYDIS_EVEX_STATIC_BROADCAST_REQUIRED_BITS);
846 #endif
848 #endif
849 
850 #ifndef ZYDIS_DISABLE_KNC
851 
852 // MSVC does not correctly execute the `pragma pack(1)` compiler-directive, if we use the correct
853 // enum types
854 ZYAN_STATIC_ASSERT(ZYDIS_MVEX_FUNC_REQUIRED_BITS <= 8);
855 ZYAN_STATIC_ASSERT(ZYDIS_MASK_POLICY_REQUIRED_BITS <= 8);
856 ZYAN_STATIC_ASSERT(ZYDIS_MVEX_STATIC_BROADCAST_REQUIRED_BITS <= 8);
857 
862 {
863  ZYDIS_INSTRUCTION_DEFINITION_BASE_VECTOR_INTEL;
864  ZyanU8 functionality ZYAN_BITFIELD(ZYDIS_MVEX_FUNC_REQUIRED_BITS);
865  ZyanU8 mask_policy ZYAN_BITFIELD(ZYDIS_MASK_POLICY_REQUIRED_BITS);
866 #ifndef ZYDIS_MINIMAL_MODE
867  ZyanBool has_element_granularity ZYAN_BITFIELD( 1);
868  ZyanU8 broadcast ZYAN_BITFIELD(ZYDIS_MVEX_STATIC_BROADCAST_REQUIRED_BITS);
869 #endif
871 #endif
872 
873 /* ---------------------------------------------------------------------------------------------- */
874 /* Accessed CPU flags */
875 /* ---------------------------------------------------------------------------------------------- */
876 
877 typedef struct ZydisAccessedFlags_
878 {
881 
882 /* ---------------------------------------------------------------------------------------------- */
883 
884 #pragma pack(pop)
885 
886 #ifdef ZYAN_MSVC
887 # pragma warning(pop)
888 #endif
889 
890 /* ============================================================================================== */
891 /* Functions */
892 /* ============================================================================================== */
893 
894 /* ---------------------------------------------------------------------------------------------- */
895 /* Instruction definition */
896 /* ---------------------------------------------------------------------------------------------- */
897 
906 ZYDIS_NO_EXPORT void ZydisGetInstructionDefinition(ZydisInstructionEncoding encoding,
907  ZyanU16 id, const ZydisInstructionDefinition** definition);
908 
909 /* ---------------------------------------------------------------------------------------------- */
910 /* Operand definition */
911 /* ---------------------------------------------------------------------------------------------- */
912 
913 #ifndef ZYDIS_MINIMAL_MODE
914 
923 ZYDIS_NO_EXPORT ZyanU8 ZydisGetOperandDefinitions(const ZydisInstructionDefinition* definition,
924  const ZydisOperandDefinition** operand);
925 #endif
926 
927 /* ---------------------------------------------------------------------------------------------- */
928 /* Element info */
929 /* ---------------------------------------------------------------------------------------------- */
930 
931 #ifndef ZYDIS_MINIMAL_MODE
932 
939 ZYDIS_NO_EXPORT void ZydisGetElementInfo(ZydisInternalElementType element, ZydisElementType* type,
940  ZydisElementSize* size);
941 #endif
942 
943 /* ---------------------------------------------------------------------------------------------- */
944 /* Accessed CPU flags */
945 /* ---------------------------------------------------------------------------------------------- */
946 
947 #ifndef ZYDIS_MINIMAL_MODE
948 
956 ZYDIS_NO_EXPORT ZyanBool ZydisGetAccessedFlags(const ZydisInstructionDefinition* definition,
957  const ZydisAccessedFlags** flags);
958 #endif
959 
960 /* ---------------------------------------------------------------------------------------------- */
961 
962 /* ============================================================================================== */
963 
964 #ifdef __cplusplus
965 }
966 #endif
967 
968 #endif /* ZYDIS_INTERNAL_SHAREDDATA_H */
Mnemonic constant definitions and helper functions.
Defines the ZydisInstructionDefinition3DNOW struct.
Definition: SharedData.h:789
Defines the ZydisInstructionDefinition struct.
Definition: SharedData.h:758
Defines the ZydisInstructionDefinitionLEGACY struct.
Definition: SharedData.h:766
Definition: SharedData.h:877
Defines the ZydisInstructionDefinitionEVEX struct.
Definition: SharedData.h:832
The minimum number of bits required to represent all values of this enum.
Definition: SharedTypes.h:316
Defines the ZydisInstructionDefinitionMVEX struct.
Definition: SharedData.h:861
Defines the basic ZydisDecodedInstruction and ZydisDecodedOperand structs.
Defines the ZydisInstructionDefinitionXOP struct.
Definition: SharedData.h:797
enum ZydisElementType_ ZydisElementType
Defines the ZydisElementType enum.
Defines decoder/encoder-shared macros and types.
The minimum number of bits required to represent all values of this enum.
Definition: DecoderTypes.h:675
enum ZydisInstructionEncoding_ ZydisInstructionEncoding
Defines the ZydisInstructionEncoding enum.
enum ZydisCPUFlagAction_ ZydisCPUFlagAction
Defines the ZydisCPUFlagAction enum.
Defines the ZydisInstructionDefinitionVEX struct.
Definition: SharedData.h:809
Maximum value of this enum.
Definition: DecoderTypes.h:530
The minimum number of bits required to represent all values of this bitset.
Definition: SharedTypes.h:391
The minimum number of bits required to represent all values of this enum.
Definition: DecoderTypes.h:614
ZyanU16 ZydisElementSize
Defines the ZydisElementSize datatype.
Definition: SharedTypes.h:189
Defines the ZydisOperandDefinition struct.
Definition: SharedData.h:213
Utility functions and constants for registers.
The minimum number of bits required to represent all values of this enum.
Definition: SharedTypes.h:283