tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

Register.h (11164B)


      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 "zydis/Zycore/Defines.h"
     36 #include "zydis/Zycore/Types.h"
     37 #include "zydis/Zydis/Defines.h"
     38 #include "zydis/Zydis/SharedTypes.h"
     39 #include "zydis/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/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.
    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 */