Home | History | Annotate | Download | only in vki
      1 /*
      2    This file is part of Valgrind, a dynamic binary instrumentation
      3    framework.
      4 
      5    Copyright (C) 2012-2015 Citrix
      6 
      7    This program is free software; you can redistribute it and/or
      8    modify it under the terms of the GNU General Public License as
      9    published by the Free Software Foundation; either version 2 of the
     10    License, or (at your option) any later version.
     11 
     12    This program is distributed in the hope that it will be useful, but
     13    WITHOUT ANY WARRANTY; without even the implied warranty of
     14    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
     15    General Public License for more details.
     16 
     17    You should have received a copy of the GNU General Public License
     18    along with this program; if not, write to the Free Software
     19    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
     20    02111-1307, USA.
     21 
     22    The GNU General Public License is contained in the file COPYING.
     23 */
     24 
     25 /* Contributed by Andrew Cooper <andrew.cooper3 (at) citrix.com>
     26    and Ian Campbell <ian.campbell (at) citrix.com> */
     27 
     28 #ifndef __VKI_XEN_X86_H
     29 #define __VKI_XEN_X86_H
     30 
     31 #if defined(__i386__)
     32 #define ___DEFINE_VKI_XEN_GUEST_HANDLE(name, type)			\
     33     typedef struct { type *p; }						\
     34         __vki_xen_guest_handle_ ## name;                                \
     35     typedef struct { union { type *p; vki_xen_uint64_aligned_t q; }; }  \
     36         __vki_xen_guest_handle_64_ ## name
     37 #define vki_xen_uint64_aligned_t vki_uint64_t __attribute__((aligned(8)))
     38 #define __VKI_XEN_GUEST_HANDLE_64(name) __vki_xen_guest_handle_64_ ## name
     39 #define VKI_XEN_GUEST_HANDLE_64(name) __VKI_XEN_GUEST_HANDLE_64(name)
     40 #else
     41 #define ___DEFINE_VKI_XEN_GUEST_HANDLE(name, type) \
     42     typedef struct { type *p; } __vki_xen_guest_handle_ ## name
     43 #define vki_xen_uint64_aligned_t vki_uint64_t
     44 #define __DEFINE_VKI_XEN_GUEST_HANDLE(name, type) \
     45     ___DEFINE_VKI_XEN_GUEST_HANDLE(name, type);   \
     46     ___DEFINE_VKI_XEN_GUEST_HANDLE(const_##name, const type)
     47 #define DEFINE_VKI_XEN_GUEST_HANDLE(name)   __DEFINE_VKI_XEN_GUEST_HANDLE(name, name)
     48 #define VKI_XEN_GUEST_HANDLE_64(name) VKI_XEN_GUEST_HANDLE(name)
     49 #endif
     50 
     51 #define __VKI_XEN_GUEST_HANDLE(name)  __vki_xen_guest_handle_ ## name
     52 #define VKI_XEN_GUEST_HANDLE(name)    __VKI_XEN_GUEST_HANDLE(name)
     53 
     54 typedef unsigned long vki_xen_pfn_t;
     55 typedef unsigned long vki_xen_ulong_t;
     56 
     57 #if defined(__i386__)
     58 struct vki_xen_cpu_user_regs {
     59     vki_uint32_t ebx;
     60     vki_uint32_t ecx;
     61     vki_uint32_t edx;
     62     vki_uint32_t esi;
     63     vki_uint32_t edi;
     64     vki_uint32_t ebp;
     65     vki_uint32_t eax;
     66     vki_uint16_t error_code;    /* private */
     67     vki_uint16_t entry_vector;  /* private */
     68     vki_uint32_t eip;
     69     vki_uint16_t cs;
     70     vki_uint8_t  saved_upcall_mask;
     71     vki_uint8_t  _pad0;
     72     vki_uint32_t eflags;        /* eflags.IF == !saved_upcall_mask */
     73     vki_uint32_t esp;
     74     vki_uint16_t ss, _pad1;
     75     vki_uint16_t es, _pad2;
     76     vki_uint16_t ds, _pad3;
     77     vki_uint16_t fs, _pad4;
     78     vki_uint16_t gs, _pad5;
     79 };
     80 #else
     81 struct vki_xen_cpu_user_regs {
     82     vki_uint64_t r15;
     83     vki_uint64_t r14;
     84     vki_uint64_t r13;
     85     vki_uint64_t r12;
     86     vki_uint64_t rbp;
     87     vki_uint64_t rbx;
     88     vki_uint64_t r11;
     89     vki_uint64_t r10;
     90     vki_uint64_t r9;
     91     vki_uint64_t r8;
     92     vki_uint64_t rax;
     93     vki_uint64_t rcx;
     94     vki_uint64_t rdx;
     95     vki_uint64_t rsi;
     96     vki_uint64_t rdi;
     97     vki_uint32_t error_code;    /* private */
     98     vki_uint32_t entry_vector;  /* private */
     99     vki_uint64_t rip;
    100     vki_uint16_t cs, _pad0[1];
    101     vki_uint8_t  saved_upcall_mask;
    102     vki_uint8_t  _pad1[3];
    103     vki_uint64_t rflags;      /* rflags.IF == !saved_upcall_mask */
    104     vki_uint64_t rsp;
    105     vki_uint16_t ss, _pad2[3];
    106     vki_uint16_t es, _pad3[3];
    107     vki_uint16_t ds, _pad4[3];
    108     vki_uint16_t fs, _pad5[3]; /* Non-zero => takes precedence over fs_base.     */
    109     vki_uint16_t gs, _pad6[3]; /* Non-zero => takes precedence over gs_base_usr. */
    110 };
    111 #endif
    112 
    113 struct vki_xen_trap_info {
    114     vki_uint8_t   vector;  /* exception vector                              */
    115     vki_uint8_t   flags;   /* 0-3: privilege level; 4: clear event enable?  */
    116     vki_uint16_t  cs;      /* code selector                                 */
    117     unsigned long address; /* code offset                                   */
    118 };
    119 
    120 struct vki_xen_vcpu_guest_context {
    121     /* FPU registers come first so they can be aligned for FXSAVE/FXRSTOR. */
    122     struct { char x[512]; } fpu_ctxt;       /* User-level FPU registers     */
    123     unsigned long flags;                    /* VGCF_* flags                 */
    124     struct vki_xen_cpu_user_regs user_regs; /* User-level CPU registers     */
    125     struct vki_xen_trap_info trap_ctxt[256];/* Virtual IDT                  */
    126     unsigned long ldt_base, ldt_ents;       /* LDT (linear address, # ents) */
    127     unsigned long gdt_frames[16], gdt_ents; /* GDT (machine frames, # ents) */
    128     unsigned long kernel_ss, kernel_sp;     /* Virtual TSS (only SS1/SP1)   */
    129     /* NB. User pagetable on x86/64 is placed in ctrlreg[1]. */
    130     unsigned long ctrlreg[8];               /* CR0-CR7 (control registers)  */
    131     unsigned long debugreg[8];              /* DB0-DB7 (debug registers)    */
    132 #ifdef __i386__
    133     unsigned long event_callback_cs;        /* CS:EIP of event callback     */
    134     unsigned long event_callback_eip;
    135     unsigned long failsafe_callback_cs;     /* CS:EIP of failsafe callback  */
    136     unsigned long failsafe_callback_eip;
    137 #else
    138     unsigned long event_callback_eip;
    139     unsigned long failsafe_callback_eip;
    140     unsigned long syscall_callback_eip;
    141 #endif
    142     unsigned long vm_assist;                /* VMASST_TYPE_* bitmap */
    143 #ifdef __x86_64__
    144     /* Segment base addresses. */
    145     vki_uint64_t  fs_base;
    146     vki_uint64_t  gs_base_kernel;
    147     vki_uint64_t  gs_base_user;
    148 #endif
    149 };
    150 typedef struct vki_xen_vcpu_guest_context vki_xen_vcpu_guest_context_t;
    151 DEFINE_VKI_XEN_GUEST_HANDLE(vki_xen_vcpu_guest_context_t);
    152 
    153 
    154 /* HVM_SAVE types and declarations for getcontext_partial */
    155 # define VKI_DECLARE_HVM_SAVE_TYPE(_x, _code, _type)                         \
    156     struct __VKI_HVM_SAVE_TYPE_##_x { _type t; char c[_code]; char cpt[1];}
    157 
    158 #define VKI_HVM_SAVE_TYPE(_x) typeof (((struct __VKI_HVM_SAVE_TYPE_##_x *)(0))->t)
    159 #define VKI_HVM_SAVE_LENGTH(_x) (sizeof (VKI_HVM_SAVE_TYPE(_x)))
    160 #define VKI_HVM_SAVE_CODE(_x) (sizeof (((struct __VKI_HVM_SAVE_TYPE_##_x *)(0))->c))
    161 
    162 struct vki_hvm_hw_cpu {
    163    vki_uint8_t  fpu_regs[512];
    164 
    165    vki_uint64_t rax;
    166    vki_uint64_t rbx;
    167    vki_uint64_t rcx;
    168    vki_uint64_t rdx;
    169    vki_uint64_t rbp;
    170    vki_uint64_t rsi;
    171    vki_uint64_t rdi;
    172    vki_uint64_t rsp;
    173    vki_uint64_t r8;
    174    vki_uint64_t r9;
    175    vki_uint64_t r10;
    176    vki_uint64_t r11;
    177    vki_uint64_t r12;
    178    vki_uint64_t r13;
    179    vki_uint64_t r14;
    180    vki_uint64_t r15;
    181 
    182    vki_uint64_t rip;
    183    vki_uint64_t rflags;
    184 
    185    vki_uint64_t cr0;
    186    vki_uint64_t cr2;
    187    vki_uint64_t cr3;
    188    vki_uint64_t cr4;
    189 
    190    vki_uint64_t dr0;
    191    vki_uint64_t dr1;
    192    vki_uint64_t dr2;
    193    vki_uint64_t dr3;
    194    vki_uint64_t dr6;
    195    vki_uint64_t dr7;
    196 
    197    vki_uint32_t cs_sel;
    198    vki_uint32_t ds_sel;
    199    vki_uint32_t es_sel;
    200    vki_uint32_t fs_sel;
    201    vki_uint32_t gs_sel;
    202    vki_uint32_t ss_sel;
    203    vki_uint32_t tr_sel;
    204    vki_uint32_t ldtr_sel;
    205 
    206    vki_uint32_t cs_limit;
    207    vki_uint32_t ds_limit;
    208    vki_uint32_t es_limit;
    209    vki_uint32_t fs_limit;
    210    vki_uint32_t gs_limit;
    211    vki_uint32_t ss_limit;
    212    vki_uint32_t tr_limit;
    213    vki_uint32_t ldtr_limit;
    214    vki_uint32_t idtr_limit;
    215    vki_uint32_t gdtr_limit;
    216 
    217    vki_uint64_t cs_base;
    218    vki_uint64_t ds_base;
    219    vki_uint64_t es_base;
    220    vki_uint64_t fs_base;
    221    vki_uint64_t gs_base;
    222    vki_uint64_t ss_base;
    223    vki_uint64_t tr_base;
    224    vki_uint64_t ldtr_base;
    225    vki_uint64_t idtr_base;
    226    vki_uint64_t gdtr_base;
    227 
    228    vki_uint32_t cs_arbytes;
    229    vki_uint32_t ds_arbytes;
    230    vki_uint32_t es_arbytes;
    231    vki_uint32_t fs_arbytes;
    232    vki_uint32_t gs_arbytes;
    233    vki_uint32_t ss_arbytes;
    234    vki_uint32_t tr_arbytes;
    235    vki_uint32_t ldtr_arbytes;
    236 
    237    vki_uint64_t sysenter_cs;
    238    vki_uint64_t sysenter_esp;
    239    vki_uint64_t sysenter_eip;
    240 
    241     /* msr for em64t */
    242    vki_uint64_t shadow_gs;
    243 
    244     /* msr content saved/restored. */
    245    vki_uint64_t msr_flags;
    246    vki_uint64_t msr_lstar;
    247    vki_uint64_t msr_star;
    248    vki_uint64_t msr_cstar;
    249    vki_uint64_t msr_syscall_mask;
    250    vki_uint64_t msr_efer;
    251    vki_uint64_t msr_tsc_aux;
    252 
    253     /* guest's idea of what rdtsc() would return */
    254    vki_uint64_t tsc;
    255 
    256     /* pending event, if any */
    257     union {
    258        vki_uint32_t pending_event;
    259         struct {
    260            vki_uint8_t  pending_vector:8;
    261            vki_uint8_t  pending_type:3;
    262            vki_uint8_t  pending_error_valid:1;
    263            vki_uint32_t pending_reserved:19;
    264            vki_uint8_t  pending_valid:1;
    265         };
    266     };
    267     /* error code for pending event */
    268    vki_uint32_t error_code;
    269 };
    270 
    271 VKI_DECLARE_HVM_SAVE_TYPE(CPU, 2, struct vki_hvm_hw_cpu);
    272 
    273 #endif // __VKI_XEN_H
    274 
    275 /*--------------------------------------------------------------------*/
    276 /*--- end                                                          ---*/
    277 /*--------------------------------------------------------------------*/
    278