duckstation

duckstation, but archived from the revision just before upstream changed it to a proprietary software project, this version is the libre one
git clone https://git.neptards.moe/u3shit/duckstation.git
Log | Files | Refs | README | LICENSE

Segment.h (5697B)


      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 /**
     28  * @file
     29  * Functions and types providing encoding information about individual instruction bytes.
     30  */
     31 
     32 #ifndef ZYDIS_SEGMENT_H
     33 #define ZYDIS_SEGMENT_H
     34 
     35 #include <Zycore/Defines.h>
     36 #include <Zydis/DecoderTypes.h>
     37 #include <Zydis/Status.h>
     38 
     39 #ifdef __cplusplus
     40 extern "C" {
     41 #endif
     42 
     43 /**
     44 * @addtogroup segment Segment
     45 * Functions and types providing encoding information about individual instruction bytes.
     46 * @{
     47 */
     48 
     49 /* ============================================================================================== */
     50 /* Macros                                                                                         */
     51 /* ============================================================================================== */
     52 
     53 /* ---------------------------------------------------------------------------------------------- */
     54 /* Constants                                                                                      */
     55 /* ---------------------------------------------------------------------------------------------- */
     56 
     57 #define ZYDIS_MAX_INSTRUCTION_SEGMENT_COUNT 9
     58 
     59 /* ---------------------------------------------------------------------------------------------- */
     60 
     61 /* ============================================================================================== */
     62 /* Enums and types                                                                                */
     63 /* ============================================================================================== */
     64 
     65 /**
     66  * Defines the `ZydisInstructionSegment` struct.
     67  */
     68 typedef enum ZydisInstructionSegment_
     69 {
     70     ZYDIS_INSTR_SEGMENT_NONE,
     71     /**
     72      * The legacy prefixes (including ignored `REX` prefixes).
     73      */
     74     ZYDIS_INSTR_SEGMENT_PREFIXES,
     75     /**
     76      * The effective `REX` prefix byte.
     77      */
     78     ZYDIS_INSTR_SEGMENT_REX,
     79     /**
     80      * The `XOP` prefix bytes.
     81      */
     82     ZYDIS_INSTR_SEGMENT_XOP,
     83     /**
     84      * The `VEX` prefix bytes.
     85      */
     86     ZYDIS_INSTR_SEGMENT_VEX,
     87     /**
     88      * The `EVEX` prefix bytes.
     89      */
     90     ZYDIS_INSTR_SEGMENT_EVEX,
     91     /**
     92      * The `MVEX` prefix bytes.
     93      */
     94     ZYDIS_INSTR_SEGMENT_MVEX,
     95     /**
     96      * The opcode bytes.
     97      */
     98     ZYDIS_INSTR_SEGMENT_OPCODE,
     99     /**
    100      * The `ModRM` byte.
    101      */
    102     ZYDIS_INSTR_SEGMENT_MODRM,
    103     /**
    104      * The `SIB` byte.
    105      */
    106     ZYDIS_INSTR_SEGMENT_SIB,
    107     /**
    108      * The displacement bytes.
    109      */
    110     ZYDIS_INSTR_SEGMENT_DISPLACEMENT,
    111     /**
    112      * The immediate bytes.
    113      */
    114     ZYDIS_INSTR_SEGMENT_IMMEDIATE,
    115 
    116     /**
    117      * Maximum value of this enum.
    118      */
    119     ZYDIS_INSTR_SEGMENT_MAX_VALUE = ZYDIS_INSTR_SEGMENT_IMMEDIATE,
    120     /**
    121      * The minimum number of bits required to represent all values of this enum.
    122      */
    123     ZYDIS_INSTR_SEGMENT_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_INSTR_SEGMENT_MAX_VALUE)
    124 } ZydisInstructionSegment;
    125 
    126 /**
    127  * Defines the `ZydisInstructionSegments` struct.
    128  */
    129 typedef struct ZydisInstructionSegments_
    130 {
    131     /**
    132      * The number of logical instruction segments.
    133      */
    134     ZyanU8 count;
    135     struct
    136     {
    137         /**
    138          * The type of the segment.
    139          */
    140         ZydisInstructionSegment type;
    141         /**
    142          * The offset of the segment relative to the start of the instruction (in bytes).
    143          */
    144         ZyanU8 offset;
    145         /**
    146          * The size of the segment, in bytes.
    147          */
    148         ZyanU8 size;
    149     } segments[ZYDIS_MAX_INSTRUCTION_SEGMENT_COUNT];
    150 } ZydisInstructionSegments;
    151 
    152 /* ============================================================================================== */
    153 /* Exported functions                                                                             */
    154 /* ============================================================================================== */
    155 
    156 /**
    157  * Returns offsets and sizes of all logical instruction segments (e.g. `OPCODE`,
    158  * `MODRM`, ...).
    159  *
    160  * @param   instruction A pointer to the `ZydisDecodedInstruction` struct.
    161  * @param   segments    Receives the instruction segments information.
    162  *
    163  * @return  A zyan status code.
    164  */
    165 ZYDIS_EXPORT ZyanStatus ZydisGetInstructionSegments(const ZydisDecodedInstruction* instruction,
    166         ZydisInstructionSegments* segments);
    167 
    168 /* ============================================================================================== */
    169 
    170 /**
    171  * @}
    172  */
    173 
    174 #ifdef __cplusplus
    175 }
    176 #endif
    177 
    178 #endif /* ZYDIS_SEGMENT_H */