Zydis 3.2.1.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
37extern "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
59typedef 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_TMM,
79 ZYDIS_SEMANTIC_OPTYPE_BND,
80 ZYDIS_SEMANTIC_OPTYPE_SREG,
81 ZYDIS_SEMANTIC_OPTYPE_CR,
82 ZYDIS_SEMANTIC_OPTYPE_DR,
83 ZYDIS_SEMANTIC_OPTYPE_MASK,
84 ZYDIS_SEMANTIC_OPTYPE_MEM,
85 ZYDIS_SEMANTIC_OPTYPE_MEM_VSIBX,
86 ZYDIS_SEMANTIC_OPTYPE_MEM_VSIBY,
87 ZYDIS_SEMANTIC_OPTYPE_MEM_VSIBZ,
88 ZYDIS_SEMANTIC_OPTYPE_IMM,
89 ZYDIS_SEMANTIC_OPTYPE_REL,
90 ZYDIS_SEMANTIC_OPTYPE_PTR,
91 ZYDIS_SEMANTIC_OPTYPE_AGEN,
92 ZYDIS_SEMANTIC_OPTYPE_MOFFS,
93 ZYDIS_SEMANTIC_OPTYPE_MIB,
94
98 ZYDIS_SEMANTIC_OPTYPE_MAX_VALUE = ZYDIS_SEMANTIC_OPTYPE_MIB,
102 ZYDIS_SEMANTIC_OPTYPE_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_SEMANTIC_OPTYPE_MAX_VALUE)
103} ZydisSemanticOperandType;
104
105/* ---------------------------------------------------------------------------------------------- */
106
110typedef enum ZydisInternalElementType_
111{
112 ZYDIS_IELEMENT_TYPE_INVALID,
113 ZYDIS_IELEMENT_TYPE_VARIABLE,
114 ZYDIS_IELEMENT_TYPE_STRUCT,
115 ZYDIS_IELEMENT_TYPE_INT,
116 ZYDIS_IELEMENT_TYPE_UINT,
117 ZYDIS_IELEMENT_TYPE_INT1,
118 ZYDIS_IELEMENT_TYPE_INT8,
119 ZYDIS_IELEMENT_TYPE_INT16,
120 ZYDIS_IELEMENT_TYPE_INT32,
121 ZYDIS_IELEMENT_TYPE_INT64,
122 ZYDIS_IELEMENT_TYPE_UINT8,
123 ZYDIS_IELEMENT_TYPE_UINT16,
124 ZYDIS_IELEMENT_TYPE_UINT32,
125 ZYDIS_IELEMENT_TYPE_UINT64,
126 ZYDIS_IELEMENT_TYPE_UINT128,
127 ZYDIS_IELEMENT_TYPE_UINT256,
128 ZYDIS_IELEMENT_TYPE_FLOAT16,
129 ZYDIS_IELEMENT_TYPE_FLOAT16X2,
130 ZYDIS_IELEMENT_TYPE_FLOAT32,
131 ZYDIS_IELEMENT_TYPE_FLOAT64,
132 ZYDIS_IELEMENT_TYPE_FLOAT80,
133 ZYDIS_IELEMENT_TYPE_BCD80,
134 ZYDIS_IELEMENT_TYPE_CC3,
135 ZYDIS_IELEMENT_TYPE_CC5,
136
140 ZYDIS_IELEMENT_TYPE_MAX_VALUE = ZYDIS_IELEMENT_TYPE_CC5,
144 ZYDIS_IELEMENT_TYPE_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_IELEMENT_TYPE_MAX_VALUE)
145} ZydisInternalElementType;
146
147/* ---------------------------------------------------------------------------------------------- */
148
152typedef enum ZydisImplicitRegisterType_
153{
154 ZYDIS_IMPLREG_TYPE_STATIC,
155 ZYDIS_IMPLREG_TYPE_GPR_OSZ,
156 ZYDIS_IMPLREG_TYPE_GPR_ASZ,
157 ZYDIS_IMPLREG_TYPE_GPR_SSZ,
158 ZYDIS_IMPLREG_TYPE_IP_ASZ,
159 ZYDIS_IMPLREG_TYPE_IP_SSZ,
160 ZYDIS_IMPLREG_TYPE_FLAGS_SSZ,
161
165 ZYDIS_IMPLREG_TYPE_MAX_VALUE = ZYDIS_IMPLREG_TYPE_FLAGS_SSZ,
169 ZYDIS_IMPLREG_TYPE_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_IMPLREG_TYPE_MAX_VALUE)
170} ZydisImplicitRegisterType;
171
172/* ---------------------------------------------------------------------------------------------- */
173
177typedef enum ZydisImplicitMemBase_
178{
179 ZYDIS_IMPLMEM_BASE_AGPR_REG,
180 ZYDIS_IMPLMEM_BASE_AGPR_RM,
181 ZYDIS_IMPLMEM_BASE_AAX,
182 ZYDIS_IMPLMEM_BASE_ADX,
183 ZYDIS_IMPLMEM_BASE_ABX,
184 ZYDIS_IMPLMEM_BASE_ASI,
185 ZYDIS_IMPLMEM_BASE_ADI,
186 ZYDIS_IMPLMEM_BASE_SSP,
187 ZYDIS_IMPLMEM_BASE_SBP,
188
192 ZYDIS_IMPLMEM_BASE_MAX_VALUE = ZYDIS_IMPLMEM_BASE_SBP,
196 ZYDIS_IMPLMEM_BASE_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_IMPLMEM_BASE_MAX_VALUE)
197} ZydisImplicitMemBase;
198
199/* ---------------------------------------------------------------------------------------------- */
200
201// MSVC does not correctly execute the `pragma pack(1)` compiler-directive, if we use the correct
202// enum types
203ZYAN_STATIC_ASSERT(ZYDIS_SEMANTIC_OPTYPE_REQUIRED_BITS <= 8);
204ZYAN_STATIC_ASSERT(ZYDIS_OPERAND_VISIBILITY_REQUIRED_BITS <= 8);
205ZYAN_STATIC_ASSERT(ZYDIS_OPERAND_ACTION_REQUIRED_BITS <= 8);
206ZYAN_STATIC_ASSERT(ZYDIS_IELEMENT_TYPE_REQUIRED_BITS <= 8);
207ZYAN_STATIC_ASSERT(ZYDIS_OPERAND_ENCODING_REQUIRED_BITS <= 8);
208ZYAN_STATIC_ASSERT(ZYDIS_IMPLREG_TYPE_REQUIRED_BITS <= 8);
209ZYAN_STATIC_ASSERT(ZYDIS_REGISTER_REQUIRED_BITS <= 16);
210ZYAN_STATIC_ASSERT(ZYDIS_IMPLMEM_BASE_REQUIRED_BITS <= 8);
211
216{
217 ZyanU8 type ZYAN_BITFIELD(ZYDIS_SEMANTIC_OPTYPE_REQUIRED_BITS);
218 ZyanU8 visibility ZYAN_BITFIELD(ZYDIS_OPERAND_VISIBILITY_REQUIRED_BITS);
219 ZyanU8 actions ZYAN_BITFIELD(ZYDIS_OPERAND_ACTION_REQUIRED_BITS);
220 ZyanU16 size[3];
221 ZyanU8 element_type ZYAN_BITFIELD(ZYDIS_IELEMENT_TYPE_REQUIRED_BITS);
222 union
223 {
224 ZyanU8 encoding ZYAN_BITFIELD(ZYDIS_OPERAND_ENCODING_REQUIRED_BITS);
225 struct
226 {
227 ZyanU8 type ZYAN_BITFIELD(ZYDIS_IMPLREG_TYPE_REQUIRED_BITS);
228 union
229 {
230 ZyanU16 reg ZYAN_BITFIELD(ZYDIS_REGISTER_REQUIRED_BITS);
231 ZyanU8 id ZYAN_BITFIELD(6);
232 } reg;
233 } reg;
234 struct
235 {
236 ZyanU8 seg ZYAN_BITFIELD(3);
237 ZyanU8 base ZYAN_BITFIELD(ZYDIS_IMPLMEM_BASE_REQUIRED_BITS);
238 } mem;
239 } op;
240 ZyanBool is_multisource4 ZYAN_BITFIELD(1);
241 ZyanBool ignore_seg_override ZYAN_BITFIELD(1);
243
244/* ---------------------------------------------------------------------------------------------- */
245/* Instruction definition */
246/* ---------------------------------------------------------------------------------------------- */
247
251typedef enum ZydisReadWriteAction_
252{
253 ZYDIS_RW_ACTION_NONE,
254 ZYDIS_RW_ACTION_READ,
255 ZYDIS_RW_ACTION_WRITE,
256 ZYDIS_RW_ACTION_READWRITE,
257
261 ZYDIS_RW_ACTION_MAX_VALUE = ZYDIS_RW_ACTION_READWRITE,
265 ZYDIS_RW_ACTION_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_RW_ACTION_MAX_VALUE)
266} ZydisReadWriteAction;
267
268/* ---------------------------------------------------------------------------------------------- */
269
273typedef enum ZydisRegisterConstraint_
274{
275 ZYDIS_REG_CONSTRAINTS_UNUSED,
276 ZYDIS_REG_CONSTRAINTS_NONE,
277 ZYDIS_REG_CONSTRAINTS_GPR,
278 ZYDIS_REG_CONSTRAINTS_SR_DEST,
279 ZYDIS_REG_CONSTRAINTS_SR,
280 ZYDIS_REG_CONSTRAINTS_CR,
281 ZYDIS_REG_CONSTRAINTS_DR,
282 ZYDIS_REG_CONSTRAINTS_MASK,
283 ZYDIS_REG_CONSTRAINTS_BND,
284 ZYDIS_REG_CONSTRAINTS_VSIB,
285 ZYDIS_REG_CONSTRAINTS_NO_REL,
286
290 ZYDIS_REG_CONSTRAINTS_MAX_VALUE = ZYDIS_REG_CONSTRAINTS_NO_REL,
294 ZYDIS_REG_CONSTRAINTS_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_REG_CONSTRAINTS_MAX_VALUE)
295} ZydisRegisterConstraint;
296
297/* ---------------------------------------------------------------------------------------------- */
298
302typedef enum ZydisInternalVectorLength_
303{
304 ZYDIS_IVECTOR_LENGTH_DEFAULT,
305 ZYDIS_IVECTOR_LENGTH_FIXED_128,
306 ZYDIS_IVECTOR_LENGTH_FIXED_256,
307 ZYDIS_IVECTOR_LENGTH_FIXED_512,
308
312 ZYDIS_IVECTOR_LENGTH_MAX_VALUE = ZYDIS_IVECTOR_LENGTH_FIXED_512,
316 ZYDIS_IVECTOR_LENGTH_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_IVECTOR_LENGTH_MAX_VALUE)
317} ZydisInternalVectorLength;
318
319/* ---------------------------------------------------------------------------------------------- */
320
324typedef enum ZydisInternalElementSize_
325{
326 ZYDIS_IELEMENT_SIZE_INVALID,
327 ZYDIS_IELEMENT_SIZE_8,
328 ZYDIS_IELEMENT_SIZE_16,
329 ZYDIS_IELEMENT_SIZE_32,
330 ZYDIS_IELEMENT_SIZE_64,
331 ZYDIS_IELEMENT_SIZE_128,
332
336 ZYDIS_IELEMENT_SIZE_MAX_VALUE = ZYDIS_IELEMENT_SIZE_128,
340 ZYDIS_IELEMENT_SIZE_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_IELEMENT_SIZE_MAX_VALUE)
341} ZydisInternalElementSize;
342
343/* ---------------------------------------------------------------------------------------------- */
344
348typedef enum ZydisEVEXFunctionality_
349{
350 ZYDIS_EVEX_FUNC_INVALID,
354 ZYDIS_EVEX_FUNC_BC,
358 ZYDIS_EVEX_FUNC_RC,
362 ZYDIS_EVEX_FUNC_SAE,
363
367 ZYDIS_EVEX_FUNC_MAX_VALUE = ZYDIS_EVEX_FUNC_SAE,
371 ZYDIS_EVEX_FUNC_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_EVEX_FUNC_MAX_VALUE)
372} ZydisEVEXFunctionality;
373
374/* ---------------------------------------------------------------------------------------------- */
375
379typedef enum ZydisEVEXTupleType_
380{
381 ZYDIS_TUPLETYPE_INVALID,
385 ZYDIS_TUPLETYPE_FV,
389 ZYDIS_TUPLETYPE_HV,
393 ZYDIS_TUPLETYPE_FVM,
397 ZYDIS_TUPLETYPE_T1S,
401 ZYDIS_TUPLETYPE_T1F,
405 ZYDIS_TUPLETYPE_T1_4X,
409 ZYDIS_TUPLETYPE_GSCAT,
413 ZYDIS_TUPLETYPE_T2,
417 ZYDIS_TUPLETYPE_T4,
421 ZYDIS_TUPLETYPE_T8,
425 ZYDIS_TUPLETYPE_HVM,
429 ZYDIS_TUPLETYPE_QVM,
433 ZYDIS_TUPLETYPE_OVM,
437 ZYDIS_TUPLETYPE_M128,
441 ZYDIS_TUPLETYPE_DUP,
445 ZYDIS_TUPLETYPE_QUARTER,
446
450 ZYDIS_TUPLETYPE_MAX_VALUE = ZYDIS_TUPLETYPE_QUARTER,
454 ZYDIS_TUPLETYPE_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_TUPLETYPE_MAX_VALUE)
455} ZydisEVEXTupleType;
456
457/* ---------------------------------------------------------------------------------------------- */
458
462typedef enum ZydisMVEXFunctionality_
463{
467 ZYDIS_MVEX_FUNC_IGNORED,
471 ZYDIS_MVEX_FUNC_INVALID,
475 ZYDIS_MVEX_FUNC_RC,
479 ZYDIS_MVEX_FUNC_SAE,
483 ZYDIS_MVEX_FUNC_F_32,
487 ZYDIS_MVEX_FUNC_I_32,
491 ZYDIS_MVEX_FUNC_F_64,
495 ZYDIS_MVEX_FUNC_I_64,
499 ZYDIS_MVEX_FUNC_SWIZZLE_32,
503 ZYDIS_MVEX_FUNC_SWIZZLE_64,
507 ZYDIS_MVEX_FUNC_SF_32,
511 ZYDIS_MVEX_FUNC_SF_32_BCST,
515 ZYDIS_MVEX_FUNC_SF_32_BCST_4TO16,
519 ZYDIS_MVEX_FUNC_SF_64,
523 ZYDIS_MVEX_FUNC_SI_32,
527 ZYDIS_MVEX_FUNC_SI_32_BCST,
531 ZYDIS_MVEX_FUNC_SI_32_BCST_4TO16,
535 ZYDIS_MVEX_FUNC_SI_64,
539 ZYDIS_MVEX_FUNC_UF_32,
543 ZYDIS_MVEX_FUNC_UF_64,
547 ZYDIS_MVEX_FUNC_UI_32,
551 ZYDIS_MVEX_FUNC_UI_64,
555 ZYDIS_MVEX_FUNC_DF_32,
559 ZYDIS_MVEX_FUNC_DF_64,
563 ZYDIS_MVEX_FUNC_DI_32,
567 ZYDIS_MVEX_FUNC_DI_64,
568
572 ZYDIS_MVEX_FUNC_MAX_VALUE = ZYDIS_MVEX_FUNC_DI_64,
576 ZYDIS_MVEX_FUNC_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_MVEX_FUNC_MAX_VALUE)
577} ZydisMVEXFunctionality;
578
579/* ---------------------------------------------------------------------------------------------- */
580
584typedef enum ZydisVEXStaticBroadcast
585{
586 ZYDIS_VEX_STATIC_BROADCAST_NONE,
587 ZYDIS_VEX_STATIC_BROADCAST_1_TO_2,
588 ZYDIS_VEX_STATIC_BROADCAST_1_TO_4,
589 ZYDIS_VEX_STATIC_BROADCAST_1_TO_8,
590 ZYDIS_VEX_STATIC_BROADCAST_1_TO_16,
591 ZYDIS_VEX_STATIC_BROADCAST_1_TO_32,
592 ZYDIS_VEX_STATIC_BROADCAST_2_TO_4,
593
597 ZYDIS_VEX_STATIC_BROADCAST_MAX_VALUE = ZYDIS_VEX_STATIC_BROADCAST_2_TO_4,
601 ZYDIS_VEX_STATIC_BROADCAST_REQUIRED_BITS =
602 ZYAN_BITS_TO_REPRESENT(ZYDIS_VEX_STATIC_BROADCAST_MAX_VALUE)
603} ZydisVEXStaticBroadcast;
604
605/* ---------------------------------------------------------------------------------------------- */
606
610typedef enum ZydisEVEXStaticBroadcast_
611{
612 ZYDIS_EVEX_STATIC_BROADCAST_NONE,
613 ZYDIS_EVEX_STATIC_BROADCAST_1_TO_2,
614 ZYDIS_EVEX_STATIC_BROADCAST_1_TO_4,
615 ZYDIS_EVEX_STATIC_BROADCAST_1_TO_8,
616 ZYDIS_EVEX_STATIC_BROADCAST_1_TO_16,
617 ZYDIS_EVEX_STATIC_BROADCAST_1_TO_32,
618 ZYDIS_EVEX_STATIC_BROADCAST_1_TO_64,
619 ZYDIS_EVEX_STATIC_BROADCAST_2_TO_4,
620 ZYDIS_EVEX_STATIC_BROADCAST_2_TO_8,
621 ZYDIS_EVEX_STATIC_BROADCAST_2_TO_16,
622 ZYDIS_EVEX_STATIC_BROADCAST_4_TO_8,
623 ZYDIS_EVEX_STATIC_BROADCAST_4_TO_16,
624 ZYDIS_EVEX_STATIC_BROADCAST_8_TO_16,
625
629 ZYDIS_EVEX_STATIC_BROADCAST_MAX_VALUE = ZYDIS_EVEX_STATIC_BROADCAST_8_TO_16,
633 ZYDIS_EVEX_STATIC_BROADCAST_REQUIRED_BITS =
634 ZYAN_BITS_TO_REPRESENT(ZYDIS_EVEX_STATIC_BROADCAST_MAX_VALUE)
635} ZydisEVEXStaticBroadcast;
636
637/* ---------------------------------------------------------------------------------------------- */
638
642typedef enum ZydisMVEXStaticBroadcast_
643{
644 ZYDIS_MVEX_STATIC_BROADCAST_NONE,
645 ZYDIS_MVEX_STATIC_BROADCAST_1_TO_8,
646 ZYDIS_MVEX_STATIC_BROADCAST_1_TO_16,
647 ZYDIS_MVEX_STATIC_BROADCAST_4_TO_8,
648 ZYDIS_MVEX_STATIC_BROADCAST_4_TO_16,
649
653 ZYDIS_MVEX_STATIC_BROADCAST_MAX_VALUE = ZYDIS_MVEX_STATIC_BROADCAST_4_TO_16,
657 ZYDIS_MVEX_STATIC_BROADCAST_REQUIRED_BITS =
658 ZYAN_BITS_TO_REPRESENT(ZYDIS_MVEX_STATIC_BROADCAST_MAX_VALUE)
659} ZydisMVEXStaticBroadcast;
660
661/* ---------------------------------------------------------------------------------------------- */
662
666typedef enum ZydisMaskPolicy_
667{
668 ZYDIS_MASK_POLICY_INVALID,
673 ZYDIS_MASK_POLICY_ALLOWED,
677 ZYDIS_MASK_POLICY_REQUIRED,
681 ZYDIS_MASK_POLICY_FORBIDDEN,
682
686 ZYDIS_MASK_POLICY_MAX_VALUE = ZYDIS_MASK_POLICY_FORBIDDEN,
690 ZYDIS_MASK_POLICY_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_MASK_POLICY_MAX_VALUE)
691} ZydisMaskPolicy;
692
693/* ---------------------------------------------------------------------------------------------- */
694
698typedef enum ZydisMaskOverride_
699{
700 ZYDIS_MASK_OVERRIDE_DEFAULT,
701 ZYDIS_MASK_OVERRIDE_ZEROING,
702 ZYDIS_MASK_OVERRIDE_CONTROL,
703
707 ZYDIS_MASK_OVERRIDE_MAX_VALUE = ZYDIS_MASK_OVERRIDE_CONTROL,
711 ZYDIS_MASK_OVERRIDE_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_MASK_OVERRIDE_MAX_VALUE)
712} ZydisMaskOverride;
713
714/* ---------------------------------------------------------------------------------------------- */
715
716// MSVC does not correctly execute the `pragma pack(1)` compiler-directive, if we use the correct
717// enum types
718ZYAN_STATIC_ASSERT(ZYDIS_MNEMONIC_REQUIRED_BITS <= 16);
719ZYAN_STATIC_ASSERT(ZYDIS_CATEGORY_REQUIRED_BITS <= 8);
720ZYAN_STATIC_ASSERT(ZYDIS_ISA_SET_REQUIRED_BITS <= 8);
721ZYAN_STATIC_ASSERT(ZYDIS_ISA_EXT_REQUIRED_BITS <= 8);
722ZYAN_STATIC_ASSERT(ZYDIS_BRANCH_TYPE_REQUIRED_BITS <= 8);
723ZYAN_STATIC_ASSERT(ZYDIS_EXCEPTION_CLASS_REQUIRED_BITS <= 8);
724ZYAN_STATIC_ASSERT(ZYDIS_REG_CONSTRAINTS_REQUIRED_BITS <= 8);
725ZYAN_STATIC_ASSERT(ZYDIS_RW_ACTION_REQUIRED_BITS <= 8);
726
727#ifndef ZYDIS_MINIMAL_MODE
728# define ZYDIS_INSTRUCTION_DEFINITION_BASE \
729 ZyanU16 mnemonic ZYAN_BITFIELD(ZYDIS_MNEMONIC_REQUIRED_BITS); \
730 ZyanU8 operand_count ZYAN_BITFIELD( 4); \
731 ZyanU16 operand_reference ZYAN_BITFIELD(15); \
732 ZyanU8 operand_size_map ZYAN_BITFIELD( 3); \
733 ZyanU8 address_size_map ZYAN_BITFIELD( 2); \
734 ZyanU8 flags_reference ZYAN_BITFIELD( 7); \
735 ZyanBool requires_protected_mode ZYAN_BITFIELD( 1); \
736 ZyanBool no_compat_mode ZYAN_BITFIELD( 1); \
737 ZyanU8 category ZYAN_BITFIELD(ZYDIS_CATEGORY_REQUIRED_BITS); \
738 ZyanU8 isa_set ZYAN_BITFIELD(ZYDIS_ISA_SET_REQUIRED_BITS); \
739 ZyanU8 isa_ext ZYAN_BITFIELD(ZYDIS_ISA_EXT_REQUIRED_BITS); \
740 ZyanU8 branch_type ZYAN_BITFIELD(ZYDIS_BRANCH_TYPE_REQUIRED_BITS); \
741 ZyanU8 exception_class ZYAN_BITFIELD(ZYDIS_EXCEPTION_CLASS_REQUIRED_BITS); \
742 ZyanU8 constr_REG ZYAN_BITFIELD(ZYDIS_REG_CONSTRAINTS_REQUIRED_BITS); \
743 ZyanU8 constr_RM ZYAN_BITFIELD(ZYDIS_REG_CONSTRAINTS_REQUIRED_BITS); \
744 ZyanU8 cpu_state ZYAN_BITFIELD(ZYDIS_RW_ACTION_REQUIRED_BITS); \
745 ZyanU8 fpu_state ZYAN_BITFIELD(ZYDIS_RW_ACTION_REQUIRED_BITS); \
746 ZyanU8 xmm_state ZYAN_BITFIELD(ZYDIS_RW_ACTION_REQUIRED_BITS); \
747 ZyanBool accepts_segment ZYAN_BITFIELD( 1)
748#else
749# define ZYDIS_INSTRUCTION_DEFINITION_BASE \
750 ZyanU16 mnemonic ZYAN_BITFIELD(ZYDIS_MNEMONIC_REQUIRED_BITS); \
751 ZyanU8 operand_size_map ZYAN_BITFIELD( 3); \
752 ZyanU8 address_size_map ZYAN_BITFIELD( 2); \
753 ZyanBool requires_protected_mode ZYAN_BITFIELD( 1); \
754 ZyanU8 constr_REG ZYAN_BITFIELD(ZYDIS_REG_CONSTRAINTS_REQUIRED_BITS); \
755 ZyanU8 constr_RM ZYAN_BITFIELD(ZYDIS_REG_CONSTRAINTS_REQUIRED_BITS)
756#endif
757
758#define ZYDIS_INSTRUCTION_DEFINITION_BASE_VECTOR \
759 ZYDIS_INSTRUCTION_DEFINITION_BASE; \
760 ZyanU8 constr_NDSNDD ZYAN_BITFIELD(ZYDIS_REG_CONSTRAINTS_REQUIRED_BITS)
761
762#define ZYDIS_INSTRUCTION_DEFINITION_BASE_VECTOR_INTEL \
763 ZYDIS_INSTRUCTION_DEFINITION_BASE_VECTOR; \
764 ZyanBool is_gather ZYAN_BITFIELD( 1); \
765 ZyanBool no_source_dest_match ZYAN_BITFIELD( 1)
766
771{
772 ZYDIS_INSTRUCTION_DEFINITION_BASE;
774
779{
780 ZYDIS_INSTRUCTION_DEFINITION_BASE;
781#ifndef ZYDIS_MINIMAL_MODE
782 ZyanBool is_privileged ZYAN_BITFIELD( 1);
783#endif
784 ZyanBool accepts_LOCK ZYAN_BITFIELD( 1);
785#ifndef ZYDIS_MINIMAL_MODE
786 ZyanBool accepts_REP ZYAN_BITFIELD( 1);
787 ZyanBool accepts_REPEREPZ ZYAN_BITFIELD( 1);
788 ZyanBool accepts_REPNEREPNZ ZYAN_BITFIELD( 1);
789 ZyanBool accepts_BOUND ZYAN_BITFIELD( 1);
790 ZyanBool accepts_XACQUIRE ZYAN_BITFIELD( 1);
791 ZyanBool accepts_XRELEASE ZYAN_BITFIELD( 1);
792 ZyanBool accepts_NOTRACK ZYAN_BITFIELD( 1);
793 ZyanBool accepts_hle_without_lock ZYAN_BITFIELD( 1);
794 ZyanBool accepts_branch_hints ZYAN_BITFIELD( 1);
795#endif
797
802{
803 ZYDIS_INSTRUCTION_DEFINITION_BASE;
805
810{
811 ZYDIS_INSTRUCTION_DEFINITION_BASE_VECTOR;
813
814// MSVC does not correctly execute the `pragma pack(1)` compiler-directive, if we use the correct
815// enum types
816ZYAN_STATIC_ASSERT(ZYDIS_VEX_STATIC_BROADCAST_REQUIRED_BITS <= 8);
817
822{
823 ZYDIS_INSTRUCTION_DEFINITION_BASE_VECTOR_INTEL;
824#ifndef ZYDIS_MINIMAL_MODE
825 ZyanU8 broadcast ZYAN_BITFIELD(ZYDIS_VEX_STATIC_BROADCAST_REQUIRED_BITS);
826#endif
828
829#ifndef ZYDIS_DISABLE_AVX512
830
831// MSVC does not correctly execute the `pragma pack(1)` compiler-directive, if we use the correct
832// enum types
833ZYAN_STATIC_ASSERT(ZYDIS_IVECTOR_LENGTH_REQUIRED_BITS <= 8);
834ZYAN_STATIC_ASSERT(ZYDIS_TUPLETYPE_REQUIRED_BITS <= 8);
835ZYAN_STATIC_ASSERT(ZYDIS_IELEMENT_SIZE_REQUIRED_BITS <= 8);
836ZYAN_STATIC_ASSERT(ZYDIS_EVEX_FUNC_REQUIRED_BITS <= 8);
837ZYAN_STATIC_ASSERT(ZYDIS_MASK_POLICY_REQUIRED_BITS <= 8);
838ZYAN_STATIC_ASSERT(ZYDIS_MASK_OVERRIDE_REQUIRED_BITS <= 8);
839ZYAN_STATIC_ASSERT(ZYDIS_EVEX_STATIC_BROADCAST_REQUIRED_BITS <= 8);
840
845{
846 ZYDIS_INSTRUCTION_DEFINITION_BASE_VECTOR_INTEL;
847#ifndef ZYDIS_MINIMAL_MODE
848 ZyanU8 vector_length ZYAN_BITFIELD(ZYDIS_IVECTOR_LENGTH_REQUIRED_BITS);
849 ZyanU8 tuple_type ZYAN_BITFIELD(ZYDIS_TUPLETYPE_REQUIRED_BITS);
850 ZyanU8 element_size ZYAN_BITFIELD(ZYDIS_IELEMENT_SIZE_REQUIRED_BITS);
851 ZyanU8 functionality ZYAN_BITFIELD(ZYDIS_EVEX_FUNC_REQUIRED_BITS);
852#endif
853 ZyanU8 mask_policy ZYAN_BITFIELD(ZYDIS_MASK_POLICY_REQUIRED_BITS);
854 ZyanBool accepts_zero_mask ZYAN_BITFIELD( 1);
855#ifndef ZYDIS_MINIMAL_MODE
856 ZyanU8 mask_override ZYAN_BITFIELD(ZYDIS_MASK_OVERRIDE_REQUIRED_BITS);
857 ZyanU8 broadcast ZYAN_BITFIELD(ZYDIS_EVEX_STATIC_BROADCAST_REQUIRED_BITS);
858#endif
860#endif
861
862#ifndef ZYDIS_DISABLE_KNC
863
864// MSVC does not correctly execute the `pragma pack(1)` compiler-directive, if we use the correct
865// enum types
866ZYAN_STATIC_ASSERT(ZYDIS_MVEX_FUNC_REQUIRED_BITS <= 8);
867ZYAN_STATIC_ASSERT(ZYDIS_MASK_POLICY_REQUIRED_BITS <= 8);
868ZYAN_STATIC_ASSERT(ZYDIS_MVEX_STATIC_BROADCAST_REQUIRED_BITS <= 8);
869
874{
875 ZYDIS_INSTRUCTION_DEFINITION_BASE_VECTOR_INTEL;
876 ZyanU8 functionality ZYAN_BITFIELD(ZYDIS_MVEX_FUNC_REQUIRED_BITS);
877 ZyanU8 mask_policy ZYAN_BITFIELD(ZYDIS_MASK_POLICY_REQUIRED_BITS);
878#ifndef ZYDIS_MINIMAL_MODE
879 ZyanBool has_element_granularity ZYAN_BITFIELD( 1);
880 ZyanU8 broadcast ZYAN_BITFIELD(ZYDIS_MVEX_STATIC_BROADCAST_REQUIRED_BITS);
881#endif
883#endif
884
885/* ---------------------------------------------------------------------------------------------- */
886/* Accessed CPU flags */
887/* ---------------------------------------------------------------------------------------------- */
888
890{
892 ZyanU32 cpu_flags_read ZYAN_BITFIELD(22);
893 ZyanU32 cpu_flags_written ZYAN_BITFIELD(22);
894 ZyanU8 fpu_flags_read ZYAN_BITFIELD( 4);
895 ZyanU8 fpu_flags_written ZYAN_BITFIELD( 4);
897
898/* ---------------------------------------------------------------------------------------------- */
899
900#pragma pack(pop)
901
902#ifdef ZYAN_MSVC
903# pragma warning(pop)
904#endif
905
906/* ============================================================================================== */
907/* Functions */
908/* ============================================================================================== */
909
910/* ---------------------------------------------------------------------------------------------- */
911/* Instruction definition */
912/* ---------------------------------------------------------------------------------------------- */
913
922ZYDIS_NO_EXPORT void ZydisGetInstructionDefinition(ZydisInstructionEncoding encoding,
923 ZyanU16 id, const ZydisInstructionDefinition** definition);
924
925/* ---------------------------------------------------------------------------------------------- */
926/* Operand definition */
927/* ---------------------------------------------------------------------------------------------- */
928
929#ifndef ZYDIS_MINIMAL_MODE
939ZYDIS_NO_EXPORT ZyanU8 ZydisGetOperandDefinitions(const ZydisInstructionDefinition* definition,
940 const ZydisOperandDefinition** operand);
941#endif
942
943/* ---------------------------------------------------------------------------------------------- */
944/* Element info */
945/* ---------------------------------------------------------------------------------------------- */
946
947#ifndef ZYDIS_MINIMAL_MODE
955ZYDIS_NO_EXPORT void ZydisGetElementInfo(ZydisInternalElementType element, ZydisElementType* type,
956 ZydisElementSize* size);
957#endif
958
959/* ---------------------------------------------------------------------------------------------- */
960/* Accessed CPU flags */
961/* ---------------------------------------------------------------------------------------------- */
962
963#ifndef ZYDIS_MINIMAL_MODE
972ZYDIS_NO_EXPORT ZyanBool ZydisGetAccessedFlags(const ZydisInstructionDefinition* definition,
973 const ZydisAccessedFlags** flags);
974#endif
975
976/* ---------------------------------------------------------------------------------------------- */
977
978/* ============================================================================================== */
979
980#ifdef __cplusplus
981}
982#endif
983
984#endif /* ZYDIS_INTERNAL_SHAREDDATA_H */
Defines the basic ZydisDecodedInstruction and ZydisDecodedOperand structs.
@ ZYDIS_EXCEPTION_CLASS_REQUIRED_BITS
The minimum number of bits required to represent all values of this enum.
Definition: DecoderTypes.h:752
@ ZYDIS_BRANCH_TYPE_REQUIRED_BITS
The minimum number of bits required to represent all values of this enum.
Definition: DecoderTypes.h:685
#define ZYDIS_CPUFLAG_MAX_VALUE
DEPRECATED.
Definition: DecoderTypes.h:580
enum ZydisCPUFlagAction_ ZydisCPUFlagAction
Defines the ZydisCPUFlagAction enum.
Mnemonic constant definitions and helper functions.
Utility functions and constants for registers.
Defines decoder/encoder-shared macros and types.
@ ZYDIS_OPERAND_VISIBILITY_REQUIRED_BITS
The minimum number of bits required to represent all values of this enum.
Definition: SharedTypes.h:316
enum ZydisInstructionEncoding_ ZydisInstructionEncoding
Defines the ZydisInstructionEncoding enum.
@ ZYDIS_OPERAND_ENCODING_REQUIRED_BITS
The minimum number of bits required to represent all values of this enum.
Definition: SharedTypes.h:283
@ ZYDIS_OPERAND_ACTION_REQUIRED_BITS
The minimum number of bits required to represent all values of this bitset.
Definition: SharedTypes.h:391
enum ZydisElementType_ ZydisElementType
Defines the ZydisElementType enum.
ZyanU16 ZydisElementSize
Defines the ZydisElementSize datatype.
Definition: SharedTypes.h:189
Definition: SharedData.h:890
Defines the ZydisInstructionDefinition3DNOW struct.
Definition: SharedData.h:802
Defines the ZydisInstructionDefinitionEVEX struct.
Definition: SharedData.h:845
Defines the ZydisInstructionDefinitionLEGACY struct.
Definition: SharedData.h:779
Defines the ZydisInstructionDefinitionMVEX struct.
Definition: SharedData.h:874
Defines the ZydisInstructionDefinitionVEX struct.
Definition: SharedData.h:822
Defines the ZydisInstructionDefinitionXOP struct.
Definition: SharedData.h:810
Defines the ZydisInstructionDefinition struct.
Definition: SharedData.h:771
Defines the ZydisOperandDefinition struct.
Definition: SharedData.h:216