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@citrix.com>
26   and Ian Campbell <ian.campbell@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
54typedef unsigned long vki_xen_pfn_t;
55typedef unsigned long vki_xen_ulong_t;
56
57#if defined(__i386__)
58struct 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
81struct 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
113struct 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
120struct 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};
150typedef struct vki_xen_vcpu_guest_context vki_xen_vcpu_guest_context_t;
151DEFINE_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
162struct 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
271VKI_DECLARE_HVM_SAVE_TYPE(CPU, 2, struct vki_hvm_hw_cpu);
272
273#endif // __VKI_XEN_H
274
275/*--------------------------------------------------------------------*/
276/*--- end                                                          ---*/
277/*--------------------------------------------------------------------*/
278