|
|
1.1 ! root 1: /****************************************************************************** ! 2: * xen-x86_32.h ! 3: * ! 4: * Guest OS interface to x86 32-bit Xen. ! 5: * ! 6: * Permission is hereby granted, free of charge, to any person obtaining a copy ! 7: * of this software and associated documentation files (the "Software"), to ! 8: * deal in the Software without restriction, including without limitation the ! 9: * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or ! 10: * sell copies of the Software, and to permit persons to whom the Software is ! 11: * furnished to do so, subject to the following conditions: ! 12: * ! 13: * The above copyright notice and this permission notice shall be included in ! 14: * all copies or substantial portions of the Software. ! 15: * ! 16: * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR ! 17: * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, ! 18: * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE ! 19: * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER ! 20: * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING ! 21: * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER ! 22: * DEALINGS IN THE SOFTWARE. ! 23: * ! 24: * Copyright (c) 2004-2007, K A Fraser ! 25: */ ! 26: ! 27: #ifndef __XEN_PUBLIC_ARCH_X86_XEN_X86_32_H__ ! 28: #define __XEN_PUBLIC_ARCH_X86_XEN_X86_32_H__ ! 29: ! 30: /* ! 31: * Hypercall interface: ! 32: * Input: %ebx, %ecx, %edx, %esi, %edi (arguments 1-5) ! 33: * Output: %eax ! 34: * Access is via hypercall page (set up by guest loader or via a Xen MSR): ! 35: * call hypercall_page + hypercall-number * 32 ! 36: * Clobbered: Argument registers (e.g., 2-arg hypercall clobbers %ebx,%ecx) ! 37: */ ! 38: ! 39: #if __XEN_INTERFACE_VERSION__ < 0x00030203 ! 40: /* ! 41: * Legacy hypercall interface: ! 42: * As above, except the entry sequence to the hypervisor is: ! 43: * mov $hypercall-number*32,%eax ; int $0x82 ! 44: */ ! 45: #define TRAP_INSTR "int $0x82" ! 46: #endif ! 47: ! 48: /* ! 49: * These flat segments are in the Xen-private section of every GDT. Since these ! 50: * are also present in the initial GDT, many OSes will be able to avoid ! 51: * installing their own GDT. ! 52: */ ! 53: #define FLAT_RING1_CS 0xe019 /* GDT index 259 */ ! 54: #define FLAT_RING1_DS 0xe021 /* GDT index 260 */ ! 55: #define FLAT_RING1_SS 0xe021 /* GDT index 260 */ ! 56: #define FLAT_RING3_CS 0xe02b /* GDT index 261 */ ! 57: #define FLAT_RING3_DS 0xe033 /* GDT index 262 */ ! 58: #define FLAT_RING3_SS 0xe033 /* GDT index 262 */ ! 59: ! 60: #define FLAT_KERNEL_CS FLAT_RING1_CS ! 61: #define FLAT_KERNEL_DS FLAT_RING1_DS ! 62: #define FLAT_KERNEL_SS FLAT_RING1_SS ! 63: #define FLAT_USER_CS FLAT_RING3_CS ! 64: #define FLAT_USER_DS FLAT_RING3_DS ! 65: #define FLAT_USER_SS FLAT_RING3_SS ! 66: ! 67: #define __HYPERVISOR_VIRT_START_PAE 0xF5800000 ! 68: #define __MACH2PHYS_VIRT_START_PAE 0xF5800000 ! 69: #define __MACH2PHYS_VIRT_END_PAE 0xF6800000 ! 70: #define HYPERVISOR_VIRT_START_PAE \ ! 71: mk_unsigned_long(__HYPERVISOR_VIRT_START_PAE) ! 72: #define MACH2PHYS_VIRT_START_PAE \ ! 73: mk_unsigned_long(__MACH2PHYS_VIRT_START_PAE) ! 74: #define MACH2PHYS_VIRT_END_PAE \ ! 75: mk_unsigned_long(__MACH2PHYS_VIRT_END_PAE) ! 76: ! 77: /* Non-PAE bounds are obsolete. */ ! 78: #define __HYPERVISOR_VIRT_START_NONPAE 0xFC000000 ! 79: #define __MACH2PHYS_VIRT_START_NONPAE 0xFC000000 ! 80: #define __MACH2PHYS_VIRT_END_NONPAE 0xFC400000 ! 81: #define HYPERVISOR_VIRT_START_NONPAE \ ! 82: mk_unsigned_long(__HYPERVISOR_VIRT_START_NONPAE) ! 83: #define MACH2PHYS_VIRT_START_NONPAE \ ! 84: mk_unsigned_long(__MACH2PHYS_VIRT_START_NONPAE) ! 85: #define MACH2PHYS_VIRT_END_NONPAE \ ! 86: mk_unsigned_long(__MACH2PHYS_VIRT_END_NONPAE) ! 87: ! 88: #define __HYPERVISOR_VIRT_START __HYPERVISOR_VIRT_START_PAE ! 89: #define __MACH2PHYS_VIRT_START __MACH2PHYS_VIRT_START_PAE ! 90: #define __MACH2PHYS_VIRT_END __MACH2PHYS_VIRT_END_PAE ! 91: ! 92: #ifndef HYPERVISOR_VIRT_START ! 93: #define HYPERVISOR_VIRT_START mk_unsigned_long(__HYPERVISOR_VIRT_START) ! 94: #endif ! 95: ! 96: #define MACH2PHYS_VIRT_START mk_unsigned_long(__MACH2PHYS_VIRT_START) ! 97: #define MACH2PHYS_VIRT_END mk_unsigned_long(__MACH2PHYS_VIRT_END) ! 98: #define MACH2PHYS_NR_ENTRIES ((MACH2PHYS_VIRT_END-MACH2PHYS_VIRT_START)>>2) ! 99: #ifndef machine_to_phys_mapping ! 100: #define machine_to_phys_mapping ((unsigned long *)MACH2PHYS_VIRT_START) ! 101: #endif ! 102: ! 103: /* 32-/64-bit invariability for control interfaces (domctl/sysctl). */ ! 104: #if defined(__XEN__) || defined(__XEN_TOOLS__) ! 105: #undef ___DEFINE_XEN_GUEST_HANDLE ! 106: #define ___DEFINE_XEN_GUEST_HANDLE(name, type) \ ! 107: typedef struct { type *p; } \ ! 108: __guest_handle_ ## name; \ ! 109: typedef struct { union { type *p; uint64_aligned_t q; }; } \ ! 110: __guest_handle_64_ ## name ! 111: #undef set_xen_guest_handle ! 112: #define set_xen_guest_handle(hnd, val) \ ! 113: do { if ( sizeof(hnd) == 8 ) *(uint64_t *)&(hnd) = 0; \ ! 114: (hnd).p = val; \ ! 115: } while ( 0 ) ! 116: #define uint64_aligned_t uint64_t __attribute__((aligned(8))) ! 117: #define __XEN_GUEST_HANDLE_64(name) __guest_handle_64_ ## name ! 118: #define XEN_GUEST_HANDLE_64(name) __XEN_GUEST_HANDLE_64(name) ! 119: #endif ! 120: ! 121: #ifndef __ASSEMBLY__ ! 122: ! 123: struct cpu_user_regs { ! 124: uint32_t ebx; ! 125: uint32_t ecx; ! 126: uint32_t edx; ! 127: uint32_t esi; ! 128: uint32_t edi; ! 129: uint32_t ebp; ! 130: uint32_t eax; ! 131: uint16_t error_code; /* private */ ! 132: uint16_t entry_vector; /* private */ ! 133: uint32_t eip; ! 134: uint16_t cs; ! 135: uint8_t saved_upcall_mask; ! 136: uint8_t _pad0; ! 137: uint32_t eflags; /* eflags.IF == !saved_upcall_mask */ ! 138: uint32_t esp; ! 139: uint16_t ss, _pad1; ! 140: uint16_t es, _pad2; ! 141: uint16_t ds, _pad3; ! 142: uint16_t fs, _pad4; ! 143: uint16_t gs, _pad5; ! 144: }; ! 145: typedef struct cpu_user_regs cpu_user_regs_t; ! 146: DEFINE_XEN_GUEST_HANDLE(cpu_user_regs_t); ! 147: ! 148: /* ! 149: * Page-directory addresses above 4GB do not fit into architectural %cr3. ! 150: * When accessing %cr3, or equivalent field in vcpu_guest_context, guests ! 151: * must use the following accessor macros to pack/unpack valid MFNs. ! 152: */ ! 153: #define xen_pfn_to_cr3(pfn) (((unsigned)(pfn) << 12) | ((unsigned)(pfn) >> 20)) ! 154: #define xen_cr3_to_pfn(cr3) (((unsigned)(cr3) >> 12) | ((unsigned)(cr3) << 20)) ! 155: ! 156: struct arch_vcpu_info { ! 157: unsigned long cr2; ! 158: unsigned long pad[5]; /* sizeof(vcpu_info_t) == 64 */ ! 159: }; ! 160: typedef struct arch_vcpu_info arch_vcpu_info_t; ! 161: ! 162: struct xen_callback { ! 163: unsigned long cs; ! 164: unsigned long eip; ! 165: }; ! 166: typedef struct xen_callback xen_callback_t; ! 167: ! 168: #endif /* !__ASSEMBLY__ */ ! 169: ! 170: #endif /* __XEN_PUBLIC_ARCH_X86_XEN_X86_32_H__ */ ! 171: ! 172: /* ! 173: * Local variables: ! 174: * mode: C ! 175: * c-set-style: "BSD" ! 176: * c-basic-offset: 4 ! 177: * tab-width: 4 ! 178: * indent-tabs-mode: nil ! 179: * End: ! 180: */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.