1436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#ifndef __VKI_XEN_X86_H
2436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define __VKI_XEN_X86_H
3436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
4436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#if defined(__i386__)
5436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define ___DEFINE_VKI_XEN_GUEST_HANDLE(name, type)			\
6436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    typedef struct { type *p; }						\
7436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov        __vki_xen_guest_handle_ ## name;                                \
8436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    typedef struct { union { type *p; vki_xen_uint64_aligned_t q; }; }  \
9436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov        __vki_xen_guest_handle_64_ ## name
10436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define vki_xen_uint64_aligned_t vki_uint64_t __attribute__((aligned(8)))
11436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define __VKI_XEN_GUEST_HANDLE_64(name) __vki_xen_guest_handle_64_ ## name
12436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define VKI_XEN_GUEST_HANDLE_64(name) __VKI_XEN_GUEST_HANDLE_64(name)
13436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#else
14436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define ___DEFINE_VKI_XEN_GUEST_HANDLE(name, type) \
15436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    typedef struct { type *p; } __vki_xen_guest_handle_ ## name
16436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define vki_xen_uint64_aligned_t vki_uint64_t
17436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define __DEFINE_VKI_XEN_GUEST_HANDLE(name, type) \
18436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    ___DEFINE_VKI_XEN_GUEST_HANDLE(name, type);   \
19436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    ___DEFINE_VKI_XEN_GUEST_HANDLE(const_##name, const type)
20436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define DEFINE_VKI_XEN_GUEST_HANDLE(name)   __DEFINE_VKI_XEN_GUEST_HANDLE(name, name)
21436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define VKI_XEN_GUEST_HANDLE_64(name) VKI_XEN_GUEST_HANDLE(name)
22436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#endif
23436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
24436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define __VKI_XEN_GUEST_HANDLE(name)  __vki_xen_guest_handle_ ## name
25436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define VKI_XEN_GUEST_HANDLE(name)    __VKI_XEN_GUEST_HANDLE(name)
26436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
27436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovtypedef unsigned long vki_xen_pfn_t;
28436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovtypedef unsigned long vki_xen_ulong_t;
29436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
30436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#if defined(__i386__)
31436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstruct vki_xen_cpu_user_regs {
32436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    vki_uint32_t ebx;
33436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    vki_uint32_t ecx;
34436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    vki_uint32_t edx;
35436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    vki_uint32_t esi;
36436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    vki_uint32_t edi;
37436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    vki_uint32_t ebp;
38436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    vki_uint32_t eax;
39436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    vki_uint16_t error_code;    /* private */
40436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    vki_uint16_t entry_vector;  /* private */
41436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    vki_uint32_t eip;
42436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    vki_uint16_t cs;
43436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    vki_uint8_t  saved_upcall_mask;
44436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    vki_uint8_t  _pad0;
45436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    vki_uint32_t eflags;        /* eflags.IF == !saved_upcall_mask */
46436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    vki_uint32_t esp;
47436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    vki_uint16_t ss, _pad1;
48436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    vki_uint16_t es, _pad2;
49436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    vki_uint16_t ds, _pad3;
50436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    vki_uint16_t fs, _pad4;
51436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    vki_uint16_t gs, _pad5;
52436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov};
53436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#else
54436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstruct vki_xen_cpu_user_regs {
55436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    vki_uint64_t r15;
56436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    vki_uint64_t r14;
57436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    vki_uint64_t r13;
58436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    vki_uint64_t r12;
59436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    vki_uint64_t rbp;
60436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    vki_uint64_t rbx;
61436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    vki_uint64_t r11;
62436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    vki_uint64_t r10;
63436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    vki_uint64_t r9;
64436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    vki_uint64_t r8;
65436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    vki_uint64_t rax;
66436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    vki_uint64_t rcx;
67436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    vki_uint64_t rdx;
68436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    vki_uint64_t rsi;
69436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    vki_uint64_t rdi;
70436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    vki_uint32_t error_code;    /* private */
71436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    vki_uint32_t entry_vector;  /* private */
72436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    vki_uint64_t rip;
73436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    vki_uint16_t cs, _pad0[1];
74436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    vki_uint8_t  saved_upcall_mask;
75436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    vki_uint8_t  _pad1[3];
76436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    vki_uint64_t rflags;      /* rflags.IF == !saved_upcall_mask */
77436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    vki_uint64_t rsp;
78436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    vki_uint16_t ss, _pad2[3];
79436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    vki_uint16_t es, _pad3[3];
80436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    vki_uint16_t ds, _pad4[3];
81436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    vki_uint16_t fs, _pad5[3]; /* Non-zero => takes precedence over fs_base.     */
82436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    vki_uint16_t gs, _pad6[3]; /* Non-zero => takes precedence over gs_base_usr. */
83436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov};
84436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#endif
85436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
86436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstruct vki_xen_trap_info {
87436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    vki_uint8_t   vector;  /* exception vector                              */
88436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    vki_uint8_t   flags;   /* 0-3: privilege level; 4: clear event enable?  */
89436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    vki_uint16_t  cs;      /* code selector                                 */
90436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    unsigned long address; /* code offset                                   */
91436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov};
92436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
93436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstruct vki_xen_vcpu_guest_context {
94436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    /* FPU registers come first so they can be aligned for FXSAVE/FXRSTOR. */
95436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    struct { char x[512]; } fpu_ctxt;       /* User-level FPU registers     */
96436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    unsigned long flags;                    /* VGCF_* flags                 */
97436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    struct vki_xen_cpu_user_regs user_regs; /* User-level CPU registers     */
98436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    struct vki_xen_trap_info trap_ctxt[256];/* Virtual IDT                  */
99436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    unsigned long ldt_base, ldt_ents;       /* LDT (linear address, # ents) */
100436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    unsigned long gdt_frames[16], gdt_ents; /* GDT (machine frames, # ents) */
101436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    unsigned long kernel_ss, kernel_sp;     /* Virtual TSS (only SS1/SP1)   */
102436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    /* NB. User pagetable on x86/64 is placed in ctrlreg[1]. */
103436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    unsigned long ctrlreg[8];               /* CR0-CR7 (control registers)  */
104436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    unsigned long debugreg[8];              /* DB0-DB7 (debug registers)    */
105436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#ifdef __i386__
106436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    unsigned long event_callback_cs;        /* CS:EIP of event callback     */
107436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    unsigned long event_callback_eip;
108436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    unsigned long failsafe_callback_cs;     /* CS:EIP of failsafe callback  */
109436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    unsigned long failsafe_callback_eip;
110436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#else
111436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    unsigned long event_callback_eip;
112436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    unsigned long failsafe_callback_eip;
113436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    unsigned long syscall_callback_eip;
114436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#endif
115436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    unsigned long vm_assist;                /* VMASST_TYPE_* bitmap */
116436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#ifdef __x86_64__
117436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    /* Segment base addresses. */
118436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    vki_uint64_t  fs_base;
119436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    vki_uint64_t  gs_base_kernel;
120436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    vki_uint64_t  gs_base_user;
121436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#endif
122436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov};
123436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovtypedef struct vki_xen_vcpu_guest_context vki_xen_vcpu_guest_context_t;
124436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovDEFINE_VKI_XEN_GUEST_HANDLE(vki_xen_vcpu_guest_context_t);
125436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
126436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#endif // __VKI_XEN_H
127436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
128436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/*--------------------------------------------------------------------*/
129436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/*--- end                                                          ---*/
130436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/*--------------------------------------------------------------------*/
131