|
|
1.1 root 1: /******************************************************************************
2: * xen-x86_64.h
3: *
4: * Guest OS interface to x86 64-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-2006, K A Fraser
25: */
26:
27: #ifndef __XEN_PUBLIC_ARCH_X86_XEN_X86_64_H__
28: #define __XEN_PUBLIC_ARCH_X86_XEN_X86_64_H__
29:
30: /*
31: * Hypercall interface:
32: * Input: %rdi, %rsi, %rdx, %r10, %r8 (arguments 1-5)
33: * Output: %rax
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 %rdi,%rsi)
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 ; syscall
44: * Clobbered: %rcx, %r11, argument registers (as above)
45: */
46: #define TRAP_INSTR "syscall"
47: #endif
48:
49: /*
50: * 64-bit segment selectors
51: * These flat segments are in the Xen-private section of every GDT. Since these
52: * are also present in the initial GDT, many OSes will be able to avoid
53: * installing their own GDT.
54: */
55:
56: #define FLAT_RING3_CS32 0xe023 /* GDT index 260 */
57: #define FLAT_RING3_CS64 0xe033 /* GDT index 261 */
58: #define FLAT_RING3_DS32 0xe02b /* GDT index 262 */
59: #define FLAT_RING3_DS64 0x0000 /* NULL selector */
60: #define FLAT_RING3_SS32 0xe02b /* GDT index 262 */
61: #define FLAT_RING3_SS64 0xe02b /* GDT index 262 */
62:
63: #define FLAT_KERNEL_DS64 FLAT_RING3_DS64
64: #define FLAT_KERNEL_DS32 FLAT_RING3_DS32
65: #define FLAT_KERNEL_DS FLAT_KERNEL_DS64
66: #define FLAT_KERNEL_CS64 FLAT_RING3_CS64
67: #define FLAT_KERNEL_CS32 FLAT_RING3_CS32
68: #define FLAT_KERNEL_CS FLAT_KERNEL_CS64
69: #define FLAT_KERNEL_SS64 FLAT_RING3_SS64
70: #define FLAT_KERNEL_SS32 FLAT_RING3_SS32
71: #define FLAT_KERNEL_SS FLAT_KERNEL_SS64
72:
73: #define FLAT_USER_DS64 FLAT_RING3_DS64
74: #define FLAT_USER_DS32 FLAT_RING3_DS32
75: #define FLAT_USER_DS FLAT_USER_DS64
76: #define FLAT_USER_CS64 FLAT_RING3_CS64
77: #define FLAT_USER_CS32 FLAT_RING3_CS32
78: #define FLAT_USER_CS FLAT_USER_CS64
79: #define FLAT_USER_SS64 FLAT_RING3_SS64
80: #define FLAT_USER_SS32 FLAT_RING3_SS32
81: #define FLAT_USER_SS FLAT_USER_SS64
82:
83: #define __HYPERVISOR_VIRT_START 0xFFFF800000000000
84: #define __HYPERVISOR_VIRT_END 0xFFFF880000000000
85: #define __MACH2PHYS_VIRT_START 0xFFFF800000000000
86: #define __MACH2PHYS_VIRT_END 0xFFFF804000000000
87:
88: #ifndef HYPERVISOR_VIRT_START
89: #define HYPERVISOR_VIRT_START mk_unsigned_long(__HYPERVISOR_VIRT_START)
90: #define HYPERVISOR_VIRT_END mk_unsigned_long(__HYPERVISOR_VIRT_END)
91: #endif
92:
93: #define MACH2PHYS_VIRT_START mk_unsigned_long(__MACH2PHYS_VIRT_START)
94: #define MACH2PHYS_VIRT_END mk_unsigned_long(__MACH2PHYS_VIRT_END)
95: #define MACH2PHYS_NR_ENTRIES ((MACH2PHYS_VIRT_END-MACH2PHYS_VIRT_START)>>3)
96: #ifndef machine_to_phys_mapping
97: #define machine_to_phys_mapping ((unsigned long *)HYPERVISOR_VIRT_START)
98: #endif
99:
100: /*
101: * int HYPERVISOR_set_segment_base(unsigned int which, unsigned long base)
102: * @which == SEGBASE_* ; @base == 64-bit base address
103: * Returns 0 on success.
104: */
105: #define SEGBASE_FS 0
106: #define SEGBASE_GS_USER 1
107: #define SEGBASE_GS_KERNEL 2
108: #define SEGBASE_GS_USER_SEL 3 /* Set user %gs specified in base[15:0] */
109:
110: /*
111: * int HYPERVISOR_iret(void)
112: * All arguments are on the kernel stack, in the following format.
113: * Never returns if successful. Current kernel context is lost.
114: * The saved CS is mapped as follows:
115: * RING0 -> RING3 kernel mode.
116: * RING1 -> RING3 kernel mode.
117: * RING2 -> RING3 kernel mode.
118: * RING3 -> RING3 user mode.
119: * However RING0 indicates that the guest kernel should return to iteself
120: * directly with
121: * orb $3,1*8(%rsp)
122: * iretq
123: * If flags contains VGCF_in_syscall:
124: * Restore RAX, RIP, RFLAGS, RSP.
125: * Discard R11, RCX, CS, SS.
126: * Otherwise:
127: * Restore RAX, R11, RCX, CS:RIP, RFLAGS, SS:RSP.
128: * All other registers are saved on hypercall entry and restored to user.
129: */
130: /* Guest exited in SYSCALL context? Return to guest with SYSRET? */
131: #define _VGCF_in_syscall 8
132: #define VGCF_in_syscall (1<<_VGCF_in_syscall)
133: #define VGCF_IN_SYSCALL VGCF_in_syscall
134:
135: #ifndef __ASSEMBLY__
136:
137: struct iret_context {
138: /* Top of stack (%rsp at point of hypercall). */
139: uint64_t rax, r11, rcx, flags, rip, cs, rflags, rsp, ss;
140: /* Bottom of iret stack frame. */
141: };
142:
143: #if defined(__GNUC__) && !defined(__STRICT_ANSI__)
144: /* Anonymous union includes both 32- and 64-bit names (e.g., eax/rax). */
145: #define __DECL_REG(name) union { \
146: uint64_t r ## name, e ## name; \
147: uint32_t _e ## name; \
148: }
149: #else
150: /* Non-gcc sources must always use the proper 64-bit name (e.g., rax). */
151: #define __DECL_REG(name) uint64_t r ## name
152: #endif
153:
154: struct cpu_user_regs {
155: uint64_t r15;
156: uint64_t r14;
157: uint64_t r13;
158: uint64_t r12;
159: __DECL_REG(bp);
160: __DECL_REG(bx);
161: uint64_t r11;
162: uint64_t r10;
163: uint64_t r9;
164: uint64_t r8;
165: __DECL_REG(ax);
166: __DECL_REG(cx);
167: __DECL_REG(dx);
168: __DECL_REG(si);
169: __DECL_REG(di);
170: uint32_t error_code; /* private */
171: uint32_t entry_vector; /* private */
172: __DECL_REG(ip);
173: uint16_t cs, _pad0[1];
174: uint8_t saved_upcall_mask;
175: uint8_t _pad1[3];
176: __DECL_REG(flags); /* rflags.IF == !saved_upcall_mask */
177: __DECL_REG(sp);
178: uint16_t ss, _pad2[3];
179: uint16_t es, _pad3[3];
180: uint16_t ds, _pad4[3];
181: uint16_t fs, _pad5[3]; /* Non-zero => takes precedence over fs_base. */
182: uint16_t gs, _pad6[3]; /* Non-zero => takes precedence over gs_base_usr. */
183: };
184: typedef struct cpu_user_regs cpu_user_regs_t;
185: DEFINE_XEN_GUEST_HANDLE(cpu_user_regs_t);
186:
187: #undef __DECL_REG
188:
189: #define xen_pfn_to_cr3(pfn) ((unsigned long)(pfn) << 12)
190: #define xen_cr3_to_pfn(cr3) ((unsigned long)(cr3) >> 12)
191:
192: struct arch_vcpu_info {
193: unsigned long cr2;
194: unsigned long pad; /* sizeof(vcpu_info_t) == 64 */
195: };
196: typedef struct arch_vcpu_info arch_vcpu_info_t;
197:
198: typedef unsigned long xen_callback_t;
199:
200: #endif /* !__ASSEMBLY__ */
201:
202: #endif /* __XEN_PUBLIC_ARCH_X86_XEN_X86_64_H__ */
203:
204: /*
205: * Local variables:
206: * mode: C
207: * c-set-style: "BSD"
208: * c-basic-offset: 4
209: * tab-width: 4
210: * indent-tabs-mode: nil
211: * End:
212: */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.