To decode an instruction you are required to provide.
More...
|
XED_DLL_EXPORT xed_reg_enum_t | xed_decoded_inst_get_seg_reg (const xed_decoded_inst_t *p, unsigned int mem_idx) |
|
XED_DLL_EXPORT xed_reg_enum_t | xed_decoded_inst_get_base_reg (const xed_decoded_inst_t *p, unsigned int mem_idx) |
|
XED_DLL_EXPORT xed_uint_t | xed_decoded_inst_get_scale (const xed_decoded_inst_t *p, unsigned int mem_idx) |
|
XED_DLL_EXPORT xed_int64_t | xed_decoded_inst_get_memory_displacement (const xed_decoded_inst_t *p, unsigned int mem_idx) |
|
XED_DLL_EXPORT xed_uint_t | xed_decoded_inst_get_memory_displacement_width (const xed_decoded_inst_t *p, unsigned int mem_idx) |
|
XED_DLL_EXPORT xed_uint_t | xed_decoded_inst_get_memory_displacement_width_bits (const xed_decoded_inst_t *p, unsigned int mem_idx) |
|
XED_DLL_EXPORT xed_int64_t | xed_decoded_inst_get_branch_displacement (const xed_decoded_inst_t *p) |
|
XED_DLL_EXPORT xed_uint_t | xed_decoded_inst_get_branch_displacement_width (const xed_decoded_inst_t *p) |
|
XED_DLL_EXPORT xed_uint_t | xed_decoded_inst_get_branch_displacement_width_bits (const xed_decoded_inst_t *p) |
|
XED_DLL_EXPORT xed_uint64_t | xed_decoded_inst_get_unsigned_immediate (const xed_decoded_inst_t *p) |
|
XED_DLL_EXPORT xed_uint_t | xed_decoded_inst_get_immediate_is_signed (const xed_decoded_inst_t *p) |
|
XED_DLL_EXPORT xed_uint_t | xed_decoded_inst_get_immediate_width (const xed_decoded_inst_t *p) |
|
XED_DLL_EXPORT xed_uint_t | xed_decoded_inst_get_immediate_width_bits (const xed_decoded_inst_t *p) |
|
XED_DLL_EXPORT xed_int32_t | xed_decoded_inst_get_signed_immediate (const xed_decoded_inst_t *p) |
|
static XED_INLINE xed_uint8_t | xed_decoded_inst_get_second_immediate (const xed_decoded_inst_t *p) |
|
XED_DLL_EXPORT xed_reg_enum_t | xed_decoded_inst_get_reg (const xed_decoded_inst_t *p, xed_operand_enum_t reg_operand) |
|
XED_DLL_EXPORT xed_reg_enum_t | xed_decoded_inst_get_dfv_reg (const xed_decoded_inst_t *xedd) |
|
const XED_DLL_EXPORT xed_simple_flag_t * | xed_decoded_inst_get_rflags_info (const xed_decoded_inst_t *p) |
| See the comment on xed_decoded_inst_uses_rflags(). More...
|
|
XED_DLL_EXPORT xed_bool_t | xed_decoded_inst_uses_rflags (const xed_decoded_inst_t *p) |
| This returns 1 if the flags are read or written. More...
|
|
XED_DLL_EXPORT xed_uint_t | xed_decoded_inst_number_of_memory_operands (const xed_decoded_inst_t *p) |
|
XED_DLL_EXPORT xed_bool_t | xed_decoded_inst_mem_read (const xed_decoded_inst_t *p, unsigned int mem_idx) |
|
XED_DLL_EXPORT xed_bool_t | xed_decoded_inst_mem_written (const xed_decoded_inst_t *p, unsigned int mem_idx) |
|
XED_DLL_EXPORT xed_bool_t | xed_decoded_inst_mem_written_only (const xed_decoded_inst_t *p, unsigned int mem_idx) |
|
XED_DLL_EXPORT xed_bool_t | xed_decoded_inst_conditionally_writes_registers (const xed_decoded_inst_t *p) |
|
XED_DLL_EXPORT unsigned int | xed_decoded_inst_get_memory_operand_length (const xed_decoded_inst_t *p, unsigned int memop_idx) |
| returns bytes More...
|
|
XED_DLL_EXPORT unsigned int | xed_decoded_inst_get_memop_address_width (const xed_decoded_inst_t *p, xed_uint_t memop_idx) |
| Returns the addressing width in bits (16,32,64) for MEM0 (memop_idx==0) or MEM1 (memop_idx==1). More...
|
|
XED_DLL_EXPORT xed_bool_t | xed_decoded_inst_is_prefetch (const xed_decoded_inst_t *p) |
|
XED_DLL_EXPORT xed_bool_t | xed_decoded_inst_is_broadcast (const xed_decoded_inst_t *p) |
|
XED_DLL_EXPORT xed_bool_t | xed_decoded_inst_is_broadcast_instruction (const xed_decoded_inst_t *p) |
|
XED_DLL_EXPORT xed_bool_t | xed_decoded_inst_uses_embedded_broadcast (const xed_decoded_inst_t *p) |
|
XED_DLL_EXPORT xed_reg_enum_t | xed_decoded_inst_get_index_reg (const xed_decoded_inst_t *p, unsigned int mem_idx) |
|
|
XED_DLL_EXPORT void | xed_decoded_inst_set_scale (xed_decoded_inst_t *p, xed_uint_t scale) |
|
XED_DLL_EXPORT void | xed_decoded_inst_set_memory_displacement (xed_decoded_inst_t *p, xed_int64_t disp, xed_uint_t length_bytes) |
|
XED_DLL_EXPORT void | xed_decoded_inst_set_branch_displacement (xed_decoded_inst_t *p, xed_int64_t disp, xed_uint_t length_bytes) |
|
XED_DLL_EXPORT void | xed_decoded_inst_set_immediate_signed (xed_decoded_inst_t *p, xed_int32_t x, xed_uint_t length_bytes) |
|
XED_DLL_EXPORT void | xed_decoded_inst_set_immediate_unsigned (xed_decoded_inst_t *p, xed_uint64_t x, xed_uint_t length_bytes) |
|
XED_DLL_EXPORT void | xed_decoded_inst_set_memory_displacement_bits (xed_decoded_inst_t *p, xed_int64_t disp, xed_uint_t length_bits) |
|
XED_DLL_EXPORT void | xed_decoded_inst_set_branch_displacement_bits (xed_decoded_inst_t *p, xed_int64_t disp, xed_uint_t length_bits) |
|
XED_DLL_EXPORT void | xed_decoded_inst_set_immediate_signed_bits (xed_decoded_inst_t *p, xed_int32_t x, xed_uint_t length_bits) |
|
XED_DLL_EXPORT void | xed_decoded_inst_set_immediate_unsigned_bits (xed_decoded_inst_t *p, xed_uint64_t x, xed_uint_t length_bits) |
|
To decode an instruction you are required to provide.
-
a machine state (operating mode and stack addressing width)
-
a pointer to the instruction text array of bytes
-
a length of the text array
The machine state is passed in to decoder via the class xed_state_t . That state is set via the constructor of each xed_decoded_inst_t .
The xed_decoded_inst_t contains the results of decoding after a successful decode.
The xed_decoded_inst_t includes an array of xed_operand_values_t and that is where most of the information about the operands, resources etc. are stored. See the Operand storage fields interface. The array is indexed by the xed_operand_enum_t enumeration. Do not access it directly though; use the interface functions in the Operand storage fields interface for portability.
After decoding the xed_decoded_inst_t contains a pointer to the xed_inst_t which acts like a kind of template giving static information about the decoded instruction: what are the types of the operands, the iclass, category extension, etc. The xed_inst_t is accessed via the xed_decoded_inst_inst(cont xed_decoded_inst_t* xedd) function.
Before every decode, you must call one of the initialization functions. The most common case would be to use xed_decoded_inst_zero_keep_mode() or maybe xed_decoded_inst_zero_set_mode().
◆ xed_decoded_inst_t
The main container for instructions. After decode, it holds an array of operands with derived information from decode and also valid xed_inst_t pointer which describes the operand templates and the operand order. See Decoding Instructions for API documentation.
◆ xed_inst_t
constant information about a decoded instruction form, including the pointer to the constant operand properties xed_operand_t for this instruction form.
◆ xed_operand_t
Constant information about an individual generic operand, like an operand template, describing the operand properties. See Decoding Instructions for API information.
◆ xed_attribute()
Return the i'th global attribute in a linear sequence, independent of any instruction. This is used for scanning and printing all attributes.
◆ xed_attribute_max()
Return the maximum number of defined attributes, independent of any instruction.
◆ xed_classify_amx()
True for AMX instructions
◆ xed_classify_apx()
True for APX instructions. includes instructions with EGPRs, REX2 and encodings that are treated as illegal on non-APX systems.
◆ xed_classify_avx()
True for AVX/AVX2 SIMD VEX-encoded operations. Does not include BMI/BMI2 instructions.
◆ xed_classify_avx512()
True for AVX512 (EVEX-encoded) SIMD and (VEX encoded) K-mask instructions
◆ xed_classify_avx512_maskop()
True for AVX512 (VEX-encoded) K-mask operations
◆ xed_classify_sse()
True for SSE/SSE2/etc. SIMD operations. Includes AES and PCLMULQDQ
◆ xed_decode()
This is the main interface to the decoder.
- Parameters
-
xedd | the decoded instruction of type xed_decoded_inst_t . Mode/state sent in via xedd; See the xed_state_t |
itext | the pointer to the array of instruction text bytes |
bytes | the length of the itext input array. 1 to 15 bytes, anything more is ignored. |
- Returns
- xed_error_enum_t indicating success (XED_ERROR_NONE) or failure. Note failure can be due to not enough bytes in the input array.
The maximum instruction is 15B and XED will tell you how long the actual instruction is via an API function call xed_decoded_inst_get_length(). However, it is not always safe or advisable for XED to read 15 bytes if the decode location is at the boundary of some sort of protection limit. For example, if one is decoding near the end of a page and the XED user does not want to cause extra page faults, one might send in the number of bytes that would stop at the page boundary. In this case, XED might not be able to decode the instruction and would return an error. The XED user would then have to decide if it was safe to touch the next page and try again to decode with more bytes. Also sometimes the user process does not have read access to the next page and this allows the user to prevent XED from causing process termination by limiting the memory range that XED will access.
◆ xed_decode_with_features()
◆ xed_decoded_inst_avx512_dest_elements()
Returns the maximum number elements processed for an AVX512 vector instruction.
Scalars report 1 element.
◆ xed_decoded_inst_conditionally_writes_registers()
◆ xed_decoded_inst_get_attribute()
Returns 1 if the attribute is defined for this instruction.
◆ xed_decoded_inst_get_attributes()
Returns the attribute bitvector
◆ xed_decoded_inst_get_base_reg()
◆ xed_decoded_inst_get_branch_displacement()
◆ xed_decoded_inst_get_branch_displacement_width()
◆ xed_decoded_inst_get_branch_displacement_width_bits()
◆ xed_decoded_inst_get_byte()
Read itext byte.
Read a whole byte from the normal input bytes.
◆ xed_decoded_inst_get_category()
◆ xed_decoded_inst_get_dfv_reg()
Return DFV register enumeration if one of the instruction's operands is a "default flags values" pseudo-register and invalid register enumeration otherwise
◆ xed_decoded_inst_get_extension()
◆ xed_decoded_inst_get_iclass()
◆ xed_decoded_inst_get_iform_enum()
◆ xed_decoded_inst_get_iform_enum_dispatch()
Return the instruction zero-based iform number based on masking the corresponding xed_iform_enum_t. This value is suitable for dispatching. The maximum value for a particular iclass is provided by xed_iform_max_per_iclass() .
◆ xed_decoded_inst_get_immediate_is_signed()
Return true if the first immediate (IMM0) is signed
◆ xed_decoded_inst_get_immediate_width()
Return the immediate width in BYTES.
◆ xed_decoded_inst_get_immediate_width_bits()
Return the immediate width in BITS.
◆ xed_decoded_inst_get_index_reg()
◆ xed_decoded_inst_get_input_chip()
Return the user-specified xed_chip_enum_t chip name, or XED_CHIP_INVALID if not set.
◆ xed_decoded_inst_get_isa_set()
◆ xed_decoded_inst_get_length()
Return the length of the decoded instruction in bytes.
◆ xed_decoded_inst_get_machine_mode_bits()
Returns 16/32/64 indicating the machine mode with in bits. This is derived from the input mode information.
◆ xed_decoded_inst_get_memop_address_width()
Returns the addressing width in bits (16,32,64) for MEM0 (memop_idx==0) or MEM1 (memop_idx==1).
This factors in things like whether or not the reference is an implicit stack push/pop reference, the machine mode and
◆ xed_decoded_inst_get_memory_displacement()
◆ xed_decoded_inst_get_memory_displacement_width()
◆ xed_decoded_inst_get_memory_displacement_width_bits()
◆ xed_decoded_inst_get_memory_operand_length()
◆ xed_decoded_inst_get_modrm()
◆ xed_decoded_inst_get_nprefixes()
Returns the number of legacy prefixes.
◆ xed_decoded_inst_get_operand_width()
◆ xed_decoded_inst_get_reg()
◆ xed_decoded_inst_get_rflags_info()
◆ xed_decoded_inst_get_scale()
◆ xed_decoded_inst_get_second_immediate()
Return the second immediate.
◆ xed_decoded_inst_get_seg_reg()
◆ xed_decoded_inst_get_signed_immediate()
◆ xed_decoded_inst_get_stack_address_mode_bits()
Returns 16/32/64 indicating the stack addressing mode with in bits. This is derived from the input mode information.
◆ xed_decoded_inst_get_unsigned_immediate()
◆ xed_decoded_inst_get_user_data()
Return a user data field for arbitrary use by the user after decoding.
◆ xed_decoded_inst_has_mpx_prefix()
Returns 1 if the instruction has mpx prefix.
◆ xed_decoded_inst_inst()
Return the xed_inst_t structure for this instruction. This is the route to the basic operands form information.
◆ xed_decoded_inst_is_apx_zu()
Return non-zero value for APX-Promtoed zero-upper instructions (ZU).
◆ xed_decoded_inst_is_broadcast()
◆ xed_decoded_inst_is_broadcast_instruction()
Return 1 for broadcast instruction. (NOT including AVX512 load-op instructions) 0 otherwise. Just a category check.
◆ xed_decoded_inst_is_prefetch()
Returns true if the instruction is a prefetch
◆ xed_decoded_inst_is_xacquire()
Returns 1 if the instruction is xacquire.
◆ xed_decoded_inst_is_xrelease()
Returns 1 if the instruction is xrelease.
◆ xed_decoded_inst_masked_vector_operation()
Returns 1 iff the instruction uses destination-masking. This is 0 for blend operations that use their mask field as a control.
◆ xed_decoded_inst_masking()
Returns true if the instruction uses write-masking.
◆ xed_decoded_inst_mem_read()
◆ xed_decoded_inst_mem_written()
◆ xed_decoded_inst_mem_written_only()
◆ xed_decoded_inst_merging()
Returns true if the instruction uses write-masking with merging.
◆ xed_decoded_inst_noperands()
Return the number of operands.
◆ xed_decoded_inst_number_of_memory_operands()
◆ xed_decoded_inst_operand_action()
Interpret the operand action in light of AVX512 masking and zeroing/merging.
If masking and merging are used together, the dest operand may also be read. If masking and merging are used together, the elemnents of dest operand register may be conditionally written (so that input values live on in the output register).
◆ xed_decoded_inst_operand_element_size_bits()
Return the size of an element in bits (for SSE and AVX operands)
◆ xed_decoded_inst_operand_element_type()
◆ xed_decoded_inst_operand_elements()
Return the number of element in the operand (for SSE and AVX operands)
◆ xed_decoded_inst_operand_length()
◆ xed_decoded_inst_operand_length_bits()
Return the length in bits of the operand_index'th operand.
◆ xed_decoded_inst_operands()
Obtain a non-constant pointer to the operands
◆ xed_decoded_inst_operands_const()
Obtain a constant pointer to the operands
◆ xed_decoded_inst_set_branch_displacement()
Set the branch displacement using a BYTE length
◆ xed_decoded_inst_set_branch_displacement_bits()
Set the branch displacement a BITS length
◆ xed_decoded_inst_set_immediate_signed()
Set the signed immediate a BYTE length
◆ xed_decoded_inst_set_immediate_signed_bits()
Set the signed immediate a BITS length
◆ xed_decoded_inst_set_immediate_unsigned()
Set the unsigned immediate a BYTE length
◆ xed_decoded_inst_set_immediate_unsigned_bits()
Set the unsigned immediate a BITS length
◆ xed_decoded_inst_set_input_chip()
◆ xed_decoded_inst_set_memory_displacement()
Set the memory displacement using a BYTE length
◆ xed_decoded_inst_set_memory_displacement_bits()
Set the memory displacement a BITS length
◆ xed_decoded_inst_set_mode()
Set the machine mode and stack addressing width directly. This is NOT a full initialization; Call xed_decoded_inst_zero() before using this if you want a clean slate.
◆ xed_decoded_inst_set_scale()
◆ xed_decoded_inst_set_user_data()
Modify the user data field.
◆ xed_decoded_inst_uses_embedded_broadcast()
Return 1 for AVX512 load-op instructions using the broadcast feature, 0 otherwise.
◆ xed_decoded_inst_uses_rflags()
This returns 1 if the flags are read or written.
This will return 0 otherwise. This will return 0 if the flags are really not used by this instruction. For some shifts/rotates, XED puts a flags operand in the operand array before it knows if the flags are used because of mode-dependent masking effects on the immediate.
◆ xed_decoded_inst_valid()
Return true if the instruction is valid
◆ xed_decoded_inst_valid_for_chip()
Indicate if this decoded instruction is valid for the specified xed_chip_enum_t chip.
◆ xed_decoded_inst_vector_length_bits()
Returns 128, 256 or 512 for operations in the VEX, EVEX (or XOP) encoding space and returns 0 for (most) nonvector operations. This usually the content of the VEX.L or EVEX.LL field, reinterpreted. Some GPR instructions (like the BMI1/BMI2) are encoded in the VEX space and return non-zero values from this API.
◆ xed_decoded_inst_zero()
Zero the decode structure completely. Re-initializes all operands.
◆ xed_decoded_inst_zero_keep_mode()
Zero the decode structure, but preserve the existing machine state/mode information. Re-initializes all operands.
◆ xed_decoded_inst_zero_keep_mode_from_operands()
Zero the decode structure, but copy the existing machine state/mode information from the supplied operands pointer. Same as xed_decoded_inst_zero_keep_mode.
◆ xed_decoded_inst_zero_set_mode()
Zero the decode structure, but set the machine state/mode information. Re-initializes all operands.
◆ xed_decoded_inst_zeroing()
Returns true if the instruction uses write-masking with zeroing.
◆ xed_ild_decode()
This function just does instruction length decoding.
It does not return a fully decoded instruction.
- Parameters
-
xedd | the decoded instruction of type xed_decoded_inst_t . Mode/state sent in via xedd; See the xed_state_t . |
itext | the pointer to the array of instruction text bytes |
bytes | the length of the itext input array. 1 to 15 bytes, anything more is ignored. |
- Returns
- xed_error_enum_t indicating success (XED_ERROR_NONE) or failure. Only two failure codes are valid for this function: XED_ERROR_BUFFER_TOO_SHORT and XED_ERROR_GENERAL_ERROR. In general this function cannot tell if the instruction is valid or not. For valid instructions, XED can figure out if enough bytes were provided to decode the instruction. If not enough were provided, XED returns XED_ERROR_BUFFER_TOO_SHORT. From this function, the XED_ERROR_GENERAL_ERROR is an indication that XED could not decode the instruction's length because the instruction was so invalid that even its length may across implmentations.
◆ xed_inst_category()
◆ xed_inst_cpl()
xed_inst_cpl() is DEPRECATED. Please use "xed_decoded_inst_get_attribute(xedd, XED_ATTRIBUTE_RING0)" instead. Return the current privilege level (CPL) required for execution, 0 or
- If the value is zero, then the instruction can only execute in ring 0.
◆ xed_inst_exception()
Return xed_exception_enum_t if present for the specified instruction. This is currently only used for SSE and AVX instructions.
◆ xed_inst_extension()
◆ xed_inst_flag_info_index()
◆ xed_inst_get_attribute()
Scan for the attribute attr and return 1 if it is found, 0 otherwise.
◆ xed_inst_get_attributes()
Return the attributes bit vector
◆ xed_inst_iclass()
◆ xed_inst_iform_enum()
◆ xed_inst_isa_set()
◆ xed_inst_noperands()
Number of instruction operands
◆ xed_inst_operand()
Obtain a pointer to an individual operand
◆ xed_inst_table_base()
Return the base of instruction table.
◆ xed_norep_map()
# REP/REPNE/REPE prefix and return the corresponding xed_iclass_enum_t without that prefix. If the input instruction does not have a REP/REPNE/REPE prefix, this function returns XED_ICLASS_INVALID.
◆ xed_operand_conditional_read()
If the operand has a conditional read (may also write)
◆ xed_operand_conditional_write()
If the operand has a conditional write (may also read)
◆ xed_operand_imm()
- Parameters
-
p | an operand template, xed_operand_t. These operands represent branch displacements, memory displacements and various immediates |
◆ xed_operand_is_memory_addressing_register()
Tests the enum for inclusion in XED_OPERAND_{BASE0,BASE1,INDEX,SEG0,SEG1}
- Parameters
-
- Returns
- 1 if the operand name is for a memory addressing register operand, 0 otherwise. See also xed_operand_is_register .
◆ xed_operand_is_register()
Tests the enum for inclusion in XED_OPERAND_REG0 through XED_OPERAND_REG9.
- Parameters
-
- Returns
- 1 if the operand name is REG0...REG9, 0 otherwise.
Note there are other registers for memory addressing; See xed_operand_is_memory_addressing_register .
◆ xed_operand_name()
◆ xed_operand_nonterminal_name()
◆ xed_operand_operand_visibility()
◆ xed_operand_print()
Print the operand p into the buffer buf, of length buflen.
- Parameters
-
p | an operand template, xed_operand_t. |
buf | buffer that gets filled in |
buflen | maximum buffer length |
◆ xed_operand_read()
If the operand is read, including conditional reads
◆ xed_operand_read_and_written()
If the operand is read-and-written, conditional reads and conditional writes
◆ xed_operand_read_only()
If the operand is read-only, including conditional reads
◆ xed_operand_reg()
Careful with this one – use xed_decoded_inst_get_reg()! This one is probably not what you think it is. It is only used for hard-coded registers implicit in the instruction encoding. Most likely you want to get the xed_operand_enum_t and then look up the instruction using xed_decoded_inst_get_reg(). The hard-coded registers are also available that way.
- Parameters
-
- Returns
- the implicit or suppressed registers, type xed_reg_enum_t
◆ xed_operand_rw()
◆ xed_operand_template_is_register()
◆ xed_operand_type()
◆ xed_operand_width()
◆ xed_operand_width_bits()
- Parameters
-
p | an operand template, xed_operand_t. |
eosz | effective operand size of the instruction, 1 | 2 | 3 for 16 | 32 | 64 bits respectively. 0 is invalid. |
- Returns
- the actual width of operand in bits. See xed_decoded_inst_operand_length_bits() for a more general solution.
◆ xed_operand_written()
If the operand is written, including conditional writes
◆ xed_operand_written_only()
If the operand is written-only, including conditional writes
◆ xed_operand_xtype()
◆ xed_rep_map()
# return the corresponding xed_iclass_enum_t with a REP prefix. If the input instruction cannot have a REP prefix, this function returns XED_ICLASS_INVALID.
◆ xed_rep_remove()
// return the corresponding xed_iclass_enum_t without that prefix. The return value differs from the other functions in this group: If the input iclass does not have REP/REPNE/REPE prefix, the function returns the original instruction.
◆ xed_repe_map()
# return the corresponding xed_iclass_enum_t with a REPE prefix. If the input instruction cannot have have a REPE prefix, this function returns XED_ICLASS_INVALID.
◆ xed_repne_map()
# and return the corresponding xed_iclass_enum_t with a REPNE prefix. If the input instruction cannot have a REPNE prefix, this function returns XED_ICLASS_INVALID.