qemu

FORK: QEMU emulator
git clone https://git.neptards.moe/neptards/qemu.git
Log | Files | Refs | Submodules | LICENSE

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 */
     21 struct 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 
     51 struct 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
     61 struct 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 
     68 union 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 
     80 typedef union interruptibility_state_t interruptibility_state_t;
     81 
     82 /* Segment descriptor */
     83 struct 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 
    107 typedef struct segment_desc_t segment_desc_t;
    108 
    109 struct 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 */
    224 enum 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  */
    254 struct 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 
    285 struct 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 */
    291 struct 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 */
    299 struct 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 
    306 struct hax_alloc_ram_info {
    307     uint32_t size;
    308     uint32_t pad;
    309     uint64_t va;
    310 } __attribute__ ((__packed__));
    311 
    312 struct 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 */
    320 struct 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 
    339 struct 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 
    354 struct 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