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