cachepc-qemu

Fork of AMDESE/qemu with changes for cachepc side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-qemu
Log | Files | Refs | Submodules | LICENSE | sfeed.txt

hax-interface.h (8766B)


      1/*
      2 * QEMU HAXM support
      3 *
      4 * Copyright (c) 2011 Intel Corporation
      5 *  Written by:
      6 *  Jiang Yunhong<yunhong.jiang@intel.com>
      7 *  Xin Xiaohui<xiaohui.xin@intel.com>
      8 *  Zhang Xiantao<xiantao.zhang@intel.com>
      9 *
     10 * This work is licensed under the terms of the GNU GPL, version 2 or later.
     11 * See the COPYING file in the top-level directory.
     12 *
     13 */
     14
     15/* Interface with HAX kernel module */
     16
     17#ifndef HAX_INTERFACE_H
     18#define HAX_INTERFACE_H
     19
     20/* fx_layout has 3 formats table 3-56, 512bytes */
     21struct fx_layout {
     22    uint16_t fcw;
     23    uint16_t fsw;
     24    uint8_t ftw;
     25    uint8_t res1;
     26    uint16_t fop;
     27    union {
     28        struct {
     29            uint32_t fip;
     30            uint16_t fcs;
     31            uint16_t res2;
     32        };
     33        uint64_t fpu_ip;
     34    };
     35    union {
     36        struct {
     37            uint32_t fdp;
     38            uint16_t fds;
     39            uint16_t res3;
     40        };
     41        uint64_t fpu_dp;
     42    };
     43    uint32_t mxcsr;
     44    uint32_t mxcsr_mask;
     45    uint8_t st_mm[8][16];
     46    uint8_t mmx_1[8][16];
     47    uint8_t mmx_2[8][16];
     48    uint8_t pad[96];
     49} __attribute__ ((aligned(8)));
     50
     51struct vmx_msr {
     52    uint64_t entry;
     53    uint64_t value;
     54} __attribute__ ((__packed__));
     55
     56/*
     57 * Fixed array is not good, but it makes Mac support a bit easier by avoiding
     58 * memory map or copyin staff.
     59 */
     60#define HAX_MAX_MSR_ARRAY 0x20
     61struct hax_msr_data {
     62    uint16_t nr_msr;
     63    uint16_t done;
     64    uint16_t pad[2];
     65    struct vmx_msr entries[HAX_MAX_MSR_ARRAY];
     66} __attribute__ ((__packed__));
     67
     68union interruptibility_state_t {
     69    uint32_t raw;
     70    struct {
     71        uint32_t sti_blocking:1;
     72        uint32_t movss_blocking:1;
     73        uint32_t smi_blocking:1;
     74        uint32_t nmi_blocking:1;
     75        uint32_t reserved:28;
     76    };
     77    uint64_t pad;
     78};
     79
     80typedef union interruptibility_state_t interruptibility_state_t;
     81
     82/* Segment descriptor */
     83struct segment_desc_t {
     84    uint16_t selector;
     85    uint16_t _dummy;
     86    uint32_t limit;
     87    uint64_t base;
     88    union {
     89        struct {
     90            uint32_t type:4;
     91            uint32_t desc:1;
     92            uint32_t dpl:2;
     93            uint32_t present:1;
     94            uint32_t:4;
     95            uint32_t available:1;
     96            uint32_t long_mode:1;
     97            uint32_t operand_size:1;
     98            uint32_t granularity:1;
     99            uint32_t null:1;
    100            uint32_t:15;
    101        };
    102        uint32_t ar;
    103    };
    104    uint32_t ipad;
    105};
    106
    107typedef struct segment_desc_t segment_desc_t;
    108
    109struct vcpu_state_t {
    110    union {
    111        uint64_t _regs[16];
    112        struct {
    113            union {
    114                struct {
    115                    uint8_t _al, _ah;
    116                };
    117                uint16_t _ax;
    118                uint32_t _eax;
    119                uint64_t _rax;
    120            };
    121            union {
    122                struct {
    123                    uint8_t _cl, _ch;
    124                };
    125                uint16_t _cx;
    126                uint32_t _ecx;
    127                uint64_t _rcx;
    128            };
    129            union {
    130                struct {
    131                    uint8_t _dl, _dh;
    132                };
    133                uint16_t _dx;
    134                uint32_t _edx;
    135                uint64_t _rdx;
    136            };
    137            union {
    138                struct {
    139                    uint8_t _bl, _bh;
    140                };
    141                uint16_t _bx;
    142                uint32_t _ebx;
    143                uint64_t _rbx;
    144            };
    145            union {
    146                uint16_t _sp;
    147                uint32_t _esp;
    148                uint64_t _rsp;
    149            };
    150            union {
    151                uint16_t _bp;
    152                uint32_t _ebp;
    153                uint64_t _rbp;
    154            };
    155            union {
    156                uint16_t _si;
    157                uint32_t _esi;
    158                uint64_t _rsi;
    159            };
    160            union {
    161                uint16_t _di;
    162                uint32_t _edi;
    163                uint64_t _rdi;
    164            };
    165
    166            uint64_t _r8;
    167            uint64_t _r9;
    168            uint64_t _r10;
    169            uint64_t _r11;
    170            uint64_t _r12;
    171            uint64_t _r13;
    172            uint64_t _r14;
    173            uint64_t _r15;
    174        };
    175    };
    176
    177    union {
    178        uint32_t _eip;
    179        uint64_t _rip;
    180    };
    181
    182    union {
    183        uint32_t _eflags;
    184        uint64_t _rflags;
    185    };
    186
    187    segment_desc_t _cs;
    188    segment_desc_t _ss;
    189    segment_desc_t _ds;
    190    segment_desc_t _es;
    191    segment_desc_t _fs;
    192    segment_desc_t _gs;
    193    segment_desc_t _ldt;
    194    segment_desc_t _tr;
    195
    196    segment_desc_t _gdt;
    197    segment_desc_t _idt;
    198
    199    uint64_t _cr0;
    200    uint64_t _cr2;
    201    uint64_t _cr3;
    202    uint64_t _cr4;
    203
    204    uint64_t _dr0;
    205    uint64_t _dr1;
    206    uint64_t _dr2;
    207    uint64_t _dr3;
    208    uint64_t _dr6;
    209    uint64_t _dr7;
    210    uint64_t _pde;
    211
    212    uint32_t _efer;
    213
    214    uint32_t _sysenter_cs;
    215    uint64_t _sysenter_eip;
    216    uint64_t _sysenter_esp;
    217
    218    uint32_t _activity_state;
    219    uint32_t pad;
    220    interruptibility_state_t _interruptibility_state;
    221};
    222
    223/* HAX exit status */
    224enum exit_status {
    225    /* IO port request */
    226    HAX_EXIT_IO = 1,
    227    /* MMIO instruction emulation */
    228    HAX_EXIT_MMIO,
    229    /* QEMU emulation mode request, currently means guest enter non-PG mode */
    230    HAX_EXIT_REAL,
    231    /*
    232     * Interrupt window open, qemu can inject interrupt now
    233     * Also used when signal pending since at that time qemu usually need
    234     * check interrupt
    235     */
    236    HAX_EXIT_INTERRUPT,
    237    /* Unknown vmexit, mostly trigger reboot */
    238    HAX_EXIT_UNKNOWN_VMEXIT,
    239    /* HALT from guest */
    240    HAX_EXIT_HLT,
    241    /* Reboot request, like because of tripple fault in guest */
    242    HAX_EXIT_STATECHANGE,
    243    /* the vcpu is now only paused when destroy, so simply return to hax */
    244    HAX_EXIT_PAUSED,
    245    HAX_EXIT_FAST_MMIO,
    246};
    247
    248/*
    249 * The interface definition:
    250 * 1. vcpu_run execute will return 0 on success, otherwise mean failed
    251 * 2. exit_status return the exit reason, as stated in enum exit_status
    252 * 3. exit_reason is the vmx exit reason
    253 */
    254struct hax_tunnel {
    255    uint32_t _exit_reason;
    256    uint32_t _exit_flag;
    257    uint32_t _exit_status;
    258    uint32_t user_event_pending;
    259    int ready_for_interrupt_injection;
    260    int request_interrupt_window;
    261    union {
    262        struct {
    263            /* 0: read, 1: write */
    264#define HAX_EXIT_IO_IN  1
    265#define HAX_EXIT_IO_OUT 0
    266            uint8_t _direction;
    267            uint8_t _df;
    268            uint16_t _size;
    269            uint16_t _port;
    270            uint16_t _count;
    271            uint8_t _flags;
    272            uint8_t _pad0;
    273            uint16_t _pad1;
    274            uint32_t _pad2;
    275            uint64_t _vaddr;
    276        } pio;
    277        struct {
    278            uint64_t gla;
    279        } mmio;
    280        struct {
    281        } state;
    282    };
    283} __attribute__ ((__packed__));
    284
    285struct hax_module_version {
    286    uint32_t compat_version;
    287    uint32_t cur_version;
    288} __attribute__ ((__packed__));
    289
    290/* This interface is support only after API version 2 */
    291struct hax_qemu_version {
    292    /* Current API version in QEMU */
    293    uint32_t cur_version;
    294    /* The minimum API version supported by QEMU */
    295    uint32_t min_version;
    296} __attribute__ ((__packed__));
    297
    298/* The mac specfic interface to qemu, mostly is ioctl related */
    299struct hax_tunnel_info {
    300    uint64_t va;
    301    uint64_t io_va;
    302    uint16_t size;
    303    uint16_t pad[3];
    304} __attribute__ ((__packed__));
    305
    306struct hax_alloc_ram_info {
    307    uint32_t size;
    308    uint32_t pad;
    309    uint64_t va;
    310} __attribute__ ((__packed__));
    311
    312struct hax_ramblock_info {
    313    uint64_t start_va;
    314    uint64_t size;
    315    uint64_t reserved;
    316} __attribute__ ((__packed__));
    317
    318#define HAX_RAM_INFO_ROM     0x01 /* Read-Only */
    319#define HAX_RAM_INFO_INVALID 0x80 /* Unmapped, usually used for MMIO */
    320struct hax_set_ram_info {
    321    uint64_t pa_start;
    322    uint32_t size;
    323    uint8_t flags;
    324    uint8_t pad[3];
    325    uint64_t va;
    326} __attribute__ ((__packed__));
    327
    328#define HAX_CAP_STATUS_WORKING     0x1
    329#define HAX_CAP_STATUS_NOTWORKING  0x0
    330#define HAX_CAP_WORKSTATUS_MASK    0x1
    331
    332#define HAX_CAP_FAILREASON_VT      0x1
    333#define HAX_CAP_FAILREASON_NX      0x2
    334
    335#define HAX_CAP_MEMQUOTA           0x2
    336#define HAX_CAP_UG                 0x4
    337#define HAX_CAP_64BIT_RAMBLOCK     0x8
    338
    339struct hax_capabilityinfo {
    340    /* bit 0: 1 - working
    341     *        0 - not working, possibly because NT/NX disabled
    342     * bit 1: 1 - memory limitation working
    343     *        0 - no memory limitation
    344     */
    345    uint16_t wstatus;
    346    /* valid when not working
    347     * bit 0: VT not enabeld
    348     * bit 1: NX not enabled*/
    349    uint16_t winfo;
    350    uint32_t pad;
    351    uint64_t mem_quota;
    352} __attribute__ ((__packed__));
    353
    354struct hax_fastmmio {
    355    uint64_t gpa;
    356    union {
    357        uint64_t value;
    358        uint64_t gpa2;  /* since HAX API v4 */
    359    };
    360    uint8_t size;
    361    uint8_t direction;
    362    uint16_t reg_index;
    363    uint32_t pad0;
    364    uint64_t _cr0;
    365    uint64_t _cr2;
    366    uint64_t _cr3;
    367    uint64_t _cr4;
    368} __attribute__ ((__packed__));
    369#endif