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

Register.h (11167B)


      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  * Utility functions and constants for registers.
     30  */
     31 
     32 #ifndef ZYDIS_REGISTER_H
     33 #define ZYDIS_REGISTER_H
     34 
     35 #include <Zycore/Defines.h>
     36 #include <Zycore/Types.h>
     37 #include <Zydis/Defines.h>
     38 #include <Zydis/SharedTypes.h>
     39 #include <Zydis/ShortString.h>
     40 
     41 #ifdef __cplusplus
     42 extern "C" {
     43 #endif
     44 
     45 /* ============================================================================================== */
     46 /* Enums and types                                                                                */
     47 /* ============================================================================================== */
     48 
     49 /* ---------------------------------------------------------------------------------------------- */
     50 /* Registers                                                                                      */
     51 /* ---------------------------------------------------------------------------------------------- */
     52 
     53 #include <Zydis/Generated/EnumRegister.h>
     54 
     55 /* ---------------------------------------------------------------------------------------------- */
     56 /* Register kinds                                                                                 */
     57 /* ---------------------------------------------------------------------------------------------- */
     58 
     59 /**
     60  * Defines the `ZydisRegisterKind` enum.
     61  *
     62  * Please note that this enum does not contain a matching entry for all values of the
     63  * `ZydisRegister` enum, but only for those registers where it makes sense to logically group them
     64  * for decoding/encoding purposes.
     65  *
     66  * These are mainly the registers that can be identified by an id within their corresponding
     67  * register-class.
     68  */
     69 typedef enum ZydisRegisterKind_
     70 {
     71     ZYDIS_REGKIND_INVALID,
     72     ZYDIS_REGKIND_GPR,
     73     ZYDIS_REGKIND_X87,
     74     ZYDIS_REGKIND_MMX,
     75     ZYDIS_REGKIND_VR,
     76     ZYDIS_REGKIND_TMM,
     77     ZYDIS_REGKIND_SEGMENT,
     78     ZYDIS_REGKIND_TEST,
     79     ZYDIS_REGKIND_CONTROL,
     80     ZYDIS_REGKIND_DEBUG,
     81     ZYDIS_REGKIND_MASK,
     82     ZYDIS_REGKIND_BOUND,
     83 
     84     /**
     85      * Maximum value of this enum.
     86      */
     87     ZYDIS_REGKIND_MAX_VALUE = ZYDIS_REGKIND_BOUND,
     88     /**
     89      * The minimum number of bits required to represent all values of this enum.
     90      */
     91     ZYDIS_REGKIND_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_REGKIND_MAX_VALUE)
     92 } ZydisRegisterKind;
     93 
     94 /* ---------------------------------------------------------------------------------------------- */
     95 /* Register classes                                                                               */
     96 /* ---------------------------------------------------------------------------------------------- */
     97 
     98 /**
     99  * Defines the `ZydisRegisterClass` enum.
    100  *
    101  * Please note that this enum does not contain a matching entry for all values of the
    102  * `ZydisRegister` enum, but only for those registers where it makes sense to logically group them
    103  * for decoding/encoding purposes.
    104  *
    105  * These are mainly the registers that can be identified by an id within their corresponding
    106  * register-class. The `IP` and `FLAGS` values are exceptions to this rule.
    107  */
    108 typedef enum ZydisRegisterClass_
    109 {
    110     ZYDIS_REGCLASS_INVALID,
    111     /**
    112      * 8-bit general-purpose registers.
    113      */
    114     ZYDIS_REGCLASS_GPR8,
    115     /**
    116      * 16-bit general-purpose registers.
    117      */
    118     ZYDIS_REGCLASS_GPR16,
    119     /**
    120      * 32-bit general-purpose registers.
    121      */
    122     ZYDIS_REGCLASS_GPR32,
    123     /**
    124      * 64-bit general-purpose registers.
    125      */
    126     ZYDIS_REGCLASS_GPR64,
    127     /**
    128      * Floating point legacy registers.
    129      */
    130     ZYDIS_REGCLASS_X87,
    131     /**
    132      * Floating point multimedia registers.
    133      */
    134     ZYDIS_REGCLASS_MMX,
    135     /**
    136      * 128-bit vector registers.
    137      */
    138     ZYDIS_REGCLASS_XMM,
    139     /**
    140      * 256-bit vector registers.
    141      */
    142     ZYDIS_REGCLASS_YMM,
    143     /**
    144      * 512-bit vector registers.
    145      */
    146     ZYDIS_REGCLASS_ZMM,
    147     /**
    148      * Matrix registers.
    149      */
    150     ZYDIS_REGCLASS_TMM,
    151     /*
    152      * Flags registers.
    153      */
    154     ZYDIS_REGCLASS_FLAGS,
    155     /**
    156      * Instruction-pointer registers.
    157      */
    158     ZYDIS_REGCLASS_IP,
    159     /**
    160      * Segment registers.
    161      */
    162     ZYDIS_REGCLASS_SEGMENT,
    163     /**
    164      * Table registers.
    165     */
    166     ZYDIS_REGCLASS_TABLE,
    167     /**
    168      * Test registers.
    169      */
    170     ZYDIS_REGCLASS_TEST,
    171     /**
    172      * Control registers.
    173      */
    174     ZYDIS_REGCLASS_CONTROL,
    175     /**
    176      * Debug registers.
    177      */
    178     ZYDIS_REGCLASS_DEBUG,
    179     /**
    180      * Mask registers.
    181      */
    182     ZYDIS_REGCLASS_MASK,
    183     /**
    184      * Bound registers.
    185      */
    186     ZYDIS_REGCLASS_BOUND,
    187 
    188     /**
    189      * Maximum value of this enum.
    190      */
    191     ZYDIS_REGCLASS_MAX_VALUE = ZYDIS_REGCLASS_BOUND,
    192     /**
    193      * The minimum number of bits required to represent all values of this enum.
    194      */
    195     ZYDIS_REGCLASS_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_REGCLASS_MAX_VALUE)
    196 } ZydisRegisterClass;
    197 
    198 /* ---------------------------------------------------------------------------------------------- */
    199 /* Register width                                                                                 */
    200 /* ---------------------------------------------------------------------------------------------- */
    201 
    202 /**
    203  * Defines the `ZydisRegisterWidth` data-type.
    204  */
    205 typedef ZyanU16 ZydisRegisterWidth;
    206 
    207 /* ---------------------------------------------------------------------------------------------- */
    208 /* Register context                                                                               */
    209 /* ---------------------------------------------------------------------------------------------- */
    210 
    211 /**
    212  * Defines the `ZydisRegisterContext` struct.
    213  */
    214 typedef struct ZydisRegisterContext_
    215 {
    216     /**
    217      * The values stored in the register context.
    218      */
    219     ZyanU64 values[ZYDIS_REGISTER_MAX_VALUE + 1];
    220 } ZydisRegisterContext;
    221 
    222 /* ---------------------------------------------------------------------------------------------- */
    223 
    224 /* ============================================================================================== */
    225 /* Exported functions                                                                             */
    226 /* ============================================================================================== */
    227 
    228 /**
    229  * @addtogroup register Register
    230  * Functions allowing retrieval of information about registers.
    231  * @{
    232  */
    233 
    234 /* ---------------------------------------------------------------------------------------------- */
    235 /* Register                                                                                       */
    236 /* ---------------------------------------------------------------------------------------------- */
    237 
    238 /**
    239  * Returns the register specified by the `register_class` and `id` tuple.
    240  *
    241  * @param   register_class  The register class.
    242  * @param   id              The register id.
    243  *
    244  * @return  The register specified by the `register_class` and `id` tuple or `ZYDIS_REGISTER_NONE`,
    245  *          if an invalid parameter was passed.
    246  */
    247 ZYDIS_EXPORT ZydisRegister ZydisRegisterEncode(ZydisRegisterClass register_class, ZyanU8 id);
    248 
    249 /**
    250  * Returns the id of the specified register.
    251  *
    252  * @param   reg The register.
    253  *
    254  * @return  The id of the specified register, or -1 if an invalid parameter was passed.
    255  */
    256 ZYDIS_EXPORT ZyanI8 ZydisRegisterGetId(ZydisRegister reg);
    257 
    258 /**
    259  * Returns the register-class of the specified register.
    260  *
    261  * @param   reg The register.
    262  *
    263  * @return  The register-class of the specified register.
    264  */
    265 ZYDIS_EXPORT ZydisRegisterClass ZydisRegisterGetClass(ZydisRegister reg);
    266 
    267 /**
    268  * Returns the width of the specified register.
    269  *
    270  * @param   mode    The active machine mode.
    271  * @param   reg     The register.
    272  *
    273  * @return  The width of the specified register, or `ZYDIS_REGISTER_NONE` if the register is
    274  *          invalid for the active machine-mode.
    275  */
    276 ZYDIS_EXPORT ZydisRegisterWidth ZydisRegisterGetWidth(ZydisMachineMode mode, ZydisRegister reg);
    277 
    278 /**
    279  * Returns the largest enclosing register of the given register.
    280  *
    281  * @param   mode    The active machine mode.
    282  * @param   reg     The register.
    283  *
    284  * @return  The largest enclosing register of the given register, or `ZYDIS_REGISTER_NONE` if the
    285  *          register is invalid for the active machine-mode or does not have an enclosing-register.
    286  */
    287 ZYDIS_EXPORT ZydisRegister ZydisRegisterGetLargestEnclosing(ZydisMachineMode mode,
    288     ZydisRegister reg);
    289 
    290 /**
    291  * Returns the specified register string.
    292  *
    293  * @param   reg The register.
    294  *
    295  * @return  The register string or `ZYAN_NULL`, if an invalid register was passed.
    296  */
    297 ZYDIS_EXPORT const char* ZydisRegisterGetString(ZydisRegister reg);
    298 
    299 /**
    300  * Returns the specified register string as `ZydisShortString`.
    301  *
    302  * @param   reg The register.
    303  *
    304  * @return  The register string or `ZYAN_NULL`, if an invalid register was passed.
    305  *
    306  * The `buffer` of the returned struct is guaranteed to be zero-terminated in this special case.
    307  */
    308 ZYDIS_EXPORT const ZydisShortString* ZydisRegisterGetStringWrapped(ZydisRegister reg);
    309 
    310 /* ---------------------------------------------------------------------------------------------- */
    311 /* Register class                                                                                 */
    312 /* ---------------------------------------------------------------------------------------------- */
    313 
    314 /**
    315  * Returns the width of the specified register-class.
    316  *
    317  * @param   mode            The active machine mode.
    318  * @param   register_class  The register class.
    319  *
    320  * @return  The width of the specified register.
    321  */
    322 ZYDIS_EXPORT ZydisRegisterWidth ZydisRegisterClassGetWidth(ZydisMachineMode mode,
    323     ZydisRegisterClass register_class);
    324 
    325 /* ---------------------------------------------------------------------------------------------- */
    326 
    327 /**
    328  * @}
    329  */
    330 
    331 /* ============================================================================================== */
    332 
    333 #ifdef __cplusplus
    334 }
    335 #endif
    336 
    337 #endif /* ZYDIS_REGISTER_H */