--- /dev/null
+#!python -u\r
+\r
+import os, sys\r
+import shutil\r
+import subprocess\r
+import re\r
+\r
+def shell(command):\r
+ print(command)\r
+ sys.stdout.flush()\r
+\r
+ pipe = os.popen(' '.join(command), 'r', 1)\r
+\r
+ for line in pipe:\r
+ print(line.rstrip())\r
+\r
+ return pipe.close()\r
+\r
+def get_repo(url):\r
+ shell(['rm', '-rf', 'working'])\r
+ shell(['git', 'clone', '--no-checkout', url, 'working'])\r
+\r
+def get_branch(tag):\r
+ cwd = os.getcwd()\r
+ os.chdir('working')\r
+ shell(['git', 'checkout', '-b', tag])\r
+ os.chdir(cwd)\r
+\r
+def copy_file(src_dir, dst_dir, name):\r
+ try:\r
+ os.makedirs('include\\xen\\%s' % dst_dir)\r
+ except OSError:\r
+ None\r
+\r
+ src = open('working\\xen\\include\\%s\\%s' % (src_dir, name), 'r')\r
+ dst = open('include\\xen\\%s\\%s' % (dst_dir, name), 'w')\r
+\r
+ print(name)\r
+\r
+ for line in src:\r
+ line = re.sub(' unsigned long', ' ULONG_PTR', line)\r
+ line = re.sub('\(unsigned long', '(ULONG_PTR', line)\r
+ line = re.sub(' long', ' LONG_PTR', line)\r
+ line = re.sub('\(long', '(LONG_PTR', line)\r
+ dst.write(line)\r
+\r
+ dst.close()\r
+ src.close()\r
+\r
+if __name__ == '__main__':\r
+ get_repo('git://xenbits.xen.org/xen.git')\r
+ get_branch(sys.argv[1])\r
+\r
+ copy_file('public', '.', 'xen.h')\r
+\r
+ copy_file('public', '.', 'xen-compat.h')\r
+ copy_file('public', '.', 'trace.h')\r
+ copy_file('public', '.', 'memory.h')\r
+ copy_file('public', '.', 'sched.h')\r
+ copy_file('public', '.', 'event_channel.h')\r
+ copy_file('public', '.', 'grant_table.h')\r
+\r
+ copy_file('xen', '.', 'errno.h')\r
+\r
+ copy_file('public\\arch-x86', 'arch-x86', 'xen.h')\r
+ copy_file('public\\arch-x86', 'arch-x86', 'xen-x86_32.h')\r
+ copy_file('public\\arch-x86', 'arch-x86', 'xen-x86_64.h')\r
+\r
+ copy_file('public\\hvm', 'hvm', 'hvm_op.h')\r
+ copy_file('public\\hvm', 'hvm', 'params.h')\r
+\r
+ copy_file('public\\io', 'io', 'xs_wire.h')\r
-/******************************************************************************
- * xen-x86_32.h
- *
- * Guest OS interface to x86 32-bit Xen.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to
- * deal in the Software without restriction, including without limitation the
- * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
- * sell copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- *
- * Copyright (c) 2004-2007, K A Fraser
- */
-
-#ifndef __XEN_PUBLIC_ARCH_X86_XEN_X86_32_H__
-#define __XEN_PUBLIC_ARCH_X86_XEN_X86_32_H__
-
-/*
- * Hypercall interface:
- * Input: %ebx, %ecx, %edx, %esi, %edi (arguments 1-5)
- * Output: %eax
- * Access is via hypercall page (set up by guest loader or via a Xen MSR):
- * call hypercall_page + hypercall-number * 32
- * Clobbered: Argument registers (e.g., 2-arg hypercall clobbers %ebx,%ecx)
- */
-
-#if __XEN_INTERFACE_VERSION__ < 0x00030203
-/*
- * Legacy hypercall interface:
- * As above, except the entry sequence to the hypervisor is:
- * mov $hypercall-number*32,%eax ; int $0x82
- */
-#define TRAP_INSTR "int $0x82"
-#endif
-
-/*
- * These flat segments are in the Xen-private section of every GDT. Since these
- * are also present in the initial GDT, many OSes will be able to avoid
- * installing their own GDT.
- */
-#define FLAT_RING1_CS 0xe019 /* GDT index 259 */
-#define FLAT_RING1_DS 0xe021 /* GDT index 260 */
-#define FLAT_RING1_SS 0xe021 /* GDT index 260 */
-#define FLAT_RING3_CS 0xe02b /* GDT index 261 */
-#define FLAT_RING3_DS 0xe033 /* GDT index 262 */
-#define FLAT_RING3_SS 0xe033 /* GDT index 262 */
-
-#define FLAT_KERNEL_CS FLAT_RING1_CS
-#define FLAT_KERNEL_DS FLAT_RING1_DS
-#define FLAT_KERNEL_SS FLAT_RING1_SS
-#define FLAT_USER_CS FLAT_RING3_CS
-#define FLAT_USER_DS FLAT_RING3_DS
-#define FLAT_USER_SS FLAT_RING3_SS
-
-#define __HYPERVISOR_VIRT_START_PAE 0xF5800000
-#define __MACH2PHYS_VIRT_START_PAE 0xF5800000
-#define __MACH2PHYS_VIRT_END_PAE 0xF6800000
-#define HYPERVISOR_VIRT_START_PAE \
- mk_unsigned_long(__HYPERVISOR_VIRT_START_PAE)
-#define MACH2PHYS_VIRT_START_PAE \
- mk_unsigned_long(__MACH2PHYS_VIRT_START_PAE)
-#define MACH2PHYS_VIRT_END_PAE \
- mk_unsigned_long(__MACH2PHYS_VIRT_END_PAE)
-
-/* Non-PAE bounds are obsolete. */
-#define __HYPERVISOR_VIRT_START_NONPAE 0xFC000000
-#define __MACH2PHYS_VIRT_START_NONPAE 0xFC000000
-#define __MACH2PHYS_VIRT_END_NONPAE 0xFC400000
-#define HYPERVISOR_VIRT_START_NONPAE \
- mk_unsigned_long(__HYPERVISOR_VIRT_START_NONPAE)
-#define MACH2PHYS_VIRT_START_NONPAE \
- mk_unsigned_long(__MACH2PHYS_VIRT_START_NONPAE)
-#define MACH2PHYS_VIRT_END_NONPAE \
- mk_unsigned_long(__MACH2PHYS_VIRT_END_NONPAE)
-
-#define __HYPERVISOR_VIRT_START __HYPERVISOR_VIRT_START_PAE
-#define __MACH2PHYS_VIRT_START __MACH2PHYS_VIRT_START_PAE
-#define __MACH2PHYS_VIRT_END __MACH2PHYS_VIRT_END_PAE
-
-#ifndef HYPERVISOR_VIRT_START
-#define HYPERVISOR_VIRT_START mk_unsigned_long(__HYPERVISOR_VIRT_START)
-#endif
-
-#define MACH2PHYS_VIRT_START mk_unsigned_long(__MACH2PHYS_VIRT_START)
-#define MACH2PHYS_VIRT_END mk_unsigned_long(__MACH2PHYS_VIRT_END)
-#define MACH2PHYS_NR_ENTRIES ((MACH2PHYS_VIRT_END-MACH2PHYS_VIRT_START)>>2)
-#ifndef machine_to_phys_mapping
-#define machine_to_phys_mapping ((ULONG_PTR *)MACH2PHYS_VIRT_START)
-#endif
-
-/* 32-/64-bit invariability for control interfaces (domctl/sysctl). */
-#if defined(__XEN__) || defined(__XEN_TOOLS__)
-#undef ___DEFINE_XEN_GUEST_HANDLE
-#define ___DEFINE_XEN_GUEST_HANDLE(name, type) \
- typedef struct { type *p; } \
- __guest_handle_ ## name; \
- typedef struct { union { type *p; uint64_aligned_t q; }; } \
- __guest_handle_64_ ## name
-#undef set_xen_guest_handle_raw
-#define set_xen_guest_handle_raw(hnd, val) \
- do { if ( sizeof(hnd) == 8 ) *(uint64_t *)&(hnd) = 0; \
- (hnd).p = val; \
- } while ( 0 )
-#define uint64_aligned_t uint64_t __attribute__((aligned(8)))
-#define __XEN_GUEST_HANDLE_64(name) __guest_handle_64_ ## name
-#define XEN_GUEST_HANDLE_64(name) __XEN_GUEST_HANDLE_64(name)
-#endif
-
-#ifndef __ASSEMBLY__
-
-struct cpu_user_regs {
- uint32_t ebx;
- uint32_t ecx;
- uint32_t edx;
- uint32_t esi;
- uint32_t edi;
- uint32_t ebp;
- uint32_t eax;
- uint16_t error_code; /* private */
- uint16_t entry_vector; /* private */
- uint32_t eip;
- uint16_t cs;
- uint8_t saved_upcall_mask;
- uint8_t _pad0;
- uint32_t eflags; /* eflags.IF == !saved_upcall_mask */
- uint32_t esp;
- uint16_t ss, _pad1;
- uint16_t es, _pad2;
- uint16_t ds, _pad3;
- uint16_t fs, _pad4;
- uint16_t gs, _pad5;
-};
-typedef struct cpu_user_regs cpu_user_regs_t;
-DEFINE_XEN_GUEST_HANDLE(cpu_user_regs_t);
-
-/*
- * Page-directory addresses above 4GB do not fit into architectural %cr3.
- * When accessing %cr3, or equivalent field in vcpu_guest_context, guests
- * must use the following accessor macros to pack/unpack valid MFNs.
- */
-#define xen_pfn_to_cr3(pfn) (((unsigned)(pfn) << 12) | ((unsigned)(pfn) >> 20))
-#define xen_cr3_to_pfn(cr3) (((unsigned)(cr3) >> 12) | ((unsigned)(cr3) << 20))
-
-struct arch_vcpu_info {
- ULONG_PTR cr2;
- ULONG_PTR pad[5]; /* sizeof(vcpu_info_t) == 64 */
-};
-typedef struct arch_vcpu_info arch_vcpu_info_t;
-
-struct xen_callback {
- ULONG_PTR cs;
- ULONG_PTR eip;
-};
-typedef struct xen_callback xen_callback_t;
-
-#endif /* !__ASSEMBLY__ */
-
-#endif /* __XEN_PUBLIC_ARCH_X86_XEN_X86_32_H__ */
-
-/*
- * Local variables:
- * mode: C
- * c-set-style: "BSD"
- * c-basic-offset: 4
- * tab-width: 4
- * indent-tabs-mode: nil
- * End:
- */
+/******************************************************************************\r
+ * xen-x86_32.h\r
+ * \r
+ * Guest OS interface to x86 32-bit Xen.\r
+ * \r
+ * Permission is hereby granted, free of charge, to any person obtaining a copy\r
+ * of this software and associated documentation files (the "Software"), to\r
+ * deal in the Software without restriction, including without limitation the\r
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\r
+ * sell copies of the Software, and to permit persons to whom the Software is\r
+ * furnished to do so, subject to the following conditions:\r
+ *\r
+ * The above copyright notice and this permission notice shall be included in\r
+ * all copies or substantial portions of the Software.\r
+ *\r
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\r
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER\r
+ * DEALINGS IN THE SOFTWARE.\r
+ *\r
+ * Copyright (c) 2004-2007, K A Fraser\r
+ */\r
+\r
+#ifndef __XEN_PUBLIC_ARCH_X86_XEN_X86_32_H__\r
+#define __XEN_PUBLIC_ARCH_X86_XEN_X86_32_H__\r
+\r
+/*\r
+ * Hypercall interface:\r
+ * Input: %ebx, %ecx, %edx, %esi, %edi, %ebp (arguments 1-6)\r
+ * Output: %eax\r
+ * Access is via hypercall page (set up by guest loader or via a Xen MSR):\r
+ * call hypercall_page + hypercall-number * 32\r
+ * Clobbered: Argument registers (e.g., 2-arg hypercall clobbers %ebx,%ecx)\r
+ */\r
+\r
+/*\r
+ * These flat segments are in the Xen-private section of every GDT. Since these\r
+ * are also present in the initial GDT, many OSes will be able to avoid\r
+ * installing their own GDT.\r
+ */\r
+#define FLAT_RING1_CS 0xe019 /* GDT index 259 */\r
+#define FLAT_RING1_DS 0xe021 /* GDT index 260 */\r
+#define FLAT_RING1_SS 0xe021 /* GDT index 260 */\r
+#define FLAT_RING3_CS 0xe02b /* GDT index 261 */\r
+#define FLAT_RING3_DS 0xe033 /* GDT index 262 */\r
+#define FLAT_RING3_SS 0xe033 /* GDT index 262 */\r
+\r
+#define FLAT_KERNEL_CS FLAT_RING1_CS\r
+#define FLAT_KERNEL_DS FLAT_RING1_DS\r
+#define FLAT_KERNEL_SS FLAT_RING1_SS\r
+#define FLAT_USER_CS FLAT_RING3_CS\r
+#define FLAT_USER_DS FLAT_RING3_DS\r
+#define FLAT_USER_SS FLAT_RING3_SS\r
+\r
+#define __HYPERVISOR_VIRT_START_PAE 0xF5800000\r
+#define __MACH2PHYS_VIRT_START_PAE 0xF5800000\r
+#define __MACH2PHYS_VIRT_END_PAE 0xF6800000\r
+#define HYPERVISOR_VIRT_START_PAE \\r
+ mk_unsigned_long(__HYPERVISOR_VIRT_START_PAE)\r
+#define MACH2PHYS_VIRT_START_PAE \\r
+ mk_unsigned_long(__MACH2PHYS_VIRT_START_PAE)\r
+#define MACH2PHYS_VIRT_END_PAE \\r
+ mk_unsigned_long(__MACH2PHYS_VIRT_END_PAE)\r
+\r
+/* Non-PAE bounds are obsolete. */\r
+#define __HYPERVISOR_VIRT_START_NONPAE 0xFC000000\r
+#define __MACH2PHYS_VIRT_START_NONPAE 0xFC000000\r
+#define __MACH2PHYS_VIRT_END_NONPAE 0xFC400000\r
+#define HYPERVISOR_VIRT_START_NONPAE \\r
+ mk_unsigned_long(__HYPERVISOR_VIRT_START_NONPAE)\r
+#define MACH2PHYS_VIRT_START_NONPAE \\r
+ mk_unsigned_long(__MACH2PHYS_VIRT_START_NONPAE)\r
+#define MACH2PHYS_VIRT_END_NONPAE \\r
+ mk_unsigned_long(__MACH2PHYS_VIRT_END_NONPAE)\r
+\r
+#define __HYPERVISOR_VIRT_START __HYPERVISOR_VIRT_START_PAE\r
+#define __MACH2PHYS_VIRT_START __MACH2PHYS_VIRT_START_PAE\r
+#define __MACH2PHYS_VIRT_END __MACH2PHYS_VIRT_END_PAE\r
+\r
+#ifndef HYPERVISOR_VIRT_START\r
+#define HYPERVISOR_VIRT_START mk_unsigned_long(__HYPERVISOR_VIRT_START)\r
+#endif\r
+\r
+#define MACH2PHYS_VIRT_START mk_unsigned_long(__MACH2PHYS_VIRT_START)\r
+#define MACH2PHYS_VIRT_END mk_unsigned_long(__MACH2PHYS_VIRT_END)\r
+#define MACH2PHYS_NR_ENTRIES ((MACH2PHYS_VIRT_END-MACH2PHYS_VIRT_START)>>2)\r
+#ifndef machine_to_phys_mapping\r
+#define machine_to_phys_mapping ((ULONG_PTR *)MACH2PHYS_VIRT_START)\r
+#endif\r
+\r
+/* 32-/64-bit invariability for control interfaces (domctl/sysctl). */\r
+#if defined(__XEN__) || defined(__XEN_TOOLS__)\r
+#undef ___DEFINE_XEN_GUEST_HANDLE\r
+#define ___DEFINE_XEN_GUEST_HANDLE(name, type) \\r
+ typedef struct { type *p; } \\r
+ __guest_handle_ ## name; \\r
+ typedef struct { union { type *p; uint64_aligned_t q; }; } \\r
+ __guest_handle_64_ ## name\r
+#undef set_xen_guest_handle_raw\r
+#define set_xen_guest_handle_raw(hnd, val) \\r
+ do { if ( sizeof(hnd) == 8 ) *(uint64_t *)&(hnd) = 0; \\r
+ (hnd).p = val; \\r
+ } while ( 0 )\r
+#define uint64_aligned_t uint64_t __attribute__((aligned(8)))\r
+#define __XEN_GUEST_HANDLE_64(name) __guest_handle_64_ ## name\r
+#define XEN_GUEST_HANDLE_64(name) __XEN_GUEST_HANDLE_64(name)\r
+#endif\r
+\r
+#ifndef __ASSEMBLY__\r
+\r
+struct cpu_user_regs {\r
+ uint32_t ebx;\r
+ uint32_t ecx;\r
+ uint32_t edx;\r
+ uint32_t esi;\r
+ uint32_t edi;\r
+ uint32_t ebp;\r
+ uint32_t eax;\r
+ uint16_t error_code; /* private */\r
+ uint16_t entry_vector; /* private */\r
+ uint32_t eip;\r
+ uint16_t cs;\r
+ uint8_t saved_upcall_mask;\r
+ uint8_t _pad0;\r
+ uint32_t eflags; /* eflags.IF == !saved_upcall_mask */\r
+ uint32_t esp;\r
+ uint16_t ss, _pad1;\r
+ uint16_t es, _pad2;\r
+ uint16_t ds, _pad3;\r
+ uint16_t fs, _pad4;\r
+ uint16_t gs, _pad5;\r
+};\r
+typedef struct cpu_user_regs cpu_user_regs_t;\r
+DEFINE_XEN_GUEST_HANDLE(cpu_user_regs_t);\r
+\r
+/*\r
+ * Page-directory addresses above 4GB do not fit into architectural %cr3.\r
+ * When accessing %cr3, or equivalent field in vcpu_guest_context, guests\r
+ * must use the following accessor macros to pack/unpack valid MFNs.\r
+ */\r
+#define xen_pfn_to_cr3(pfn) (((unsigned)(pfn) << 12) | ((unsigned)(pfn) >> 20))\r
+#define xen_cr3_to_pfn(cr3) (((unsigned)(cr3) >> 12) | ((unsigned)(cr3) << 20))\r
+\r
+struct arch_vcpu_info {\r
+ ULONG_PTR cr2;\r
+ ULONG_PTR pad[5]; /* sizeof(vcpu_info_t) == 64 */\r
+};\r
+typedef struct arch_vcpu_info arch_vcpu_info_t;\r
+\r
+struct xen_callback {\r
+ ULONG_PTR cs;\r
+ ULONG_PTR eip;\r
+};\r
+typedef struct xen_callback xen_callback_t;\r
+\r
+#endif /* !__ASSEMBLY__ */\r
+\r
+#endif /* __XEN_PUBLIC_ARCH_X86_XEN_X86_32_H__ */\r
+\r
+/*\r
+ * Local variables:\r
+ * mode: C\r
+ * c-file-style: "BSD"\r
+ * c-basic-offset: 4\r
+ * tab-width: 4\r
+ * indent-tabs-mode: nil\r
+ * End:\r
+ */\r
-/******************************************************************************
- * xen-x86_64.h
- *
- * Guest OS interface to x86 64-bit Xen.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to
- * deal in the Software without restriction, including without limitation the
- * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
- * sell copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- *
- * Copyright (c) 2004-2006, K A Fraser
- */
-
-#ifndef __XEN_PUBLIC_ARCH_X86_XEN_X86_64_H__
-#define __XEN_PUBLIC_ARCH_X86_XEN_X86_64_H__
-
-/*
- * Hypercall interface:
- * Input: %rdi, %rsi, %rdx, %r10, %r8 (arguments 1-5)
- * Output: %rax
- * Access is via hypercall page (set up by guest loader or via a Xen MSR):
- * call hypercall_page + hypercall-number * 32
- * Clobbered: argument registers (e.g., 2-arg hypercall clobbers %rdi,%rsi)
- */
-
-#if __XEN_INTERFACE_VERSION__ < 0x00030203
-/*
- * Legacy hypercall interface:
- * As above, except the entry sequence to the hypervisor is:
- * mov $hypercall-number*32,%eax ; syscall
- * Clobbered: %rcx, %r11, argument registers (as above)
- */
-#define TRAP_INSTR "syscall"
-#endif
-
-/*
- * 64-bit segment selectors
- * These flat segments are in the Xen-private section of every GDT. Since these
- * are also present in the initial GDT, many OSes will be able to avoid
- * installing their own GDT.
- */
-
-#define FLAT_RING3_CS32 0xe023 /* GDT index 260 */
-#define FLAT_RING3_CS64 0xe033 /* GDT index 261 */
-#define FLAT_RING3_DS32 0xe02b /* GDT index 262 */
-#define FLAT_RING3_DS64 0x0000 /* NULL selector */
-#define FLAT_RING3_SS32 0xe02b /* GDT index 262 */
-#define FLAT_RING3_SS64 0xe02b /* GDT index 262 */
-
-#define FLAT_KERNEL_DS64 FLAT_RING3_DS64
-#define FLAT_KERNEL_DS32 FLAT_RING3_DS32
-#define FLAT_KERNEL_DS FLAT_KERNEL_DS64
-#define FLAT_KERNEL_CS64 FLAT_RING3_CS64
-#define FLAT_KERNEL_CS32 FLAT_RING3_CS32
-#define FLAT_KERNEL_CS FLAT_KERNEL_CS64
-#define FLAT_KERNEL_SS64 FLAT_RING3_SS64
-#define FLAT_KERNEL_SS32 FLAT_RING3_SS32
-#define FLAT_KERNEL_SS FLAT_KERNEL_SS64
-
-#define FLAT_USER_DS64 FLAT_RING3_DS64
-#define FLAT_USER_DS32 FLAT_RING3_DS32
-#define FLAT_USER_DS FLAT_USER_DS64
-#define FLAT_USER_CS64 FLAT_RING3_CS64
-#define FLAT_USER_CS32 FLAT_RING3_CS32
-#define FLAT_USER_CS FLAT_USER_CS64
-#define FLAT_USER_SS64 FLAT_RING3_SS64
-#define FLAT_USER_SS32 FLAT_RING3_SS32
-#define FLAT_USER_SS FLAT_USER_SS64
-
-#define __HYPERVISOR_VIRT_START 0xFFFF800000000000
-#define __HYPERVISOR_VIRT_END 0xFFFF880000000000
-#define __MACH2PHYS_VIRT_START 0xFFFF800000000000
-#define __MACH2PHYS_VIRT_END 0xFFFF804000000000
-
-#ifndef HYPERVISOR_VIRT_START
-#define HYPERVISOR_VIRT_START mk_unsigned_long(__HYPERVISOR_VIRT_START)
-#define HYPERVISOR_VIRT_END mk_unsigned_long(__HYPERVISOR_VIRT_END)
-#endif
-
-#define MACH2PHYS_VIRT_START mk_unsigned_long(__MACH2PHYS_VIRT_START)
-#define MACH2PHYS_VIRT_END mk_unsigned_long(__MACH2PHYS_VIRT_END)
-#define MACH2PHYS_NR_ENTRIES ((MACH2PHYS_VIRT_END-MACH2PHYS_VIRT_START)>>3)
-#ifndef machine_to_phys_mapping
-#define machine_to_phys_mapping ((ULONG_PTR *)HYPERVISOR_VIRT_START)
-#endif
-
-/*
- * int HYPERVISOR_set_segment_base(unsigned int which, ULONG_PTR base)
- * @which == SEGBASE_* ; @base == 64-bit base address
- * Returns 0 on success.
- */
-#define SEGBASE_FS 0
-#define SEGBASE_GS_USER 1
-#define SEGBASE_GS_KERNEL 2
-#define SEGBASE_GS_USER_SEL 3 /* Set user %gs specified in base[15:0] */
-
-/*
- * int HYPERVISOR_iret(void)
- * All arguments are on the kernel stack, in the following format.
- * Never returns if successful. Current kernel context is lost.
- * The saved CS is mapped as follows:
- * RING0 -> RING3 kernel mode.
- * RING1 -> RING3 kernel mode.
- * RING2 -> RING3 kernel mode.
- * RING3 -> RING3 user mode.
- * However RING0 indicates that the guest kernel should return to iteself
- * directly with
- * orb $3,1*8(%rsp)
- * iretq
- * If flags contains VGCF_in_syscall:
- * Restore RAX, RIP, RFLAGS, RSP.
- * Discard R11, RCX, CS, SS.
- * Otherwise:
- * Restore RAX, R11, RCX, CS:RIP, RFLAGS, SS:RSP.
- * All other registers are saved on hypercall entry and restored to user.
- */
-/* Guest exited in SYSCALL context? Return to guest with SYSRET? */
-#define _VGCF_in_syscall 8
-#define VGCF_in_syscall (1<<_VGCF_in_syscall)
-#define VGCF_IN_SYSCALL VGCF_in_syscall
-
-#ifndef __ASSEMBLY__
-
-struct iret_context {
- /* Top of stack (%rsp at point of hypercall). */
- uint64_t rax, r11, rcx, flags, rip, cs, rflags, rsp, ss;
- /* Bottom of iret stack frame. */
-};
-
-#if defined(__GNUC__) && !defined(__STRICT_ANSI__)
-/* Anonymous union includes both 32- and 64-bit names (e.g., eax/rax). */
-#define __DECL_REG(name) union { \
- uint64_t r ## name, e ## name; \
- uint32_t _e ## name; \
-}
-#else
-/* Non-gcc sources must always use the proper 64-bit name (e.g., rax). */
-#define __DECL_REG(name) uint64_t r ## name
-#endif
-
-struct cpu_user_regs {
- uint64_t r15;
- uint64_t r14;
- uint64_t r13;
- uint64_t r12;
- __DECL_REG(bp);
- __DECL_REG(bx);
- uint64_t r11;
- uint64_t r10;
- uint64_t r9;
- uint64_t r8;
- __DECL_REG(ax);
- __DECL_REG(cx);
- __DECL_REG(dx);
- __DECL_REG(si);
- __DECL_REG(di);
- uint32_t error_code; /* private */
- uint32_t entry_vector; /* private */
- __DECL_REG(ip);
- uint16_t cs, _pad0[1];
- uint8_t saved_upcall_mask;
- uint8_t _pad1[3];
- __DECL_REG(flags); /* rflags.IF == !saved_upcall_mask */
- __DECL_REG(sp);
- uint16_t ss, _pad2[3];
- uint16_t es, _pad3[3];
- uint16_t ds, _pad4[3];
- uint16_t fs, _pad5[3]; /* Non-zero => takes precedence over fs_base. */
- uint16_t gs, _pad6[3]; /* Non-zero => takes precedence over gs_base_usr. */
-};
-typedef struct cpu_user_regs cpu_user_regs_t;
-DEFINE_XEN_GUEST_HANDLE(cpu_user_regs_t);
-
-#undef __DECL_REG
-
-#define xen_pfn_to_cr3(pfn) ((ULONG_PTR)(pfn) << 12)
-#define xen_cr3_to_pfn(cr3) ((ULONG_PTR)(cr3) >> 12)
-
-struct arch_vcpu_info {
- ULONG_PTR cr2;
- ULONG_PTR pad; /* sizeof(vcpu_info_t) == 64 */
-};
-typedef struct arch_vcpu_info arch_vcpu_info_t;
-
-typedef ULONG_PTR xen_callback_t;
-
-#endif /* !__ASSEMBLY__ */
-
-#endif /* __XEN_PUBLIC_ARCH_X86_XEN_X86_64_H__ */
-
-/*
- * Local variables:
- * mode: C
- * c-set-style: "BSD"
- * c-basic-offset: 4
- * tab-width: 4
- * indent-tabs-mode: nil
- * End:
- */
+/******************************************************************************\r
+ * xen-x86_64.h\r
+ * \r
+ * Guest OS interface to x86 64-bit Xen.\r
+ * \r
+ * Permission is hereby granted, free of charge, to any person obtaining a copy\r
+ * of this software and associated documentation files (the "Software"), to\r
+ * deal in the Software without restriction, including without limitation the\r
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\r
+ * sell copies of the Software, and to permit persons to whom the Software is\r
+ * furnished to do so, subject to the following conditions:\r
+ *\r
+ * The above copyright notice and this permission notice shall be included in\r
+ * all copies or substantial portions of the Software.\r
+ *\r
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\r
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER\r
+ * DEALINGS IN THE SOFTWARE.\r
+ *\r
+ * Copyright (c) 2004-2006, K A Fraser\r
+ */\r
+\r
+#ifndef __XEN_PUBLIC_ARCH_X86_XEN_X86_64_H__\r
+#define __XEN_PUBLIC_ARCH_X86_XEN_X86_64_H__\r
+\r
+/*\r
+ * Hypercall interface:\r
+ * Input: %rdi, %rsi, %rdx, %r10, %r8, %r9 (arguments 1-6)\r
+ * Output: %rax\r
+ * Access is via hypercall page (set up by guest loader or via a Xen MSR):\r
+ * call hypercall_page + hypercall-number * 32\r
+ * Clobbered: argument registers (e.g., 2-arg hypercall clobbers %rdi,%rsi)\r
+ */\r
+\r
+/*\r
+ * 64-bit segment selectors\r
+ * These flat segments are in the Xen-private section of every GDT. Since these\r
+ * are also present in the initial GDT, many OSes will be able to avoid\r
+ * installing their own GDT.\r
+ */\r
+\r
+#define FLAT_RING3_CS32 0xe023 /* GDT index 260 */\r
+#define FLAT_RING3_CS64 0xe033 /* GDT index 261 */\r
+#define FLAT_RING3_DS32 0xe02b /* GDT index 262 */\r
+#define FLAT_RING3_DS64 0x0000 /* NULL selector */\r
+#define FLAT_RING3_SS32 0xe02b /* GDT index 262 */\r
+#define FLAT_RING3_SS64 0xe02b /* GDT index 262 */\r
+\r
+#define FLAT_KERNEL_DS64 FLAT_RING3_DS64\r
+#define FLAT_KERNEL_DS32 FLAT_RING3_DS32\r
+#define FLAT_KERNEL_DS FLAT_KERNEL_DS64\r
+#define FLAT_KERNEL_CS64 FLAT_RING3_CS64\r
+#define FLAT_KERNEL_CS32 FLAT_RING3_CS32\r
+#define FLAT_KERNEL_CS FLAT_KERNEL_CS64\r
+#define FLAT_KERNEL_SS64 FLAT_RING3_SS64\r
+#define FLAT_KERNEL_SS32 FLAT_RING3_SS32\r
+#define FLAT_KERNEL_SS FLAT_KERNEL_SS64\r
+\r
+#define FLAT_USER_DS64 FLAT_RING3_DS64\r
+#define FLAT_USER_DS32 FLAT_RING3_DS32\r
+#define FLAT_USER_DS FLAT_USER_DS64\r
+#define FLAT_USER_CS64 FLAT_RING3_CS64\r
+#define FLAT_USER_CS32 FLAT_RING3_CS32\r
+#define FLAT_USER_CS FLAT_USER_CS64\r
+#define FLAT_USER_SS64 FLAT_RING3_SS64\r
+#define FLAT_USER_SS32 FLAT_RING3_SS32\r
+#define FLAT_USER_SS FLAT_USER_SS64\r
+\r
+#define __HYPERVISOR_VIRT_START 0xFFFF800000000000\r
+#define __HYPERVISOR_VIRT_END 0xFFFF880000000000\r
+#define __MACH2PHYS_VIRT_START 0xFFFF800000000000\r
+#define __MACH2PHYS_VIRT_END 0xFFFF804000000000\r
+\r
+#ifndef HYPERVISOR_VIRT_START\r
+#define HYPERVISOR_VIRT_START mk_unsigned_long(__HYPERVISOR_VIRT_START)\r
+#define HYPERVISOR_VIRT_END mk_unsigned_long(__HYPERVISOR_VIRT_END)\r
+#endif\r
+\r
+#define MACH2PHYS_VIRT_START mk_unsigned_long(__MACH2PHYS_VIRT_START)\r
+#define MACH2PHYS_VIRT_END mk_unsigned_long(__MACH2PHYS_VIRT_END)\r
+#define MACH2PHYS_NR_ENTRIES ((MACH2PHYS_VIRT_END-MACH2PHYS_VIRT_START)>>3)\r
+#ifndef machine_to_phys_mapping\r
+#define machine_to_phys_mapping ((ULONG_PTR *)HYPERVISOR_VIRT_START)\r
+#endif\r
+\r
+/*\r
+ * int HYPERVISOR_set_segment_base(unsigned int which, ULONG_PTR base)\r
+ * @which == SEGBASE_* ; @base == 64-bit base address\r
+ * Returns 0 on success.\r
+ */\r
+#define SEGBASE_FS 0\r
+#define SEGBASE_GS_USER 1\r
+#define SEGBASE_GS_KERNEL 2\r
+#define SEGBASE_GS_USER_SEL 3 /* Set user %gs specified in base[15:0] */\r
+\r
+/*\r
+ * int HYPERVISOR_iret(void)\r
+ * All arguments are on the kernel stack, in the following format.\r
+ * Never returns if successful. Current kernel context is lost.\r
+ * The saved CS is mapped as follows:\r
+ * RING0 -> RING3 kernel mode.\r
+ * RING1 -> RING3 kernel mode.\r
+ * RING2 -> RING3 kernel mode.\r
+ * RING3 -> RING3 user mode.\r
+ * However RING0 indicates that the guest kernel should return to iteself\r
+ * directly with\r
+ * orb $3,1*8(%rsp)\r
+ * iretq\r
+ * If flags contains VGCF_in_syscall:\r
+ * Restore RAX, RIP, RFLAGS, RSP.\r
+ * Discard R11, RCX, CS, SS.\r
+ * Otherwise:\r
+ * Restore RAX, R11, RCX, CS:RIP, RFLAGS, SS:RSP.\r
+ * All other registers are saved on hypercall entry and restored to user.\r
+ */\r
+/* Guest exited in SYSCALL context? Return to guest with SYSRET? */\r
+#define _VGCF_in_syscall 8\r
+#define VGCF_in_syscall (1<<_VGCF_in_syscall)\r
+#define VGCF_IN_SYSCALL VGCF_in_syscall\r
+\r
+#ifndef __ASSEMBLY__\r
+\r
+struct iret_context {\r
+ /* Top of stack (%rsp at point of hypercall). */\r
+ uint64_t rax, r11, rcx, flags, rip, cs, rflags, rsp, ss;\r
+ /* Bottom of iret stack frame. */\r
+};\r
+\r
+#if defined(__GNUC__) && !defined(__STRICT_ANSI__)\r
+/* Anonymous union includes both 32- and 64-bit names (e.g., eax/rax). */\r
+#define __DECL_REG(name) union { \\r
+ uint64_t r ## name, e ## name; \\r
+ uint32_t _e ## name; \\r
+}\r
+#else\r
+/* Non-gcc sources must always use the proper 64-bit name (e.g., rax). */\r
+#define __DECL_REG(name) uint64_t r ## name\r
+#endif\r
+\r
+struct cpu_user_regs {\r
+ uint64_t r15;\r
+ uint64_t r14;\r
+ uint64_t r13;\r
+ uint64_t r12;\r
+ __DECL_REG(bp);\r
+ __DECL_REG(bx);\r
+ uint64_t r11;\r
+ uint64_t r10;\r
+ uint64_t r9;\r
+ uint64_t r8;\r
+ __DECL_REG(ax);\r
+ __DECL_REG(cx);\r
+ __DECL_REG(dx);\r
+ __DECL_REG(si);\r
+ __DECL_REG(di);\r
+ uint32_t error_code; /* private */\r
+ uint32_t entry_vector; /* private */\r
+ __DECL_REG(ip);\r
+ uint16_t cs, _pad0[1];\r
+ uint8_t saved_upcall_mask;\r
+ uint8_t _pad1[3];\r
+ __DECL_REG(flags); /* rflags.IF == !saved_upcall_mask */\r
+ __DECL_REG(sp);\r
+ uint16_t ss, _pad2[3];\r
+ uint16_t es, _pad3[3];\r
+ uint16_t ds, _pad4[3];\r
+ uint16_t fs, _pad5[3]; /* Non-zero => takes precedence over fs_base. */\r
+ uint16_t gs, _pad6[3]; /* Non-zero => takes precedence over gs_base_usr. */\r
+};\r
+typedef struct cpu_user_regs cpu_user_regs_t;\r
+DEFINE_XEN_GUEST_HANDLE(cpu_user_regs_t);\r
+\r
+#undef __DECL_REG\r
+\r
+#define xen_pfn_to_cr3(pfn) ((ULONG_PTR)(pfn) << 12)\r
+#define xen_cr3_to_pfn(cr3) ((ULONG_PTR)(cr3) >> 12)\r
+\r
+struct arch_vcpu_info {\r
+ ULONG_PTR cr2;\r
+ ULONG_PTR pad; /* sizeof(vcpu_info_t) == 64 */\r
+};\r
+typedef struct arch_vcpu_info arch_vcpu_info_t;\r
+\r
+typedef ULONG_PTR xen_callback_t;\r
+\r
+#endif /* !__ASSEMBLY__ */\r
+\r
+#endif /* __XEN_PUBLIC_ARCH_X86_XEN_X86_64_H__ */\r
+\r
+/*\r
+ * Local variables:\r
+ * mode: C\r
+ * c-file-style: "BSD"\r
+ * c-basic-offset: 4\r
+ * tab-width: 4\r
+ * indent-tabs-mode: nil\r
+ * End:\r
+ */\r
-/******************************************************************************
- * arch-x86/xen.h
- *
- * Guest OS interface to x86 Xen.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to
- * deal in the Software without restriction, including without limitation the
- * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
- * sell copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- *
- * Copyright (c) 2004-2006, K A Fraser
- */
-
-#include "../xen.h"
-
-#ifndef __XEN_PUBLIC_ARCH_X86_XEN_H__
-#define __XEN_PUBLIC_ARCH_X86_XEN_H__
-
-/* Structural guest handles introduced in 0x00030201. */
-#if __XEN_INTERFACE_VERSION__ >= 0x00030201
-#define ___DEFINE_XEN_GUEST_HANDLE(name, type) \
- typedef struct { type *p; } __guest_handle_ ## name
-#else
-#define ___DEFINE_XEN_GUEST_HANDLE(name, type) \
- typedef type * __guest_handle_ ## name
-#endif
-
-#define __DEFINE_XEN_GUEST_HANDLE(name, type) \
- ___DEFINE_XEN_GUEST_HANDLE(name, type); \
- ___DEFINE_XEN_GUEST_HANDLE(const_##name, const type)
-#define DEFINE_XEN_GUEST_HANDLE(name) __DEFINE_XEN_GUEST_HANDLE(name, name)
-#define __XEN_GUEST_HANDLE(name) __guest_handle_ ## name
-#define XEN_GUEST_HANDLE(name) __XEN_GUEST_HANDLE(name)
-#define set_xen_guest_handle_raw(hnd, val) do { (hnd).p = val; } while (0)
-#ifdef __XEN_TOOLS__
-#define get_xen_guest_handle(val, hnd) do { val = (hnd).p; } while (0)
-#endif
-#define set_xen_guest_handle(hnd, val) set_xen_guest_handle_raw(hnd, val)
-
-#if defined(__i386__)
-#include "xen-x86_32.h"
-#elif defined(__x86_64__)
-#include "xen-x86_64.h"
-#endif
-
-#ifndef __ASSEMBLY__
-typedef ULONG_PTR xen_pfn_t;
-#define PRI_xen_pfn "lx"
-#endif
-
-/*
- * SEGMENT DESCRIPTOR TABLES
- */
-/*
- * A number of GDT entries are reserved by Xen. These are not situated at the
- * start of the GDT because some stupid OSes export hard-coded selector values
- * in their ABI. These hard-coded values are always near the start of the GDT,
- * so Xen places itself out of the way, at the far end of the GDT.
- */
-#define FIRST_RESERVED_GDT_PAGE 14
-#define FIRST_RESERVED_GDT_BYTE (FIRST_RESERVED_GDT_PAGE * 4096)
-#define FIRST_RESERVED_GDT_ENTRY (FIRST_RESERVED_GDT_BYTE / 8)
-
-/* Maximum number of virtual CPUs in legacy multi-processor guests. */
-#define XEN_LEGACY_MAX_VCPUS 32
-
-#ifndef __ASSEMBLY__
-
-typedef ULONG_PTR xen_ulong_t;
-
-/*
- * Send an array of these to HYPERVISOR_set_trap_table().
- * The privilege level specifies which modes may enter a trap via a software
- * interrupt. On x86/64, since rings 1 and 2 are unavailable, we allocate
- * privilege levels as follows:
- * Level == 0: Noone may enter
- * Level == 1: Kernel may enter
- * Level == 2: Kernel may enter
- * Level == 3: Everyone may enter
- */
-#define TI_GET_DPL(_ti) ((_ti)->flags & 3)
-#define TI_GET_IF(_ti) ((_ti)->flags & 4)
-#define TI_SET_DPL(_ti,_dpl) ((_ti)->flags |= (_dpl))
-#define TI_SET_IF(_ti,_if) ((_ti)->flags |= ((!!(_if))<<2))
-struct trap_info {
- uint8_t vector; /* exception vector */
- uint8_t flags; /* 0-3: privilege level; 4: clear event enable? */
- uint16_t cs; /* code selector */
- ULONG_PTR address; /* code offset */
-};
-typedef struct trap_info trap_info_t;
-DEFINE_XEN_GUEST_HANDLE(trap_info_t);
-
-typedef uint64_t tsc_timestamp_t; /* RDTSC timestamp */
-
-/*
- * The following is all CPU context. Note that the fpu_ctxt block is filled
- * in by FXSAVE if the CPU has feature FXSR; otherwise FSAVE is used.
- */
-struct vcpu_guest_context {
- /* FPU registers come first so they can be aligned for FXSAVE/FXRSTOR. */
- struct { char x[512]; } fpu_ctxt; /* User-level FPU registers */
-#define VGCF_I387_VALID (1<<0)
-#define VGCF_IN_KERNEL (1<<2)
-#define _VGCF_i387_valid 0
-#define VGCF_i387_valid (1<<_VGCF_i387_valid)
-#define _VGCF_in_kernel 2
-#define VGCF_in_kernel (1<<_VGCF_in_kernel)
-#define _VGCF_failsafe_disables_events 3
-#define VGCF_failsafe_disables_events (1<<_VGCF_failsafe_disables_events)
-#define _VGCF_syscall_disables_events 4
-#define VGCF_syscall_disables_events (1<<_VGCF_syscall_disables_events)
-#define _VGCF_online 5
-#define VGCF_online (1<<_VGCF_online)
- ULONG_PTR flags; /* VGCF_* flags */
- struct cpu_user_regs user_regs; /* User-level CPU registers */
- struct trap_info trap_ctxt[256]; /* Virtual IDT */
- ULONG_PTR ldt_base, ldt_ents; /* LDT (linear address, # ents) */
- ULONG_PTR gdt_frames[16], gdt_ents; /* GDT (machine frames, # ents) */
- ULONG_PTR kernel_ss, kernel_sp; /* Virtual TSS (only SS1/SP1) */
- /* NB. User pagetable on x86/64 is placed in ctrlreg[1]. */
- ULONG_PTR ctrlreg[8]; /* CR0-CR7 (control registers) */
- ULONG_PTR debugreg[8]; /* DB0-DB7 (debug registers) */
-#ifdef __i386__
- ULONG_PTR event_callback_cs; /* CS:EIP of event callback */
- ULONG_PTR event_callback_eip;
- ULONG_PTR failsafe_callback_cs; /* CS:EIP of failsafe callback */
- ULONG_PTR failsafe_callback_eip;
-#else
- ULONG_PTR event_callback_eip;
- ULONG_PTR failsafe_callback_eip;
-#ifdef __XEN__
- union {
- ULONG_PTR syscall_callback_eip;
- struct {
- unsigned int event_callback_cs; /* compat CS of event cb */
- unsigned int failsafe_callback_cs; /* compat CS of failsafe cb */
- };
- };
-#else
- ULONG_PTR syscall_callback_eip;
-#endif
-#endif
- ULONG_PTR vm_assist; /* VMASST_TYPE_* bitmap */
-#ifdef __x86_64__
- /* Segment base addresses. */
- uint64_t fs_base;
- uint64_t gs_base_kernel;
- uint64_t gs_base_user;
-#endif
-};
-typedef struct vcpu_guest_context vcpu_guest_context_t;
-DEFINE_XEN_GUEST_HANDLE(vcpu_guest_context_t);
-
-struct arch_shared_info {
- ULONG_PTR max_pfn; /* max pfn that appears in table */
- /* Frame containing list of mfns containing list of mfns containing p2m. */
- xen_pfn_t pfn_to_mfn_frame_list_list;
- ULONG_PTR nmi_reason;
- uint64_t pad[32];
-};
-typedef struct arch_shared_info arch_shared_info_t;
-
-#endif /* !__ASSEMBLY__ */
-
-/*
- * Prefix forces emulation of some non-trapping instructions.
- * Currently only CPUID.
- */
-#ifdef __ASSEMBLY__
-#define XEN_EMULATE_PREFIX .byte 0x0f,0x0b,0x78,0x65,0x6e ;
-#define XEN_CPUID XEN_EMULATE_PREFIX cpuid
-#else
-#define XEN_EMULATE_PREFIX ".byte 0x0f,0x0b,0x78,0x65,0x6e ; "
-#define XEN_CPUID XEN_EMULATE_PREFIX "cpuid"
-#endif
-
-#endif /* __XEN_PUBLIC_ARCH_X86_XEN_H__ */
-
-/*
- * Local variables:
- * mode: C
- * c-set-style: "BSD"
- * c-basic-offset: 4
- * tab-width: 4
- * indent-tabs-mode: nil
- * End:
- */
+/******************************************************************************\r
+ * arch-x86/xen.h\r
+ * \r
+ * Guest OS interface to x86 Xen.\r
+ * \r
+ * Permission is hereby granted, free of charge, to any person obtaining a copy\r
+ * of this software and associated documentation files (the "Software"), to\r
+ * deal in the Software without restriction, including without limitation the\r
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\r
+ * sell copies of the Software, and to permit persons to whom the Software is\r
+ * furnished to do so, subject to the following conditions:\r
+ *\r
+ * The above copyright notice and this permission notice shall be included in\r
+ * all copies or substantial portions of the Software.\r
+ *\r
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\r
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER\r
+ * DEALINGS IN THE SOFTWARE.\r
+ *\r
+ * Copyright (c) 2004-2006, K A Fraser\r
+ */\r
+\r
+#include "../xen.h"\r
+\r
+#ifndef __XEN_PUBLIC_ARCH_X86_XEN_H__\r
+#define __XEN_PUBLIC_ARCH_X86_XEN_H__\r
+\r
+/* Structural guest handles introduced in 0x00030201. */\r
+#if __XEN_INTERFACE_VERSION__ >= 0x00030201\r
+#define ___DEFINE_XEN_GUEST_HANDLE(name, type) \\r
+ typedef struct { type *p; } __guest_handle_ ## name\r
+#else\r
+#define ___DEFINE_XEN_GUEST_HANDLE(name, type) \\r
+ typedef type * __guest_handle_ ## name\r
+#endif\r
+\r
+/*\r
+ * XEN_GUEST_HANDLE represents a guest pointer, when passed as a field\r
+ * in a struct in memory.\r
+ * XEN_GUEST_HANDLE_PARAM represent a guest pointer, when passed as an\r
+ * hypercall argument.\r
+ * XEN_GUEST_HANDLE_PARAM and XEN_GUEST_HANDLE are the same on X86 but\r
+ * they might not be on other architectures.\r
+ */\r
+#define __DEFINE_XEN_GUEST_HANDLE(name, type) \\r
+ ___DEFINE_XEN_GUEST_HANDLE(name, type); \\r
+ ___DEFINE_XEN_GUEST_HANDLE(const_##name, const type)\r
+#define DEFINE_XEN_GUEST_HANDLE(name) __DEFINE_XEN_GUEST_HANDLE(name, name)\r
+#define __XEN_GUEST_HANDLE(name) __guest_handle_ ## name\r
+#define XEN_GUEST_HANDLE(name) __XEN_GUEST_HANDLE(name)\r
+#define XEN_GUEST_HANDLE_PARAM(name) XEN_GUEST_HANDLE(name)\r
+#define set_xen_guest_handle_raw(hnd, val) do { (hnd).p = val; } while (0)\r
+#ifdef __XEN_TOOLS__\r
+#define get_xen_guest_handle(val, hnd) do { val = (hnd).p; } while (0)\r
+#endif\r
+#define set_xen_guest_handle(hnd, val) set_xen_guest_handle_raw(hnd, val)\r
+\r
+#if defined(__i386__)\r
+#include "xen-x86_32.h"\r
+#elif defined(__x86_64__)\r
+#include "xen-x86_64.h"\r
+#endif\r
+\r
+#ifndef __ASSEMBLY__\r
+typedef ULONG_PTR xen_pfn_t;\r
+#define PRI_xen_pfn "lx"\r
+#endif\r
+\r
+#define XEN_HAVE_PV_GUEST_ENTRY 1\r
+\r
+#define XEN_HAVE_PV_UPCALL_MASK 1\r
+\r
+/*\r
+ * `incontents 200 segdesc Segment Descriptor Tables\r
+ */\r
+/*\r
+ * ` enum neg_errnoval\r
+ * ` HYPERVISOR_set_gdt(const xen_pfn_t frames[], unsigned int entries);\r
+ * `\r
+ */\r
+/*\r
+ * A number of GDT entries are reserved by Xen. These are not situated at the\r
+ * start of the GDT because some stupid OSes export hard-coded selector values\r
+ * in their ABI. These hard-coded values are always near the start of the GDT,\r
+ * so Xen places itself out of the way, at the far end of the GDT.\r
+ *\r
+ * NB The LDT is set using the MMUEXT_SET_LDT op of HYPERVISOR_mmuext_op\r
+ */\r
+#define FIRST_RESERVED_GDT_PAGE 14\r
+#define FIRST_RESERVED_GDT_BYTE (FIRST_RESERVED_GDT_PAGE * 4096)\r
+#define FIRST_RESERVED_GDT_ENTRY (FIRST_RESERVED_GDT_BYTE / 8)\r
+\r
+\r
+/*\r
+ * ` enum neg_errnoval\r
+ * ` HYPERVISOR_update_descriptor(u64 pa, u64 desc);\r
+ * `\r
+ * ` @pa The machine physical address of the descriptor to\r
+ * ` update. Must be either a descriptor page or writable.\r
+ * ` @desc The descriptor value to update, in the same format as a\r
+ * ` native descriptor table entry.\r
+ */\r
+\r
+/* Maximum number of virtual CPUs in legacy multi-processor guests. */\r
+#define XEN_LEGACY_MAX_VCPUS 32\r
+\r
+#ifndef __ASSEMBLY__\r
+\r
+typedef ULONG_PTR xen_ulong_t;\r
+#define PRI_xen_ulong "lx"\r
+\r
+/*\r
+ * ` enum neg_errnoval\r
+ * ` HYPERVISOR_stack_switch(ULONG_PTR ss, ULONG_PTR esp);\r
+ * `\r
+ * Sets the stack segment and pointer for the current vcpu.\r
+ */\r
+\r
+/*\r
+ * ` enum neg_errnoval\r
+ * ` HYPERVISOR_set_trap_table(const struct trap_info traps[]);\r
+ * `\r
+ */\r
+/*\r
+ * Send an array of these to HYPERVISOR_set_trap_table().\r
+ * Terminate the array with a sentinel entry, with traps[].address==0.\r
+ * The privilege level specifies which modes may enter a trap via a software\r
+ * interrupt. On x86/64, since rings 1 and 2 are unavailable, we allocate\r
+ * privilege levels as follows:\r
+ * Level == 0: Noone may enter\r
+ * Level == 1: Kernel may enter\r
+ * Level == 2: Kernel may enter\r
+ * Level == 3: Everyone may enter\r
+ */\r
+#define TI_GET_DPL(_ti) ((_ti)->flags & 3)\r
+#define TI_GET_IF(_ti) ((_ti)->flags & 4)\r
+#define TI_SET_DPL(_ti,_dpl) ((_ti)->flags |= (_dpl))\r
+#define TI_SET_IF(_ti,_if) ((_ti)->flags |= ((!!(_if))<<2))\r
+struct trap_info {\r
+ uint8_t vector; /* exception vector */\r
+ uint8_t flags; /* 0-3: privilege level; 4: clear event enable? */\r
+ uint16_t cs; /* code selector */\r
+ ULONG_PTR address; /* code offset */\r
+};\r
+typedef struct trap_info trap_info_t;\r
+DEFINE_XEN_GUEST_HANDLE(trap_info_t);\r
+\r
+typedef uint64_t tsc_timestamp_t; /* RDTSC timestamp */\r
+\r
+/*\r
+ * The following is all CPU context. Note that the fpu_ctxt block is filled \r
+ * in by FXSAVE if the CPU has feature FXSR; otherwise FSAVE is used.\r
+ */\r
+struct vcpu_guest_context {\r
+ /* FPU registers come first so they can be aligned for FXSAVE/FXRSTOR. */\r
+ struct { char x[512]; } fpu_ctxt; /* User-level FPU registers */\r
+#define VGCF_I387_VALID (1<<0)\r
+#define VGCF_IN_KERNEL (1<<2)\r
+#define _VGCF_i387_valid 0\r
+#define VGCF_i387_valid (1<<_VGCF_i387_valid)\r
+#define _VGCF_in_kernel 2\r
+#define VGCF_in_kernel (1<<_VGCF_in_kernel)\r
+#define _VGCF_failsafe_disables_events 3\r
+#define VGCF_failsafe_disables_events (1<<_VGCF_failsafe_disables_events)\r
+#define _VGCF_syscall_disables_events 4\r
+#define VGCF_syscall_disables_events (1<<_VGCF_syscall_disables_events)\r
+#define _VGCF_online 5\r
+#define VGCF_online (1<<_VGCF_online)\r
+ ULONG_PTR flags; /* VGCF_* flags */\r
+ struct cpu_user_regs user_regs; /* User-level CPU registers */\r
+ struct trap_info trap_ctxt[256]; /* Virtual IDT */\r
+ ULONG_PTR ldt_base, ldt_ents; /* LDT (linear address, # ents) */\r
+ ULONG_PTR gdt_frames[16], gdt_ents; /* GDT (machine frames, # ents) */\r
+ ULONG_PTR kernel_ss, kernel_sp; /* Virtual TSS (only SS1/SP1) */\r
+ /* NB. User pagetable on x86/64 is placed in ctrlreg[1]. */\r
+ ULONG_PTR ctrlreg[8]; /* CR0-CR7 (control registers) */\r
+ ULONG_PTR debugreg[8]; /* DB0-DB7 (debug registers) */\r
+#ifdef __i386__\r
+ ULONG_PTR event_callback_cs; /* CS:EIP of event callback */\r
+ ULONG_PTR event_callback_eip;\r
+ ULONG_PTR failsafe_callback_cs; /* CS:EIP of failsafe callback */\r
+ ULONG_PTR failsafe_callback_eip;\r
+#else\r
+ ULONG_PTR event_callback_eip;\r
+ ULONG_PTR failsafe_callback_eip;\r
+#ifdef __XEN__\r
+ union {\r
+ ULONG_PTR syscall_callback_eip;\r
+ struct {\r
+ unsigned int event_callback_cs; /* compat CS of event cb */\r
+ unsigned int failsafe_callback_cs; /* compat CS of failsafe cb */\r
+ };\r
+ };\r
+#else\r
+ ULONG_PTR syscall_callback_eip;\r
+#endif\r
+#endif\r
+ ULONG_PTR vm_assist; /* VMASST_TYPE_* bitmap */\r
+#ifdef __x86_64__\r
+ /* Segment base addresses. */\r
+ uint64_t fs_base;\r
+ uint64_t gs_base_kernel;\r
+ uint64_t gs_base_user;\r
+#endif\r
+};\r
+typedef struct vcpu_guest_context vcpu_guest_context_t;\r
+DEFINE_XEN_GUEST_HANDLE(vcpu_guest_context_t);\r
+\r
+struct arch_shared_info {\r
+ ULONG_PTR max_pfn; /* max pfn that appears in table */\r
+ /* Frame containing list of mfns containing list of mfns containing p2m. */\r
+ xen_pfn_t pfn_to_mfn_frame_list_list;\r
+ ULONG_PTR nmi_reason;\r
+ uint64_t pad[32];\r
+};\r
+typedef struct arch_shared_info arch_shared_info_t;\r
+\r
+#endif /* !__ASSEMBLY__ */\r
+\r
+/*\r
+ * ` enum neg_errnoval\r
+ * ` HYPERVISOR_fpu_taskswitch(int set);\r
+ * `\r
+ * Sets (if set!=0) or clears (if set==0) CR0.TS.\r
+ */\r
+\r
+/*\r
+ * ` enum neg_errnoval\r
+ * ` HYPERVISOR_set_debugreg(int regno, ULONG_PTR value);\r
+ *\r
+ * ` ULONG_PTR\r
+ * ` HYPERVISOR_get_debugreg(int regno);\r
+ * For 0<=reg<=7, returns the debug register value.\r
+ * For other values of reg, returns ((ULONG_PTR)-EINVAL).\r
+ * (Unfortunately, this interface is defective.)\r
+ */\r
+\r
+/*\r
+ * Prefix forces emulation of some non-trapping instructions.\r
+ * Currently only CPUID.\r
+ */\r
+#ifdef __ASSEMBLY__\r
+#define XEN_EMULATE_PREFIX .byte 0x0f,0x0b,0x78,0x65,0x6e ;\r
+#define XEN_CPUID XEN_EMULATE_PREFIX cpuid\r
+#else\r
+#define XEN_EMULATE_PREFIX ".byte 0x0f,0x0b,0x78,0x65,0x6e ; "\r
+#define XEN_CPUID XEN_EMULATE_PREFIX "cpuid"\r
+#endif\r
+\r
+#endif /* __XEN_PUBLIC_ARCH_X86_XEN_H__ */\r
+\r
+/*\r
+ * Local variables:\r
+ * mode: C\r
+ * c-file-style: "BSD"\r
+ * c-basic-offset: 4\r
+ * tab-width: 4\r
+ * indent-tabs-mode: nil\r
+ * End:\r
+ */\r
-#ifndef _I386_ERRNO_H
-#define _I386_ERRNO_H
-
-#define EPERM 1 /* Operation not permitted */
-#define ENOENT 2 /* No such file or directory */
-#define ESRCH 3 /* No such process */
-#define EINTR 4 /* Interrupted system call */
-#define EIO 5 /* I/O error */
-#define ENXIO 6 /* No such device or address */
-#define E2BIG 7 /* Arg list too LONG_PTR */
-#define ENOEXEC 8 /* Exec format error */
-#define EBADF 9 /* Bad file number */
-#define ECHILD 10 /* No child processes */
-#define EAGAIN 11 /* Try again */
-#define ENOMEM 12 /* Out of memory */
-#define EACCES 13 /* Permission denied */
-#define EFAULT 14 /* Bad address */
-#define ENOTBLK 15 /* Block device required */
-#define EBUSY 16 /* Device or resource busy */
-#define EEXIST 17 /* File exists */
-#define EXDEV 18 /* Cross-device link */
-#define ENODEV 19 /* No such device */
-#define ENOTDIR 20 /* Not a directory */
-#define EISDIR 21 /* Is a directory */
-#define EINVAL 22 /* Invalid argument */
-#define ENFILE 23 /* File table overflow */
-#define EMFILE 24 /* Too many open files */
-#define ENOTTY 25 /* Not a typewriter */
-#define ETXTBSY 26 /* Text file busy */
-#define EFBIG 27 /* File too large */
-#define ENOSPC 28 /* No space left on device */
-#define ESPIPE 29 /* Illegal seek */
-#define EROFS 30 /* Read-only file system */
-#define EMLINK 31 /* Too many links */
-#define EPIPE 32 /* Broken pipe */
-#define EDOM 33 /* Math argument out of domain of func */
-#define ERANGE 34 /* Math result not representable */
-#define EDEADLK 35 /* Resource deadlock would occur */
-#define ENAMETOOLONG 36 /* File name too LONG_PTR */
-#define ENOLCK 37 /* No record locks available */
-#define ENOSYS 38 /* Function not implemented */
-#define ENOTEMPTY 39 /* Directory not empty */
-#define ELOOP 40 /* Too many symbolic links encountered */
-#define EWOULDBLOCK EAGAIN /* Operation would block */
-#define ENOMSG 42 /* No message of desired type */
-#define EIDRM 43 /* Identifier removed */
-#define ECHRNG 44 /* Channel number out of range */
-#define EL2NSYNC 45 /* Level 2 not synchronized */
-#define EL3HLT 46 /* Level 3 halted */
-#define EL3RST 47 /* Level 3 reset */
-#define ELNRNG 48 /* Link number out of range */
-#define EUNATCH 49 /* Protocol driver not attached */
-#define ENOCSI 50 /* No CSI structure available */
-#define EL2HLT 51 /* Level 2 halted */
-#define EBADE 52 /* Invalid exchange */
-#define EBADR 53 /* Invalid request descriptor */
-#define EXFULL 54 /* Exchange full */
-#define ENOANO 55 /* No anode */
-#define EBADRQC 56 /* Invalid request code */
-#define EBADSLT 57 /* Invalid slot */
-
-#define EDEADLOCK EDEADLK
-
-#define EBFONT 59 /* Bad font file format */
-#define ENOSTR 60 /* Device not a stream */
-#define ENODATA 61 /* No data available */
-#define ETIME 62 /* Timer expired */
-#define ENOSR 63 /* Out of streams resources */
-#define ENONET 64 /* Machine is not on the network */
-#define ENOPKG 65 /* Package not installed */
-#define EREMOTE 66 /* Object is remote */
-#define ENOLINK 67 /* Link has been severed */
-#define EADV 68 /* Advertise error */
-#define ESRMNT 69 /* Srmount error */
-#define ECOMM 70 /* Communication error on send */
-#define EPROTO 71 /* Protocol error */
-#define EMULTIHOP 72 /* Multihop attempted */
-#define EDOTDOT 73 /* RFS specific error */
-#define EBADMSG 74 /* Not a data message */
-#define EOVERFLOW 75 /* Value too large for defined data type */
-#define ENOTUNIQ 76 /* Name not unique on network */
-#define EBADFD 77 /* File descriptor in bad state */
-#define EREMCHG 78 /* Remote address changed */
-#define ELIBACC 79 /* Can not access a needed shared library */
-#define ELIBBAD 80 /* Accessing a corrupted shared library */
-#define ELIBSCN 81 /* .lib section in a.out corrupted */
-#define ELIBMAX 82 /* Attempting to link in too many shared libraries */
-#define ELIBEXEC 83 /* Cannot exec a shared library directly */
-#define EILSEQ 84 /* Illegal byte sequence */
-#define ERESTART 85 /* Interrupted system call should be restarted */
-#define ESTRPIPE 86 /* Streams pipe error */
-#define EUSERS 87 /* Too many users */
-#define ENOTSOCK 88 /* Socket operation on non-socket */
-#define EDESTADDRREQ 89 /* Destination address required */
-#define EMSGSIZE 90 /* Message too LONG_PTR */
-#define EPROTOTYPE 91 /* Protocol wrong type for socket */
-#define ENOPROTOOPT 92 /* Protocol not available */
-#define EPROTONOSUPPORT 93 /* Protocol not supported */
-#define ESOCKTNOSUPPORT 94 /* Socket type not supported */
-#define EOPNOTSUPP 95 /* Operation not supported on transport endpoint */
-#define EPFNOSUPPORT 96 /* Protocol family not supported */
-#define EAFNOSUPPORT 97 /* Address family not supported by protocol */
-#define EADDRINUSE 98 /* Address already in use */
-#define EADDRNOTAVAIL 99 /* Cannot assign requested address */
-#define ENETDOWN 100 /* Network is down */
-#define ENETUNREACH 101 /* Network is unreachable */
-#define ENETRESET 102 /* Network dropped connection because of reset */
-#define ECONNABORTED 103 /* Software caused connection abort */
-#define ECONNRESET 104 /* Connection reset by peer */
-#define ENOBUFS 105 /* No buffer space available */
-#define EISCONN 106 /* Transport endpoint is already connected */
-#define ENOTCONN 107 /* Transport endpoint is not connected */
-#define ESHUTDOWN 108 /* Cannot send after transport endpoint shutdown */
-#define ETOOMANYREFS 109 /* Too many references: cannot splice */
-#define ETIMEDOUT 110 /* Connection timed out */
-#define ECONNREFUSED 111 /* Connection refused */
-#define EHOSTDOWN 112 /* Host is down */
-#define EHOSTUNREACH 113 /* No route to host */
-#define EALREADY 114 /* Operation already in progress */
-#define EINPROGRESS 115 /* Operation now in progress */
-#define ESTALE 116 /* Stale NFS file handle */
-#define EUCLEAN 117 /* Structure needs cleaning */
-#define ENOTNAM 118 /* Not a XENIX named type file */
-#define ENAVAIL 119 /* No XENIX semaphores available */
-#define EISNAM 120 /* Is a named type file */
-#define EREMOTEIO 121 /* Remote I/O error */
-#define EDQUOT 122 /* Quota exceeded */
-
-#define ENOMEDIUM 123 /* No medium found */
-#define EMEDIUMTYPE 124 /* Wrong medium type */
-
-#endif
+#ifndef _I386_ERRNO_H\r
+#define _I386_ERRNO_H\r
+\r
+/* ` enum neg_errnoval { [ -Efoo for each Efoo in the list below ] } */\r
+/* ` enum errnoval { */\r
+\r
+#define EPERM 1 /* Operation not permitted */\r
+#define ENOENT 2 /* No such file or directory */\r
+#define ESRCH 3 /* No such process */\r
+#define EINTR 4 /* Interrupted system call */\r
+#define EIO 5 /* I/O error */\r
+#define ENXIO 6 /* No such device or address */\r
+#define E2BIG 7 /* Arg list too LONG_PTR */\r
+#define ENOEXEC 8 /* Exec format error */\r
+#define EBADF 9 /* Bad file number */\r
+#define ECHILD 10 /* No child processes */\r
+#define EAGAIN 11 /* Try again */\r
+#define ENOMEM 12 /* Out of memory */\r
+#define EACCES 13 /* Permission denied */\r
+#define EFAULT 14 /* Bad address */\r
+#define ENOTBLK 15 /* Block device required */\r
+#define EBUSY 16 /* Device or resource busy */\r
+#define EEXIST 17 /* File exists */\r
+#define EXDEV 18 /* Cross-device link */\r
+#define ENODEV 19 /* No such device */\r
+#define ENOTDIR 20 /* Not a directory */\r
+#define EISDIR 21 /* Is a directory */\r
+#define EINVAL 22 /* Invalid argument */\r
+#define ENFILE 23 /* File table overflow */\r
+#define EMFILE 24 /* Too many open files */\r
+#define ENOTTY 25 /* Not a typewriter */\r
+#define ETXTBSY 26 /* Text file busy */\r
+#define EFBIG 27 /* File too large */\r
+#define ENOSPC 28 /* No space left on device */\r
+#define ESPIPE 29 /* Illegal seek */\r
+#define EROFS 30 /* Read-only file system */\r
+#define EMLINK 31 /* Too many links */\r
+#define EPIPE 32 /* Broken pipe */\r
+#define EDOM 33 /* Math argument out of domain of func */\r
+#define ERANGE 34 /* Math result not representable */\r
+#define EDEADLK 35 /* Resource deadlock would occur */\r
+#define ENAMETOOLONG 36 /* File name too LONG_PTR */\r
+#define ENOLCK 37 /* No record locks available */\r
+#define ENOSYS 38 /* Function not implemented */\r
+#define ENOTEMPTY 39 /* Directory not empty */\r
+#define ELOOP 40 /* Too many symbolic links encountered */\r
+#define EWOULDBLOCK EAGAIN /* Operation would block */\r
+#define ENOMSG 42 /* No message of desired type */\r
+#define EIDRM 43 /* Identifier removed */\r
+#define ECHRNG 44 /* Channel number out of range */\r
+#define EL2NSYNC 45 /* Level 2 not synchronized */\r
+#define EL3HLT 46 /* Level 3 halted */\r
+#define EL3RST 47 /* Level 3 reset */\r
+#define ELNRNG 48 /* Link number out of range */\r
+#define EUNATCH 49 /* Protocol driver not attached */\r
+#define ENOCSI 50 /* No CSI structure available */\r
+#define EL2HLT 51 /* Level 2 halted */\r
+#define EBADE 52 /* Invalid exchange */\r
+#define EBADR 53 /* Invalid request descriptor */\r
+#define EXFULL 54 /* Exchange full */\r
+#define ENOANO 55 /* No anode */\r
+#define EBADRQC 56 /* Invalid request code */\r
+#define EBADSLT 57 /* Invalid slot */\r
+\r
+#define EDEADLOCK EDEADLK\r
+\r
+#define EBFONT 59 /* Bad font file format */\r
+#define ENOSTR 60 /* Device not a stream */\r
+#define ENODATA 61 /* No data available */\r
+#define ETIME 62 /* Timer expired */\r
+#define ENOSR 63 /* Out of streams resources */\r
+#define ENONET 64 /* Machine is not on the network */\r
+#define ENOPKG 65 /* Package not installed */\r
+#define EREMOTE 66 /* Object is remote */\r
+#define ENOLINK 67 /* Link has been severed */\r
+#define EADV 68 /* Advertise error */\r
+#define ESRMNT 69 /* Srmount error */\r
+#define ECOMM 70 /* Communication error on send */\r
+#define EPROTO 71 /* Protocol error */\r
+#define EMULTIHOP 72 /* Multihop attempted */\r
+#define EDOTDOT 73 /* RFS specific error */\r
+#define EBADMSG 74 /* Not a data message */\r
+#define EOVERFLOW 75 /* Value too large for defined data type */\r
+#define ENOTUNIQ 76 /* Name not unique on network */\r
+#define EBADFD 77 /* File descriptor in bad state */\r
+#define EREMCHG 78 /* Remote address changed */\r
+#define ELIBACC 79 /* Can not access a needed shared library */\r
+#define ELIBBAD 80 /* Accessing a corrupted shared library */\r
+#define ELIBSCN 81 /* .lib section in a.out corrupted */\r
+#define ELIBMAX 82 /* Attempting to link in too many shared libraries */\r
+#define ELIBEXEC 83 /* Cannot exec a shared library directly */\r
+#define EILSEQ 84 /* Illegal byte sequence */\r
+#define ERESTART 85 /* Interrupted system call should be restarted */\r
+#define ESTRPIPE 86 /* Streams pipe error */\r
+#define EUSERS 87 /* Too many users */\r
+#define ENOTSOCK 88 /* Socket operation on non-socket */\r
+#define EDESTADDRREQ 89 /* Destination address required */\r
+#define EMSGSIZE 90 /* Message too LONG_PTR */\r
+#define EPROTOTYPE 91 /* Protocol wrong type for socket */\r
+#define ENOPROTOOPT 92 /* Protocol not available */\r
+#define EPROTONOSUPPORT 93 /* Protocol not supported */\r
+#define ESOCKTNOSUPPORT 94 /* Socket type not supported */\r
+#define EOPNOTSUPP 95 /* Operation not supported on transport endpoint */\r
+#define EPFNOSUPPORT 96 /* Protocol family not supported */\r
+#define EAFNOSUPPORT 97 /* Address family not supported by protocol */\r
+#define EADDRINUSE 98 /* Address already in use */\r
+#define EADDRNOTAVAIL 99 /* Cannot assign requested address */\r
+#define ENETDOWN 100 /* Network is down */\r
+#define ENETUNREACH 101 /* Network is unreachable */\r
+#define ENETRESET 102 /* Network dropped connection because of reset */\r
+#define ECONNABORTED 103 /* Software caused connection abort */\r
+#define ECONNRESET 104 /* Connection reset by peer */\r
+#define ENOBUFS 105 /* No buffer space available */\r
+#define EISCONN 106 /* Transport endpoint is already connected */\r
+#define ENOTCONN 107 /* Transport endpoint is not connected */\r
+#define ESHUTDOWN 108 /* Cannot send after transport endpoint shutdown */\r
+#define ETOOMANYREFS 109 /* Too many references: cannot splice */\r
+#define ETIMEDOUT 110 /* Connection timed out */\r
+#define ECONNREFUSED 111 /* Connection refused */\r
+#define EHOSTDOWN 112 /* Host is down */\r
+#define EHOSTUNREACH 113 /* No route to host */\r
+#define EALREADY 114 /* Operation already in progress */\r
+#define EINPROGRESS 115 /* Operation now in progress */\r
+#define ESTALE 116 /* Stale NFS file handle */\r
+#define EUCLEAN 117 /* Structure needs cleaning */\r
+#define ENOTNAM 118 /* Not a XENIX named type file */\r
+#define ENAVAIL 119 /* No XENIX semaphores available */\r
+#define EISNAM 120 /* Is a named type file */\r
+#define EREMOTEIO 121 /* Remote I/O error */\r
+#define EDQUOT 122 /* Quota exceeded */\r
+\r
+#define ENOMEDIUM 123 /* No medium found */\r
+#define EMEDIUMTYPE 124 /* Wrong medium type */\r
+\r
+/* ` } */\r
+\r
+#endif\r
-/******************************************************************************
- * event_channel.h
- *
- * Event channels between domains.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to
- * deal in the Software without restriction, including without limitation the
- * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
- * sell copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- *
- * Copyright (c) 2003-2004, K A Fraser.
- */
-
-#ifndef __XEN_PUBLIC_EVENT_CHANNEL_H__
-#define __XEN_PUBLIC_EVENT_CHANNEL_H__
-
-#include "xen.h"
-
-/*
- * Prototype for this hypercall is:
- * int event_channel_op(int cmd, void *args)
- * @cmd == EVTCHNOP_??? (event-channel operation).
- * @args == Operation-specific extra arguments (NULL if none).
- */
-
-typedef uint32_t evtchn_port_t;
-DEFINE_XEN_GUEST_HANDLE(evtchn_port_t);
-
-/*
- * EVTCHNOP_alloc_unbound: Allocate a port in domain <dom> and mark as
- * accepting interdomain bindings from domain <remote_dom>. A fresh port
- * is allocated in <dom> and returned as <port>.
- * NOTES:
- * 1. If the caller is unprivileged then <dom> must be DOMID_SELF.
- * 2. <rdom> may be DOMID_SELF, allowing loopback connections.
- */
-#define EVTCHNOP_alloc_unbound 6
-struct evtchn_alloc_unbound {
- /* IN parameters */
- domid_t dom, remote_dom;
- /* OUT parameters */
- evtchn_port_t port;
-};
-typedef struct evtchn_alloc_unbound evtchn_alloc_unbound_t;
-
-/*
- * EVTCHNOP_bind_interdomain: Construct an interdomain event channel between
- * the calling domain and <remote_dom>. <remote_dom,remote_port> must identify
- * a port that is unbound and marked as accepting bindings from the calling
- * domain. A fresh port is allocated in the calling domain and returned as
- * <local_port>.
- * NOTES:
- * 2. <remote_dom> may be DOMID_SELF, allowing loopback connections.
- */
-#define EVTCHNOP_bind_interdomain 0
-struct evtchn_bind_interdomain {
- /* IN parameters. */
- domid_t remote_dom;
- evtchn_port_t remote_port;
- /* OUT parameters. */
- evtchn_port_t local_port;
-};
-typedef struct evtchn_bind_interdomain evtchn_bind_interdomain_t;
-
-/*
- * EVTCHNOP_bind_virq: Bind a local event channel to VIRQ <irq> on specified
- * vcpu.
- * NOTES:
- * 1. Virtual IRQs are classified as per-vcpu or global. See the VIRQ list
- * in xen.h for the classification of each VIRQ.
- * 2. Global VIRQs must be allocated on VCPU0 but can subsequently be
- * re-bound via EVTCHNOP_bind_vcpu.
- * 3. Per-vcpu VIRQs may be bound to at most one event channel per vcpu.
- * The allocated event channel is bound to the specified vcpu and the
- * binding cannot be changed.
- */
-#define EVTCHNOP_bind_virq 1
-struct evtchn_bind_virq {
- /* IN parameters. */
- uint32_t virq;
- uint32_t vcpu;
- /* OUT parameters. */
- evtchn_port_t port;
-};
-typedef struct evtchn_bind_virq evtchn_bind_virq_t;
-
-/*
- * EVTCHNOP_bind_pirq: Bind a local event channel to PIRQ <irq>.
- * NOTES:
- * 1. A physical IRQ may be bound to at most one event channel per domain.
- * 2. Only a sufficiently-privileged domain may bind to a physical IRQ.
- */
-#define EVTCHNOP_bind_pirq 2
-struct evtchn_bind_pirq {
- /* IN parameters. */
- uint32_t pirq;
-#define BIND_PIRQ__WILL_SHARE 1
- uint32_t flags; /* BIND_PIRQ__* */
- /* OUT parameters. */
- evtchn_port_t port;
-};
-typedef struct evtchn_bind_pirq evtchn_bind_pirq_t;
-
-/*
- * EVTCHNOP_bind_ipi: Bind a local event channel to receive events.
- * NOTES:
- * 1. The allocated event channel is bound to the specified vcpu. The binding
- * may not be changed.
- */
-#define EVTCHNOP_bind_ipi 7
-struct evtchn_bind_ipi {
- uint32_t vcpu;
- /* OUT parameters. */
- evtchn_port_t port;
-};
-typedef struct evtchn_bind_ipi evtchn_bind_ipi_t;
-
-/*
- * EVTCHNOP_close: Close a local event channel <port>. If the channel is
- * interdomain then the remote end is placed in the unbound state
- * (EVTCHNSTAT_unbound), awaiting a new connection.
- */
-#define EVTCHNOP_close 3
-struct evtchn_close {
- /* IN parameters. */
- evtchn_port_t port;
-};
-typedef struct evtchn_close evtchn_close_t;
-
-/*
- * EVTCHNOP_send: Send an event to the remote end of the channel whose local
- * endpoint is <port>.
- */
-#define EVTCHNOP_send 4
-struct evtchn_send {
- /* IN parameters. */
- evtchn_port_t port;
-};
-typedef struct evtchn_send evtchn_send_t;
-
-/*
- * EVTCHNOP_status: Get the current status of the communication channel which
- * has an endpoint at <dom, port>.
- * NOTES:
- * 1. <dom> may be specified as DOMID_SELF.
- * 2. Only a sufficiently-privileged domain may obtain the status of an event
- * channel for which <dom> is not DOMID_SELF.
- */
-#define EVTCHNOP_status 5
-struct evtchn_status {
- /* IN parameters */
- domid_t dom;
- evtchn_port_t port;
- /* OUT parameters */
-#define EVTCHNSTAT_closed 0 /* Channel is not in use. */
-#define EVTCHNSTAT_unbound 1 /* Channel is waiting interdom connection.*/
-#define EVTCHNSTAT_interdomain 2 /* Channel is connected to remote domain. */
-#define EVTCHNSTAT_pirq 3 /* Channel is bound to a phys IRQ line. */
-#define EVTCHNSTAT_virq 4 /* Channel is bound to a virtual IRQ line */
-#define EVTCHNSTAT_ipi 5 /* Channel is bound to a virtual IPI line */
- uint32_t status;
- uint32_t vcpu; /* VCPU to which this channel is bound. */
- union {
- struct {
- domid_t dom;
- } unbound; /* EVTCHNSTAT_unbound */
- struct {
- domid_t dom;
- evtchn_port_t port;
- } interdomain; /* EVTCHNSTAT_interdomain */
- uint32_t pirq; /* EVTCHNSTAT_pirq */
- uint32_t virq; /* EVTCHNSTAT_virq */
- } u;
-};
-typedef struct evtchn_status evtchn_status_t;
-
-/*
- * EVTCHNOP_bind_vcpu: Specify which vcpu a channel should notify when an
- * event is pending.
- * NOTES:
- * 1. IPI-bound channels always notify the vcpu specified at bind time.
- * This binding cannot be changed.
- * 2. Per-VCPU VIRQ channels always notify the vcpu specified at bind time.
- * This binding cannot be changed.
- * 3. All other channels notify vcpu0 by default. This default is set when
- * the channel is allocated (a port that is freed and subsequently reused
- * has its binding reset to vcpu0).
- */
-#define EVTCHNOP_bind_vcpu 8
-struct evtchn_bind_vcpu {
- /* IN parameters. */
- evtchn_port_t port;
- uint32_t vcpu;
-};
-typedef struct evtchn_bind_vcpu evtchn_bind_vcpu_t;
-
-/*
- * EVTCHNOP_unmask: Unmask the specified local event-channel port and deliver
- * a notification to the appropriate VCPU if an event is pending.
- */
-#define EVTCHNOP_unmask 9
-struct evtchn_unmask {
- /* IN parameters. */
- evtchn_port_t port;
-};
-typedef struct evtchn_unmask evtchn_unmask_t;
-
-/*
- * EVTCHNOP_reset: Close all event channels associated with specified domain.
- * NOTES:
- * 1. <dom> may be specified as DOMID_SELF.
- * 2. Only a sufficiently-privileged domain may specify other than DOMID_SELF.
- */
-#define EVTCHNOP_reset 10
-struct evtchn_reset {
- /* IN parameters. */
- domid_t dom;
-};
-typedef struct evtchn_reset evtchn_reset_t;
-
-/*
- * Argument to event_channel_op_compat() hypercall. Superceded by new
- * event_channel_op() hypercall since 0x00030202.
- */
-struct evtchn_op {
- uint32_t cmd; /* EVTCHNOP_* */
- union {
- struct evtchn_alloc_unbound alloc_unbound;
- struct evtchn_bind_interdomain bind_interdomain;
- struct evtchn_bind_virq bind_virq;
- struct evtchn_bind_pirq bind_pirq;
- struct evtchn_bind_ipi bind_ipi;
- struct evtchn_close close;
- struct evtchn_send send;
- struct evtchn_status status;
- struct evtchn_bind_vcpu bind_vcpu;
- struct evtchn_unmask unmask;
- } u;
-};
-typedef struct evtchn_op evtchn_op_t;
-DEFINE_XEN_GUEST_HANDLE(evtchn_op_t);
-
-#endif /* __XEN_PUBLIC_EVENT_CHANNEL_H__ */
-
-/*
- * Local variables:
- * mode: C
- * c-set-style: "BSD"
- * c-basic-offset: 4
- * tab-width: 4
- * indent-tabs-mode: nil
- * End:
- */
+/******************************************************************************\r
+ * event_channel.h\r
+ *\r
+ * Event channels between domains.\r
+ *\r
+ * Permission is hereby granted, free of charge, to any person obtaining a copy\r
+ * of this software and associated documentation files (the "Software"), to\r
+ * deal in the Software without restriction, including without limitation the\r
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\r
+ * sell copies of the Software, and to permit persons to whom the Software is\r
+ * furnished to do so, subject to the following conditions:\r
+ *\r
+ * The above copyright notice and this permission notice shall be included in\r
+ * all copies or substantial portions of the Software.\r
+ *\r
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\r
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER\r
+ * DEALINGS IN THE SOFTWARE.\r
+ *\r
+ * Copyright (c) 2003-2004, K A Fraser.\r
+ */\r
+\r
+#ifndef __XEN_PUBLIC_EVENT_CHANNEL_H__\r
+#define __XEN_PUBLIC_EVENT_CHANNEL_H__\r
+\r
+#include "xen.h"\r
+\r
+/*\r
+ * `incontents 150 evtchn Event Channels\r
+ *\r
+ * Event channels are the basic primitive provided by Xen for event\r
+ * notifications. An event is the Xen equivalent of a hardware\r
+ * interrupt. They essentially store one bit of information, the event\r
+ * of interest is signalled by transitioning this bit from 0 to 1.\r
+ *\r
+ * Notifications are received by a guest via an upcall from Xen,\r
+ * indicating when an event arrives (setting the bit). Further\r
+ * notifications are masked until the bit is cleared again (therefore,\r
+ * guests must check the value of the bit after re-enabling event\r
+ * delivery to ensure no missed notifications).\r
+ *\r
+ * Event notifications can be masked by setting a flag; this is\r
+ * equivalent to disabling interrupts and can be used to ensure\r
+ * atomicity of certain operations in the guest kernel.\r
+ *\r
+ * Event channels are represented by the evtchn_* fields in\r
+ * struct shared_info and struct vcpu_info.\r
+ */\r
+\r
+/*\r
+ * ` enum neg_errnoval\r
+ * ` HYPERVISOR_event_channel_op(enum event_channel_op cmd, void *args)\r
+ * `\r
+ * @cmd == EVTCHNOP_* (event-channel operation).\r
+ * @args == struct evtchn_* Operation-specific extra arguments (NULL if none).\r
+ */\r
+\r
+/* ` enum event_channel_op { // EVTCHNOP_* => struct evtchn_* */\r
+#define EVTCHNOP_bind_interdomain 0\r
+#define EVTCHNOP_bind_virq 1\r
+#define EVTCHNOP_bind_pirq 2\r
+#define EVTCHNOP_close 3\r
+#define EVTCHNOP_send 4\r
+#define EVTCHNOP_status 5\r
+#define EVTCHNOP_alloc_unbound 6\r
+#define EVTCHNOP_bind_ipi 7\r
+#define EVTCHNOP_bind_vcpu 8\r
+#define EVTCHNOP_unmask 9\r
+#define EVTCHNOP_reset 10\r
+/* ` } */\r
+\r
+typedef uint32_t evtchn_port_t;\r
+DEFINE_XEN_GUEST_HANDLE(evtchn_port_t);\r
+\r
+/*\r
+ * EVTCHNOP_alloc_unbound: Allocate a port in domain <dom> and mark as\r
+ * accepting interdomain bindings from domain <remote_dom>. A fresh port\r
+ * is allocated in <dom> and returned as <port>.\r
+ * NOTES:\r
+ * 1. If the caller is unprivileged then <dom> must be DOMID_SELF.\r
+ * 2. <rdom> may be DOMID_SELF, allowing loopback connections.\r
+ */\r
+struct evtchn_alloc_unbound {\r
+ /* IN parameters */\r
+ domid_t dom, remote_dom;\r
+ /* OUT parameters */\r
+ evtchn_port_t port;\r
+};\r
+typedef struct evtchn_alloc_unbound evtchn_alloc_unbound_t;\r
+\r
+/*\r
+ * EVTCHNOP_bind_interdomain: Construct an interdomain event channel between\r
+ * the calling domain and <remote_dom>. <remote_dom,remote_port> must identify\r
+ * a port that is unbound and marked as accepting bindings from the calling\r
+ * domain. A fresh port is allocated in the calling domain and returned as\r
+ * <local_port>.\r
+ * NOTES:\r
+ * 1. <remote_dom> may be DOMID_SELF, allowing loopback connections.\r
+ */\r
+struct evtchn_bind_interdomain {\r
+ /* IN parameters. */\r
+ domid_t remote_dom;\r
+ evtchn_port_t remote_port;\r
+ /* OUT parameters. */\r
+ evtchn_port_t local_port;\r
+};\r
+typedef struct evtchn_bind_interdomain evtchn_bind_interdomain_t;\r
+\r
+/*\r
+ * EVTCHNOP_bind_virq: Bind a local event channel to VIRQ <irq> on specified\r
+ * vcpu.\r
+ * NOTES:\r
+ * 1. Virtual IRQs are classified as per-vcpu or global. See the VIRQ list\r
+ * in xen.h for the classification of each VIRQ.\r
+ * 2. Global VIRQs must be allocated on VCPU0 but can subsequently be\r
+ * re-bound via EVTCHNOP_bind_vcpu.\r
+ * 3. Per-vcpu VIRQs may be bound to at most one event channel per vcpu.\r
+ * The allocated event channel is bound to the specified vcpu and the\r
+ * binding cannot be changed.\r
+ */\r
+struct evtchn_bind_virq {\r
+ /* IN parameters. */\r
+ uint32_t virq; /* enum virq */\r
+ uint32_t vcpu;\r
+ /* OUT parameters. */\r
+ evtchn_port_t port;\r
+};\r
+typedef struct evtchn_bind_virq evtchn_bind_virq_t;\r
+\r
+/*\r
+ * EVTCHNOP_bind_pirq: Bind a local event channel to a real IRQ (PIRQ <irq>).\r
+ * NOTES:\r
+ * 1. A physical IRQ may be bound to at most one event channel per domain.\r
+ * 2. Only a sufficiently-privileged domain may bind to a physical IRQ.\r
+ */\r
+struct evtchn_bind_pirq {\r
+ /* IN parameters. */\r
+ uint32_t pirq;\r
+#define BIND_PIRQ__WILL_SHARE 1\r
+ uint32_t flags; /* BIND_PIRQ__* */\r
+ /* OUT parameters. */\r
+ evtchn_port_t port;\r
+};\r
+typedef struct evtchn_bind_pirq evtchn_bind_pirq_t;\r
+\r
+/*\r
+ * EVTCHNOP_bind_ipi: Bind a local event channel to receive events.\r
+ * NOTES:\r
+ * 1. The allocated event channel is bound to the specified vcpu. The binding\r
+ * may not be changed.\r
+ */\r
+struct evtchn_bind_ipi {\r
+ uint32_t vcpu;\r
+ /* OUT parameters. */\r
+ evtchn_port_t port;\r
+};\r
+typedef struct evtchn_bind_ipi evtchn_bind_ipi_t;\r
+\r
+/*\r
+ * EVTCHNOP_close: Close a local event channel <port>. If the channel is\r
+ * interdomain then the remote end is placed in the unbound state\r
+ * (EVTCHNSTAT_unbound), awaiting a new connection.\r
+ */\r
+struct evtchn_close {\r
+ /* IN parameters. */\r
+ evtchn_port_t port;\r
+};\r
+typedef struct evtchn_close evtchn_close_t;\r
+\r
+/*\r
+ * EVTCHNOP_send: Send an event to the remote end of the channel whose local\r
+ * endpoint is <port>.\r
+ */\r
+struct evtchn_send {\r
+ /* IN parameters. */\r
+ evtchn_port_t port;\r
+};\r
+typedef struct evtchn_send evtchn_send_t;\r
+\r
+/*\r
+ * EVTCHNOP_status: Get the current status of the communication channel which\r
+ * has an endpoint at <dom, port>.\r
+ * NOTES:\r
+ * 1. <dom> may be specified as DOMID_SELF.\r
+ * 2. Only a sufficiently-privileged domain may obtain the status of an event\r
+ * channel for which <dom> is not DOMID_SELF.\r
+ */\r
+struct evtchn_status {\r
+ /* IN parameters */\r
+ domid_t dom;\r
+ evtchn_port_t port;\r
+ /* OUT parameters */\r
+#define EVTCHNSTAT_closed 0 /* Channel is not in use. */\r
+#define EVTCHNSTAT_unbound 1 /* Channel is waiting interdom connection.*/\r
+#define EVTCHNSTAT_interdomain 2 /* Channel is connected to remote domain. */\r
+#define EVTCHNSTAT_pirq 3 /* Channel is bound to a phys IRQ line. */\r
+#define EVTCHNSTAT_virq 4 /* Channel is bound to a virtual IRQ line */\r
+#define EVTCHNSTAT_ipi 5 /* Channel is bound to a virtual IPI line */\r
+ uint32_t status;\r
+ uint32_t vcpu; /* VCPU to which this channel is bound. */\r
+ union {\r
+ struct {\r
+ domid_t dom;\r
+ } unbound; /* EVTCHNSTAT_unbound */\r
+ struct {\r
+ domid_t dom;\r
+ evtchn_port_t port;\r
+ } interdomain; /* EVTCHNSTAT_interdomain */\r
+ uint32_t pirq; /* EVTCHNSTAT_pirq */\r
+ uint32_t virq; /* EVTCHNSTAT_virq */\r
+ } u;\r
+};\r
+typedef struct evtchn_status evtchn_status_t;\r
+\r
+/*\r
+ * EVTCHNOP_bind_vcpu: Specify which vcpu a channel should notify when an\r
+ * event is pending.\r
+ * NOTES:\r
+ * 1. IPI-bound channels always notify the vcpu specified at bind time.\r
+ * This binding cannot be changed.\r
+ * 2. Per-VCPU VIRQ channels always notify the vcpu specified at bind time.\r
+ * This binding cannot be changed.\r
+ * 3. All other channels notify vcpu0 by default. This default is set when\r
+ * the channel is allocated (a port that is freed and subsequently reused\r
+ * has its binding reset to vcpu0).\r
+ */\r
+struct evtchn_bind_vcpu {\r
+ /* IN parameters. */\r
+ evtchn_port_t port;\r
+ uint32_t vcpu;\r
+};\r
+typedef struct evtchn_bind_vcpu evtchn_bind_vcpu_t;\r
+\r
+/*\r
+ * EVTCHNOP_unmask: Unmask the specified local event-channel port and deliver\r
+ * a notification to the appropriate VCPU if an event is pending.\r
+ */\r
+struct evtchn_unmask {\r
+ /* IN parameters. */\r
+ evtchn_port_t port;\r
+};\r
+typedef struct evtchn_unmask evtchn_unmask_t;\r
+\r
+/*\r
+ * EVTCHNOP_reset: Close all event channels associated with specified domain.\r
+ * NOTES:\r
+ * 1. <dom> may be specified as DOMID_SELF.\r
+ * 2. Only a sufficiently-privileged domain may specify other than DOMID_SELF.\r
+ */\r
+struct evtchn_reset {\r
+ /* IN parameters. */\r
+ domid_t dom;\r
+};\r
+typedef struct evtchn_reset evtchn_reset_t;\r
+\r
+/*\r
+ * ` enum neg_errnoval\r
+ * ` HYPERVISOR_event_channel_op_compat(struct evtchn_op *op)\r
+ * `\r
+ * Superceded by new event_channel_op() hypercall since 0x00030202.\r
+ */\r
+struct evtchn_op {\r
+ uint32_t cmd; /* enum event_channel_op */\r
+ union {\r
+ struct evtchn_alloc_unbound alloc_unbound;\r
+ struct evtchn_bind_interdomain bind_interdomain;\r
+ struct evtchn_bind_virq bind_virq;\r
+ struct evtchn_bind_pirq bind_pirq;\r
+ struct evtchn_bind_ipi bind_ipi;\r
+ struct evtchn_close close;\r
+ struct evtchn_send send;\r
+ struct evtchn_status status;\r
+ struct evtchn_bind_vcpu bind_vcpu;\r
+ struct evtchn_unmask unmask;\r
+ } u;\r
+};\r
+typedef struct evtchn_op evtchn_op_t;\r
+DEFINE_XEN_GUEST_HANDLE(evtchn_op_t);\r
+\r
+#endif /* __XEN_PUBLIC_EVENT_CHANNEL_H__ */\r
+\r
+/*\r
+ * Local variables:\r
+ * mode: C\r
+ * c-file-style: "BSD"\r
+ * c-basic-offset: 4\r
+ * tab-width: 4\r
+ * indent-tabs-mode: nil\r
+ * End:\r
+ */\r
-/******************************************************************************
- * grant_table.h
- *
- * Interface for granting foreign access to page frames, and receiving
- * page-ownership transfers.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to
- * deal in the Software without restriction, including without limitation the
- * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
- * sell copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- *
- * Copyright (c) 2004, K A Fraser
- */
-
-#ifndef __XEN_PUBLIC_GRANT_TABLE_H__
-#define __XEN_PUBLIC_GRANT_TABLE_H__
-
-#include "xen.h"
-
-/***********************************
- * GRANT TABLE REPRESENTATION
- */
-
-/* Some rough guidelines on accessing and updating grant-table entries
- * in a concurrency-safe manner. For more information, Linux contains a
- * reference implementation for guest OSes (arch/xen/kernel/grant_table.c).
- *
- * NB. WMB is a no-op on current-generation x86 processors. However, a
- * compiler barrier will still be required.
- *
- * Introducing a valid entry into the grant table:
- * 1. Write ent->domid.
- * 2. Write ent->frame:
- * GTF_permit_access: Frame to which access is permitted.
- * GTF_accept_transfer: Pseudo-phys frame slot being filled by new
- * frame, or zero if none.
- * 3. Write memory barrier (WMB).
- * 4. Write ent->flags, inc. valid type.
- *
- * Invalidating an unused GTF_permit_access entry:
- * 1. flags = ent->flags.
- * 2. Observe that !(flags & (GTF_reading|GTF_writing)).
- * 3. Check result of SMP-safe CMPXCHG(&ent->flags, flags, 0).
- * NB. No need for WMB as reuse of entry is control-dependent on success of
- * step 3, and all architectures guarantee ordering of ctrl-dep writes.
- *
- * Invalidating an in-use GTF_permit_access entry:
- * This cannot be done directly. Request assistance from the domain controller
- * which can set a timeout on the use of a grant entry and take necessary
- * action. (NB. This is not yet implemented!).
- *
- * Invalidating an unused GTF_accept_transfer entry:
- * 1. flags = ent->flags.
- * 2. Observe that !(flags & GTF_transfer_committed). [*]
- * 3. Check result of SMP-safe CMPXCHG(&ent->flags, flags, 0).
- * NB. No need for WMB as reuse of entry is control-dependent on success of
- * step 3, and all architectures guarantee ordering of ctrl-dep writes.
- * [*] If GTF_transfer_committed is set then the grant entry is 'committed'.
- * The guest must /not/ modify the grant entry until the address of the
- * transferred frame is written. It is safe for the guest to spin waiting
- * for this to occur (detect by observing GTF_transfer_completed in
- * ent->flags).
- *
- * Invalidating a committed GTF_accept_transfer entry:
- * 1. Wait for (ent->flags & GTF_transfer_completed).
- *
- * Changing a GTF_permit_access from writable to read-only:
- * Use SMP-safe CMPXCHG to set GTF_readonly, while checking !GTF_writing.
- *
- * Changing a GTF_permit_access from read-only to writable:
- * Use SMP-safe bit-setting instruction.
- */
-
-/*
- * Reference to a grant entry in a specified domain's grant table.
- */
-typedef uint32_t grant_ref_t;
-
-/*
- * A grant table comprises a packed array of grant entries in one or more
- * page frames shared between Xen and a guest.
- * [XEN]: This field is written by Xen and read by the sharing guest.
- * [GST]: This field is written by the guest and read by Xen.
- */
-
-/*
- * Version 1 of the grant table entry structure is maintained purely
- * for backwards compatibility. New guests should use version 2.
- */
-#if __XEN_INTERFACE_VERSION__ < 0x0003020a
-#define grant_entry_v1 grant_entry
-#define grant_entry_v1_t grant_entry_t
-#endif
-struct grant_entry_v1 {
- /* GTF_xxx: various type and flag information. [XEN,GST] */
- uint16_t flags;
- /* The domain being granted foreign privileges. [GST] */
- domid_t domid;
- /*
- * GTF_permit_access: Frame that @domid is allowed to map and access. [GST]
- * GTF_accept_transfer: Frame whose ownership transferred by @domid. [XEN]
- */
- uint32_t frame;
-};
-typedef struct grant_entry_v1 grant_entry_v1_t;
-
-/*
- * Type of grant entry.
- * GTF_invalid: This grant entry grants no privileges.
- * GTF_permit_access: Allow @domid to map/access @frame.
- * GTF_accept_transfer: Allow @domid to transfer ownership of one page frame
- * to this guest. Xen writes the page number to @frame.
- * GTF_transitive: Allow @domid to transitively access a subrange of
- * @trans_grant in @trans_domid. No mappings are allowed.
- */
-#define GTF_invalid (0U<<0)
-#define GTF_permit_access (1U<<0)
-#define GTF_accept_transfer (2U<<0)
-#define GTF_transitive (3U<<0)
-#define GTF_type_mask (3U<<0)
-
-/*
- * Subflags for GTF_permit_access.
- * GTF_readonly: Restrict @domid to read-only mappings and accesses. [GST]
- * GTF_reading: Grant entry is currently mapped for reading by @domid. [XEN]
- * GTF_writing: Grant entry is currently mapped for writing by @domid. [XEN]
- * GTF_PAT, GTF_PWT, GTF_PCD: (x86) cache attribute flags for the grant [GST]
- * GTF_sub_page: Grant access to only a subrange of the page. @domid
- * will only be allowed to copy from the grant, and not
- * map it. [GST]
- */
-#define _GTF_readonly (2)
-#define GTF_readonly (1U<<_GTF_readonly)
-#define _GTF_reading (3)
-#define GTF_reading (1U<<_GTF_reading)
-#define _GTF_writing (4)
-#define GTF_writing (1U<<_GTF_writing)
-#define _GTF_PWT (5)
-#define GTF_PWT (1U<<_GTF_PWT)
-#define _GTF_PCD (6)
-#define GTF_PCD (1U<<_GTF_PCD)
-#define _GTF_PAT (7)
-#define GTF_PAT (1U<<_GTF_PAT)
-#define _GTF_sub_page (8)
-#define GTF_sub_page (1U<<_GTF_sub_page)
-
-/*
- * Subflags for GTF_accept_transfer:
- * GTF_transfer_committed: Xen sets this flag to indicate that it is committed
- * to transferring ownership of a page frame. When a guest sees this flag
- * it must /not/ modify the grant entry until GTF_transfer_completed is
- * set by Xen.
- * GTF_transfer_completed: It is safe for the guest to spin-wait on this flag
- * after reading GTF_transfer_committed. Xen will always write the frame
- * address, followed by ORing this flag, in a timely manner.
- */
-#define _GTF_transfer_committed (2)
-#define GTF_transfer_committed (1U<<_GTF_transfer_committed)
-#define _GTF_transfer_completed (3)
-#define GTF_transfer_completed (1U<<_GTF_transfer_completed)
-
-/*
- * Version 2 grant table entries. These fulfil the same role as
- * version 1 entries, but can represent more complicated operations.
- * Any given domain will have either a version 1 or a version 2 table,
- * and every entry in the table will be the same version.
- *
- * The interface by which domains use grant references does not depend
- * on the grant table version in use by the other domain.
- */
-#if __XEN_INTERFACE_VERSION__ >= 0x0003020a
-/*
- * Version 1 and version 2 grant entries share a common prefix. The
- * fields of the prefix are documented as part of struct
- * grant_entry_v1.
- */
-struct grant_entry_header {
- uint16_t flags;
- domid_t domid;
-};
-typedef struct grant_entry_header grant_entry_header_t;
-
-/*
- * Version 2 of the grant entry structure.
- */
-union grant_entry_v2 {
- grant_entry_header_t hdr;
-
- /*
- * This member is used for V1-style full page grants, where either:
- *
- * -- hdr.type is GTF_accept_transfer, or
- * -- hdr.type is GTF_permit_access and GTF_sub_page is not set.
- *
- * In that case, the frame field has the same semantics as the
- * field of the same name in the V1 entry structure.
- */
- struct {
- grant_entry_header_t hdr;
- uint32_t pad0;
- uint64_t frame;
- } full_page;
-
- /*
- * If the grant type is GTF_grant_access and GTF_sub_page is set,
- * @domid is allowed to access bytes [@page_off,@page_off+@length)
- * in frame @frame.
- */
- struct {
- grant_entry_header_t hdr;
- uint16_t page_off;
- uint16_t length;
- uint64_t frame;
- } sub_page;
-
- /*
- * If the grant is GTF_transitive, @domid is allowed to use the
- * grant @gref in domain @trans_domid, as if it was the local
- * domain. Obviously, the transitive access must be compatible
- * with the original grant.
- *
- * The current version of Xen does not allow transitive grants
- * to be mapped.
- */
- struct {
- grant_entry_header_t hdr;
- domid_t trans_domid;
- uint16_t pad0;
- grant_ref_t gref;
- } transitive;
-
- uint32_t __spacer[4]; /* Pad to a power of two */
-};
-typedef union grant_entry_v2 grant_entry_v2_t;
-
-typedef uint16_t grant_status_t;
-
-#endif /* __XEN_INTERFACE_VERSION__ */
-
-/***********************************
- * GRANT TABLE QUERIES AND USES
- */
-
-/*
- * Handle to track a mapping created via a grant reference.
- */
-typedef uint32_t grant_handle_t;
-
-/*
- * GNTTABOP_map_grant_ref: Map the grant entry (<dom>,<ref>) for access
- * by devices and/or host CPUs. If successful, <handle> is a tracking number
- * that must be presented later to destroy the mapping(s). On error, <handle>
- * is a negative status code.
- * NOTES:
- * 1. If GNTMAP_device_map is specified then <dev_bus_addr> is the address
- * via which I/O devices may access the granted frame.
- * 2. If GNTMAP_host_map is specified then a mapping will be added at
- * either a host virtual address in the current address space, or at
- * a PTE at the specified machine address. The type of mapping to
- * perform is selected through the GNTMAP_contains_pte flag, and the
- * address is specified in <host_addr>.
- * 3. Mappings should only be destroyed via GNTTABOP_unmap_grant_ref. If a
- * host mapping is destroyed by other means then it is *NOT* guaranteed
- * to be accounted to the correct grant reference!
- */
-#define GNTTABOP_map_grant_ref 0
-struct gnttab_map_grant_ref {
- /* IN parameters. */
- uint64_t host_addr;
- uint32_t flags; /* GNTMAP_* */
- grant_ref_t ref;
- domid_t dom;
- /* OUT parameters. */
- int16_t status; /* GNTST_* */
- grant_handle_t handle;
- uint64_t dev_bus_addr;
-};
-typedef struct gnttab_map_grant_ref gnttab_map_grant_ref_t;
-DEFINE_XEN_GUEST_HANDLE(gnttab_map_grant_ref_t);
-
-/*
- * GNTTABOP_unmap_grant_ref: Destroy one or more grant-reference mappings
- * tracked by <handle>. If <host_addr> or <dev_bus_addr> is zero, that
- * field is ignored. If non-zero, they must refer to a device/host mapping
- * that is tracked by <handle>
- * NOTES:
- * 1. The call may fail in an undefined manner if either mapping is not
- * tracked by <handle>.
- * 3. After executing a batch of unmaps, it is guaranteed that no stale
- * mappings will remain in the device or host TLBs.
- */
-#define GNTTABOP_unmap_grant_ref 1
-struct gnttab_unmap_grant_ref {
- /* IN parameters. */
- uint64_t host_addr;
- uint64_t dev_bus_addr;
- grant_handle_t handle;
- /* OUT parameters. */
- int16_t status; /* GNTST_* */
-};
-typedef struct gnttab_unmap_grant_ref gnttab_unmap_grant_ref_t;
-DEFINE_XEN_GUEST_HANDLE(gnttab_unmap_grant_ref_t);
-
-/*
- * GNTTABOP_setup_table: Set up a grant table for <dom> comprising at least
- * <nr_frames> pages. The frame addresses are written to the <frame_list>.
- * Only <nr_frames> addresses are written, even if the table is larger.
- * NOTES:
- * 1. <dom> may be specified as DOMID_SELF.
- * 2. Only a sufficiently-privileged domain may specify <dom> != DOMID_SELF.
- * 3. Xen may not support more than a single grant-table page per domain.
- */
-#define GNTTABOP_setup_table 2
-struct gnttab_setup_table {
- /* IN parameters. */
- domid_t dom;
- uint32_t nr_frames;
- /* OUT parameters. */
- int16_t status; /* GNTST_* */
- XEN_GUEST_HANDLE(ulong) frame_list;
-};
-typedef struct gnttab_setup_table gnttab_setup_table_t;
-DEFINE_XEN_GUEST_HANDLE(gnttab_setup_table_t);
-
-/*
- * GNTTABOP_dump_table: Dump the contents of the grant table to the
- * xen console. Debugging use only.
- */
-#define GNTTABOP_dump_table 3
-struct gnttab_dump_table {
- /* IN parameters. */
- domid_t dom;
- /* OUT parameters. */
- int16_t status; /* GNTST_* */
-};
-typedef struct gnttab_dump_table gnttab_dump_table_t;
-DEFINE_XEN_GUEST_HANDLE(gnttab_dump_table_t);
-
-/*
- * GNTTABOP_transfer_grant_ref: Transfer <frame> to a foreign domain. The
- * foreign domain has previously registered its interest in the transfer via
- * <domid, ref>.
- *
- * Note that, even if the transfer fails, the specified page no LONG_PTRer belongs
- * to the calling domain *unless* the error is GNTST_bad_page.
- */
-#define GNTTABOP_transfer 4
-struct gnttab_transfer {
- /* IN parameters. */
- xen_pfn_t mfn;
- domid_t domid;
- grant_ref_t ref;
- /* OUT parameters. */
- int16_t status;
-};
-typedef struct gnttab_transfer gnttab_transfer_t;
-DEFINE_XEN_GUEST_HANDLE(gnttab_transfer_t);
-
-
-/*
- * GNTTABOP_copy: Hypervisor based copy
- * source and destinations can be eithers MFNs or, for foreign domains,
- * grant references. the foreign domain has to grant read/write access
- * in its grant table.
- *
- * The flags specify what type source and destinations are (either MFN
- * or grant reference).
- *
- * Note that this can also be used to copy data between two domains
- * via a third party if the source and destination domains had previously
- * grant appropriate access to their pages to the third party.
- *
- * source_offset specifies an offset in the source frame, dest_offset
- * the offset in the target frame and len specifies the number of
- * bytes to be copied.
- */
-
-#define _GNTCOPY_source_gref (0)
-#define GNTCOPY_source_gref (1<<_GNTCOPY_source_gref)
-#define _GNTCOPY_dest_gref (1)
-#define GNTCOPY_dest_gref (1<<_GNTCOPY_dest_gref)
-#define _GNTCOPY_can_fail (2)
-#define GNTCOPY_can_fail (1<<_GNTCOPY_can_fail)
-
-#define GNTTABOP_copy 5
-typedef struct gnttab_copy {
- /* IN parameters. */
- struct {
- union {
- grant_ref_t ref;
- xen_pfn_t gmfn;
- } u;
- domid_t domid;
- uint16_t offset;
- } source, dest;
- uint16_t len;
- uint16_t flags; /* GNTCOPY_* */
- /* OUT parameters. */
- int16_t status;
-} gnttab_copy_t;
-DEFINE_XEN_GUEST_HANDLE(gnttab_copy_t);
-
-/*
- * GNTTABOP_query_size: Query the current and maximum sizes of the shared
- * grant table.
- * NOTES:
- * 1. <dom> may be specified as DOMID_SELF.
- * 2. Only a sufficiently-privileged domain may specify <dom> != DOMID_SELF.
- */
-#define GNTTABOP_query_size 6
-struct gnttab_query_size {
- /* IN parameters. */
- domid_t dom;
- /* OUT parameters. */
- uint32_t nr_frames;
- uint32_t max_nr_frames;
- int16_t status; /* GNTST_* */
-};
-typedef struct gnttab_query_size gnttab_query_size_t;
-DEFINE_XEN_GUEST_HANDLE(gnttab_query_size_t);
-
-/*
- * GNTTABOP_unmap_and_replace: Destroy one or more grant-reference mappings
- * tracked by <handle> but atomically replace the page table entry with one
- * pointing to the machine address under <new_addr>. <new_addr> will be
- * redirected to the null entry.
- * NOTES:
- * 1. The call may fail in an undefined manner if either mapping is not
- * tracked by <handle>.
- * 2. After executing a batch of unmaps, it is guaranteed that no stale
- * mappings will remain in the device or host TLBs.
- */
-#define GNTTABOP_unmap_and_replace 7
-struct gnttab_unmap_and_replace {
- /* IN parameters. */
- uint64_t host_addr;
- uint64_t new_addr;
- grant_handle_t handle;
- /* OUT parameters. */
- int16_t status; /* GNTST_* */
-};
-typedef struct gnttab_unmap_and_replace gnttab_unmap_and_replace_t;
-DEFINE_XEN_GUEST_HANDLE(gnttab_unmap_and_replace_t);
-
-#if __XEN_INTERFACE_VERSION__ >= 0x0003020a
-/*
- * GNTTABOP_set_version: Request a particular version of the grant
- * table shared table structure. This operation can only be performed
- * once in any given domain. It must be performed before any grants
- * are activated; otherwise, the domain will be stuck with version 1.
- * The only defined versions are 1 and 2.
- */
-#define GNTTABOP_set_version 8
-struct gnttab_set_version {
- /* IN/OUT parameters */
- uint32_t version;
-};
-typedef struct gnttab_set_version gnttab_set_version_t;
-DEFINE_XEN_GUEST_HANDLE(gnttab_set_version_t);
-
-
-/*
- * GNTTABOP_get_status_frames: Get the list of frames used to store grant
- * status for <dom>. In grant format version 2, the status is separated
- * from the other shared grant fields to allow more efficient synchronization
- * using barriers instead of atomic cmpexch operations.
- * <nr_frames> specify the size of vector <frame_list>.
- * The frame addresses are returned in the <frame_list>.
- * Only <nr_frames> addresses are returned, even if the table is larger.
- * NOTES:
- * 1. <dom> may be specified as DOMID_SELF.
- * 2. Only a sufficiently-privileged domain may specify <dom> != DOMID_SELF.
- */
-#define GNTTABOP_get_status_frames 9
-struct gnttab_get_status_frames {
- /* IN parameters. */
- uint32_t nr_frames;
- domid_t dom;
- /* OUT parameters. */
- int16_t status; /* GNTST_* */
- XEN_GUEST_HANDLE(uint64_t) frame_list;
-};
-typedef struct gnttab_get_status_frames gnttab_get_status_frames_t;
-DEFINE_XEN_GUEST_HANDLE(gnttab_get_status_frames_t);
-
-/*
- * GNTTABOP_get_version: Get the grant table version which is in
- * effect for domain <dom>.
- */
-#define GNTTABOP_get_version 10
-struct gnttab_get_version {
- /* IN parameters */
- domid_t dom;
- uint16_t pad;
- /* OUT parameters */
- uint32_t version;
-};
-typedef struct gnttab_get_version gnttab_get_version_t;
-DEFINE_XEN_GUEST_HANDLE(gnttab_get_version_t);
-
-#endif /* __XEN_INTERFACE_VERSION__ */
-
-/*
- * Bitfield values for gnttab_map_grant_ref.flags.
- */
- /* Map the grant entry for access by I/O devices. */
-#define _GNTMAP_device_map (0)
-#define GNTMAP_device_map (1<<_GNTMAP_device_map)
- /* Map the grant entry for access by host CPUs. */
-#define _GNTMAP_host_map (1)
-#define GNTMAP_host_map (1<<_GNTMAP_host_map)
- /* Accesses to the granted frame will be restricted to read-only access. */
-#define _GNTMAP_readonly (2)
-#define GNTMAP_readonly (1<<_GNTMAP_readonly)
- /*
- * GNTMAP_host_map subflag:
- * 0 => The host mapping is usable only by the guest OS.
- * 1 => The host mapping is usable by guest OS + current application.
- */
-#define _GNTMAP_application_map (3)
-#define GNTMAP_application_map (1<<_GNTMAP_application_map)
-
- /*
- * GNTMAP_contains_pte subflag:
- * 0 => This map request contains a host virtual address.
- * 1 => This map request contains the machine addess of the PTE to update.
- */
-#define _GNTMAP_contains_pte (4)
-#define GNTMAP_contains_pte (1<<_GNTMAP_contains_pte)
-
-#define _GNTMAP_can_fail (5)
-#define GNTMAP_can_fail (1<<_GNTMAP_can_fail)
-
-/*
- * Bits to be placed in guest kernel available PTE bits (architecture
- * dependent; only supported when XENFEAT_gnttab_map_avail_bits is set).
- */
-#define _GNTMAP_guest_avail0 (16)
-#define GNTMAP_guest_avail_mask ((uint32_t)~0 << _GNTMAP_guest_avail0)
-
-/*
- * Values for error status returns. All errors are -ve.
- */
-#define GNTST_okay (0) /* Normal return. */
-#define GNTST_general_error (-1) /* General undefined error. */
-#define GNTST_bad_domain (-2) /* Unrecognsed domain id. */
-#define GNTST_bad_gntref (-3) /* Unrecognised or inappropriate gntref. */
-#define GNTST_bad_handle (-4) /* Unrecognised or inappropriate handle. */
-#define GNTST_bad_virt_addr (-5) /* Inappropriate virtual address to map. */
-#define GNTST_bad_dev_addr (-6) /* Inappropriate device address to unmap.*/
-#define GNTST_no_device_space (-7) /* Out of space in I/O MMU. */
-#define GNTST_permission_denied (-8) /* Not enough privilege for operation. */
-#define GNTST_bad_page (-9) /* Specified page was invalid for op. */
-#define GNTST_bad_copy_arg (-10) /* copy arguments cross page boundary. */
-#define GNTST_address_too_big (-11) /* transfer page address too large. */
-#define GNTST_eagain (-12) /* Could not map at the moment. Retry. */
-
-#define GNTTABOP_error_msgs { \
- "okay", \
- "undefined error", \
- "unrecognised domain id", \
- "invalid grant reference", \
- "invalid mapping handle", \
- "invalid virtual address", \
- "invalid device address", \
- "no spare translation slot in the I/O MMU", \
- "permission denied", \
- "bad page", \
- "copy arguments cross page boundary", \
- "page address size too large", \
- "could not map at the moment, retry" \
-}
-
-#endif /* __XEN_PUBLIC_GRANT_TABLE_H__ */
-
-/*
- * Local variables:
- * mode: C
- * c-set-style: "BSD"
- * c-basic-offset: 4
- * tab-width: 4
- * indent-tabs-mode: nil
- * End:
- */
+/******************************************************************************\r
+ * grant_table.h\r
+ *\r
+ * Interface for granting foreign access to page frames, and receiving\r
+ * page-ownership transfers.\r
+ *\r
+ * Permission is hereby granted, free of charge, to any person obtaining a copy\r
+ * of this software and associated documentation files (the "Software"), to\r
+ * deal in the Software without restriction, including without limitation the\r
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\r
+ * sell copies of the Software, and to permit persons to whom the Software is\r
+ * furnished to do so, subject to the following conditions:\r
+ *\r
+ * The above copyright notice and this permission notice shall be included in\r
+ * all copies or substantial portions of the Software.\r
+ *\r
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\r
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER\r
+ * DEALINGS IN THE SOFTWARE.\r
+ *\r
+ * Copyright (c) 2004, K A Fraser\r
+ */\r
+\r
+#ifndef __XEN_PUBLIC_GRANT_TABLE_H__\r
+#define __XEN_PUBLIC_GRANT_TABLE_H__\r
+\r
+#include "xen.h"\r
+\r
+/*\r
+ * `incontents 150 gnttab Grant Tables\r
+ *\r
+ * Xen's grant tables provide a generic mechanism to memory sharing\r
+ * between domains. This shared memory interface underpins the split\r
+ * device drivers for block and network IO.\r
+ *\r
+ * Each domain has its own grant table. This is a data structure that\r
+ * is shared with Xen; it allows the domain to tell Xen what kind of\r
+ * permissions other domains have on its pages. Entries in the grant\r
+ * table are identified by grant references. A grant reference is an\r
+ * integer, which indexes into the grant table. It acts as a\r
+ * capability which the grantee can use to perform operations on the\r
+ * granter’s memory.\r
+ *\r
+ * This capability-based system allows shared-memory communications\r
+ * between unprivileged domains. A grant reference also encapsulates\r
+ * the details of a shared page, removing the need for a domain to\r
+ * know the real machine address of a page it is sharing. This makes\r
+ * it possible to share memory correctly with domains running in\r
+ * fully virtualised memory.\r
+ */\r
+\r
+/***********************************\r
+ * GRANT TABLE REPRESENTATION\r
+ */\r
+\r
+/* Some rough guidelines on accessing and updating grant-table entries\r
+ * in a concurrency-safe manner. For more information, Linux contains a\r
+ * reference implementation for guest OSes (drivers/xen/grant_table.c, see\r
+ * http://git.kernel.org/?p=linux/kernel/git/torvalds/linux.git;a=blob;f=drivers/xen/grant-table.c;hb=HEAD\r
+ *\r
+ * NB. WMB is a no-op on current-generation x86 processors. However, a\r
+ * compiler barrier will still be required.\r
+ *\r
+ * Introducing a valid entry into the grant table:\r
+ * 1. Write ent->domid.\r
+ * 2. Write ent->frame:\r
+ * GTF_permit_access: Frame to which access is permitted.\r
+ * GTF_accept_transfer: Pseudo-phys frame slot being filled by new\r
+ * frame, or zero if none.\r
+ * 3. Write memory barrier (WMB).\r
+ * 4. Write ent->flags, inc. valid type.\r
+ *\r
+ * Invalidating an unused GTF_permit_access entry:\r
+ * 1. flags = ent->flags.\r
+ * 2. Observe that !(flags & (GTF_reading|GTF_writing)).\r
+ * 3. Check result of SMP-safe CMPXCHG(&ent->flags, flags, 0).\r
+ * NB. No need for WMB as reuse of entry is control-dependent on success of\r
+ * step 3, and all architectures guarantee ordering of ctrl-dep writes.\r
+ *\r
+ * Invalidating an in-use GTF_permit_access entry:\r
+ * This cannot be done directly. Request assistance from the domain controller\r
+ * which can set a timeout on the use of a grant entry and take necessary\r
+ * action. (NB. This is not yet implemented!).\r
+ *\r
+ * Invalidating an unused GTF_accept_transfer entry:\r
+ * 1. flags = ent->flags.\r
+ * 2. Observe that !(flags & GTF_transfer_committed). [*]\r
+ * 3. Check result of SMP-safe CMPXCHG(&ent->flags, flags, 0).\r
+ * NB. No need for WMB as reuse of entry is control-dependent on success of\r
+ * step 3, and all architectures guarantee ordering of ctrl-dep writes.\r
+ * [*] If GTF_transfer_committed is set then the grant entry is 'committed'.\r
+ * The guest must /not/ modify the grant entry until the address of the\r
+ * transferred frame is written. It is safe for the guest to spin waiting\r
+ * for this to occur (detect by observing GTF_transfer_completed in\r
+ * ent->flags).\r
+ *\r
+ * Invalidating a committed GTF_accept_transfer entry:\r
+ * 1. Wait for (ent->flags & GTF_transfer_completed).\r
+ *\r
+ * Changing a GTF_permit_access from writable to read-only:\r
+ * Use SMP-safe CMPXCHG to set GTF_readonly, while checking !GTF_writing.\r
+ *\r
+ * Changing a GTF_permit_access from read-only to writable:\r
+ * Use SMP-safe bit-setting instruction.\r
+ */\r
+\r
+/*\r
+ * Reference to a grant entry in a specified domain's grant table.\r
+ */\r
+typedef uint32_t grant_ref_t;\r
+\r
+/*\r
+ * A grant table comprises a packed array of grant entries in one or more\r
+ * page frames shared between Xen and a guest.\r
+ * [XEN]: This field is written by Xen and read by the sharing guest.\r
+ * [GST]: This field is written by the guest and read by Xen.\r
+ */\r
+\r
+/*\r
+ * Version 1 of the grant table entry structure is maintained purely\r
+ * for backwards compatibility. New guests should use version 2.\r
+ */\r
+#if __XEN_INTERFACE_VERSION__ < 0x0003020a\r
+#define grant_entry_v1 grant_entry\r
+#define grant_entry_v1_t grant_entry_t\r
+#endif\r
+struct grant_entry_v1 {\r
+ /* GTF_xxx: various type and flag information. [XEN,GST] */\r
+ uint16_t flags;\r
+ /* The domain being granted foreign privileges. [GST] */\r
+ domid_t domid;\r
+ /*\r
+ * GTF_permit_access: Frame that @domid is allowed to map and access. [GST]\r
+ * GTF_accept_transfer: Frame whose ownership transferred by @domid. [XEN]\r
+ */\r
+ uint32_t frame;\r
+};\r
+typedef struct grant_entry_v1 grant_entry_v1_t;\r
+\r
+/* The first few grant table entries will be preserved across grant table\r
+ * version changes and may be pre-populated at domain creation by tools.\r
+ */\r
+#define GNTTAB_NR_RESERVED_ENTRIES 8\r
+#define GNTTAB_RESERVED_CONSOLE 0\r
+#define GNTTAB_RESERVED_XENSTORE 1\r
+\r
+/*\r
+ * Type of grant entry.\r
+ * GTF_invalid: This grant entry grants no privileges.\r
+ * GTF_permit_access: Allow @domid to map/access @frame.\r
+ * GTF_accept_transfer: Allow @domid to transfer ownership of one page frame\r
+ * to this guest. Xen writes the page number to @frame.\r
+ * GTF_transitive: Allow @domid to transitively access a subrange of\r
+ * @trans_grant in @trans_domid. No mappings are allowed.\r
+ */\r
+#define GTF_invalid (0U<<0)\r
+#define GTF_permit_access (1U<<0)\r
+#define GTF_accept_transfer (2U<<0)\r
+#define GTF_transitive (3U<<0)\r
+#define GTF_type_mask (3U<<0)\r
+\r
+/*\r
+ * Subflags for GTF_permit_access.\r
+ * GTF_readonly: Restrict @domid to read-only mappings and accesses. [GST]\r
+ * GTF_reading: Grant entry is currently mapped for reading by @domid. [XEN]\r
+ * GTF_writing: Grant entry is currently mapped for writing by @domid. [XEN]\r
+ * GTF_PAT, GTF_PWT, GTF_PCD: (x86) cache attribute flags for the grant [GST]\r
+ * GTF_sub_page: Grant access to only a subrange of the page. @domid\r
+ * will only be allowed to copy from the grant, and not\r
+ * map it. [GST]\r
+ */\r
+#define _GTF_readonly (2)\r
+#define GTF_readonly (1U<<_GTF_readonly)\r
+#define _GTF_reading (3)\r
+#define GTF_reading (1U<<_GTF_reading)\r
+#define _GTF_writing (4)\r
+#define GTF_writing (1U<<_GTF_writing)\r
+#define _GTF_PWT (5)\r
+#define GTF_PWT (1U<<_GTF_PWT)\r
+#define _GTF_PCD (6)\r
+#define GTF_PCD (1U<<_GTF_PCD)\r
+#define _GTF_PAT (7)\r
+#define GTF_PAT (1U<<_GTF_PAT)\r
+#define _GTF_sub_page (8)\r
+#define GTF_sub_page (1U<<_GTF_sub_page)\r
+\r
+/*\r
+ * Subflags for GTF_accept_transfer:\r
+ * GTF_transfer_committed: Xen sets this flag to indicate that it is committed\r
+ * to transferring ownership of a page frame. When a guest sees this flag\r
+ * it must /not/ modify the grant entry until GTF_transfer_completed is\r
+ * set by Xen.\r
+ * GTF_transfer_completed: It is safe for the guest to spin-wait on this flag\r
+ * after reading GTF_transfer_committed. Xen will always write the frame\r
+ * address, followed by ORing this flag, in a timely manner.\r
+ */\r
+#define _GTF_transfer_committed (2)\r
+#define GTF_transfer_committed (1U<<_GTF_transfer_committed)\r
+#define _GTF_transfer_completed (3)\r
+#define GTF_transfer_completed (1U<<_GTF_transfer_completed)\r
+\r
+/*\r
+ * Version 2 grant table entries. These fulfil the same role as\r
+ * version 1 entries, but can represent more complicated operations.\r
+ * Any given domain will have either a version 1 or a version 2 table,\r
+ * and every entry in the table will be the same version.\r
+ *\r
+ * The interface by which domains use grant references does not depend\r
+ * on the grant table version in use by the other domain.\r
+ */\r
+#if __XEN_INTERFACE_VERSION__ >= 0x0003020a\r
+/*\r
+ * Version 1 and version 2 grant entries share a common prefix. The\r
+ * fields of the prefix are documented as part of struct\r
+ * grant_entry_v1.\r
+ */\r
+struct grant_entry_header {\r
+ uint16_t flags;\r
+ domid_t domid;\r
+};\r
+typedef struct grant_entry_header grant_entry_header_t;\r
+\r
+/*\r
+ * Version 2 of the grant entry structure.\r
+ */\r
+union grant_entry_v2 {\r
+ grant_entry_header_t hdr;\r
+\r
+ /*\r
+ * This member is used for V1-style full page grants, where either:\r
+ *\r
+ * -- hdr.type is GTF_accept_transfer, or\r
+ * -- hdr.type is GTF_permit_access and GTF_sub_page is not set.\r
+ *\r
+ * In that case, the frame field has the same semantics as the\r
+ * field of the same name in the V1 entry structure.\r
+ */\r
+ struct {\r
+ grant_entry_header_t hdr;\r
+ uint32_t pad0;\r
+ uint64_t frame;\r
+ } full_page;\r
+\r
+ /*\r
+ * If the grant type is GTF_grant_access and GTF_sub_page is set,\r
+ * @domid is allowed to access bytes [@page_off,@page_off+@length)\r
+ * in frame @frame.\r
+ */\r
+ struct {\r
+ grant_entry_header_t hdr;\r
+ uint16_t page_off;\r
+ uint16_t length;\r
+ uint64_t frame;\r
+ } sub_page;\r
+\r
+ /*\r
+ * If the grant is GTF_transitive, @domid is allowed to use the\r
+ * grant @gref in domain @trans_domid, as if it was the local\r
+ * domain. Obviously, the transitive access must be compatible\r
+ * with the original grant.\r
+ *\r
+ * The current version of Xen does not allow transitive grants\r
+ * to be mapped.\r
+ */\r
+ struct {\r
+ grant_entry_header_t hdr;\r
+ domid_t trans_domid;\r
+ uint16_t pad0;\r
+ grant_ref_t gref;\r
+ } transitive;\r
+\r
+ uint32_t __spacer[4]; /* Pad to a power of two */\r
+};\r
+typedef union grant_entry_v2 grant_entry_v2_t;\r
+\r
+typedef uint16_t grant_status_t;\r
+\r
+#endif /* __XEN_INTERFACE_VERSION__ */\r
+\r
+/***********************************\r
+ * GRANT TABLE QUERIES AND USES\r
+ */\r
+\r
+/* ` enum neg_errnoval\r
+ * ` HYPERVISOR_grant_table_op(enum grant_table_op cmd,\r
+ * ` void *args,\r
+ * ` unsigned int count)\r
+ * `\r
+ *\r
+ * @args points to an array of a per-command data structure. The array\r
+ * has @count members\r
+ */\r
+\r
+/* ` enum grant_table_op { // GNTTABOP_* => struct gnttab_* */\r
+#define GNTTABOP_map_grant_ref 0\r
+#define GNTTABOP_unmap_grant_ref 1\r
+#define GNTTABOP_setup_table 2\r
+#define GNTTABOP_dump_table 3\r
+#define GNTTABOP_transfer 4\r
+#define GNTTABOP_copy 5\r
+#define GNTTABOP_query_size 6\r
+#define GNTTABOP_unmap_and_replace 7\r
+#if __XEN_INTERFACE_VERSION__ >= 0x0003020a\r
+#define GNTTABOP_set_version 8\r
+#define GNTTABOP_get_status_frames 9\r
+#define GNTTABOP_get_version 10\r
+#define GNTTABOP_swap_grant_ref 11\r
+#endif /* __XEN_INTERFACE_VERSION__ */\r
+/* ` } */\r
+\r
+/*\r
+ * Handle to track a mapping created via a grant reference.\r
+ */\r
+typedef uint32_t grant_handle_t;\r
+\r
+/*\r
+ * GNTTABOP_map_grant_ref: Map the grant entry (<dom>,<ref>) for access\r
+ * by devices and/or host CPUs. If successful, <handle> is a tracking number\r
+ * that must be presented later to destroy the mapping(s). On error, <handle>\r
+ * is a negative status code.\r
+ * NOTES:\r
+ * 1. If GNTMAP_device_map is specified then <dev_bus_addr> is the address\r
+ * via which I/O devices may access the granted frame.\r
+ * 2. If GNTMAP_host_map is specified then a mapping will be added at\r
+ * either a host virtual address in the current address space, or at\r
+ * a PTE at the specified machine address. The type of mapping to\r
+ * perform is selected through the GNTMAP_contains_pte flag, and the\r
+ * address is specified in <host_addr>.\r
+ * 3. Mappings should only be destroyed via GNTTABOP_unmap_grant_ref. If a\r
+ * host mapping is destroyed by other means then it is *NOT* guaranteed\r
+ * to be accounted to the correct grant reference!\r
+ */\r
+struct gnttab_map_grant_ref {\r
+ /* IN parameters. */\r
+ uint64_t host_addr;\r
+ uint32_t flags; /* GNTMAP_* */\r
+ grant_ref_t ref;\r
+ domid_t dom;\r
+ /* OUT parameters. */\r
+ int16_t status; /* => enum grant_status */\r
+ grant_handle_t handle;\r
+ uint64_t dev_bus_addr;\r
+};\r
+typedef struct gnttab_map_grant_ref gnttab_map_grant_ref_t;\r
+DEFINE_XEN_GUEST_HANDLE(gnttab_map_grant_ref_t);\r
+\r
+/*\r
+ * GNTTABOP_unmap_grant_ref: Destroy one or more grant-reference mappings\r
+ * tracked by <handle>. If <host_addr> or <dev_bus_addr> is zero, that\r
+ * field is ignored. If non-zero, they must refer to a device/host mapping\r
+ * that is tracked by <handle>\r
+ * NOTES:\r
+ * 1. The call may fail in an undefined manner if either mapping is not\r
+ * tracked by <handle>.\r
+ * 3. After executing a batch of unmaps, it is guaranteed that no stale\r
+ * mappings will remain in the device or host TLBs.\r
+ */\r
+struct gnttab_unmap_grant_ref {\r
+ /* IN parameters. */\r
+ uint64_t host_addr;\r
+ uint64_t dev_bus_addr;\r
+ grant_handle_t handle;\r
+ /* OUT parameters. */\r
+ int16_t status; /* => enum grant_status */\r
+};\r
+typedef struct gnttab_unmap_grant_ref gnttab_unmap_grant_ref_t;\r
+DEFINE_XEN_GUEST_HANDLE(gnttab_unmap_grant_ref_t);\r
+\r
+/*\r
+ * GNTTABOP_setup_table: Set up a grant table for <dom> comprising at least\r
+ * <nr_frames> pages. The frame addresses are written to the <frame_list>.\r
+ * Only <nr_frames> addresses are written, even if the table is larger.\r
+ * NOTES:\r
+ * 1. <dom> may be specified as DOMID_SELF.\r
+ * 2. Only a sufficiently-privileged domain may specify <dom> != DOMID_SELF.\r
+ * 3. Xen may not support more than a single grant-table page per domain.\r
+ */\r
+struct gnttab_setup_table {\r
+ /* IN parameters. */\r
+ domid_t dom;\r
+ uint32_t nr_frames;\r
+ /* OUT parameters. */\r
+ int16_t status; /* => enum grant_status */\r
+#if __XEN_INTERFACE_VERSION__ < 0x00040300\r
+ XEN_GUEST_HANDLE(ulong) frame_list;\r
+#else\r
+ XEN_GUEST_HANDLE(xen_pfn_t) frame_list;\r
+#endif\r
+};\r
+typedef struct gnttab_setup_table gnttab_setup_table_t;\r
+DEFINE_XEN_GUEST_HANDLE(gnttab_setup_table_t);\r
+\r
+/*\r
+ * GNTTABOP_dump_table: Dump the contents of the grant table to the\r
+ * xen console. Debugging use only.\r
+ */\r
+struct gnttab_dump_table {\r
+ /* IN parameters. */\r
+ domid_t dom;\r
+ /* OUT parameters. */\r
+ int16_t status; /* => enum grant_status */\r
+};\r
+typedef struct gnttab_dump_table gnttab_dump_table_t;\r
+DEFINE_XEN_GUEST_HANDLE(gnttab_dump_table_t);\r
+\r
+/*\r
+ * GNTTABOP_transfer_grant_ref: Transfer <frame> to a foreign domain. The\r
+ * foreign domain has previously registered its interest in the transfer via\r
+ * <domid, ref>.\r
+ *\r
+ * Note that, even if the transfer fails, the specified page no LONG_PTRer belongs\r
+ * to the calling domain *unless* the error is GNTST_bad_page.\r
+ */\r
+struct gnttab_transfer {\r
+ /* IN parameters. */\r
+ xen_pfn_t mfn;\r
+ domid_t domid;\r
+ grant_ref_t ref;\r
+ /* OUT parameters. */\r
+ int16_t status;\r
+};\r
+typedef struct gnttab_transfer gnttab_transfer_t;\r
+DEFINE_XEN_GUEST_HANDLE(gnttab_transfer_t);\r
+\r
+\r
+/*\r
+ * GNTTABOP_copy: Hypervisor based copy\r
+ * source and destinations can be eithers MFNs or, for foreign domains,\r
+ * grant references. the foreign domain has to grant read/write access\r
+ * in its grant table.\r
+ *\r
+ * The flags specify what type source and destinations are (either MFN\r
+ * or grant reference).\r
+ *\r
+ * Note that this can also be used to copy data between two domains\r
+ * via a third party if the source and destination domains had previously\r
+ * grant appropriate access to their pages to the third party.\r
+ *\r
+ * source_offset specifies an offset in the source frame, dest_offset\r
+ * the offset in the target frame and len specifies the number of\r
+ * bytes to be copied.\r
+ */\r
+\r
+#define _GNTCOPY_source_gref (0)\r
+#define GNTCOPY_source_gref (1<<_GNTCOPY_source_gref)\r
+#define _GNTCOPY_dest_gref (1)\r
+#define GNTCOPY_dest_gref (1<<_GNTCOPY_dest_gref)\r
+\r
+struct gnttab_copy {\r
+ /* IN parameters. */\r
+ struct {\r
+ union {\r
+ grant_ref_t ref;\r
+ xen_pfn_t gmfn;\r
+ } u;\r
+ domid_t domid;\r
+ uint16_t offset;\r
+ } source, dest;\r
+ uint16_t len;\r
+ uint16_t flags; /* GNTCOPY_* */\r
+ /* OUT parameters. */\r
+ int16_t status;\r
+};\r
+typedef struct gnttab_copy gnttab_copy_t;\r
+DEFINE_XEN_GUEST_HANDLE(gnttab_copy_t);\r
+\r
+/*\r
+ * GNTTABOP_query_size: Query the current and maximum sizes of the shared\r
+ * grant table.\r
+ * NOTES:\r
+ * 1. <dom> may be specified as DOMID_SELF.\r
+ * 2. Only a sufficiently-privileged domain may specify <dom> != DOMID_SELF.\r
+ */\r
+struct gnttab_query_size {\r
+ /* IN parameters. */\r
+ domid_t dom;\r
+ /* OUT parameters. */\r
+ uint32_t nr_frames;\r
+ uint32_t max_nr_frames;\r
+ int16_t status; /* => enum grant_status */\r
+};\r
+typedef struct gnttab_query_size gnttab_query_size_t;\r
+DEFINE_XEN_GUEST_HANDLE(gnttab_query_size_t);\r
+\r
+/*\r
+ * GNTTABOP_unmap_and_replace: Destroy one or more grant-reference mappings\r
+ * tracked by <handle> but atomically replace the page table entry with one\r
+ * pointing to the machine address under <new_addr>. <new_addr> will be\r
+ * redirected to the null entry.\r
+ * NOTES:\r
+ * 1. The call may fail in an undefined manner if either mapping is not\r
+ * tracked by <handle>.\r
+ * 2. After executing a batch of unmaps, it is guaranteed that no stale\r
+ * mappings will remain in the device or host TLBs.\r
+ */\r
+struct gnttab_unmap_and_replace {\r
+ /* IN parameters. */\r
+ uint64_t host_addr;\r
+ uint64_t new_addr;\r
+ grant_handle_t handle;\r
+ /* OUT parameters. */\r
+ int16_t status; /* => enum grant_status */\r
+};\r
+typedef struct gnttab_unmap_and_replace gnttab_unmap_and_replace_t;\r
+DEFINE_XEN_GUEST_HANDLE(gnttab_unmap_and_replace_t);\r
+\r
+#if __XEN_INTERFACE_VERSION__ >= 0x0003020a\r
+/*\r
+ * GNTTABOP_set_version: Request a particular version of the grant\r
+ * table shared table structure. This operation can only be performed\r
+ * once in any given domain. It must be performed before any grants\r
+ * are activated; otherwise, the domain will be stuck with version 1.\r
+ * The only defined versions are 1 and 2.\r
+ */\r
+struct gnttab_set_version {\r
+ /* IN/OUT parameters */\r
+ uint32_t version;\r
+};\r
+typedef struct gnttab_set_version gnttab_set_version_t;\r
+DEFINE_XEN_GUEST_HANDLE(gnttab_set_version_t);\r
+\r
+\r
+/*\r
+ * GNTTABOP_get_status_frames: Get the list of frames used to store grant\r
+ * status for <dom>. In grant format version 2, the status is separated\r
+ * from the other shared grant fields to allow more efficient synchronization\r
+ * using barriers instead of atomic cmpexch operations.\r
+ * <nr_frames> specify the size of vector <frame_list>.\r
+ * The frame addresses are returned in the <frame_list>.\r
+ * Only <nr_frames> addresses are returned, even if the table is larger.\r
+ * NOTES:\r
+ * 1. <dom> may be specified as DOMID_SELF.\r
+ * 2. Only a sufficiently-privileged domain may specify <dom> != DOMID_SELF.\r
+ */\r
+struct gnttab_get_status_frames {\r
+ /* IN parameters. */\r
+ uint32_t nr_frames;\r
+ domid_t dom;\r
+ /* OUT parameters. */\r
+ int16_t status; /* => enum grant_status */\r
+ XEN_GUEST_HANDLE(uint64_t) frame_list;\r
+};\r
+typedef struct gnttab_get_status_frames gnttab_get_status_frames_t;\r
+DEFINE_XEN_GUEST_HANDLE(gnttab_get_status_frames_t);\r
+\r
+/*\r
+ * GNTTABOP_get_version: Get the grant table version which is in\r
+ * effect for domain <dom>.\r
+ */\r
+struct gnttab_get_version {\r
+ /* IN parameters */\r
+ domid_t dom;\r
+ uint16_t pad;\r
+ /* OUT parameters */\r
+ uint32_t version;\r
+};\r
+typedef struct gnttab_get_version gnttab_get_version_t;\r
+DEFINE_XEN_GUEST_HANDLE(gnttab_get_version_t);\r
+\r
+/*\r
+ * GNTTABOP_swap_grant_ref: Swap the contents of two grant entries.\r
+ */\r
+struct gnttab_swap_grant_ref {\r
+ /* IN parameters */\r
+ grant_ref_t ref_a;\r
+ grant_ref_t ref_b;\r
+ /* OUT parameters */\r
+ int16_t status; /* => enum grant_status */\r
+};\r
+typedef struct gnttab_swap_grant_ref gnttab_swap_grant_ref_t;\r
+DEFINE_XEN_GUEST_HANDLE(gnttab_swap_grant_ref_t);\r
+\r
+#endif /* __XEN_INTERFACE_VERSION__ */\r
+\r
+/*\r
+ * Bitfield values for gnttab_map_grant_ref.flags.\r
+ */\r
+ /* Map the grant entry for access by I/O devices. */\r
+#define _GNTMAP_device_map (0)\r
+#define GNTMAP_device_map (1<<_GNTMAP_device_map)\r
+ /* Map the grant entry for access by host CPUs. */\r
+#define _GNTMAP_host_map (1)\r
+#define GNTMAP_host_map (1<<_GNTMAP_host_map)\r
+ /* Accesses to the granted frame will be restricted to read-only access. */\r
+#define _GNTMAP_readonly (2)\r
+#define GNTMAP_readonly (1<<_GNTMAP_readonly)\r
+ /*\r
+ * GNTMAP_host_map subflag:\r
+ * 0 => The host mapping is usable only by the guest OS.\r
+ * 1 => The host mapping is usable by guest OS + current application.\r
+ */\r
+#define _GNTMAP_application_map (3)\r
+#define GNTMAP_application_map (1<<_GNTMAP_application_map)\r
+\r
+ /*\r
+ * GNTMAP_contains_pte subflag:\r
+ * 0 => This map request contains a host virtual address.\r
+ * 1 => This map request contains the machine addess of the PTE to update.\r
+ */\r
+#define _GNTMAP_contains_pte (4)\r
+#define GNTMAP_contains_pte (1<<_GNTMAP_contains_pte)\r
+\r
+#define _GNTMAP_can_fail (5)\r
+#define GNTMAP_can_fail (1<<_GNTMAP_can_fail)\r
+\r
+/*\r
+ * Bits to be placed in guest kernel available PTE bits (architecture\r
+ * dependent; only supported when XENFEAT_gnttab_map_avail_bits is set).\r
+ */\r
+#define _GNTMAP_guest_avail0 (16)\r
+#define GNTMAP_guest_avail_mask ((uint32_t)~0 << _GNTMAP_guest_avail0)\r
+\r
+/*\r
+ * Values for error status returns. All errors are -ve.\r
+ */\r
+/* ` enum grant_status { */\r
+#define GNTST_okay (0) /* Normal return. */\r
+#define GNTST_general_error (-1) /* General undefined error. */\r
+#define GNTST_bad_domain (-2) /* Unrecognsed domain id. */\r
+#define GNTST_bad_gntref (-3) /* Unrecognised or inappropriate gntref. */\r
+#define GNTST_bad_handle (-4) /* Unrecognised or inappropriate handle. */\r
+#define GNTST_bad_virt_addr (-5) /* Inappropriate virtual address to map. */\r
+#define GNTST_bad_dev_addr (-6) /* Inappropriate device address to unmap.*/\r
+#define GNTST_no_device_space (-7) /* Out of space in I/O MMU. */\r
+#define GNTST_permission_denied (-8) /* Not enough privilege for operation. */\r
+#define GNTST_bad_page (-9) /* Specified page was invalid for op. */\r
+#define GNTST_bad_copy_arg (-10) /* copy arguments cross page boundary. */\r
+#define GNTST_address_too_big (-11) /* transfer page address too large. */\r
+#define GNTST_eagain (-12) /* Operation not done; try again. */\r
+/* ` } */\r
+\r
+#define GNTTABOP_error_msgs { \\r
+ "okay", \\r
+ "undefined error", \\r
+ "unrecognised domain id", \\r
+ "invalid grant reference", \\r
+ "invalid mapping handle", \\r
+ "invalid virtual address", \\r
+ "invalid device address", \\r
+ "no spare translation slot in the I/O MMU", \\r
+ "permission denied", \\r
+ "bad page", \\r
+ "copy arguments cross page boundary", \\r
+ "page address size too large", \\r
+ "operation not done; try again" \\r
+}\r
+\r
+#endif /* __XEN_PUBLIC_GRANT_TABLE_H__ */\r
+\r
+/*\r
+ * Local variables:\r
+ * mode: C\r
+ * c-file-style: "BSD"\r
+ * c-basic-offset: 4\r
+ * tab-width: 4\r
+ * indent-tabs-mode: nil\r
+ * End:\r
+ */\r
-/*
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to
- * deal in the Software without restriction, including without limitation the
- * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
- * sell copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- */
-
-#ifndef __XEN_PUBLIC_HVM_HVM_OP_H__
-#define __XEN_PUBLIC_HVM_HVM_OP_H__
-
-#include "../xen.h"
-#include "../trace.h"
-
-/* Get/set subcommands: extra argument == pointer to xen_hvm_param struct. */
-#define HVMOP_set_param 0
-#define HVMOP_get_param 1
-struct xen_hvm_param {
- domid_t domid; /* IN */
- uint32_t index; /* IN */
- uint64_t value; /* IN/OUT */
-};
-typedef struct xen_hvm_param xen_hvm_param_t;
-DEFINE_XEN_GUEST_HANDLE(xen_hvm_param_t);
-
-/* Set the logical level of one of a domain's PCI INTx wires. */
-#define HVMOP_set_pci_intx_level 2
-struct xen_hvm_set_pci_intx_level {
- /* Domain to be updated. */
- domid_t domid;
- /* PCI INTx identification in PCI topology (domain:bus:device:intx). */
- uint8_t domain, bus, device, intx;
- /* Assertion level (0 = unasserted, 1 = asserted). */
- uint8_t level;
-};
-typedef struct xen_hvm_set_pci_intx_level xen_hvm_set_pci_intx_level_t;
-DEFINE_XEN_GUEST_HANDLE(xen_hvm_set_pci_intx_level_t);
-
-/* Set the logical level of one of a domain's ISA IRQ wires. */
-#define HVMOP_set_isa_irq_level 3
-struct xen_hvm_set_isa_irq_level {
- /* Domain to be updated. */
- domid_t domid;
- /* ISA device identification, by ISA IRQ (0-15). */
- uint8_t isa_irq;
- /* Assertion level (0 = unasserted, 1 = asserted). */
- uint8_t level;
-};
-typedef struct xen_hvm_set_isa_irq_level xen_hvm_set_isa_irq_level_t;
-DEFINE_XEN_GUEST_HANDLE(xen_hvm_set_isa_irq_level_t);
-
-#define HVMOP_set_pci_link_route 4
-struct xen_hvm_set_pci_link_route {
- /* Domain to be updated. */
- domid_t domid;
- /* PCI link identifier (0-3). */
- uint8_t link;
- /* ISA IRQ (1-15), or 0 (disable link). */
- uint8_t isa_irq;
-};
-typedef struct xen_hvm_set_pci_link_route xen_hvm_set_pci_link_route_t;
-DEFINE_XEN_GUEST_HANDLE(xen_hvm_set_pci_link_route_t);
-
-/* Flushes all VCPU TLBs: @arg must be NULL. */
-#define HVMOP_flush_tlbs 5
-
-typedef enum {
- HVMMEM_ram_rw, /* Normal read/write guest RAM */
- HVMMEM_ram_ro, /* Read-only; writes are discarded */
- HVMMEM_mmio_dm, /* Reads and write go to the device model */
-} hvmmem_type_t;
-
-/* Following tools-only interfaces may change in future. */
-#if defined(__XEN__) || defined(__XEN_TOOLS__)
-
-/* Track dirty VRAM. */
-#define HVMOP_track_dirty_vram 6
-struct xen_hvm_track_dirty_vram {
- /* Domain to be tracked. */
- domid_t domid;
- /* First pfn to track. */
- uint64_aligned_t first_pfn;
- /* Number of pages to track. */
- uint64_aligned_t nr;
- /* OUT variable. */
- /* Dirty bitmap buffer. */
- XEN_GUEST_HANDLE_64(uint8) dirty_bitmap;
-};
-typedef struct xen_hvm_track_dirty_vram xen_hvm_track_dirty_vram_t;
-DEFINE_XEN_GUEST_HANDLE(xen_hvm_track_dirty_vram_t);
-
-/* Notify that some pages got modified by the Device Model. */
-#define HVMOP_modified_memory 7
-struct xen_hvm_modified_memory {
- /* Domain to be updated. */
- domid_t domid;
- /* First pfn. */
- uint64_aligned_t first_pfn;
- /* Number of pages. */
- uint64_aligned_t nr;
-};
-typedef struct xen_hvm_modified_memory xen_hvm_modified_memory_t;
-DEFINE_XEN_GUEST_HANDLE(xen_hvm_modified_memory_t);
-
-#define HVMOP_set_mem_type 8
-/* Notify that a region of memory is to be treated in a specific way. */
-struct xen_hvm_set_mem_type {
- /* Domain to be updated. */
- domid_t domid;
- /* Memory type */
- uint16_t hvmmem_type;
- /* Number of pages. */
- uint32_t nr;
- /* First pfn. */
- uint64_aligned_t first_pfn;
-};
-typedef struct xen_hvm_set_mem_type xen_hvm_set_mem_type_t;
-DEFINE_XEN_GUEST_HANDLE(xen_hvm_set_mem_type_t);
-
-#endif /* defined(__XEN__) || defined(__XEN_TOOLS__) */
-
-/* Hint from PV drivers for pagetable destruction. */
-#define HVMOP_pagetable_dying 9
-struct xen_hvm_pagetable_dying {
- /* Domain with a pagetable about to be destroyed. */
- domid_t domid;
- uint16_t pad[3]; /* align next field on 8-byte boundary */
- /* guest physical address of the toplevel pagetable dying */
- uint64_t gpa;
-};
-typedef struct xen_hvm_pagetable_dying xen_hvm_pagetable_dying_t;
-DEFINE_XEN_GUEST_HANDLE(xen_hvm_pagetable_dying_t);
-
-/* Get the current Xen time, in nanoseconds since system boot. */
-#define HVMOP_get_time 10
-struct xen_hvm_get_time {
- uint64_t now; /* OUT */
-};
-typedef struct xen_hvm_get_time xen_hvm_get_time_t;
-DEFINE_XEN_GUEST_HANDLE(xen_hvm_get_time_t);
-
-#define HVMOP_xentrace 11
-struct xen_hvm_xentrace {
- uint16_t event, extra_bytes;
- uint8_t extra[TRACE_EXTRA_MAX * sizeof(uint32_t)];
-};
-typedef struct xen_hvm_xentrace xen_hvm_xentrace_t;
-DEFINE_XEN_GUEST_HANDLE(xen_hvm_xentrace_t);
-
-/* Following tools-only interfaces may change in future. */
-#if defined(__XEN__) || defined(__XEN_TOOLS__)
-
-#define HVMOP_set_mem_access 12
-typedef enum {
- HVMMEM_access_n,
- HVMMEM_access_r,
- HVMMEM_access_w,
- HVMMEM_access_rw,
- HVMMEM_access_x,
- HVMMEM_access_rx,
- HVMMEM_access_wx,
- HVMMEM_access_rwx,
- HVMMEM_access_rx2rw, /* Page starts off as r-x, but automatically
- * change to r-w on a write */
- HVMMEM_access_default /* Take the domain default */
-} hvmmem_access_t;
-/* Notify that a region of memory is to have specific access types */
-struct xen_hvm_set_mem_access {
- /* Domain to be updated. */
- domid_t domid;
- /* Memory type */
- uint16_t hvmmem_access; /* hvm_access_t */
- /* Number of pages, ignored on setting default access */
- uint32_t nr;
- /* First pfn, or ~0ull to set the default access for new pages */
- uint64_aligned_t first_pfn;
-};
-typedef struct xen_hvm_set_mem_access xen_hvm_set_mem_access_t;
-DEFINE_XEN_GUEST_HANDLE(xen_hvm_set_mem_access_t);
-
-#define HVMOP_get_mem_access 13
-/* Get the specific access type for that region of memory */
-struct xen_hvm_get_mem_access {
- /* Domain to be queried. */
- domid_t domid;
- /* Memory type: OUT */
- uint16_t hvmmem_access; /* hvm_access_t */
- /* pfn, or ~0ull for default access for new pages. IN */
- uint64_aligned_t pfn;
-};
-typedef struct xen_hvm_get_mem_access xen_hvm_get_mem_access_t;
-DEFINE_XEN_GUEST_HANDLE(xen_hvm_get_mem_access_t);
-
-#define HVMOP_inject_trap 14
-/* Inject a trap into a VCPU, which will get taken up on the next
- * scheduling of it. Note that the caller should know enough of the
- * state of the CPU before injecting, to know what the effect of
- * injecting the trap will be.
- */
-struct xen_hvm_inject_trap {
- /* Domain to be queried. */
- domid_t domid;
- /* VCPU */
- uint32_t vcpuid;
- /* Trap number */
- uint32_t trap;
- /* Error code, or -1 to skip */
- uint32_t error_code;
- /* CR2 for page faults */
- uint64_aligned_t cr2;
-};
-typedef struct xen_hvm_inject_trap xen_hvm_inject_trap_t;
-DEFINE_XEN_GUEST_HANDLE(xen_hvm_inject_trap_t);
-
-#endif /* defined(__XEN__) || defined(__XEN_TOOLS__) */
-
-#define HVMOP_get_mem_type 15
-/* Return hvmmem_type_t for the specified pfn. */
-struct xen_hvm_get_mem_type {
- /* Domain to be queried. */
- domid_t domid;
- /* OUT variable. */
- uint16_t mem_type;
- uint16_t pad[2]; /* align next field on 8-byte boundary */
- /* IN variable. */
- uint64_t pfn;
-};
-typedef struct xen_hvm_get_mem_type xen_hvm_get_mem_type_t;
-DEFINE_XEN_GUEST_HANDLE(xen_hvm_get_mem_type_t);
-
-#endif /* __XEN_PUBLIC_HVM_HVM_OP_H__ */
+/*\r
+ * Permission is hereby granted, free of charge, to any person obtaining a copy\r
+ * of this software and associated documentation files (the "Software"), to\r
+ * deal in the Software without restriction, including without limitation the\r
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\r
+ * sell copies of the Software, and to permit persons to whom the Software is\r
+ * furnished to do so, subject to the following conditions:\r
+ *\r
+ * The above copyright notice and this permission notice shall be included in\r
+ * all copies or substantial portions of the Software.\r
+ *\r
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\r
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER\r
+ * DEALINGS IN THE SOFTWARE.\r
+ */\r
+\r
+#ifndef __XEN_PUBLIC_HVM_HVM_OP_H__\r
+#define __XEN_PUBLIC_HVM_HVM_OP_H__\r
+\r
+#include "../xen.h"\r
+#include "../trace.h"\r
+\r
+/* Get/set subcommands: extra argument == pointer to xen_hvm_param struct. */\r
+#define HVMOP_set_param 0\r
+#define HVMOP_get_param 1\r
+struct xen_hvm_param {\r
+ domid_t domid; /* IN */\r
+ uint32_t index; /* IN */\r
+ uint64_t value; /* IN/OUT */\r
+};\r
+typedef struct xen_hvm_param xen_hvm_param_t;\r
+DEFINE_XEN_GUEST_HANDLE(xen_hvm_param_t);\r
+\r
+/* Set the logical level of one of a domain's PCI INTx wires. */\r
+#define HVMOP_set_pci_intx_level 2\r
+struct xen_hvm_set_pci_intx_level {\r
+ /* Domain to be updated. */\r
+ domid_t domid;\r
+ /* PCI INTx identification in PCI topology (domain:bus:device:intx). */\r
+ uint8_t domain, bus, device, intx;\r
+ /* Assertion level (0 = unasserted, 1 = asserted). */\r
+ uint8_t level;\r
+};\r
+typedef struct xen_hvm_set_pci_intx_level xen_hvm_set_pci_intx_level_t;\r
+DEFINE_XEN_GUEST_HANDLE(xen_hvm_set_pci_intx_level_t);\r
+\r
+/* Set the logical level of one of a domain's ISA IRQ wires. */\r
+#define HVMOP_set_isa_irq_level 3\r
+struct xen_hvm_set_isa_irq_level {\r
+ /* Domain to be updated. */\r
+ domid_t domid;\r
+ /* ISA device identification, by ISA IRQ (0-15). */\r
+ uint8_t isa_irq;\r
+ /* Assertion level (0 = unasserted, 1 = asserted). */\r
+ uint8_t level;\r
+};\r
+typedef struct xen_hvm_set_isa_irq_level xen_hvm_set_isa_irq_level_t;\r
+DEFINE_XEN_GUEST_HANDLE(xen_hvm_set_isa_irq_level_t);\r
+\r
+#define HVMOP_set_pci_link_route 4\r
+struct xen_hvm_set_pci_link_route {\r
+ /* Domain to be updated. */\r
+ domid_t domid;\r
+ /* PCI link identifier (0-3). */\r
+ uint8_t link;\r
+ /* ISA IRQ (1-15), or 0 (disable link). */\r
+ uint8_t isa_irq;\r
+};\r
+typedef struct xen_hvm_set_pci_link_route xen_hvm_set_pci_link_route_t;\r
+DEFINE_XEN_GUEST_HANDLE(xen_hvm_set_pci_link_route_t);\r
+\r
+/* Flushes all VCPU TLBs: @arg must be NULL. */\r
+#define HVMOP_flush_tlbs 5\r
+\r
+typedef enum {\r
+ HVMMEM_ram_rw, /* Normal read/write guest RAM */\r
+ HVMMEM_ram_ro, /* Read-only; writes are discarded */\r
+ HVMMEM_mmio_dm, /* Reads and write go to the device model */\r
+} hvmmem_type_t;\r
+\r
+/* Following tools-only interfaces may change in future. */\r
+#if defined(__XEN__) || defined(__XEN_TOOLS__)\r
+\r
+/* Track dirty VRAM. */\r
+#define HVMOP_track_dirty_vram 6\r
+struct xen_hvm_track_dirty_vram {\r
+ /* Domain to be tracked. */\r
+ domid_t domid;\r
+ /* First pfn to track. */\r
+ uint64_aligned_t first_pfn;\r
+ /* Number of pages to track. */\r
+ uint64_aligned_t nr;\r
+ /* OUT variable. */\r
+ /* Dirty bitmap buffer. */\r
+ XEN_GUEST_HANDLE_64(uint8) dirty_bitmap;\r
+};\r
+typedef struct xen_hvm_track_dirty_vram xen_hvm_track_dirty_vram_t;\r
+DEFINE_XEN_GUEST_HANDLE(xen_hvm_track_dirty_vram_t);\r
+\r
+/* Notify that some pages got modified by the Device Model. */\r
+#define HVMOP_modified_memory 7\r
+struct xen_hvm_modified_memory {\r
+ /* Domain to be updated. */\r
+ domid_t domid;\r
+ /* First pfn. */\r
+ uint64_aligned_t first_pfn;\r
+ /* Number of pages. */\r
+ uint64_aligned_t nr;\r
+};\r
+typedef struct xen_hvm_modified_memory xen_hvm_modified_memory_t;\r
+DEFINE_XEN_GUEST_HANDLE(xen_hvm_modified_memory_t);\r
+\r
+#define HVMOP_set_mem_type 8\r
+/* Notify that a region of memory is to be treated in a specific way. */\r
+struct xen_hvm_set_mem_type {\r
+ /* Domain to be updated. */\r
+ domid_t domid;\r
+ /* Memory type */\r
+ uint16_t hvmmem_type;\r
+ /* Number of pages. */\r
+ uint32_t nr;\r
+ /* First pfn. */\r
+ uint64_aligned_t first_pfn;\r
+};\r
+typedef struct xen_hvm_set_mem_type xen_hvm_set_mem_type_t;\r
+DEFINE_XEN_GUEST_HANDLE(xen_hvm_set_mem_type_t);\r
+\r
+#endif /* defined(__XEN__) || defined(__XEN_TOOLS__) */\r
+\r
+/* Hint from PV drivers for pagetable destruction. */\r
+#define HVMOP_pagetable_dying 9\r
+struct xen_hvm_pagetable_dying {\r
+ /* Domain with a pagetable about to be destroyed. */\r
+ domid_t domid;\r
+ uint16_t pad[3]; /* align next field on 8-byte boundary */\r
+ /* guest physical address of the toplevel pagetable dying */\r
+ uint64_t gpa;\r
+};\r
+typedef struct xen_hvm_pagetable_dying xen_hvm_pagetable_dying_t;\r
+DEFINE_XEN_GUEST_HANDLE(xen_hvm_pagetable_dying_t);\r
+\r
+/* Get the current Xen time, in nanoseconds since system boot. */\r
+#define HVMOP_get_time 10\r
+struct xen_hvm_get_time {\r
+ uint64_t now; /* OUT */\r
+};\r
+typedef struct xen_hvm_get_time xen_hvm_get_time_t;\r
+DEFINE_XEN_GUEST_HANDLE(xen_hvm_get_time_t);\r
+\r
+#define HVMOP_xentrace 11\r
+struct xen_hvm_xentrace {\r
+ uint16_t event, extra_bytes;\r
+ uint8_t extra[TRACE_EXTRA_MAX * sizeof(uint32_t)];\r
+};\r
+typedef struct xen_hvm_xentrace xen_hvm_xentrace_t;\r
+DEFINE_XEN_GUEST_HANDLE(xen_hvm_xentrace_t);\r
+\r
+/* Following tools-only interfaces may change in future. */\r
+#if defined(__XEN__) || defined(__XEN_TOOLS__)\r
+\r
+#define HVMOP_set_mem_access 12\r
+typedef enum {\r
+ HVMMEM_access_n,\r
+ HVMMEM_access_r,\r
+ HVMMEM_access_w,\r
+ HVMMEM_access_rw,\r
+ HVMMEM_access_x,\r
+ HVMMEM_access_rx,\r
+ HVMMEM_access_wx,\r
+ HVMMEM_access_rwx,\r
+ HVMMEM_access_rx2rw, /* Page starts off as r-x, but automatically\r
+ * change to r-w on a write */\r
+ HVMMEM_access_n2rwx, /* Log access: starts off as n, automatically \r
+ * goes to rwx, generating an event without\r
+ * pausing the vcpu */\r
+ HVMMEM_access_default /* Take the domain default */\r
+} hvmmem_access_t;\r
+/* Notify that a region of memory is to have specific access types */\r
+struct xen_hvm_set_mem_access {\r
+ /* Domain to be updated. */\r
+ domid_t domid;\r
+ /* Memory type */\r
+ uint16_t hvmmem_access; /* hvm_access_t */\r
+ /* Number of pages, ignored on setting default access */\r
+ uint32_t nr;\r
+ /* First pfn, or ~0ull to set the default access for new pages */\r
+ uint64_aligned_t first_pfn;\r
+};\r
+typedef struct xen_hvm_set_mem_access xen_hvm_set_mem_access_t;\r
+DEFINE_XEN_GUEST_HANDLE(xen_hvm_set_mem_access_t);\r
+\r
+#define HVMOP_get_mem_access 13\r
+/* Get the specific access type for that region of memory */\r
+struct xen_hvm_get_mem_access {\r
+ /* Domain to be queried. */\r
+ domid_t domid;\r
+ /* Memory type: OUT */\r
+ uint16_t hvmmem_access; /* hvm_access_t */\r
+ /* pfn, or ~0ull for default access for new pages. IN */\r
+ uint64_aligned_t pfn;\r
+};\r
+typedef struct xen_hvm_get_mem_access xen_hvm_get_mem_access_t;\r
+DEFINE_XEN_GUEST_HANDLE(xen_hvm_get_mem_access_t);\r
+\r
+#define HVMOP_inject_trap 14\r
+/* Inject a trap into a VCPU, which will get taken up on the next\r
+ * scheduling of it. Note that the caller should know enough of the\r
+ * state of the CPU before injecting, to know what the effect of\r
+ * injecting the trap will be.\r
+ */\r
+struct xen_hvm_inject_trap {\r
+ /* Domain to be queried. */\r
+ domid_t domid;\r
+ /* VCPU */\r
+ uint32_t vcpuid;\r
+ /* Vector number */\r
+ uint32_t vector;\r
+ /* Trap type (HVMOP_TRAP_*) */\r
+ uint32_t type;\r
+/* NB. This enumeration precisely matches hvm.h:X86_EVENTTYPE_* */\r
+# define HVMOP_TRAP_ext_int 0 /* external interrupt */\r
+# define HVMOP_TRAP_nmi 2 /* nmi */\r
+# define HVMOP_TRAP_hw_exc 3 /* hardware exception */\r
+# define HVMOP_TRAP_sw_int 4 /* software interrupt (CD nn) */\r
+# define HVMOP_TRAP_pri_sw_exc 5 /* ICEBP (F1) */\r
+# define HVMOP_TRAP_sw_exc 6 /* INT3 (CC), INTO (CE) */\r
+ /* Error code, or ~0u to skip */\r
+ uint32_t error_code;\r
+ /* Intruction length */\r
+ uint32_t insn_len;\r
+ /* CR2 for page faults */\r
+ uint64_aligned_t cr2;\r
+};\r
+typedef struct xen_hvm_inject_trap xen_hvm_inject_trap_t;\r
+DEFINE_XEN_GUEST_HANDLE(xen_hvm_inject_trap_t);\r
+\r
+#endif /* defined(__XEN__) || defined(__XEN_TOOLS__) */\r
+\r
+#define HVMOP_get_mem_type 15\r
+/* Return hvmmem_type_t for the specified pfn. */\r
+struct xen_hvm_get_mem_type {\r
+ /* Domain to be queried. */\r
+ domid_t domid;\r
+ /* OUT variable. */\r
+ uint16_t mem_type;\r
+ uint16_t pad[2]; /* align next field on 8-byte boundary */\r
+ /* IN variable. */\r
+ uint64_t pfn;\r
+};\r
+typedef struct xen_hvm_get_mem_type xen_hvm_get_mem_type_t;\r
+DEFINE_XEN_GUEST_HANDLE(xen_hvm_get_mem_type_t);\r
+\r
+/* Following tools-only interfaces may change in future. */\r
+#if defined(__XEN__) || defined(__XEN_TOOLS__)\r
+\r
+/* MSI injection for emulated devices */\r
+#define HVMOP_inject_msi 16\r
+struct xen_hvm_inject_msi {\r
+ /* Domain to be injected */\r
+ domid_t domid;\r
+ /* Data -- lower 32 bits */\r
+ uint32_t data;\r
+ /* Address (0xfeexxxxx) */\r
+ uint64_t addr;\r
+};\r
+typedef struct xen_hvm_inject_msi xen_hvm_inject_msi_t;\r
+DEFINE_XEN_GUEST_HANDLE(xen_hvm_inject_msi_t);\r
+\r
+#endif /* defined(__XEN__) || defined(__XEN_TOOLS__) */\r
+\r
+#endif /* __XEN_PUBLIC_HVM_HVM_OP_H__ */\r
-/*
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to
- * deal in the Software without restriction, including without limitation the
- * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
- * sell copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- */
-
-#ifndef __XEN_PUBLIC_HVM_PARAMS_H__
-#define __XEN_PUBLIC_HVM_PARAMS_H__
-
-#include "hvm_op.h"
-
-/*
- * Parameter space for HVMOP_{set,get}_param.
- */
-
-/*
- * How should CPU0 event-channel notifications be delivered?
- * val[63:56] == 0: val[55:0] is a delivery GSI (Global System Interrupt).
- * val[63:56] == 1: val[55:0] is a delivery PCI INTx line, as follows:
- * Domain = val[47:32], Bus = val[31:16],
- * DevFn = val[15: 8], IntX = val[ 1: 0]
- * val[63:56] == 2: val[7:0] is a vector number, check for
- * XENFEAT_hvm_callback_vector to know if this delivery
- * method is available.
- * If val == 0 then CPU0 event-channel notifications are not delivered.
- */
-#define HVM_PARAM_CALLBACK_IRQ 0
-
-/*
- * These are not used by Xen. They are here for convenience of HVM-guest
- * xenbus implementations.
- */
-#define HVM_PARAM_STORE_PFN 1
-#define HVM_PARAM_STORE_EVTCHN 2
-
-#define HVM_PARAM_PAE_ENABLED 4
-
-#define HVM_PARAM_IOREQ_PFN 5
-
-#define HVM_PARAM_BUFIOREQ_PFN 6
-
-#ifdef __ia64__
-
-#define HVM_PARAM_NVRAM_FD 7
-#define HVM_PARAM_VHPT_SIZE 8
-#define HVM_PARAM_BUFPIOREQ_PFN 9
-
-#elif defined(__i386__) || defined(__x86_64__)
-
-/* Expose Viridian interfaces to this HVM guest? */
-#define HVM_PARAM_VIRIDIAN 9
-
-#endif
-
-/*
- * Set mode for virtual timers (currently x86 only):
- * delay_for_missed_ticks (default):
- * Do not advance a vcpu's time beyond the correct delivery time for
- * interrupts that have been missed due to preemption. Deliver missed
- * interrupts when the vcpu is rescheduled and advance the vcpu's virtual
- * time stepwise for each one.
- * no_delay_for_missed_ticks:
- * As above, missed interrupts are delivered, but guest time always tracks
- * wallclock (i.e., real) time while doing so.
- * no_missed_ticks_pending:
- * No missed interrupts are held pending. Instead, to ensure ticks are
- * delivered at some non-zero rate, if we detect missed ticks then the
- * internal tick alarm is not disabled if the VCPU is preempted during the
- * next tick period.
- * one_missed_tick_pending:
- * Missed interrupts are collapsed together and delivered as one 'late tick'.
- * Guest time always tracks wallclock (i.e., real) time.
- */
-#define HVM_PARAM_TIMER_MODE 10
-#define HVMPTM_delay_for_missed_ticks 0
-#define HVMPTM_no_delay_for_missed_ticks 1
-#define HVMPTM_no_missed_ticks_pending 2
-#define HVMPTM_one_missed_tick_pending 3
-
-/* Boolean: Enable virtual HPET (high-precision event timer)? (x86-only) */
-#define HVM_PARAM_HPET_ENABLED 11
-
-/* Identity-map page directory used by Intel EPT when CR0.PG=0. */
-#define HVM_PARAM_IDENT_PT 12
-
-/* Device Model domain, defaults to 0. */
-#define HVM_PARAM_DM_DOMAIN 13
-
-/* ACPI S state: currently support S0 and S3 on x86. */
-#define HVM_PARAM_ACPI_S_STATE 14
-
-/* TSS used on Intel when CR0.PE=0. */
-#define HVM_PARAM_VM86_TSS 15
-
-/* Boolean: Enable aligning all periodic vpts to reduce interrupts */
-#define HVM_PARAM_VPT_ALIGN 16
-
-/* Console debug shared memory ring and event channel */
-#define HVM_PARAM_CONSOLE_PFN 17
-#define HVM_PARAM_CONSOLE_EVTCHN 18
-
-/*
- * Select location of ACPI PM1a and TMR control blocks. Currently two locations
- * are supported, specified by version 0 or 1 in this parameter:
- * - 0: default, use the old addresses
- * PM1A_EVT == 0x1f40; PM1A_CNT == 0x1f44; PM_TMR == 0x1f48
- * - 1: use the new default qemu addresses
- * PM1A_EVT == 0xb000; PM1A_CNT == 0xb004; PM_TMR == 0xb008
- * You can find these address definitions in <hvm/ioreq.h>
- */
-#define HVM_PARAM_ACPI_IOPORTS_LOCATION 19
-
-/* Enable blocking memory events, async or sync (pause vcpu until response)
- * onchangeonly indicates messages only on a change of value */
-#define HVM_PARAM_MEMORY_EVENT_CR0 20
-#define HVM_PARAM_MEMORY_EVENT_CR3 21
-#define HVM_PARAM_MEMORY_EVENT_CR4 22
-#define HVM_PARAM_MEMORY_EVENT_INT3 23
-#define HVM_PARAM_MEMORY_EVENT_SINGLE_STEP 25
-
-#define HVMPME_MODE_MASK (3 << 0)
-#define HVMPME_mode_disabled 0
-#define HVMPME_mode_async 1
-#define HVMPME_mode_sync 2
-#define HVMPME_onchangeonly (1 << 2)
-
-#define HVM_NR_PARAMS 26
-
-#endif /* __XEN_PUBLIC_HVM_PARAMS_H__ */
+/*\r
+ * Permission is hereby granted, free of charge, to any person obtaining a copy\r
+ * of this software and associated documentation files (the "Software"), to\r
+ * deal in the Software without restriction, including without limitation the\r
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\r
+ * sell copies of the Software, and to permit persons to whom the Software is\r
+ * furnished to do so, subject to the following conditions:\r
+ *\r
+ * The above copyright notice and this permission notice shall be included in\r
+ * all copies or substantial portions of the Software.\r
+ *\r
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\r
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER\r
+ * DEALINGS IN THE SOFTWARE.\r
+ */\r
+\r
+#ifndef __XEN_PUBLIC_HVM_PARAMS_H__\r
+#define __XEN_PUBLIC_HVM_PARAMS_H__\r
+\r
+#include "hvm_op.h"\r
+\r
+/*\r
+ * Parameter space for HVMOP_{set,get}_param.\r
+ */\r
+\r
+/*\r
+ * How should CPU0 event-channel notifications be delivered?\r
+ * val[63:56] == 0: val[55:0] is a delivery GSI (Global System Interrupt).\r
+ * val[63:56] == 1: val[55:0] is a delivery PCI INTx line, as follows:\r
+ * Domain = val[47:32], Bus = val[31:16],\r
+ * DevFn = val[15: 8], IntX = val[ 1: 0]\r
+ * val[63:56] == 2: val[7:0] is a vector number, check for\r
+ * XENFEAT_hvm_callback_vector to know if this delivery\r
+ * method is available.\r
+ * If val == 0 then CPU0 event-channel notifications are not delivered.\r
+ */\r
+#define HVM_PARAM_CALLBACK_IRQ 0\r
+\r
+/*\r
+ * These are not used by Xen. They are here for convenience of HVM-guest\r
+ * xenbus implementations.\r
+ */\r
+#define HVM_PARAM_STORE_PFN 1\r
+#define HVM_PARAM_STORE_EVTCHN 2\r
+\r
+#define HVM_PARAM_PAE_ENABLED 4\r
+\r
+#define HVM_PARAM_IOREQ_PFN 5\r
+\r
+#define HVM_PARAM_BUFIOREQ_PFN 6\r
+#define HVM_PARAM_BUFIOREQ_EVTCHN 26\r
+\r
+#if defined(__i386__) || defined(__x86_64__)\r
+\r
+/* Expose Viridian interfaces to this HVM guest? */\r
+#define HVM_PARAM_VIRIDIAN 9\r
+\r
+#endif\r
+\r
+/*\r
+ * Set mode for virtual timers (currently x86 only):\r
+ * delay_for_missed_ticks (default):\r
+ * Do not advance a vcpu's time beyond the correct delivery time for\r
+ * interrupts that have been missed due to preemption. Deliver missed\r
+ * interrupts when the vcpu is rescheduled and advance the vcpu's virtual\r
+ * time stepwise for each one.\r
+ * no_delay_for_missed_ticks:\r
+ * As above, missed interrupts are delivered, but guest time always tracks\r
+ * wallclock (i.e., real) time while doing so.\r
+ * no_missed_ticks_pending:\r
+ * No missed interrupts are held pending. Instead, to ensure ticks are\r
+ * delivered at some non-zero rate, if we detect missed ticks then the\r
+ * internal tick alarm is not disabled if the VCPU is preempted during the\r
+ * next tick period.\r
+ * one_missed_tick_pending:\r
+ * Missed interrupts are collapsed together and delivered as one 'late tick'.\r
+ * Guest time always tracks wallclock (i.e., real) time.\r
+ */\r
+#define HVM_PARAM_TIMER_MODE 10\r
+#define HVMPTM_delay_for_missed_ticks 0\r
+#define HVMPTM_no_delay_for_missed_ticks 1\r
+#define HVMPTM_no_missed_ticks_pending 2\r
+#define HVMPTM_one_missed_tick_pending 3\r
+\r
+/* Boolean: Enable virtual HPET (high-precision event timer)? (x86-only) */\r
+#define HVM_PARAM_HPET_ENABLED 11\r
+\r
+/* Identity-map page directory used by Intel EPT when CR0.PG=0. */\r
+#define HVM_PARAM_IDENT_PT 12\r
+\r
+/* Device Model domain, defaults to 0. */\r
+#define HVM_PARAM_DM_DOMAIN 13\r
+\r
+/* ACPI S state: currently support S0 and S3 on x86. */\r
+#define HVM_PARAM_ACPI_S_STATE 14\r
+\r
+/* TSS used on Intel when CR0.PE=0. */\r
+#define HVM_PARAM_VM86_TSS 15\r
+\r
+/* Boolean: Enable aligning all periodic vpts to reduce interrupts */\r
+#define HVM_PARAM_VPT_ALIGN 16\r
+\r
+/* Console debug shared memory ring and event channel */\r
+#define HVM_PARAM_CONSOLE_PFN 17\r
+#define HVM_PARAM_CONSOLE_EVTCHN 18\r
+\r
+/*\r
+ * Select location of ACPI PM1a and TMR control blocks. Currently two locations\r
+ * are supported, specified by version 0 or 1 in this parameter:\r
+ * - 0: default, use the old addresses\r
+ * PM1A_EVT == 0x1f40; PM1A_CNT == 0x1f44; PM_TMR == 0x1f48\r
+ * - 1: use the new default qemu addresses\r
+ * PM1A_EVT == 0xb000; PM1A_CNT == 0xb004; PM_TMR == 0xb008\r
+ * You can find these address definitions in <hvm/ioreq.h>\r
+ */\r
+#define HVM_PARAM_ACPI_IOPORTS_LOCATION 19\r
+\r
+/* Enable blocking memory events, async or sync (pause vcpu until response) \r
+ * onchangeonly indicates messages only on a change of value */\r
+#define HVM_PARAM_MEMORY_EVENT_CR0 20\r
+#define HVM_PARAM_MEMORY_EVENT_CR3 21\r
+#define HVM_PARAM_MEMORY_EVENT_CR4 22\r
+#define HVM_PARAM_MEMORY_EVENT_INT3 23\r
+#define HVM_PARAM_MEMORY_EVENT_SINGLE_STEP 25\r
+#define HVM_PARAM_MEMORY_EVENT_MSR 30\r
+\r
+#define HVMPME_MODE_MASK (3 << 0)\r
+#define HVMPME_mode_disabled 0\r
+#define HVMPME_mode_async 1\r
+#define HVMPME_mode_sync 2\r
+#define HVMPME_onchangeonly (1 << 2)\r
+\r
+/* Boolean: Enable nestedhvm (hvm only) */\r
+#define HVM_PARAM_NESTEDHVM 24\r
+\r
+/* Params for the mem event rings */\r
+#define HVM_PARAM_PAGING_RING_PFN 27\r
+#define HVM_PARAM_ACCESS_RING_PFN 28\r
+#define HVM_PARAM_SHARING_RING_PFN 29\r
+\r
+/* SHUTDOWN_* action in case of a triple fault */\r
+#define HVM_PARAM_TRIPLE_FAULT_REASON 31\r
+\r
+#define HVM_NR_PARAMS 32\r
+\r
+#endif /* __XEN_PUBLIC_HVM_PARAMS_H__ */\r
-/*
- * Details of the "wire" protocol between Xen Store Daemon and client
- * library or guest kernel.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to
- * deal in the Software without restriction, including without limitation the
- * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
- * sell copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- *
- * Copyright (C) 2005 Rusty Russell IBM Corporation
- */
-
-#ifndef _XS_WIRE_H
-#define _XS_WIRE_H
-
-enum xsd_sockmsg_type
-{
- XS_DEBUG,
- XS_DIRECTORY,
- XS_READ,
- XS_GET_PERMS,
- XS_WATCH,
- XS_UNWATCH,
- XS_TRANSACTION_START,
- XS_TRANSACTION_END,
- XS_INTRODUCE,
- XS_RELEASE,
- XS_GET_DOMAIN_PATH,
- XS_WRITE,
- XS_MKDIR,
- XS_RM,
- XS_SET_PERMS,
- XS_WATCH_EVENT,
- XS_ERROR,
- XS_IS_DOMAIN_INTRODUCED,
- XS_RESUME,
- XS_SET_TARGET,
- XS_RESTRICT
-};
-
-#define XS_WRITE_NONE "NONE"
-#define XS_WRITE_CREATE "CREATE"
-#define XS_WRITE_CREATE_EXCL "CREATE|EXCL"
-
-/* We hand errors as strings, for portability. */
-struct xsd_errors
-{
- int errnum;
- const char *errstring;
-};
-#ifdef EINVAL
-#define XSD_ERROR(x) { x, #x }
-/* LINTED: static unused */
-static struct xsd_errors xsd_errors[]
-#if defined(__GNUC__)
-__attribute__((unused))
-#endif
- = {
- XSD_ERROR(EINVAL),
- XSD_ERROR(EACCES),
- XSD_ERROR(EEXIST),
- XSD_ERROR(EISDIR),
- XSD_ERROR(ENOENT),
- XSD_ERROR(ENOMEM),
- XSD_ERROR(ENOSPC),
- XSD_ERROR(EIO),
- XSD_ERROR(ENOTEMPTY),
- XSD_ERROR(ENOSYS),
- XSD_ERROR(EROFS),
- XSD_ERROR(EBUSY),
- XSD_ERROR(EAGAIN),
- XSD_ERROR(EISCONN)
-};
-#endif
-
-struct xsd_sockmsg
-{
- uint32_t type; /* XS_??? */
- uint32_t req_id;/* Request identifier, echoed in daemon's response. */
- uint32_t tx_id; /* Transaction id (0 if not related to a transaction). */
- uint32_t len; /* Length of data following this. */
-
- /* Generally followed by nul-terminated string(s). */
-};
-
-enum xs_watch_type
-{
- XS_WATCH_PATH = 0,
- XS_WATCH_TOKEN
-};
-
-/* Inter-domain shared memory communications. */
-#define XENSTORE_RING_SIZE 1024
-typedef uint32_t XENSTORE_RING_IDX;
-#define MASK_XENSTORE_IDX(idx) ((idx) & (XENSTORE_RING_SIZE-1))
-struct xenstore_domain_interface {
- char req[XENSTORE_RING_SIZE]; /* Requests to xenstore daemon. */
- char rsp[XENSTORE_RING_SIZE]; /* Replies and async watch events. */
- XENSTORE_RING_IDX req_cons, req_prod;
- XENSTORE_RING_IDX rsp_cons, rsp_prod;
-};
-
-/* Violating this is very bad. See docs/misc/xenstore.txt. */
-#define XENSTORE_PAYLOAD_MAX 4096
-
-/* Violating these just gets you an error back */
-#define XENSTORE_ABS_PATH_MAX 3072
-#define XENSTORE_REL_PATH_MAX 2048
-
-#endif /* _XS_WIRE_H */
-
-/*
- * Local variables:
- * mode: C
- * c-set-style: "BSD"
- * c-basic-offset: 4
- * tab-width: 4
- * indent-tabs-mode: nil
- * End:
- */
+/*\r
+ * Details of the "wire" protocol between Xen Store Daemon and client\r
+ * library or guest kernel.\r
+ *\r
+ * Permission is hereby granted, free of charge, to any person obtaining a copy\r
+ * of this software and associated documentation files (the "Software"), to\r
+ * deal in the Software without restriction, including without limitation the\r
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\r
+ * sell copies of the Software, and to permit persons to whom the Software is\r
+ * furnished to do so, subject to the following conditions:\r
+ *\r
+ * The above copyright notice and this permission notice shall be included in\r
+ * all copies or substantial portions of the Software.\r
+ *\r
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\r
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER\r
+ * DEALINGS IN THE SOFTWARE.\r
+ *\r
+ * Copyright (C) 2005 Rusty Russell IBM Corporation\r
+ */\r
+\r
+#ifndef _XS_WIRE_H\r
+#define _XS_WIRE_H\r
+\r
+enum xsd_sockmsg_type\r
+{\r
+ XS_DEBUG,\r
+ XS_DIRECTORY,\r
+ XS_READ,\r
+ XS_GET_PERMS,\r
+ XS_WATCH,\r
+ XS_UNWATCH,\r
+ XS_TRANSACTION_START,\r
+ XS_TRANSACTION_END,\r
+ XS_INTRODUCE,\r
+ XS_RELEASE,\r
+ XS_GET_DOMAIN_PATH,\r
+ XS_WRITE,\r
+ XS_MKDIR,\r
+ XS_RM,\r
+ XS_SET_PERMS,\r
+ XS_WATCH_EVENT,\r
+ XS_ERROR,\r
+ XS_IS_DOMAIN_INTRODUCED,\r
+ XS_RESUME,\r
+ XS_SET_TARGET,\r
+ XS_RESTRICT,\r
+ XS_RESET_WATCHES\r
+};\r
+\r
+#define XS_WRITE_NONE "NONE"\r
+#define XS_WRITE_CREATE "CREATE"\r
+#define XS_WRITE_CREATE_EXCL "CREATE|EXCL"\r
+\r
+/* We hand errors as strings, for portability. */\r
+struct xsd_errors\r
+{\r
+ int errnum;\r
+ const char *errstring;\r
+};\r
+#ifdef EINVAL\r
+#define XSD_ERROR(x) { x, #x }\r
+/* LINTED: static unused */\r
+static struct xsd_errors xsd_errors[]\r
+#if defined(__GNUC__)\r
+__attribute__((unused))\r
+#endif\r
+ = {\r
+ XSD_ERROR(EINVAL),\r
+ XSD_ERROR(EACCES),\r
+ XSD_ERROR(EEXIST),\r
+ XSD_ERROR(EISDIR),\r
+ XSD_ERROR(ENOENT),\r
+ XSD_ERROR(ENOMEM),\r
+ XSD_ERROR(ENOSPC),\r
+ XSD_ERROR(EIO),\r
+ XSD_ERROR(ENOTEMPTY),\r
+ XSD_ERROR(ENOSYS),\r
+ XSD_ERROR(EROFS),\r
+ XSD_ERROR(EBUSY),\r
+ XSD_ERROR(EAGAIN),\r
+ XSD_ERROR(EISCONN)\r
+};\r
+#endif\r
+\r
+struct xsd_sockmsg\r
+{\r
+ uint32_t type; /* XS_??? */\r
+ uint32_t req_id;/* Request identifier, echoed in daemon's response. */\r
+ uint32_t tx_id; /* Transaction id (0 if not related to a transaction). */\r
+ uint32_t len; /* Length of data following this. */\r
+\r
+ /* Generally followed by nul-terminated string(s). */\r
+};\r
+\r
+enum xs_watch_type\r
+{\r
+ XS_WATCH_PATH = 0,\r
+ XS_WATCH_TOKEN\r
+};\r
+\r
+/*\r
+ * `incontents 150 xenstore_struct XenStore wire protocol.\r
+ *\r
+ * Inter-domain shared memory communications. */\r
+#define XENSTORE_RING_SIZE 1024\r
+typedef uint32_t XENSTORE_RING_IDX;\r
+#define MASK_XENSTORE_IDX(idx) ((idx) & (XENSTORE_RING_SIZE-1))\r
+struct xenstore_domain_interface {\r
+ char req[XENSTORE_RING_SIZE]; /* Requests to xenstore daemon. */\r
+ char rsp[XENSTORE_RING_SIZE]; /* Replies and async watch events. */\r
+ XENSTORE_RING_IDX req_cons, req_prod;\r
+ XENSTORE_RING_IDX rsp_cons, rsp_prod;\r
+};\r
+\r
+/* Violating this is very bad. See docs/misc/xenstore.txt. */\r
+#define XENSTORE_PAYLOAD_MAX 4096\r
+\r
+/* Violating these just gets you an error back */\r
+#define XENSTORE_ABS_PATH_MAX 3072\r
+#define XENSTORE_REL_PATH_MAX 2048\r
+\r
+#endif /* _XS_WIRE_H */\r
+\r
+/*\r
+ * Local variables:\r
+ * mode: C\r
+ * c-file-style: "BSD"\r
+ * c-basic-offset: 4\r
+ * tab-width: 4\r
+ * indent-tabs-mode: nil\r
+ * End:\r
+ */\r
-/******************************************************************************
- * memory.h
- *
- * Memory reservation and information.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to
- * deal in the Software without restriction, including without limitation the
- * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
- * sell copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- *
- * Copyright (c) 2005, Keir Fraser <keir@xensource.com>
- */
-
-#ifndef __XEN_PUBLIC_MEMORY_H__
-#define __XEN_PUBLIC_MEMORY_H__
-
-#include "xen.h"
-
-/*
- * Increase or decrease the specified domain's memory reservation. Returns the
- * number of extents successfully allocated or freed.
- * arg == addr of struct xen_memory_reservation.
- */
-#define XENMEM_increase_reservation 0
-#define XENMEM_decrease_reservation 1
-#define XENMEM_populate_physmap 6
-
-#if __XEN_INTERFACE_VERSION__ >= 0x00030209
-/*
- * Maximum # bits addressable by the user of the allocated region (e.g., I/O
- * devices often have a 32-bit limitation even in 64-bit systems). If zero
- * then the user has no addressing restriction. This field is not used by
- * XENMEM_decrease_reservation.
- */
-#define XENMEMF_address_bits(x) (x)
-#define XENMEMF_get_address_bits(x) ((x) & 0xffu)
-/* NUMA node to allocate from. */
-#define XENMEMF_node(x) (((x) + 1) << 8)
-#define XENMEMF_get_node(x) ((((x) >> 8) - 1) & 0xffu)
-/* Flag to populate physmap with populate-on-demand entries */
-#define XENMEMF_populate_on_demand (1<<16)
-/* Flag to request allocation only from the node specified */
-#define XENMEMF_exact_node_request (1<<17)
-#define XENMEMF_exact_node(n) (XENMEMF_node(n) | XENMEMF_exact_node_request)
-#endif
-
-struct xen_memory_reservation {
-
- /*
- * XENMEM_increase_reservation:
- * OUT: MFN (*not* GMFN) bases of extents that were allocated
- * XENMEM_decrease_reservation:
- * IN: GMFN bases of extents to free
- * XENMEM_populate_physmap:
- * IN: GPFN bases of extents to populate with memory
- * OUT: GMFN bases of extents that were allocated
- * (NB. This command also updates the mach_to_phys translation table)
- */
- XEN_GUEST_HANDLE(xen_pfn_t) extent_start;
-
- /* Number of extents, and size/alignment of each (2^extent_order pages). */
- xen_ulong_t nr_extents;
- unsigned int extent_order;
-
-#if __XEN_INTERFACE_VERSION__ >= 0x00030209
- /* XENMEMF flags. */
- unsigned int mem_flags;
-#else
- unsigned int address_bits;
-#endif
-
- /*
- * Domain whose reservation is being changed.
- * Unprivileged domains can specify only DOMID_SELF.
- */
- domid_t domid;
-};
-typedef struct xen_memory_reservation xen_memory_reservation_t;
-DEFINE_XEN_GUEST_HANDLE(xen_memory_reservation_t);
-
-/*
- * An atomic exchange of memory pages. If return code is zero then
- * @out.extent_list provides GMFNs of the newly-allocated memory.
- * Returns zero on complete success, otherwise a negative error code.
- * On complete success then always @nr_exchanged == @in.nr_extents.
- * On partial success @nr_exchanged indicates how much work was done.
- */
-#define XENMEM_exchange 11
-struct xen_memory_exchange {
- /*
- * [IN] Details of memory extents to be exchanged (GMFN bases).
- * Note that @in.address_bits is ignored and unused.
- */
- struct xen_memory_reservation in;
-
- /*
- * [IN/OUT] Details of new memory extents.
- * We require that:
- * 1. @in.domid == @out.domid
- * 2. @in.nr_extents << @in.extent_order ==
- * @out.nr_extents << @out.extent_order
- * 3. @in.extent_start and @out.extent_start lists must not overlap
- * 4. @out.extent_start lists GPFN bases to be populated
- * 5. @out.extent_start is overwritten with allocated GMFN bases
- */
- struct xen_memory_reservation out;
-
- /*
- * [OUT] Number of input extents that were successfully exchanged:
- * 1. The first @nr_exchanged input extents were successfully
- * deallocated.
- * 2. The corresponding first entries in the output extent list correctly
- * indicate the GMFNs that were successfully exchanged.
- * 3. All other input and output extents are untouched.
- * 4. If not all input exents are exchanged then the return code of this
- * command will be non-zero.
- * 5. THIS FIELD MUST BE INITIALISED TO ZERO BY THE CALLER!
- */
- xen_ulong_t nr_exchanged;
-};
-typedef struct xen_memory_exchange xen_memory_exchange_t;
-DEFINE_XEN_GUEST_HANDLE(xen_memory_exchange_t);
-
-/*
- * Returns the maximum machine frame number of mapped RAM in this system.
- * This command always succeeds (it never returns an error code).
- * arg == NULL.
- */
-#define XENMEM_maximum_ram_page 2
-
-/*
- * Returns the current or maximum memory reservation, in pages, of the
- * specified domain (may be DOMID_SELF). Returns -ve errcode on failure.
- * arg == addr of domid_t.
- */
-#define XENMEM_current_reservation 3
-#define XENMEM_maximum_reservation 4
-
-/*
- * Returns the maximum GPFN in use by the guest, or -ve errcode on failure.
- */
-#define XENMEM_maximum_gpfn 14
-
-/*
- * Returns a list of MFN bases of 2MB extents comprising the machine_to_phys
- * mapping table. Architectures which do not have a m2p table do not implement
- * this command.
- * arg == addr of xen_machphys_mfn_list_t.
- */
-#define XENMEM_machphys_mfn_list 5
-struct xen_machphys_mfn_list {
- /*
- * Size of the 'extent_start' array. Fewer entries will be filled if the
- * machphys table is smaller than max_extents * 2MB.
- */
- unsigned int max_extents;
-
- /*
- * Pointer to buffer to fill with list of extent starts. If there are
- * any large discontiguities in the machine address space, 2MB gaps in
- * the machphys table will be represented by an MFN base of zero.
- */
- XEN_GUEST_HANDLE(xen_pfn_t) extent_start;
-
- /*
- * Number of extents written to the above array. This will be smaller
- * than 'max_extents' if the machphys table is smaller than max_e * 2MB.
- */
- unsigned int nr_extents;
-};
-typedef struct xen_machphys_mfn_list xen_machphys_mfn_list_t;
-DEFINE_XEN_GUEST_HANDLE(xen_machphys_mfn_list_t);
-
-/*
- * Returns the location in virtual address space of the machine_to_phys
- * mapping table. Architectures which do not have a m2p table, or which do not
- * map it by default into guest address space, do not implement this command.
- * arg == addr of xen_machphys_mapping_t.
- */
-#define XENMEM_machphys_mapping 12
-struct xen_machphys_mapping {
- xen_ulong_t v_start, v_end; /* Start and end virtual addresses. */
- xen_ulong_t max_mfn; /* Maximum MFN that can be looked up. */
-};
-typedef struct xen_machphys_mapping xen_machphys_mapping_t;
-DEFINE_XEN_GUEST_HANDLE(xen_machphys_mapping_t);
-
-/*
- * Sets the GPFN at which a particular page appears in the specified guest's
- * pseudophysical address space.
- * arg == addr of xen_add_to_physmap_t.
- */
-#define XENMEM_add_to_physmap 7
-struct xen_add_to_physmap {
- /* Which domain to change the mapping for. */
- domid_t domid;
-
- /* Source mapping space. */
-#define XENMAPSPACE_shared_info 0 /* shared info page */
-#define XENMAPSPACE_grant_table 1 /* grant table page */
-#define XENMAPSPACE_gmfn 2 /* GMFN */
- unsigned int space;
-
-#define XENMAPIDX_grant_table_status 0x80000000
-
- /* Index into source mapping space. */
- xen_ulong_t idx;
-
- /* GPFN where the source mapping page should appear. */
- xen_pfn_t gpfn;
-};
-typedef struct xen_add_to_physmap xen_add_to_physmap_t;
-DEFINE_XEN_GUEST_HANDLE(xen_add_to_physmap_t);
-
-/*** REMOVED ***/
-/*#define XENMEM_translate_gpfn_list 8*/
-
-/*
- * Returns the pseudo-physical memory map as it was when the domain
- * was started (specified by XENMEM_set_memory_map).
- * arg == addr of xen_memory_map_t.
- */
-#define XENMEM_memory_map 9
-struct xen_memory_map {
- /*
- * On call the number of entries which can be stored in buffer. On
- * return the number of entries which have been stored in
- * buffer.
- */
- unsigned int nr_entries;
-
- /*
- * Entries in the buffer are in the same format as returned by the
- * BIOS INT 0x15 EAX=0xE820 call.
- */
- XEN_GUEST_HANDLE(void) buffer;
-};
-typedef struct xen_memory_map xen_memory_map_t;
-DEFINE_XEN_GUEST_HANDLE(xen_memory_map_t);
-
-/*
- * Returns the real physical memory map. Passes the same structure as
- * XENMEM_memory_map.
- * arg == addr of xen_memory_map_t.
- */
-#define XENMEM_machine_memory_map 10
-
-/*
- * Set the pseudo-physical memory map of a domain, as returned by
- * XENMEM_memory_map.
- * arg == addr of xen_foreign_memory_map_t.
- */
-#define XENMEM_set_memory_map 13
-struct xen_foreign_memory_map {
- domid_t domid;
- struct xen_memory_map map;
-};
-typedef struct xen_foreign_memory_map xen_foreign_memory_map_t;
-DEFINE_XEN_GUEST_HANDLE(xen_foreign_memory_map_t);
-
-#define XENMEM_set_pod_target 16
-#define XENMEM_get_pod_target 17
-struct xen_pod_target {
- /* IN */
- uint64_t target_pages;
- /* OUT */
- uint64_t tot_pages;
- uint64_t pod_cache_pages;
- uint64_t pod_entries;
- /* IN */
- domid_t domid;
-};
-typedef struct xen_pod_target xen_pod_target_t;
-
-/*
- * Get the number of MFNs saved through memory sharing.
- * The call never fails.
- */
-#define XENMEM_get_sharing_freed_pages 18
-
-#endif /* __XEN_PUBLIC_MEMORY_H__ */
-
-/*
- * Local variables:
- * mode: C
- * c-set-style: "BSD"
- * c-basic-offset: 4
- * tab-width: 4
- * indent-tabs-mode: nil
- * End:
- */
+/******************************************************************************\r
+ * memory.h\r
+ * \r
+ * Memory reservation and information.\r
+ * \r
+ * Permission is hereby granted, free of charge, to any person obtaining a copy\r
+ * of this software and associated documentation files (the "Software"), to\r
+ * deal in the Software without restriction, including without limitation the\r
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\r
+ * sell copies of the Software, and to permit persons to whom the Software is\r
+ * furnished to do so, subject to the following conditions:\r
+ *\r
+ * The above copyright notice and this permission notice shall be included in\r
+ * all copies or substantial portions of the Software.\r
+ *\r
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\r
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER\r
+ * DEALINGS IN THE SOFTWARE.\r
+ *\r
+ * Copyright (c) 2005, Keir Fraser <keir@xensource.com>\r
+ */\r
+\r
+#ifndef __XEN_PUBLIC_MEMORY_H__\r
+#define __XEN_PUBLIC_MEMORY_H__\r
+\r
+#include "xen.h"\r
+\r
+/*\r
+ * Increase or decrease the specified domain's memory reservation. Returns the\r
+ * number of extents successfully allocated or freed.\r
+ * arg == addr of struct xen_memory_reservation.\r
+ */\r
+#define XENMEM_increase_reservation 0\r
+#define XENMEM_decrease_reservation 1\r
+#define XENMEM_populate_physmap 6\r
+\r
+#if __XEN_INTERFACE_VERSION__ >= 0x00030209\r
+/*\r
+ * Maximum # bits addressable by the user of the allocated region (e.g., I/O \r
+ * devices often have a 32-bit limitation even in 64-bit systems). If zero \r
+ * then the user has no addressing restriction. This field is not used by \r
+ * XENMEM_decrease_reservation.\r
+ */\r
+#define XENMEMF_address_bits(x) (x)\r
+#define XENMEMF_get_address_bits(x) ((x) & 0xffu)\r
+/* NUMA node to allocate from. */\r
+#define XENMEMF_node(x) (((x) + 1) << 8)\r
+#define XENMEMF_get_node(x) ((((x) >> 8) - 1) & 0xffu)\r
+/* Flag to populate physmap with populate-on-demand entries */\r
+#define XENMEMF_populate_on_demand (1<<16)\r
+/* Flag to request allocation only from the node specified */\r
+#define XENMEMF_exact_node_request (1<<17)\r
+#define XENMEMF_exact_node(n) (XENMEMF_node(n) | XENMEMF_exact_node_request)\r
+#endif\r
+\r
+struct xen_memory_reservation {\r
+\r
+ /*\r
+ * XENMEM_increase_reservation:\r
+ * OUT: MFN (*not* GMFN) bases of extents that were allocated\r
+ * XENMEM_decrease_reservation:\r
+ * IN: GMFN bases of extents to free\r
+ * XENMEM_populate_physmap:\r
+ * IN: GPFN bases of extents to populate with memory\r
+ * OUT: GMFN bases of extents that were allocated\r
+ * (NB. This command also updates the mach_to_phys translation table)\r
+ * XENMEM_claim_pages:\r
+ * IN: must be zero\r
+ */\r
+ XEN_GUEST_HANDLE(xen_pfn_t) extent_start;\r
+\r
+ /* Number of extents, and size/alignment of each (2^extent_order pages). */\r
+ xen_ulong_t nr_extents;\r
+ unsigned int extent_order;\r
+\r
+#if __XEN_INTERFACE_VERSION__ >= 0x00030209\r
+ /* XENMEMF flags. */\r
+ unsigned int mem_flags;\r
+#else\r
+ unsigned int address_bits;\r
+#endif\r
+\r
+ /*\r
+ * Domain whose reservation is being changed.\r
+ * Unprivileged domains can specify only DOMID_SELF.\r
+ */\r
+ domid_t domid;\r
+};\r
+typedef struct xen_memory_reservation xen_memory_reservation_t;\r
+DEFINE_XEN_GUEST_HANDLE(xen_memory_reservation_t);\r
+\r
+/*\r
+ * An atomic exchange of memory pages. If return code is zero then\r
+ * @out.extent_list provides GMFNs of the newly-allocated memory.\r
+ * Returns zero on complete success, otherwise a negative error code.\r
+ * On complete success then always @nr_exchanged == @in.nr_extents.\r
+ * On partial success @nr_exchanged indicates how much work was done.\r
+ */\r
+#define XENMEM_exchange 11\r
+struct xen_memory_exchange {\r
+ /*\r
+ * [IN] Details of memory extents to be exchanged (GMFN bases).\r
+ * Note that @in.address_bits is ignored and unused.\r
+ */\r
+ struct xen_memory_reservation in;\r
+\r
+ /*\r
+ * [IN/OUT] Details of new memory extents.\r
+ * We require that:\r
+ * 1. @in.domid == @out.domid\r
+ * 2. @in.nr_extents << @in.extent_order == \r
+ * @out.nr_extents << @out.extent_order\r
+ * 3. @in.extent_start and @out.extent_start lists must not overlap\r
+ * 4. @out.extent_start lists GPFN bases to be populated\r
+ * 5. @out.extent_start is overwritten with allocated GMFN bases\r
+ */\r
+ struct xen_memory_reservation out;\r
+\r
+ /*\r
+ * [OUT] Number of input extents that were successfully exchanged:\r
+ * 1. The first @nr_exchanged input extents were successfully\r
+ * deallocated.\r
+ * 2. The corresponding first entries in the output extent list correctly\r
+ * indicate the GMFNs that were successfully exchanged.\r
+ * 3. All other input and output extents are untouched.\r
+ * 4. If not all input exents are exchanged then the return code of this\r
+ * command will be non-zero.\r
+ * 5. THIS FIELD MUST BE INITIALISED TO ZERO BY THE CALLER!\r
+ */\r
+ xen_ulong_t nr_exchanged;\r
+};\r
+typedef struct xen_memory_exchange xen_memory_exchange_t;\r
+DEFINE_XEN_GUEST_HANDLE(xen_memory_exchange_t);\r
+\r
+/*\r
+ * Returns the maximum machine frame number of mapped RAM in this system.\r
+ * This command always succeeds (it never returns an error code).\r
+ * arg == NULL.\r
+ */\r
+#define XENMEM_maximum_ram_page 2\r
+\r
+/*\r
+ * Returns the current or maximum memory reservation, in pages, of the\r
+ * specified domain (may be DOMID_SELF). Returns -ve errcode on failure.\r
+ * arg == addr of domid_t.\r
+ */\r
+#define XENMEM_current_reservation 3\r
+#define XENMEM_maximum_reservation 4\r
+\r
+/*\r
+ * Returns the maximum GPFN in use by the guest, or -ve errcode on failure.\r
+ */\r
+#define XENMEM_maximum_gpfn 14\r
+\r
+/*\r
+ * Returns a list of MFN bases of 2MB extents comprising the machine_to_phys\r
+ * mapping table. Architectures which do not have a m2p table do not implement\r
+ * this command.\r
+ * arg == addr of xen_machphys_mfn_list_t.\r
+ */\r
+#define XENMEM_machphys_mfn_list 5\r
+struct xen_machphys_mfn_list {\r
+ /*\r
+ * Size of the 'extent_start' array. Fewer entries will be filled if the\r
+ * machphys table is smaller than max_extents * 2MB.\r
+ */\r
+ unsigned int max_extents;\r
+\r
+ /*\r
+ * Pointer to buffer to fill with list of extent starts. If there are\r
+ * any large discontiguities in the machine address space, 2MB gaps in\r
+ * the machphys table will be represented by an MFN base of zero.\r
+ */\r
+ XEN_GUEST_HANDLE(xen_pfn_t) extent_start;\r
+\r
+ /*\r
+ * Number of extents written to the above array. This will be smaller\r
+ * than 'max_extents' if the machphys table is smaller than max_e * 2MB.\r
+ */\r
+ unsigned int nr_extents;\r
+};\r
+typedef struct xen_machphys_mfn_list xen_machphys_mfn_list_t;\r
+DEFINE_XEN_GUEST_HANDLE(xen_machphys_mfn_list_t);\r
+\r
+/*\r
+ * Returns the location in virtual address space of the machine_to_phys\r
+ * mapping table. Architectures which do not have a m2p table, or which do not\r
+ * map it by default into guest address space, do not implement this command.\r
+ * arg == addr of xen_machphys_mapping_t.\r
+ */\r
+#define XENMEM_machphys_mapping 12\r
+struct xen_machphys_mapping {\r
+ xen_ulong_t v_start, v_end; /* Start and end virtual addresses. */\r
+ xen_ulong_t max_mfn; /* Maximum MFN that can be looked up. */\r
+};\r
+typedef struct xen_machphys_mapping xen_machphys_mapping_t;\r
+DEFINE_XEN_GUEST_HANDLE(xen_machphys_mapping_t);\r
+\r
+/* Source mapping space. */\r
+/* ` enum phys_map_space { */\r
+#define XENMAPSPACE_shared_info 0 /* shared info page */\r
+#define XENMAPSPACE_grant_table 1 /* grant table page */\r
+#define XENMAPSPACE_gmfn 2 /* GMFN */\r
+#define XENMAPSPACE_gmfn_range 3 /* GMFN range, XENMEM_add_to_physmap only. */\r
+#define XENMAPSPACE_gmfn_foreign 4 /* GMFN from another dom,\r
+ * XENMEM_add_to_physmap_range only.\r
+ */\r
+/* ` } */\r
+\r
+/*\r
+ * Sets the GPFN at which a particular page appears in the specified guest's\r
+ * pseudophysical address space.\r
+ * arg == addr of xen_add_to_physmap_t.\r
+ */\r
+#define XENMEM_add_to_physmap 7\r
+struct xen_add_to_physmap {\r
+ /* Which domain to change the mapping for. */\r
+ domid_t domid;\r
+\r
+ /* Number of pages to go through for gmfn_range */\r
+ uint16_t size;\r
+\r
+ unsigned int space; /* => enum phys_map_space */\r
+\r
+#define XENMAPIDX_grant_table_status 0x80000000\r
+\r
+ /* Index into space being mapped. */\r
+ xen_ulong_t idx;\r
+\r
+ /* GPFN in domid where the source mapping page should appear. */\r
+ xen_pfn_t gpfn;\r
+};\r
+typedef struct xen_add_to_physmap xen_add_to_physmap_t;\r
+DEFINE_XEN_GUEST_HANDLE(xen_add_to_physmap_t);\r
+\r
+/* A batched version of add_to_physmap. */\r
+#define XENMEM_add_to_physmap_range 23\r
+struct xen_add_to_physmap_range {\r
+ /* IN */\r
+ /* Which domain to change the mapping for. */\r
+ domid_t domid;\r
+ uint16_t space; /* => enum phys_map_space */\r
+\r
+ /* Number of pages to go through */\r
+ uint16_t size;\r
+ domid_t foreign_domid; /* IFF gmfn_foreign */\r
+\r
+ /* Indexes into space being mapped. */\r
+ XEN_GUEST_HANDLE(xen_ulong_t) idxs;\r
+\r
+ /* GPFN in domid where the source mapping page should appear. */\r
+ XEN_GUEST_HANDLE(xen_pfn_t) gpfns;\r
+\r
+ /* OUT */\r
+\r
+ /* Per index error code. */\r
+ XEN_GUEST_HANDLE(int) errs;\r
+};\r
+typedef struct xen_add_to_physmap_range xen_add_to_physmap_range_t;\r
+DEFINE_XEN_GUEST_HANDLE(xen_add_to_physmap_range_t);\r
+\r
+/*\r
+ * Unmaps the page appearing at a particular GPFN from the specified guest's\r
+ * pseudophysical address space.\r
+ * arg == addr of xen_remove_from_physmap_t.\r
+ */\r
+#define XENMEM_remove_from_physmap 15\r
+struct xen_remove_from_physmap {\r
+ /* Which domain to change the mapping for. */\r
+ domid_t domid;\r
+\r
+ /* GPFN of the current mapping of the page. */\r
+ xen_pfn_t gpfn;\r
+};\r
+typedef struct xen_remove_from_physmap xen_remove_from_physmap_t;\r
+DEFINE_XEN_GUEST_HANDLE(xen_remove_from_physmap_t);\r
+\r
+/*** REMOVED ***/\r
+/*#define XENMEM_translate_gpfn_list 8*/\r
+\r
+/*\r
+ * Returns the pseudo-physical memory map as it was when the domain\r
+ * was started (specified by XENMEM_set_memory_map).\r
+ * arg == addr of xen_memory_map_t.\r
+ */\r
+#define XENMEM_memory_map 9\r
+struct xen_memory_map {\r
+ /*\r
+ * On call the number of entries which can be stored in buffer. On\r
+ * return the number of entries which have been stored in\r
+ * buffer.\r
+ */\r
+ unsigned int nr_entries;\r
+\r
+ /*\r
+ * Entries in the buffer are in the same format as returned by the\r
+ * BIOS INT 0x15 EAX=0xE820 call.\r
+ */\r
+ XEN_GUEST_HANDLE(void) buffer;\r
+};\r
+typedef struct xen_memory_map xen_memory_map_t;\r
+DEFINE_XEN_GUEST_HANDLE(xen_memory_map_t);\r
+\r
+/*\r
+ * Returns the real physical memory map. Passes the same structure as\r
+ * XENMEM_memory_map.\r
+ * arg == addr of xen_memory_map_t.\r
+ */\r
+#define XENMEM_machine_memory_map 10\r
+\r
+/*\r
+ * Set the pseudo-physical memory map of a domain, as returned by\r
+ * XENMEM_memory_map.\r
+ * arg == addr of xen_foreign_memory_map_t.\r
+ */\r
+#define XENMEM_set_memory_map 13\r
+struct xen_foreign_memory_map {\r
+ domid_t domid;\r
+ struct xen_memory_map map;\r
+};\r
+typedef struct xen_foreign_memory_map xen_foreign_memory_map_t;\r
+DEFINE_XEN_GUEST_HANDLE(xen_foreign_memory_map_t);\r
+\r
+#define XENMEM_set_pod_target 16\r
+#define XENMEM_get_pod_target 17\r
+struct xen_pod_target {\r
+ /* IN */\r
+ uint64_t target_pages;\r
+ /* OUT */\r
+ uint64_t tot_pages;\r
+ uint64_t pod_cache_pages;\r
+ uint64_t pod_entries;\r
+ /* IN */\r
+ domid_t domid;\r
+};\r
+typedef struct xen_pod_target xen_pod_target_t;\r
+\r
+#if defined(__XEN__) || defined(__XEN_TOOLS__)\r
+\r
+#ifndef uint64_aligned_t\r
+#define uint64_aligned_t uint64_t\r
+#endif\r
+\r
+/*\r
+ * Get the number of MFNs saved through memory sharing.\r
+ * The call never fails. \r
+ */\r
+#define XENMEM_get_sharing_freed_pages 18\r
+#define XENMEM_get_sharing_shared_pages 19\r
+\r
+#define XENMEM_paging_op 20\r
+#define XENMEM_paging_op_nominate 0\r
+#define XENMEM_paging_op_evict 1\r
+#define XENMEM_paging_op_prep 2\r
+\r
+#define XENMEM_access_op 21\r
+#define XENMEM_access_op_resume 0\r
+\r
+struct xen_mem_event_op {\r
+ uint8_t op; /* XENMEM_*_op_* */\r
+ domid_t domain;\r
+ \r
+\r
+ /* PAGING_PREP IN: buffer to immediately fill page in */\r
+ uint64_aligned_t buffer;\r
+ /* Other OPs */\r
+ uint64_aligned_t gfn; /* IN: gfn of page being operated on */\r
+};\r
+typedef struct xen_mem_event_op xen_mem_event_op_t;\r
+DEFINE_XEN_GUEST_HANDLE(xen_mem_event_op_t);\r
+\r
+#define XENMEM_sharing_op 22\r
+#define XENMEM_sharing_op_nominate_gfn 0\r
+#define XENMEM_sharing_op_nominate_gref 1\r
+#define XENMEM_sharing_op_share 2\r
+#define XENMEM_sharing_op_resume 3\r
+#define XENMEM_sharing_op_debug_gfn 4\r
+#define XENMEM_sharing_op_debug_mfn 5\r
+#define XENMEM_sharing_op_debug_gref 6\r
+#define XENMEM_sharing_op_add_physmap 7\r
+#define XENMEM_sharing_op_audit 8\r
+\r
+#define XENMEM_SHARING_OP_S_HANDLE_INVALID (-10)\r
+#define XENMEM_SHARING_OP_C_HANDLE_INVALID (-9)\r
+\r
+/* The following allows sharing of grant refs. This is useful\r
+ * for sharing utilities sitting as "filters" in IO backends\r
+ * (e.g. memshr + blktap(2)). The IO backend is only exposed \r
+ * to grant references, and this allows sharing of the grefs */\r
+#define XENMEM_SHARING_OP_FIELD_IS_GREF_FLAG (1ULL << 62)\r
+\r
+#define XENMEM_SHARING_OP_FIELD_MAKE_GREF(field, val) \\r
+ (field) = (XENMEM_SHARING_OP_FIELD_IS_GREF_FLAG | val)\r
+#define XENMEM_SHARING_OP_FIELD_IS_GREF(field) \\r
+ ((field) & XENMEM_SHARING_OP_FIELD_IS_GREF_FLAG)\r
+#define XENMEM_SHARING_OP_FIELD_GET_GREF(field) \\r
+ ((field) & (~XENMEM_SHARING_OP_FIELD_IS_GREF_FLAG))\r
+\r
+struct xen_mem_sharing_op {\r
+ uint8_t op; /* XENMEM_sharing_op_* */\r
+ domid_t domain;\r
+\r
+ union {\r
+ struct mem_sharing_op_nominate { /* OP_NOMINATE_xxx */\r
+ union {\r
+ uint64_aligned_t gfn; /* IN: gfn to nominate */\r
+ uint32_t grant_ref; /* IN: grant ref to nominate */\r
+ } u;\r
+ uint64_aligned_t handle; /* OUT: the handle */\r
+ } nominate;\r
+ struct mem_sharing_op_share { /* OP_SHARE/ADD_PHYSMAP */\r
+ uint64_aligned_t source_gfn; /* IN: the gfn of the source page */\r
+ uint64_aligned_t source_handle; /* IN: handle to the source page */\r
+ uint64_aligned_t client_gfn; /* IN: the client gfn */\r
+ uint64_aligned_t client_handle; /* IN: handle to the client page */\r
+ domid_t client_domain; /* IN: the client domain id */\r
+ } share; \r
+ struct mem_sharing_op_debug { /* OP_DEBUG_xxx */\r
+ union {\r
+ uint64_aligned_t gfn; /* IN: gfn to debug */\r
+ uint64_aligned_t mfn; /* IN: mfn to debug */\r
+ uint32_t gref; /* IN: gref to debug */\r
+ } u;\r
+ } debug;\r
+ } u;\r
+};\r
+typedef struct xen_mem_sharing_op xen_mem_sharing_op_t;\r
+DEFINE_XEN_GUEST_HANDLE(xen_mem_sharing_op_t);\r
+\r
+/*\r
+ * Attempt to stake a claim for a domain on a quantity of pages\r
+ * of system RAM, but _not_ assign specific pageframes. Only\r
+ * arithmetic is performed so the hypercall is very fast and need\r
+ * not be preemptible, thus sidestepping time-of-check-time-of-use\r
+ * races for memory allocation. Returns 0 if the hypervisor page\r
+ * allocator has atomically and successfully claimed the requested\r
+ * number of pages, else non-zero.\r
+ *\r
+ * Any domain may have only one active claim. When sufficient memory\r
+ * has been allocated to resolve the claim, the claim silently expires.\r
+ * Claiming zero pages effectively resets any outstanding claim and\r
+ * is always successful.\r
+ *\r
+ * Note that a valid claim may be staked even after memory has been\r
+ * allocated for a domain. In this case, the claim is not incremental,\r
+ * i.e. if the domain's tot_pages is 3, and a claim is staked for 10,\r
+ * only 7 additional pages are claimed.\r
+ *\r
+ * Caller must be privileged or the hypercall fails.\r
+ */\r
+#define XENMEM_claim_pages 24\r
+\r
+/*\r
+ * XENMEM_claim_pages flags - the are no flags at this time.\r
+ * The zero value is appropiate.\r
+ */\r
+\r
+#endif /* defined(__XEN__) || defined(__XEN_TOOLS__) */\r
+\r
+#endif /* __XEN_PUBLIC_MEMORY_H__ */\r
+\r
+/*\r
+ * Local variables:\r
+ * mode: C\r
+ * c-file-style: "BSD"\r
+ * c-basic-offset: 4\r
+ * tab-width: 4\r
+ * indent-tabs-mode: nil\r
+ * End:\r
+ */\r
-/******************************************************************************
- * sched.h
- *
- * Scheduler state interactions
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to
- * deal in the Software without restriction, including without limitation the
- * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
- * sell copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- *
- * Copyright (c) 2005, Keir Fraser <keir@xensource.com>
- */
-
-#ifndef __XEN_PUBLIC_SCHED_H__
-#define __XEN_PUBLIC_SCHED_H__
-
-#include "event_channel.h"
-
-/*
- * The prototype for this hypercall is:
- * LONG_PTR sched_op(int cmd, void *arg)
- * @cmd == SCHEDOP_??? (scheduler operation).
- * @arg == Operation-specific extra argument(s), as described below.
- *
- * Versions of Xen prior to 3.0.2 provided only the following legacy version
- * of this hypercall, supporting only the commands yield, block and shutdown:
- * LONG_PTR sched_op(int cmd, ULONG_PTR arg)
- * @cmd == SCHEDOP_??? (scheduler operation).
- * @arg == 0 (SCHEDOP_yield and SCHEDOP_block)
- * == SHUTDOWN_* code (SCHEDOP_shutdown)
- * This legacy version is available to new guests as sched_op_compat().
- */
-
-/*
- * Voluntarily yield the CPU.
- * @arg == NULL.
- */
-#define SCHEDOP_yield 0
-
-/*
- * Block execution of this VCPU until an event is received for processing.
- * If called with event upcalls masked, this operation will atomically
- * reenable event delivery and check for pending events before blocking the
- * VCPU. This avoids a "wakeup waiting" race.
- * @arg == NULL.
- */
-#define SCHEDOP_block 1
-
-/*
- * Halt execution of this domain (all VCPUs) and notify the system controller.
- * @arg == pointer to sched_shutdown structure.
- */
-#define SCHEDOP_shutdown 2
-struct sched_shutdown {
- unsigned int reason; /* SHUTDOWN_* */
-};
-typedef struct sched_shutdown sched_shutdown_t;
-DEFINE_XEN_GUEST_HANDLE(sched_shutdown_t);
-
-/*
- * Poll a set of event-channel ports. Return when one or more are pending. An
- * optional timeout may be specified.
- * @arg == pointer to sched_poll structure.
- */
-#define SCHEDOP_poll 3
-struct sched_poll {
- XEN_GUEST_HANDLE(evtchn_port_t) ports;
- unsigned int nr_ports;
- uint64_t timeout;
-};
-typedef struct sched_poll sched_poll_t;
-DEFINE_XEN_GUEST_HANDLE(sched_poll_t);
-
-/*
- * Declare a shutdown for another domain. The main use of this function is
- * in interpreting shutdown requests and reasons for fully-virtualized
- * domains. A para-virtualized domain may use SCHEDOP_shutdown directly.
- * @arg == pointer to sched_remote_shutdown structure.
- */
-#define SCHEDOP_remote_shutdown 4
-struct sched_remote_shutdown {
- domid_t domain_id; /* Remote domain ID */
- unsigned int reason; /* SHUTDOWN_xxx reason */
-};
-typedef struct sched_remote_shutdown sched_remote_shutdown_t;
-DEFINE_XEN_GUEST_HANDLE(sched_remote_shutdown_t);
-
-/*
- * Latch a shutdown code, so that when the domain later shuts down it
- * reports this code to the control tools.
- * @arg == as for SCHEDOP_shutdown.
- */
-#define SCHEDOP_shutdown_code 5
-
-/*
- * Setup, poke and destroy a domain watchdog timer.
- * @arg == pointer to sched_watchdog structure.
- * With id == 0, setup a domain watchdog timer to cause domain shutdown
- * after timeout, returns watchdog id.
- * With id != 0 and timeout == 0, destroy domain watchdog timer.
- * With id != 0 and timeout != 0, poke watchdog timer and set new timeout.
- */
-#define SCHEDOP_watchdog 6
-struct sched_watchdog {
- uint32_t id; /* watchdog ID */
- uint32_t timeout; /* timeout */
-};
-typedef struct sched_watchdog sched_watchdog_t;
-DEFINE_XEN_GUEST_HANDLE(sched_watchdog_t);
-
-/*
- * Reason codes for SCHEDOP_shutdown. These may be interpreted by control
- * software to determine the appropriate action. For the most part, Xen does
- * not care about the shutdown code.
- */
-#define SHUTDOWN_poweroff 0 /* Domain exited normally. Clean up and kill. */
-#define SHUTDOWN_reboot 1 /* Clean up, kill, and then restart. */
-#define SHUTDOWN_suspend 2 /* Clean up, save suspend info, kill. */
-#define SHUTDOWN_crash 3 /* Tell controller we've crashed. */
-#define SHUTDOWN_watchdog 4 /* Restart because watchdog time expired. */
-
-#endif /* __XEN_PUBLIC_SCHED_H__ */
-
-/*
- * Local variables:
- * mode: C
- * c-set-style: "BSD"
- * c-basic-offset: 4
- * tab-width: 4
- * indent-tabs-mode: nil
- * End:
- */
+/******************************************************************************\r
+ * sched.h\r
+ *\r
+ * Scheduler state interactions\r
+ *\r
+ * Permission is hereby granted, free of charge, to any person obtaining a copy\r
+ * of this software and associated documentation files (the "Software"), to\r
+ * deal in the Software without restriction, including without limitation the\r
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\r
+ * sell copies of the Software, and to permit persons to whom the Software is\r
+ * furnished to do so, subject to the following conditions:\r
+ *\r
+ * The above copyright notice and this permission notice shall be included in\r
+ * all copies or substantial portions of the Software.\r
+ *\r
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\r
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER\r
+ * DEALINGS IN THE SOFTWARE.\r
+ *\r
+ * Copyright (c) 2005, Keir Fraser <keir@xensource.com>\r
+ */\r
+\r
+#ifndef __XEN_PUBLIC_SCHED_H__\r
+#define __XEN_PUBLIC_SCHED_H__\r
+\r
+#include "event_channel.h"\r
+\r
+/*\r
+ * `incontents 150 sched Guest Scheduler Operations\r
+ *\r
+ * The SCHEDOP interface provides mechanisms for a guest to interact\r
+ * with the scheduler, including yield, blocking and shutting itself\r
+ * down.\r
+ */\r
+\r
+/*\r
+ * The prototype for this hypercall is:\r
+ * ` LONG_PTR HYPERVISOR_sched_op(enum sched_op cmd, void *arg, ...)\r
+ *\r
+ * @cmd == SCHEDOP_??? (scheduler operation).\r
+ * @arg == Operation-specific extra argument(s), as described below.\r
+ * ... == Additional Operation-specific extra arguments, described below.\r
+ *\r
+ * Versions of Xen prior to 3.0.2 provided only the following legacy version\r
+ * of this hypercall, supporting only the commands yield, block and shutdown:\r
+ * LONG_PTR sched_op(int cmd, ULONG_PTR arg)\r
+ * @cmd == SCHEDOP_??? (scheduler operation).\r
+ * @arg == 0 (SCHEDOP_yield and SCHEDOP_block)\r
+ * == SHUTDOWN_* code (SCHEDOP_shutdown)\r
+ *\r
+ * This legacy version is available to new guests as:\r
+ * ` LONG_PTR HYPERVISOR_sched_op_compat(enum sched_op cmd, ULONG_PTR arg)\r
+ */\r
+\r
+/* ` enum sched_op { // SCHEDOP_* => struct sched_* */\r
+/*\r
+ * Voluntarily yield the CPU.\r
+ * @arg == NULL.\r
+ */\r
+#define SCHEDOP_yield 0\r
+\r
+/*\r
+ * Block execution of this VCPU until an event is received for processing.\r
+ * If called with event upcalls masked, this operation will atomically\r
+ * reenable event delivery and check for pending events before blocking the\r
+ * VCPU. This avoids a "wakeup waiting" race.\r
+ * @arg == NULL.\r
+ */\r
+#define SCHEDOP_block 1\r
+\r
+/*\r
+ * Halt execution of this domain (all VCPUs) and notify the system controller.\r
+ * @arg == pointer to sched_shutdown_t structure.\r
+ *\r
+ * If the sched_shutdown_t reason is SHUTDOWN_suspend then this\r
+ * hypercall takes an additional extra argument which should be the\r
+ * MFN of the guest's start_info_t.\r
+ *\r
+ * In addition, which reason is SHUTDOWN_suspend this hypercall\r
+ * returns 1 if suspend was cancelled or the domain was merely\r
+ * checkpointed, and 0 if it is resuming in a new domain.\r
+ */\r
+#define SCHEDOP_shutdown 2\r
+\r
+/*\r
+ * Poll a set of event-channel ports. Return when one or more are pending. An\r
+ * optional timeout may be specified.\r
+ * @arg == pointer to sched_poll_t structure.\r
+ */\r
+#define SCHEDOP_poll 3\r
+\r
+/*\r
+ * Declare a shutdown for another domain. The main use of this function is\r
+ * in interpreting shutdown requests and reasons for fully-virtualized\r
+ * domains. A para-virtualized domain may use SCHEDOP_shutdown directly.\r
+ * @arg == pointer to sched_remote_shutdown_t structure.\r
+ */\r
+#define SCHEDOP_remote_shutdown 4\r
+\r
+/*\r
+ * Latch a shutdown code, so that when the domain later shuts down it\r
+ * reports this code to the control tools.\r
+ * @arg == sched_shutdown_t, as for SCHEDOP_shutdown.\r
+ */\r
+#define SCHEDOP_shutdown_code 5\r
+\r
+/*\r
+ * Setup, poke and destroy a domain watchdog timer.\r
+ * @arg == pointer to sched_watchdog_t structure.\r
+ * With id == 0, setup a domain watchdog timer to cause domain shutdown\r
+ * after timeout, returns watchdog id.\r
+ * With id != 0 and timeout == 0, destroy domain watchdog timer.\r
+ * With id != 0 and timeout != 0, poke watchdog timer and set new timeout.\r
+ */\r
+#define SCHEDOP_watchdog 6\r
+/* ` } */\r
+\r
+struct sched_shutdown {\r
+ unsigned int reason; /* SHUTDOWN_* => enum sched_shutdown_reason */\r
+};\r
+typedef struct sched_shutdown sched_shutdown_t;\r
+DEFINE_XEN_GUEST_HANDLE(sched_shutdown_t);\r
+\r
+struct sched_poll {\r
+ XEN_GUEST_HANDLE(evtchn_port_t) ports;\r
+ unsigned int nr_ports;\r
+ uint64_t timeout;\r
+};\r
+typedef struct sched_poll sched_poll_t;\r
+DEFINE_XEN_GUEST_HANDLE(sched_poll_t);\r
+\r
+struct sched_remote_shutdown {\r
+ domid_t domain_id; /* Remote domain ID */\r
+ unsigned int reason; /* SHUTDOWN_* => enum sched_shutdown_reason */\r
+};\r
+typedef struct sched_remote_shutdown sched_remote_shutdown_t;\r
+DEFINE_XEN_GUEST_HANDLE(sched_remote_shutdown_t);\r
+\r
+struct sched_watchdog {\r
+ uint32_t id; /* watchdog ID */\r
+ uint32_t timeout; /* timeout */\r
+};\r
+typedef struct sched_watchdog sched_watchdog_t;\r
+DEFINE_XEN_GUEST_HANDLE(sched_watchdog_t);\r
+\r
+/*\r
+ * Reason codes for SCHEDOP_shutdown. These may be interpreted by control\r
+ * software to determine the appropriate action. For the most part, Xen does\r
+ * not care about the shutdown code.\r
+ */\r
+/* ` enum sched_shutdown_reason { */\r
+#define SHUTDOWN_poweroff 0 /* Domain exited normally. Clean up and kill. */\r
+#define SHUTDOWN_reboot 1 /* Clean up, kill, and then restart. */\r
+#define SHUTDOWN_suspend 2 /* Clean up, save suspend info, kill. */\r
+#define SHUTDOWN_crash 3 /* Tell controller we've crashed. */\r
+#define SHUTDOWN_watchdog 4 /* Restart because watchdog time expired. */\r
+#define SHUTDOWN_MAX 4 /* Maximum valid shutdown reason. */\r
+/* ` } */\r
+\r
+#endif /* __XEN_PUBLIC_SCHED_H__ */\r
+\r
+/*\r
+ * Local variables:\r
+ * mode: C\r
+ * c-file-style: "BSD"\r
+ * c-basic-offset: 4\r
+ * tab-width: 4\r
+ * indent-tabs-mode: nil\r
+ * End:\r
+ */\r
-/******************************************************************************
- * include/public/trace.h
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to
- * deal in the Software without restriction, including without limitation the
- * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
- * sell copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- *
- * Mark Williamson, (C) 2004 Intel Research Cambridge
- * Copyright (C) 2005 Bin Ren
- */
-
-#ifndef __XEN_PUBLIC_TRACE_H__
-#define __XEN_PUBLIC_TRACE_H__
-
-#define TRACE_EXTRA_MAX 7
-#define TRACE_EXTRA_SHIFT 28
-
-/* Trace classes */
-#define TRC_CLS_SHIFT 16
-#define TRC_GEN 0x0001f000 /* General trace */
-#define TRC_SCHED 0x0002f000 /* Xen Scheduler trace */
-#define TRC_DOM0OP 0x0004f000 /* Xen DOM0 operation trace */
-#define TRC_HVM 0x0008f000 /* Xen HVM trace */
-#define TRC_MEM 0x0010f000 /* Xen memory trace */
-#define TRC_PV 0x0020f000 /* Xen PV traces */
-#define TRC_SHADOW 0x0040f000 /* Xen shadow tracing */
-#define TRC_PM 0x0080f000 /* Xen power management trace */
-#define TRC_GUEST 0x0800f000 /* Guest-generated traces */
-#define TRC_ALL 0x0ffff000
-#define TRC_HD_TO_EVENT(x) ((x)&0x0fffffff)
-#define TRC_HD_CYCLE_FLAG (1UL<<31)
-#define TRC_HD_INCLUDES_CYCLE_COUNT(x) ( !!( (x) & TRC_HD_CYCLE_FLAG ) )
-#define TRC_HD_EXTRA(x) (((x)>>TRACE_EXTRA_SHIFT)&TRACE_EXTRA_MAX)
-
-/* Trace subclasses */
-#define TRC_SUBCLS_SHIFT 12
-
-/* trace subclasses for SVM */
-#define TRC_HVM_ENTRYEXIT 0x00081000 /* VMENTRY and #VMEXIT */
-#define TRC_HVM_HANDLER 0x00082000 /* various HVM handlers */
-
-#define TRC_SCHED_MIN 0x00021000 /* Just runstate changes */
-#define TRC_SCHED_CLASS 0x00022000 /* Scheduler-specific */
-#define TRC_SCHED_VERBOSE 0x00028000 /* More inclusive scheduling */
-
-/* Trace events per class */
-#define TRC_LOST_RECORDS (TRC_GEN + 1)
-#define TRC_TRACE_WRAP_BUFFER (TRC_GEN + 2)
-#define TRC_TRACE_CPU_CHANGE (TRC_GEN + 3)
-#define TRC_TRACE_IRQ (TRC_GEN + 4)
-
-#define TRC_SCHED_RUNSTATE_CHANGE (TRC_SCHED_MIN + 1)
-#define TRC_SCHED_CONTINUE_RUNNING (TRC_SCHED_MIN + 2)
-#define TRC_SCHED_DOM_ADD (TRC_SCHED_VERBOSE + 1)
-#define TRC_SCHED_DOM_REM (TRC_SCHED_VERBOSE + 2)
-#define TRC_SCHED_SLEEP (TRC_SCHED_VERBOSE + 3)
-#define TRC_SCHED_WAKE (TRC_SCHED_VERBOSE + 4)
-#define TRC_SCHED_YIELD (TRC_SCHED_VERBOSE + 5)
-#define TRC_SCHED_BLOCK (TRC_SCHED_VERBOSE + 6)
-#define TRC_SCHED_SHUTDOWN (TRC_SCHED_VERBOSE + 7)
-#define TRC_SCHED_CTL (TRC_SCHED_VERBOSE + 8)
-#define TRC_SCHED_ADJDOM (TRC_SCHED_VERBOSE + 9)
-#define TRC_SCHED_SWITCH (TRC_SCHED_VERBOSE + 10)
-#define TRC_SCHED_S_TIMER_FN (TRC_SCHED_VERBOSE + 11)
-#define TRC_SCHED_T_TIMER_FN (TRC_SCHED_VERBOSE + 12)
-#define TRC_SCHED_DOM_TIMER_FN (TRC_SCHED_VERBOSE + 13)
-#define TRC_SCHED_SWITCH_INFPREV (TRC_SCHED_VERBOSE + 14)
-#define TRC_SCHED_SWITCH_INFNEXT (TRC_SCHED_VERBOSE + 15)
-#define TRC_SCHED_SHUTDOWN_CODE (TRC_SCHED_VERBOSE + 16)
-
-#define TRC_MEM_PAGE_GRANT_MAP (TRC_MEM + 1)
-#define TRC_MEM_PAGE_GRANT_UNMAP (TRC_MEM + 2)
-#define TRC_MEM_PAGE_GRANT_TRANSFER (TRC_MEM + 3)
-#define TRC_MEM_SET_P2M_ENTRY (TRC_MEM + 4)
-#define TRC_MEM_DECREASE_RESERVATION (TRC_MEM + 5)
-#define TRC_MEM_POD_POPULATE (TRC_MEM + 16)
-#define TRC_MEM_POD_ZERO_RECLAIM (TRC_MEM + 17)
-#define TRC_MEM_POD_SUPERPAGE_SPLINTER (TRC_MEM + 18)
-
-
-#define TRC_PV_HYPERCALL (TRC_PV + 1)
-#define TRC_PV_TRAP (TRC_PV + 3)
-#define TRC_PV_PAGE_FAULT (TRC_PV + 4)
-#define TRC_PV_FORCED_INVALID_OP (TRC_PV + 5)
-#define TRC_PV_EMULATE_PRIVOP (TRC_PV + 6)
-#define TRC_PV_EMULATE_4GB (TRC_PV + 7)
-#define TRC_PV_MATH_STATE_RESTORE (TRC_PV + 8)
-#define TRC_PV_PAGING_FIXUP (TRC_PV + 9)
-#define TRC_PV_GDT_LDT_MAPPING_FAULT (TRC_PV + 10)
-#define TRC_PV_PTWR_EMULATION (TRC_PV + 11)
-#define TRC_PV_PTWR_EMULATION_PAE (TRC_PV + 12)
- /* Indicates that addresses in trace record are 64 bits */
-#define TRC_64_FLAG (0x100)
-
-#define TRC_SHADOW_NOT_SHADOW (TRC_SHADOW + 1)
-#define TRC_SHADOW_FAST_PROPAGATE (TRC_SHADOW + 2)
-#define TRC_SHADOW_FAST_MMIO (TRC_SHADOW + 3)
-#define TRC_SHADOW_FALSE_FAST_PATH (TRC_SHADOW + 4)
-#define TRC_SHADOW_MMIO (TRC_SHADOW + 5)
-#define TRC_SHADOW_FIXUP (TRC_SHADOW + 6)
-#define TRC_SHADOW_DOMF_DYING (TRC_SHADOW + 7)
-#define TRC_SHADOW_EMULATE (TRC_SHADOW + 8)
-#define TRC_SHADOW_EMULATE_UNSHADOW_USER (TRC_SHADOW + 9)
-#define TRC_SHADOW_EMULATE_UNSHADOW_EVTINJ (TRC_SHADOW + 10)
-#define TRC_SHADOW_EMULATE_UNSHADOW_UNHANDLED (TRC_SHADOW + 11)
-#define TRC_SHADOW_WRMAP_BF (TRC_SHADOW + 12)
-#define TRC_SHADOW_PREALLOC_UNPIN (TRC_SHADOW + 13)
-#define TRC_SHADOW_RESYNC_FULL (TRC_SHADOW + 14)
-#define TRC_SHADOW_RESYNC_ONLY (TRC_SHADOW + 15)
-
-/* trace events per subclass */
-#define TRC_HVM_VMENTRY (TRC_HVM_ENTRYEXIT + 0x01)
-#define TRC_HVM_VMEXIT (TRC_HVM_ENTRYEXIT + 0x02)
-#define TRC_HVM_VMEXIT64 (TRC_HVM_ENTRYEXIT + TRC_64_FLAG + 0x02)
-#define TRC_HVM_PF_XEN (TRC_HVM_HANDLER + 0x01)
-#define TRC_HVM_PF_XEN64 (TRC_HVM_HANDLER + TRC_64_FLAG + 0x01)
-#define TRC_HVM_PF_INJECT (TRC_HVM_HANDLER + 0x02)
-#define TRC_HVM_PF_INJECT64 (TRC_HVM_HANDLER + TRC_64_FLAG + 0x02)
-#define TRC_HVM_INJ_EXC (TRC_HVM_HANDLER + 0x03)
-#define TRC_HVM_INJ_VIRQ (TRC_HVM_HANDLER + 0x04)
-#define TRC_HVM_REINJ_VIRQ (TRC_HVM_HANDLER + 0x05)
-#define TRC_HVM_IO_READ (TRC_HVM_HANDLER + 0x06)
-#define TRC_HVM_IO_WRITE (TRC_HVM_HANDLER + 0x07)
-#define TRC_HVM_CR_READ (TRC_HVM_HANDLER + 0x08)
-#define TRC_HVM_CR_READ64 (TRC_HVM_HANDLER + TRC_64_FLAG + 0x08)
-#define TRC_HVM_CR_WRITE (TRC_HVM_HANDLER + 0x09)
-#define TRC_HVM_CR_WRITE64 (TRC_HVM_HANDLER + TRC_64_FLAG + 0x09)
-#define TRC_HVM_DR_READ (TRC_HVM_HANDLER + 0x0A)
-#define TRC_HVM_DR_WRITE (TRC_HVM_HANDLER + 0x0B)
-#define TRC_HVM_MSR_READ (TRC_HVM_HANDLER + 0x0C)
-#define TRC_HVM_MSR_WRITE (TRC_HVM_HANDLER + 0x0D)
-#define TRC_HVM_CPUID (TRC_HVM_HANDLER + 0x0E)
-#define TRC_HVM_INTR (TRC_HVM_HANDLER + 0x0F)
-#define TRC_HVM_NMI (TRC_HVM_HANDLER + 0x10)
-#define TRC_HVM_SMI (TRC_HVM_HANDLER + 0x11)
-#define TRC_HVM_VMMCALL (TRC_HVM_HANDLER + 0x12)
-#define TRC_HVM_HLT (TRC_HVM_HANDLER + 0x13)
-#define TRC_HVM_INVLPG (TRC_HVM_HANDLER + 0x14)
-#define TRC_HVM_INVLPG64 (TRC_HVM_HANDLER + TRC_64_FLAG + 0x14)
-#define TRC_HVM_MCE (TRC_HVM_HANDLER + 0x15)
-#define TRC_HVM_IOPORT_READ (TRC_HVM_HANDLER + 0x16)
-#define TRC_HVM_IOMEM_READ (TRC_HVM_HANDLER + 0x17)
-#define TRC_HVM_CLTS (TRC_HVM_HANDLER + 0x18)
-#define TRC_HVM_LMSW (TRC_HVM_HANDLER + 0x19)
-#define TRC_HVM_LMSW64 (TRC_HVM_HANDLER + TRC_64_FLAG + 0x19)
-#define TRC_HVM_RDTSC (TRC_HVM_HANDLER + 0x1a)
-#define TRC_HVM_INTR_WINDOW (TRC_HVM_HANDLER + 0x20)
-#define TRC_HVM_NPF (TRC_HVM_HANDLER + 0x21)
-
-#define TRC_HVM_IOPORT_WRITE (TRC_HVM_HANDLER + 0x216)
-#define TRC_HVM_IOMEM_WRITE (TRC_HVM_HANDLER + 0x217)
-
-/* trace subclasses for power management */
-#define TRC_PM_FREQ 0x00801000 /* xen cpu freq events */
-#define TRC_PM_IDLE 0x00802000 /* xen cpu idle events */
-
-/* trace events for per class */
-#define TRC_PM_FREQ_CHANGE (TRC_PM_FREQ + 0x01)
-#define TRC_PM_IDLE_ENTRY (TRC_PM_IDLE + 0x01)
-#define TRC_PM_IDLE_EXIT (TRC_PM_IDLE + 0x02)
-
-/* This structure represents a single trace buffer record. */
-struct t_rec {
- uint32_t event:28;
- uint32_t extra_u32:3; /* # entries in trailing extra_u32[] array */
- uint32_t cycles_included:1; /* u.cycles or u.no_cycles? */
- union {
- struct {
- uint32_t cycles_lo, cycles_hi; /* cycle counter timestamp */
- uint32_t extra_u32[7]; /* event data items */
- } cycles;
- struct {
- uint32_t extra_u32[7]; /* event data items */
- } nocycles;
- } u;
-};
-
-/*
- * This structure contains the metadata for a single trace buffer. The head
- * field, indexes into an array of struct t_rec's.
- */
-struct t_buf {
- /* Assume the data buffer size is X. X is generally not a power of 2.
- * CONS and PROD are incremented modulo (2*X):
- * 0 <= cons < 2*X
- * 0 <= prod < 2*X
- * This is done because addition modulo X breaks at 2^32 when X is not a
- * power of 2:
- * (((2^32 - 1) % X) + 1) % X != (2^32) % X
- */
- uint32_t cons; /* Offset of next item to be consumed by control tools. */
- uint32_t prod; /* Offset of next item to be produced by Xen. */
- /* Records follow immediately after the meta-data header. */
-};
-
-/* Structure used to pass MFNs to the trace buffers back to trace consumers.
- * Offset is an offset into the mapped structure where the mfn list will be held.
- * MFNs will be at ((ULONG_PTR *)(t_info))+(t_info->cpu_offset[cpu]).
- */
-struct t_info {
- uint16_t tbuf_size; /* Size in pages of each trace buffer */
- uint16_t mfn_offset[]; /* Offset within t_info structure of the page list per cpu */
- /* MFN lists immediately after the header */
-};
-
-#endif /* __XEN_PUBLIC_TRACE_H__ */
-
-/*
- * Local variables:
- * mode: C
- * c-set-style: "BSD"
- * c-basic-offset: 4
- * tab-width: 4
- * indent-tabs-mode: nil
- * End:
- */
+/******************************************************************************\r
+ * include/public/trace.h\r
+ * \r
+ * Permission is hereby granted, free of charge, to any person obtaining a copy\r
+ * of this software and associated documentation files (the "Software"), to\r
+ * deal in the Software without restriction, including without limitation the\r
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\r
+ * sell copies of the Software, and to permit persons to whom the Software is\r
+ * furnished to do so, subject to the following conditions:\r
+ *\r
+ * The above copyright notice and this permission notice shall be included in\r
+ * all copies or substantial portions of the Software.\r
+ *\r
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\r
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER\r
+ * DEALINGS IN THE SOFTWARE.\r
+ *\r
+ * Mark Williamson, (C) 2004 Intel Research Cambridge\r
+ * Copyright (C) 2005 Bin Ren\r
+ */\r
+\r
+#ifndef __XEN_PUBLIC_TRACE_H__\r
+#define __XEN_PUBLIC_TRACE_H__\r
+\r
+#define TRACE_EXTRA_MAX 7\r
+#define TRACE_EXTRA_SHIFT 28\r
+\r
+/* Trace classes */\r
+#define TRC_CLS_SHIFT 16\r
+#define TRC_GEN 0x0001f000 /* General trace */\r
+#define TRC_SCHED 0x0002f000 /* Xen Scheduler trace */\r
+#define TRC_DOM0OP 0x0004f000 /* Xen DOM0 operation trace */\r
+#define TRC_HVM 0x0008f000 /* Xen HVM trace */\r
+#define TRC_MEM 0x0010f000 /* Xen memory trace */\r
+#define TRC_PV 0x0020f000 /* Xen PV traces */\r
+#define TRC_SHADOW 0x0040f000 /* Xen shadow tracing */\r
+#define TRC_HW 0x0080f000 /* Xen hardware-related traces */\r
+#define TRC_GUEST 0x0800f000 /* Guest-generated traces */\r
+#define TRC_ALL 0x0ffff000\r
+#define TRC_HD_TO_EVENT(x) ((x)&0x0fffffff)\r
+#define TRC_HD_CYCLE_FLAG (1UL<<31)\r
+#define TRC_HD_INCLUDES_CYCLE_COUNT(x) ( !!( (x) & TRC_HD_CYCLE_FLAG ) )\r
+#define TRC_HD_EXTRA(x) (((x)>>TRACE_EXTRA_SHIFT)&TRACE_EXTRA_MAX)\r
+\r
+/* Trace subclasses */\r
+#define TRC_SUBCLS_SHIFT 12\r
+\r
+/* trace subclasses for SVM */\r
+#define TRC_HVM_ENTRYEXIT 0x00081000 /* VMENTRY and #VMEXIT */\r
+#define TRC_HVM_HANDLER 0x00082000 /* various HVM handlers */\r
+\r
+#define TRC_SCHED_MIN 0x00021000 /* Just runstate changes */\r
+#define TRC_SCHED_CLASS 0x00022000 /* Scheduler-specific */\r
+#define TRC_SCHED_VERBOSE 0x00028000 /* More inclusive scheduling */\r
+\r
+/*\r
+ * The highest 3 bits of the last 12 bits of TRC_SCHED_CLASS above are\r
+ * reserved for encoding what scheduler produced the information. The\r
+ * actual event is encoded in the last 9 bits.\r
+ *\r
+ * This means we have 8 scheduling IDs available (which means at most 8\r
+ * schedulers generating events) and, in each scheduler, up to 512\r
+ * different events.\r
+ */\r
+#define TRC_SCHED_ID_BITS 3\r
+#define TRC_SCHED_ID_SHIFT (TRC_SUBCLS_SHIFT - TRC_SCHED_ID_BITS)\r
+#define TRC_SCHED_ID_MASK (((1UL<<TRC_SCHED_ID_BITS) - 1) << TRC_SCHED_ID_SHIFT)\r
+#define TRC_SCHED_EVT_MASK (~(TRC_SCHED_ID_MASK))\r
+\r
+/* Per-scheduler IDs, to identify scheduler specific events */\r
+#define TRC_SCHED_CSCHED 0\r
+#define TRC_SCHED_CSCHED2 1\r
+#define TRC_SCHED_SEDF 2\r
+#define TRC_SCHED_ARINC653 3\r
+\r
+/* Per-scheduler tracing */\r
+#define TRC_SCHED_CLASS_EVT(_c, _e) \\r
+ ( ( TRC_SCHED_CLASS | \\r
+ ((TRC_SCHED_##_c << TRC_SCHED_ID_SHIFT) & TRC_SCHED_ID_MASK) ) + \\r
+ (_e & TRC_SCHED_EVT_MASK) )\r
+\r
+/* Trace classes for Hardware */\r
+#define TRC_HW_PM 0x00801000 /* Power management traces */\r
+#define TRC_HW_IRQ 0x00802000 /* Traces relating to the handling of IRQs */\r
+\r
+/* Trace events per class */\r
+#define TRC_LOST_RECORDS (TRC_GEN + 1)\r
+#define TRC_TRACE_WRAP_BUFFER (TRC_GEN + 2)\r
+#define TRC_TRACE_CPU_CHANGE (TRC_GEN + 3)\r
+\r
+#define TRC_SCHED_RUNSTATE_CHANGE (TRC_SCHED_MIN + 1)\r
+#define TRC_SCHED_CONTINUE_RUNNING (TRC_SCHED_MIN + 2)\r
+#define TRC_SCHED_DOM_ADD (TRC_SCHED_VERBOSE + 1)\r
+#define TRC_SCHED_DOM_REM (TRC_SCHED_VERBOSE + 2)\r
+#define TRC_SCHED_SLEEP (TRC_SCHED_VERBOSE + 3)\r
+#define TRC_SCHED_WAKE (TRC_SCHED_VERBOSE + 4)\r
+#define TRC_SCHED_YIELD (TRC_SCHED_VERBOSE + 5)\r
+#define TRC_SCHED_BLOCK (TRC_SCHED_VERBOSE + 6)\r
+#define TRC_SCHED_SHUTDOWN (TRC_SCHED_VERBOSE + 7)\r
+#define TRC_SCHED_CTL (TRC_SCHED_VERBOSE + 8)\r
+#define TRC_SCHED_ADJDOM (TRC_SCHED_VERBOSE + 9)\r
+#define TRC_SCHED_SWITCH (TRC_SCHED_VERBOSE + 10)\r
+#define TRC_SCHED_S_TIMER_FN (TRC_SCHED_VERBOSE + 11)\r
+#define TRC_SCHED_T_TIMER_FN (TRC_SCHED_VERBOSE + 12)\r
+#define TRC_SCHED_DOM_TIMER_FN (TRC_SCHED_VERBOSE + 13)\r
+#define TRC_SCHED_SWITCH_INFPREV (TRC_SCHED_VERBOSE + 14)\r
+#define TRC_SCHED_SWITCH_INFNEXT (TRC_SCHED_VERBOSE + 15)\r
+#define TRC_SCHED_SHUTDOWN_CODE (TRC_SCHED_VERBOSE + 16)\r
+\r
+#define TRC_MEM_PAGE_GRANT_MAP (TRC_MEM + 1)\r
+#define TRC_MEM_PAGE_GRANT_UNMAP (TRC_MEM + 2)\r
+#define TRC_MEM_PAGE_GRANT_TRANSFER (TRC_MEM + 3)\r
+#define TRC_MEM_SET_P2M_ENTRY (TRC_MEM + 4)\r
+#define TRC_MEM_DECREASE_RESERVATION (TRC_MEM + 5)\r
+#define TRC_MEM_POD_POPULATE (TRC_MEM + 16)\r
+#define TRC_MEM_POD_ZERO_RECLAIM (TRC_MEM + 17)\r
+#define TRC_MEM_POD_SUPERPAGE_SPLINTER (TRC_MEM + 18)\r
+\r
+#define TRC_PV_ENTRY 0x00201000 /* Hypervisor entry points for PV guests. */\r
+#define TRC_PV_SUBCALL 0x00202000 /* Sub-call in a multicall hypercall */\r
+\r
+#define TRC_PV_HYPERCALL (TRC_PV_ENTRY + 1)\r
+#define TRC_PV_TRAP (TRC_PV_ENTRY + 3)\r
+#define TRC_PV_PAGE_FAULT (TRC_PV_ENTRY + 4)\r
+#define TRC_PV_FORCED_INVALID_OP (TRC_PV_ENTRY + 5)\r
+#define TRC_PV_EMULATE_PRIVOP (TRC_PV_ENTRY + 6)\r
+#define TRC_PV_EMULATE_4GB (TRC_PV_ENTRY + 7)\r
+#define TRC_PV_MATH_STATE_RESTORE (TRC_PV_ENTRY + 8)\r
+#define TRC_PV_PAGING_FIXUP (TRC_PV_ENTRY + 9)\r
+#define TRC_PV_GDT_LDT_MAPPING_FAULT (TRC_PV_ENTRY + 10)\r
+#define TRC_PV_PTWR_EMULATION (TRC_PV_ENTRY + 11)\r
+#define TRC_PV_PTWR_EMULATION_PAE (TRC_PV_ENTRY + 12)\r
+#define TRC_PV_HYPERCALL_V2 (TRC_PV_ENTRY + 13)\r
+#define TRC_PV_HYPERCALL_SUBCALL (TRC_PV_SUBCALL + 14)\r
+\r
+/*\r
+ * TRC_PV_HYPERCALL_V2 format\r
+ *\r
+ * Only some of the hypercall argument are recorded. Bit fields A0 to\r
+ * A5 in the first extra word are set if the argument is present and\r
+ * the arguments themselves are packed sequentially in the following\r
+ * words.\r
+ *\r
+ * The TRC_64_FLAG bit is not set for these events (even if there are\r
+ * 64-bit arguments in the record).\r
+ *\r
+ * Word\r
+ * 0 bit 31 30|29 28|27 26|25 24|23 22|21 20|19 ... 0\r
+ * A5 |A4 |A3 |A2 |A1 |A0 |Hypercall op\r
+ * 1 First 32 bit (or low word of first 64 bit) arg in record\r
+ * 2 Second 32 bit (or high word of first 64 bit) arg in record\r
+ * ...\r
+ *\r
+ * A0-A5 bitfield values:\r
+ *\r
+ * 00b Argument not present\r
+ * 01b 32-bit argument present\r
+ * 10b 64-bit argument present\r
+ * 11b Reserved\r
+ */\r
+#define TRC_PV_HYPERCALL_V2_ARG_32(i) (0x1 << (20 + 2*(i)))\r
+#define TRC_PV_HYPERCALL_V2_ARG_64(i) (0x2 << (20 + 2*(i)))\r
+#define TRC_PV_HYPERCALL_V2_ARG_MASK (0xfff00000)\r
+\r
+#define TRC_SHADOW_NOT_SHADOW (TRC_SHADOW + 1)\r
+#define TRC_SHADOW_FAST_PROPAGATE (TRC_SHADOW + 2)\r
+#define TRC_SHADOW_FAST_MMIO (TRC_SHADOW + 3)\r
+#define TRC_SHADOW_FALSE_FAST_PATH (TRC_SHADOW + 4)\r
+#define TRC_SHADOW_MMIO (TRC_SHADOW + 5)\r
+#define TRC_SHADOW_FIXUP (TRC_SHADOW + 6)\r
+#define TRC_SHADOW_DOMF_DYING (TRC_SHADOW + 7)\r
+#define TRC_SHADOW_EMULATE (TRC_SHADOW + 8)\r
+#define TRC_SHADOW_EMULATE_UNSHADOW_USER (TRC_SHADOW + 9)\r
+#define TRC_SHADOW_EMULATE_UNSHADOW_EVTINJ (TRC_SHADOW + 10)\r
+#define TRC_SHADOW_EMULATE_UNSHADOW_UNHANDLED (TRC_SHADOW + 11)\r
+#define TRC_SHADOW_WRMAP_BF (TRC_SHADOW + 12)\r
+#define TRC_SHADOW_PREALLOC_UNPIN (TRC_SHADOW + 13)\r
+#define TRC_SHADOW_RESYNC_FULL (TRC_SHADOW + 14)\r
+#define TRC_SHADOW_RESYNC_ONLY (TRC_SHADOW + 15)\r
+\r
+/* trace events per subclass */\r
+#define TRC_HVM_NESTEDFLAG (0x400)\r
+#define TRC_HVM_VMENTRY (TRC_HVM_ENTRYEXIT + 0x01)\r
+#define TRC_HVM_VMEXIT (TRC_HVM_ENTRYEXIT + 0x02)\r
+#define TRC_HVM_VMEXIT64 (TRC_HVM_ENTRYEXIT + TRC_64_FLAG + 0x02)\r
+#define TRC_HVM_PF_XEN (TRC_HVM_HANDLER + 0x01)\r
+#define TRC_HVM_PF_XEN64 (TRC_HVM_HANDLER + TRC_64_FLAG + 0x01)\r
+#define TRC_HVM_PF_INJECT (TRC_HVM_HANDLER + 0x02)\r
+#define TRC_HVM_PF_INJECT64 (TRC_HVM_HANDLER + TRC_64_FLAG + 0x02)\r
+#define TRC_HVM_INJ_EXC (TRC_HVM_HANDLER + 0x03)\r
+#define TRC_HVM_INJ_VIRQ (TRC_HVM_HANDLER + 0x04)\r
+#define TRC_HVM_REINJ_VIRQ (TRC_HVM_HANDLER + 0x05)\r
+#define TRC_HVM_IO_READ (TRC_HVM_HANDLER + 0x06)\r
+#define TRC_HVM_IO_WRITE (TRC_HVM_HANDLER + 0x07)\r
+#define TRC_HVM_CR_READ (TRC_HVM_HANDLER + 0x08)\r
+#define TRC_HVM_CR_READ64 (TRC_HVM_HANDLER + TRC_64_FLAG + 0x08)\r
+#define TRC_HVM_CR_WRITE (TRC_HVM_HANDLER + 0x09)\r
+#define TRC_HVM_CR_WRITE64 (TRC_HVM_HANDLER + TRC_64_FLAG + 0x09)\r
+#define TRC_HVM_DR_READ (TRC_HVM_HANDLER + 0x0A)\r
+#define TRC_HVM_DR_WRITE (TRC_HVM_HANDLER + 0x0B)\r
+#define TRC_HVM_MSR_READ (TRC_HVM_HANDLER + 0x0C)\r
+#define TRC_HVM_MSR_WRITE (TRC_HVM_HANDLER + 0x0D)\r
+#define TRC_HVM_CPUID (TRC_HVM_HANDLER + 0x0E)\r
+#define TRC_HVM_INTR (TRC_HVM_HANDLER + 0x0F)\r
+#define TRC_HVM_NMI (TRC_HVM_HANDLER + 0x10)\r
+#define TRC_HVM_SMI (TRC_HVM_HANDLER + 0x11)\r
+#define TRC_HVM_VMMCALL (TRC_HVM_HANDLER + 0x12)\r
+#define TRC_HVM_HLT (TRC_HVM_HANDLER + 0x13)\r
+#define TRC_HVM_INVLPG (TRC_HVM_HANDLER + 0x14)\r
+#define TRC_HVM_INVLPG64 (TRC_HVM_HANDLER + TRC_64_FLAG + 0x14)\r
+#define TRC_HVM_MCE (TRC_HVM_HANDLER + 0x15)\r
+#define TRC_HVM_IOPORT_READ (TRC_HVM_HANDLER + 0x16)\r
+#define TRC_HVM_IOMEM_READ (TRC_HVM_HANDLER + 0x17)\r
+#define TRC_HVM_CLTS (TRC_HVM_HANDLER + 0x18)\r
+#define TRC_HVM_LMSW (TRC_HVM_HANDLER + 0x19)\r
+#define TRC_HVM_LMSW64 (TRC_HVM_HANDLER + TRC_64_FLAG + 0x19)\r
+#define TRC_HVM_RDTSC (TRC_HVM_HANDLER + 0x1a)\r
+#define TRC_HVM_INTR_WINDOW (TRC_HVM_HANDLER + 0x20)\r
+#define TRC_HVM_NPF (TRC_HVM_HANDLER + 0x21)\r
+#define TRC_HVM_REALMODE_EMULATE (TRC_HVM_HANDLER + 0x22)\r
+#define TRC_HVM_TRAP (TRC_HVM_HANDLER + 0x23)\r
+#define TRC_HVM_TRAP_DEBUG (TRC_HVM_HANDLER + 0x24)\r
+#define TRC_HVM_VLAPIC (TRC_HVM_HANDLER + 0x25)\r
+\r
+#define TRC_HVM_IOPORT_WRITE (TRC_HVM_HANDLER + 0x216)\r
+#define TRC_HVM_IOMEM_WRITE (TRC_HVM_HANDLER + 0x217)\r
+\r
+/* trace events for per class */\r
+#define TRC_PM_FREQ_CHANGE (TRC_HW_PM + 0x01)\r
+#define TRC_PM_IDLE_ENTRY (TRC_HW_PM + 0x02)\r
+#define TRC_PM_IDLE_EXIT (TRC_HW_PM + 0x03)\r
+\r
+/* Trace events for IRQs */\r
+#define TRC_HW_IRQ_MOVE_CLEANUP_DELAY (TRC_HW_IRQ + 0x1)\r
+#define TRC_HW_IRQ_MOVE_CLEANUP (TRC_HW_IRQ + 0x2)\r
+#define TRC_HW_IRQ_BIND_VECTOR (TRC_HW_IRQ + 0x3)\r
+#define TRC_HW_IRQ_CLEAR_VECTOR (TRC_HW_IRQ + 0x4)\r
+#define TRC_HW_IRQ_MOVE_FINISH (TRC_HW_IRQ + 0x5)\r
+#define TRC_HW_IRQ_ASSIGN_VECTOR (TRC_HW_IRQ + 0x6)\r
+#define TRC_HW_IRQ_UNMAPPED_VECTOR (TRC_HW_IRQ + 0x7)\r
+#define TRC_HW_IRQ_HANDLED (TRC_HW_IRQ + 0x8)\r
+\r
+/*\r
+ * Event Flags\r
+ *\r
+ * Some events (e.g, TRC_PV_TRAP and TRC_HVM_IOMEM_READ) have multiple\r
+ * record formats. These event flags distinguish between the\r
+ * different formats.\r
+ */\r
+#define TRC_64_FLAG 0x100 /* Addresses are 64 bits (instead of 32 bits) */\r
+\r
+/* This structure represents a single trace buffer record. */\r
+struct t_rec {\r
+ uint32_t event:28;\r
+ uint32_t extra_u32:3; /* # entries in trailing extra_u32[] array */\r
+ uint32_t cycles_included:1; /* u.cycles or u.no_cycles? */\r
+ union {\r
+ struct {\r
+ uint32_t cycles_lo, cycles_hi; /* cycle counter timestamp */\r
+ uint32_t extra_u32[7]; /* event data items */\r
+ } cycles;\r
+ struct {\r
+ uint32_t extra_u32[7]; /* event data items */\r
+ } nocycles;\r
+ } u;\r
+};\r
+\r
+/*\r
+ * This structure contains the metadata for a single trace buffer. The head\r
+ * field, indexes into an array of struct t_rec's.\r
+ */\r
+struct t_buf {\r
+ /* Assume the data buffer size is X. X is generally not a power of 2.\r
+ * CONS and PROD are incremented modulo (2*X):\r
+ * 0 <= cons < 2*X\r
+ * 0 <= prod < 2*X\r
+ * This is done because addition modulo X breaks at 2^32 when X is not a\r
+ * power of 2:\r
+ * (((2^32 - 1) % X) + 1) % X != (2^32) % X\r
+ */\r
+ uint32_t cons; /* Offset of next item to be consumed by control tools. */\r
+ uint32_t prod; /* Offset of next item to be produced by Xen. */\r
+ /* Records follow immediately after the meta-data header. */\r
+};\r
+\r
+/* Structure used to pass MFNs to the trace buffers back to trace consumers.\r
+ * Offset is an offset into the mapped structure where the mfn list will be held.\r
+ * MFNs will be at ((ULONG_PTR *)(t_info))+(t_info->cpu_offset[cpu]).\r
+ */\r
+struct t_info {\r
+ uint16_t tbuf_size; /* Size in pages of each trace buffer */\r
+ uint16_t mfn_offset[]; /* Offset within t_info structure of the page list per cpu */\r
+ /* MFN lists immediately after the header */\r
+};\r
+\r
+#endif /* __XEN_PUBLIC_TRACE_H__ */\r
+\r
+/*\r
+ * Local variables:\r
+ * mode: C\r
+ * c-file-style: "BSD"\r
+ * c-basic-offset: 4\r
+ * tab-width: 4\r
+ * indent-tabs-mode: nil\r
+ * End:\r
+ */\r
-/******************************************************************************
- * xen-compat.h
- *
- * Guest OS interface to Xen. Compatibility layer.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to
- * deal in the Software without restriction, including without limitation the
- * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
- * sell copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- *
- * Copyright (c) 2006, Christian Limpach
- */
-
-#ifndef __XEN_PUBLIC_XEN_COMPAT_H__
-#define __XEN_PUBLIC_XEN_COMPAT_H__
-
-#define __XEN_LATEST_INTERFACE_VERSION__ 0x0003020a
-
-#if defined(__XEN__) || defined(__XEN_TOOLS__)
-/* Xen is built with matching headers and implements the latest interface. */
-#define __XEN_INTERFACE_VERSION__ __XEN_LATEST_INTERFACE_VERSION__
-#elif !defined(__XEN_INTERFACE_VERSION__)
-/* Guests which do not specify a version get the legacy interface. */
-#define __XEN_INTERFACE_VERSION__ 0x00000000
-#endif
-
-#if __XEN_INTERFACE_VERSION__ > __XEN_LATEST_INTERFACE_VERSION__
-#error "These header files do not support the requested interface version."
-#endif
-
-#endif /* __XEN_PUBLIC_XEN_COMPAT_H__ */
+/******************************************************************************\r
+ * xen-compat.h\r
+ * \r
+ * Guest OS interface to Xen. Compatibility layer.\r
+ * \r
+ * Permission is hereby granted, free of charge, to any person obtaining a copy\r
+ * of this software and associated documentation files (the "Software"), to\r
+ * deal in the Software without restriction, including without limitation the\r
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\r
+ * sell copies of the Software, and to permit persons to whom the Software is\r
+ * furnished to do so, subject to the following conditions:\r
+ *\r
+ * The above copyright notice and this permission notice shall be included in\r
+ * all copies or substantial portions of the Software.\r
+ *\r
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\r
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER\r
+ * DEALINGS IN THE SOFTWARE.\r
+ *\r
+ * Copyright (c) 2006, Christian Limpach\r
+ */\r
+\r
+#ifndef __XEN_PUBLIC_XEN_COMPAT_H__\r
+#define __XEN_PUBLIC_XEN_COMPAT_H__\r
+\r
+#define __XEN_LATEST_INTERFACE_VERSION__ 0x00040300\r
+\r
+#if defined(__XEN__) || defined(__XEN_TOOLS__)\r
+/* Xen is built with matching headers and implements the latest interface. */\r
+#define __XEN_INTERFACE_VERSION__ __XEN_LATEST_INTERFACE_VERSION__\r
+#elif !defined(__XEN_INTERFACE_VERSION__)\r
+/* Guests which do not specify a version get the legacy interface. */\r
+#define __XEN_INTERFACE_VERSION__ 0x00000000\r
+#endif\r
+\r
+#if __XEN_INTERFACE_VERSION__ > __XEN_LATEST_INTERFACE_VERSION__\r
+#error "These header files do not support the requested interface version."\r
+#endif\r
+\r
+#endif /* __XEN_PUBLIC_XEN_COMPAT_H__ */\r
-/******************************************************************************
- * xen.h
- *
- * Guest OS interface to Xen.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to
- * deal in the Software without restriction, including without limitation the
- * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
- * sell copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- *
- * Copyright (c) 2004, K A Fraser
- */
-
-#ifndef __XEN_PUBLIC_XEN_H__
-#define __XEN_PUBLIC_XEN_H__
-
-#include "xen-compat.h"
-
-#if defined(__i386__) || defined(__x86_64__)
-#include "arch-x86/xen.h"
-#elif defined(__ia64__)
-#include "arch-ia64.h"
-#else
-#error "Unsupported architecture"
-#endif
-
-#ifndef __ASSEMBLY__
-/* Guest handles for primitive C types. */
-DEFINE_XEN_GUEST_HANDLE(char);
-__DEFINE_XEN_GUEST_HANDLE(uchar, unsigned char);
-DEFINE_XEN_GUEST_HANDLE(int);
-__DEFINE_XEN_GUEST_HANDLE(uint, unsigned int);
-DEFINE_XEN_GUEST_HANDLE(LONG_PTR);
-__DEFINE_XEN_GUEST_HANDLE(ulong, ULONG_PTR);
-DEFINE_XEN_GUEST_HANDLE(void);
-
-DEFINE_XEN_GUEST_HANDLE(uint64_t);
-DEFINE_XEN_GUEST_HANDLE(xen_pfn_t);
-#endif
-
-/*
- * HYPERCALLS
- */
-
-#define __HYPERVISOR_set_trap_table 0
-#define __HYPERVISOR_mmu_update 1
-#define __HYPERVISOR_set_gdt 2
-#define __HYPERVISOR_stack_switch 3
-#define __HYPERVISOR_set_callbacks 4
-#define __HYPERVISOR_fpu_taskswitch 5
-#define __HYPERVISOR_sched_op_compat 6 /* compat since 0x00030101 */
-#define __HYPERVISOR_platform_op 7
-#define __HYPERVISOR_set_debugreg 8
-#define __HYPERVISOR_get_debugreg 9
-#define __HYPERVISOR_update_descriptor 10
-#define __HYPERVISOR_memory_op 12
-#define __HYPERVISOR_multicall 13
-#define __HYPERVISOR_update_va_mapping 14
-#define __HYPERVISOR_set_timer_op 15
-#define __HYPERVISOR_event_channel_op_compat 16 /* compat since 0x00030202 */
-#define __HYPERVISOR_xen_version 17
-#define __HYPERVISOR_console_io 18
-#define __HYPERVISOR_physdev_op_compat 19 /* compat since 0x00030202 */
-#define __HYPERVISOR_grant_table_op 20
-#define __HYPERVISOR_vm_assist 21
-#define __HYPERVISOR_update_va_mapping_otherdomain 22
-#define __HYPERVISOR_iret 23 /* x86 only */
-#define __HYPERVISOR_vcpu_op 24
-#define __HYPERVISOR_set_segment_base 25 /* x86/64 only */
-#define __HYPERVISOR_mmuext_op 26
-#define __HYPERVISOR_xsm_op 27
-#define __HYPERVISOR_nmi_op 28
-#define __HYPERVISOR_sched_op 29
-#define __HYPERVISOR_callback_op 30
-#define __HYPERVISOR_xenoprof_op 31
-#define __HYPERVISOR_event_channel_op 32
-#define __HYPERVISOR_physdev_op 33
-#define __HYPERVISOR_hvm_op 34
-#define __HYPERVISOR_sysctl 35
-#define __HYPERVISOR_domctl 36
-#define __HYPERVISOR_kexec_op 37
-#define __HYPERVISOR_tmem_op 38
-
-/* Architecture-specific hypercall definitions. */
-#define __HYPERVISOR_arch_0 48
-#define __HYPERVISOR_arch_1 49
-#define __HYPERVISOR_arch_2 50
-#define __HYPERVISOR_arch_3 51
-#define __HYPERVISOR_arch_4 52
-#define __HYPERVISOR_arch_5 53
-#define __HYPERVISOR_arch_6 54
-#define __HYPERVISOR_arch_7 55
-
-/*
- * HYPERCALL COMPATIBILITY.
- */
-
-/* New sched_op hypercall introduced in 0x00030101. */
-#if __XEN_INTERFACE_VERSION__ < 0x00030101
-#undef __HYPERVISOR_sched_op
-#define __HYPERVISOR_sched_op __HYPERVISOR_sched_op_compat
-#endif
-
-/* New event-channel and physdev hypercalls introduced in 0x00030202. */
-#if __XEN_INTERFACE_VERSION__ < 0x00030202
-#undef __HYPERVISOR_event_channel_op
-#define __HYPERVISOR_event_channel_op __HYPERVISOR_event_channel_op_compat
-#undef __HYPERVISOR_physdev_op
-#define __HYPERVISOR_physdev_op __HYPERVISOR_physdev_op_compat
-#endif
-
-/* New platform_op hypercall introduced in 0x00030204. */
-#if __XEN_INTERFACE_VERSION__ < 0x00030204
-#define __HYPERVISOR_dom0_op __HYPERVISOR_platform_op
-#endif
-
-/*
- * VIRTUAL INTERRUPTS
- *
- * Virtual interrupts that a guest OS may receive from Xen.
- *
- * In the side comments, 'V.' denotes a per-VCPU VIRQ while 'G.' denotes a
- * global VIRQ. The former can be bound once per VCPU and cannot be re-bound.
- * The latter can be allocated only once per guest: they must initially be
- * allocated to VCPU0 but can subsequently be re-bound.
- */
-#define VIRQ_TIMER 0 /* V. Timebase update, and/or requested timeout. */
-#define VIRQ_DEBUG 1 /* V. Request guest to dump debug info. */
-#define VIRQ_CONSOLE 2 /* G. (DOM0) Bytes received on emergency console. */
-#define VIRQ_DOM_EXC 3 /* G. (DOM0) Exceptional event for some domain. */
-#define VIRQ_TBUF 4 /* G. (DOM0) Trace buffer has records available. */
-#define VIRQ_DEBUGGER 6 /* G. (DOM0) A domain has paused for debugging. */
-#define VIRQ_XENOPROF 7 /* V. XenOprofile interrupt: new sample available */
-#define VIRQ_CON_RING 8 /* G. (DOM0) Bytes received on console */
-#define VIRQ_PCPU_STATE 9 /* G. (DOM0) PCPU state changed */
-#define VIRQ_MEM_EVENT 10 /* G. (DOM0) A memory event has occured */
-
-/* Architecture-specific VIRQ definitions. */
-#define VIRQ_ARCH_0 16
-#define VIRQ_ARCH_1 17
-#define VIRQ_ARCH_2 18
-#define VIRQ_ARCH_3 19
-#define VIRQ_ARCH_4 20
-#define VIRQ_ARCH_5 21
-#define VIRQ_ARCH_6 22
-#define VIRQ_ARCH_7 23
-
-#define NR_VIRQS 24
-
-/*
- * HYPERVISOR_mmu_update(reqs, count, pdone, foreigndom)
- *
- * @reqs is an array of mmu_update_t structures ((ptr, val) pairs).
- * @count is the length of the above array.
- * @pdone is an output parameter indicating number of completed operations
- * @foreigndom[15:0]: FD, the expected owner of data pages referenced in this
- * hypercall invocation. Can be DOMID_SELF.
- * @foreigndom[31:16]: PFD, the expected owner of pagetable pages referenced
- * in this hypercall invocation. The value of this field
- * (x) encodes the PFD as follows:
- * x == 0 => PFD == DOMID_SELF
- * x != 0 => PFD == x - 1
- *
- * Sub-commands: ptr[1:0] specifies the appropriate MMU_* command.
- * -------------
- * ptr[1:0] == MMU_NORMAL_PT_UPDATE:
- * Updates an entry in a page table belonging to PFD. If updating an L1 table,
- * and the new table entry is valid/present, the mapped frame must belong to
- * FD. If attempting to map an I/O page then the caller assumes the privilege
- * of the FD.
- * FD == DOMID_IO: Permit /only/ I/O mappings, at the priv level of the caller.
- * FD == DOMID_XEN: Map restricted areas of Xen's heap space.
- * ptr[:2] -- Machine address of the page-table entry to modify.
- * val -- Value to write.
- *
- * ptr[1:0] == MMU_MACHPHYS_UPDATE:
- * Updates an entry in the machine->pseudo-physical mapping table.
- * ptr[:2] -- Machine address within the frame whose mapping to modify.
- * The frame must belong to the FD, if one is specified.
- * val -- Value to write into the mapping entry.
- *
- * ptr[1:0] == MMU_PT_UPDATE_PRESERVE_AD:
- * As MMU_NORMAL_PT_UPDATE above, but A/D bits currently in the PTE are ORed
- * with those in @val.
- */
-#define MMU_NORMAL_PT_UPDATE 0 /* checked '*ptr = val'. ptr is MA. */
-#define MMU_MACHPHYS_UPDATE 1 /* ptr = MA of frame to modify entry for */
-#define MMU_PT_UPDATE_PRESERVE_AD 2 /* atomically: *ptr = val | (*ptr&(A|D)) */
-
-/*
- * MMU EXTENDED OPERATIONS
- *
- * HYPERVISOR_mmuext_op() accepts a list of mmuext_op structures.
- * A foreigndom (FD) can be specified (or DOMID_SELF for none).
- * Where the FD has some effect, it is described below.
- *
- * cmd: MMUEXT_(UN)PIN_*_TABLE
- * mfn: Machine frame number to be (un)pinned as a p.t. page.
- * The frame must belong to the FD, if one is specified.
- *
- * cmd: MMUEXT_NEW_BASEPTR
- * mfn: Machine frame number of new page-table base to install in MMU.
- *
- * cmd: MMUEXT_NEW_USER_BASEPTR [x86/64 only]
- * mfn: Machine frame number of new page-table base to install in MMU
- * when in user space.
- *
- * cmd: MMUEXT_TLB_FLUSH_LOCAL
- * No additional arguments. Flushes local TLB.
- *
- * cmd: MMUEXT_INVLPG_LOCAL
- * linear_addr: Linear address to be flushed from the local TLB.
- *
- * cmd: MMUEXT_TLB_FLUSH_MULTI
- * vcpumask: Pointer to bitmap of VCPUs to be flushed.
- *
- * cmd: MMUEXT_INVLPG_MULTI
- * linear_addr: Linear address to be flushed.
- * vcpumask: Pointer to bitmap of VCPUs to be flushed.
- *
- * cmd: MMUEXT_TLB_FLUSH_ALL
- * No additional arguments. Flushes all VCPUs' TLBs.
- *
- * cmd: MMUEXT_INVLPG_ALL
- * linear_addr: Linear address to be flushed from all VCPUs' TLBs.
- *
- * cmd: MMUEXT_FLUSH_CACHE
- * No additional arguments. Writes back and flushes cache contents.
- *
- * cmd: MMUEXT_FLUSH_CACHE_GLOBAL
- * No additional arguments. Writes back and flushes cache contents
- * on all CPUs in the system.
- *
- * cmd: MMUEXT_SET_LDT
- * linear_addr: Linear address of LDT base (NB. must be page-aligned).
- * nr_ents: Number of entries in LDT.
- *
- * cmd: MMUEXT_CLEAR_PAGE
- * mfn: Machine frame number to be cleared.
- *
- * cmd: MMUEXT_COPY_PAGE
- * mfn: Machine frame number of the destination page.
- * src_mfn: Machine frame number of the source page.
- *
- * cmd: MMUEXT_[UN]MARK_SUPER
- * mfn: Machine frame number of head of superpage to be [un]marked.
- */
-#define MMUEXT_PIN_L1_TABLE 0
-#define MMUEXT_PIN_L2_TABLE 1
-#define MMUEXT_PIN_L3_TABLE 2
-#define MMUEXT_PIN_L4_TABLE 3
-#define MMUEXT_UNPIN_TABLE 4
-#define MMUEXT_NEW_BASEPTR 5
-#define MMUEXT_TLB_FLUSH_LOCAL 6
-#define MMUEXT_INVLPG_LOCAL 7
-#define MMUEXT_TLB_FLUSH_MULTI 8
-#define MMUEXT_INVLPG_MULTI 9
-#define MMUEXT_TLB_FLUSH_ALL 10
-#define MMUEXT_INVLPG_ALL 11
-#define MMUEXT_FLUSH_CACHE 12
-#define MMUEXT_SET_LDT 13
-#define MMUEXT_NEW_USER_BASEPTR 15
-#define MMUEXT_CLEAR_PAGE 16
-#define MMUEXT_COPY_PAGE 17
-#define MMUEXT_FLUSH_CACHE_GLOBAL 18
-#define MMUEXT_MARK_SUPER 19
-#define MMUEXT_UNMARK_SUPER 20
-
-#ifndef __ASSEMBLY__
-struct mmuext_op {
- unsigned int cmd;
- union {
- /* [UN]PIN_TABLE, NEW_BASEPTR, NEW_USER_BASEPTR
- * CLEAR_PAGE, COPY_PAGE, [UN]MARK_SUPER */
- xen_pfn_t mfn;
- /* INVLPG_LOCAL, INVLPG_ALL, SET_LDT */
- ULONG_PTR linear_addr;
- } arg1;
- union {
- /* SET_LDT */
- unsigned int nr_ents;
- /* TLB_FLUSH_MULTI, INVLPG_MULTI */
-#if __XEN_INTERFACE_VERSION__ >= 0x00030205
- XEN_GUEST_HANDLE(const_void) vcpumask;
-#else
- const void *vcpumask;
-#endif
- /* COPY_PAGE */
- xen_pfn_t src_mfn;
- } arg2;
-};
-typedef struct mmuext_op mmuext_op_t;
-DEFINE_XEN_GUEST_HANDLE(mmuext_op_t);
-#endif
-
-/* These are passed as 'flags' to update_va_mapping. They can be ORed. */
-/* When specifying UVMF_MULTI, also OR in a pointer to a CPU bitmap. */
-/* UVMF_LOCAL is merely UVMF_MULTI with a NULL bitmap pointer. */
-#define UVMF_NONE (0UL<<0) /* No flushing at all. */
-#define UVMF_TLB_FLUSH (1UL<<0) /* Flush entire TLB(s). */
-#define UVMF_INVLPG (2UL<<0) /* Flush only one entry. */
-#define UVMF_FLUSHTYPE_MASK (3UL<<0)
-#define UVMF_MULTI (0UL<<2) /* Flush subset of TLBs. */
-#define UVMF_LOCAL (0UL<<2) /* Flush local TLB. */
-#define UVMF_ALL (1UL<<2) /* Flush all TLBs. */
-
-/*
- * Commands to HYPERVISOR_console_io().
- */
-#define CONSOLEIO_write 0
-#define CONSOLEIO_read 1
-
-/*
- * Commands to HYPERVISOR_vm_assist().
- */
-#define VMASST_CMD_enable 0
-#define VMASST_CMD_disable 1
-
-/* x86/32 guests: simulate full 4GB segment limits. */
-#define VMASST_TYPE_4gb_segments 0
-
-/* x86/32 guests: trap (vector 15) whenever above vmassist is used. */
-#define VMASST_TYPE_4gb_segments_notify 1
-
-/*
- * x86 guests: support writes to bottom-level PTEs.
- * NB1. Page-directory entries cannot be written.
- * NB2. Guest must continue to remove all writable mappings of PTEs.
- */
-#define VMASST_TYPE_writable_pagetables 2
-
-/* x86/PAE guests: support PDPTs above 4GB. */
-#define VMASST_TYPE_pae_extended_cr3 3
-
-#define MAX_VMASST_TYPE 3
-
-#ifndef __ASSEMBLY__
-
-typedef uint16_t domid_t;
-
-/* Domain ids >= DOMID_FIRST_RESERVED cannot be used for ordinary domains. */
-#define DOMID_FIRST_RESERVED (0x7FF0U)
-
-/* DOMID_SELF is used in certain contexts to refer to oneself. */
-#define DOMID_SELF (0x7FF0U)
-
-/*
- * DOMID_IO is used to restrict page-table updates to mapping I/O memory.
- * Although no Foreign Domain need be specified to map I/O pages, DOMID_IO
- * is useful to ensure that no mappings to the OS's own heap are accidentally
- * installed. (e.g., in Linux this could cause havoc as reference counts
- * aren't adjusted on the I/O-mapping code path).
- * This only makes sense in MMUEXT_SET_FOREIGNDOM, but in that context can
- * be specified by any calling domain.
- */
-#define DOMID_IO (0x7FF1U)
-
-/*
- * DOMID_XEN is used to allow privileged domains to map restricted parts of
- * Xen's heap space (e.g., the machine_to_phys table).
- * This only makes sense in MMUEXT_SET_FOREIGNDOM, and is only permitted if
- * the caller is privileged.
- */
-#define DOMID_XEN (0x7FF2U)
-
-/*
- * DOMID_COW is used as the owner of sharable pages */
-#define DOMID_COW (0x7FF3U)
-
-/* DOMID_INVALID is used to identify pages with unknown owner. */
-#define DOMID_INVALID (0x7FF4U)
-
-/* Idle domain. */
-#define DOMID_IDLE (0x7FFFU)
-
-/*
- * Send an array of these to HYPERVISOR_mmu_update().
- * NB. The fields are natural pointer/address size for this architecture.
- */
-struct mmu_update {
- uint64_t ptr; /* Machine address of PTE. */
- uint64_t val; /* New contents of PTE. */
-};
-typedef struct mmu_update mmu_update_t;
-DEFINE_XEN_GUEST_HANDLE(mmu_update_t);
-
-/*
- * Send an array of these to HYPERVISOR_multicall().
- * NB. The fields are natural register size for this architecture.
- */
-struct multicall_entry {
- ULONG_PTR op, result;
- ULONG_PTR args[6];
-};
-typedef struct multicall_entry multicall_entry_t;
-DEFINE_XEN_GUEST_HANDLE(multicall_entry_t);
-
-/*
- * Event channel endpoints per domain:
- * 1024 if a LONG_PTR is 32 bits; 4096 if a LONG_PTR is 64 bits.
- */
-#define NR_EVENT_CHANNELS (sizeof(ULONG_PTR) * sizeof(ULONG_PTR) * 64)
-
-struct vcpu_time_info {
- /*
- * Updates to the following values are preceded and followed by an
- * increment of 'version'. The guest can therefore detect updates by
- * looking for changes to 'version'. If the least-significant bit of
- * the version number is set then an update is in progress and the guest
- * must wait to read a consistent set of values.
- * The correct way to interact with the version number is similar to
- * Linux's seqlock: see the implementations of read_seqbegin/read_seqretry.
- */
- uint32_t version;
- uint32_t pad0;
- uint64_t tsc_timestamp; /* TSC at last update of time vals. */
- uint64_t system_time; /* Time, in nanosecs, since boot. */
- /*
- * Current system time:
- * system_time +
- * ((((tsc - tsc_timestamp) << tsc_shift) * tsc_to_system_mul) >> 32)
- * CPU frequency (Hz):
- * ((10^9 << 32) / tsc_to_system_mul) >> tsc_shift
- */
- uint32_t tsc_to_system_mul;
- int8_t tsc_shift;
- int8_t pad1[3];
-}; /* 32 bytes */
-typedef struct vcpu_time_info vcpu_time_info_t;
-
-struct vcpu_info {
- /*
- * 'evtchn_upcall_pending' is written non-zero by Xen to indicate
- * a pending notification for a particular VCPU. It is then cleared
- * by the guest OS /before/ checking for pending work, thus avoiding
- * a set-and-check race. Note that the mask is only accessed by Xen
- * on the CPU that is currently hosting the VCPU. This means that the
- * pending and mask flags can be updated by the guest without special
- * synchronisation (i.e., no need for the x86 LOCK prefix).
- * This may seem suboptimal because if the pending flag is set by
- * a different CPU then an IPI may be scheduled even when the mask
- * is set. However, note:
- * 1. The task of 'interrupt holdoff' is covered by the per-event-
- * channel mask bits. A 'noisy' event that is continually being
- * triggered can be masked at source at this very precise
- * granularity.
- * 2. The main purpose of the per-VCPU mask is therefore to restrict
- * reentrant execution: whether for concurrency control, or to
- * prevent unbounded stack usage. Whatever the purpose, we expect
- * that the mask will be asserted only for short periods at a time,
- * and so the likelihood of a 'spurious' IPI is suitably small.
- * The mask is read before making an event upcall to the guest: a
- * non-zero mask therefore guarantees that the VCPU will not receive
- * an upcall activation. The mask is cleared when the VCPU requests
- * to block: this avoids wakeup-waiting races.
- */
- uint8_t evtchn_upcall_pending;
- uint8_t evtchn_upcall_mask;
- ULONG_PTR evtchn_pending_sel;
- struct arch_vcpu_info arch;
- struct vcpu_time_info time;
-}; /* 64 bytes (x86) */
-#ifndef __XEN__
-typedef struct vcpu_info vcpu_info_t;
-#endif
-
-/*
- * Xen/kernel shared data -- pointer provided in start_info.
- *
- * This structure is defined to be both smaller than a page, and the
- * only data on the shared page, but may vary in actual size even within
- * compatible Xen versions; guests should not rely on the size
- * of this structure remaining constant.
- */
-struct shared_info {
- struct vcpu_info vcpu_info[XEN_LEGACY_MAX_VCPUS];
-
- /*
- * A domain can create "event channels" on which it can send and receive
- * asynchronous event notifications. There are three classes of event that
- * are delivered by this mechanism:
- * 1. Bi-directional inter- and intra-domain connections. Domains must
- * arrange out-of-band to set up a connection (usually by allocating
- * an unbound 'listener' port and avertising that via a storage service
- * such as xenstore).
- * 2. Physical interrupts. A domain with suitable hardware-access
- * privileges can bind an event-channel port to a physical interrupt
- * source.
- * 3. Virtual interrupts ('events'). A domain can bind an event-channel
- * port to a virtual interrupt source, such as the virtual-timer
- * device or the emergency console.
- *
- * Event channels are addressed by a "port index". Each channel is
- * associated with two bits of information:
- * 1. PENDING -- notifies the domain that there is a pending notification
- * to be processed. This bit is cleared by the guest.
- * 2. MASK -- if this bit is clear then a 0->1 transition of PENDING
- * will cause an asynchronous upcall to be scheduled. This bit is only
- * updated by the guest. It is read-only within Xen. If a channel
- * becomes pending while the channel is masked then the 'edge' is lost
- * (i.e., when the channel is unmasked, the guest must manually handle
- * pending notifications as no upcall will be scheduled by Xen).
- *
- * To expedite scanning of pending notifications, any 0->1 pending
- * transition on an unmasked channel causes a corresponding bit in a
- * per-vcpu selector word to be set. Each bit in the selector covers a
- * 'C LONG_PTR' in the PENDING bitfield array.
- */
- ULONG_PTR evtchn_pending[sizeof(ULONG_PTR) * 8];
- ULONG_PTR evtchn_mask[sizeof(ULONG_PTR) * 8];
-
- /*
- * Wallclock time: updated only by control software. Guests should base
- * their gettimeofday() syscall on this wallclock-base value.
- */
- uint32_t wc_version; /* Version counter: see vcpu_time_info_t. */
- uint32_t wc_sec; /* Secs 00:00:00 UTC, Jan 1, 1970. */
- uint32_t wc_nsec; /* Nsecs 00:00:00 UTC, Jan 1, 1970. */
-
- struct arch_shared_info arch;
-
-};
-#ifndef __XEN__
-typedef struct shared_info shared_info_t;
-#endif
-
-/*
- * Start-of-day memory layout:
- * 1. The domain is started within contiguous virtual-memory region.
- * 2. The contiguous region ends on an aligned 4MB boundary.
- * 3. This the order of bootstrap elements in the initial virtual region:
- * a. relocated kernel image
- * b. initial ram disk [mod_start, mod_len]
- * c. list of allocated page frames [mfn_list, nr_pages]
- * (unless relocated due to XEN_ELFNOTE_INIT_P2M)
- * d. start_info_t structure [register ESI (x86)]
- * e. bootstrap page tables [pt_base, CR3 (x86)]
- * f. bootstrap stack [register ESP (x86)]
- * 4. Bootstrap elements are packed together, but each is 4kB-aligned.
- * 5. The initial ram disk may be omitted.
- * 6. The list of page frames forms a contiguous 'pseudo-physical' memory
- * layout for the domain. In particular, the bootstrap virtual-memory
- * region is a 1:1 mapping to the first section of the pseudo-physical map.
- * 7. All bootstrap elements are mapped read-writable for the guest OS. The
- * only exception is the bootstrap page table, which is mapped read-only.
- * 8. There is guaranteed to be at least 512kB padding after the final
- * bootstrap element. If necessary, the bootstrap virtual region is
- * extended by an extra 4MB to ensure this.
- */
-
-#define MAX_GUEST_CMDLINE 1024
-struct start_info {
- /* THE FOLLOWING ARE FILLED IN BOTH ON INITIAL BOOT AND ON RESUME. */
- char magic[32]; /* "xen-<version>-<platform>". */
- ULONG_PTR nr_pages; /* Total pages allocated to this domain. */
- ULONG_PTR shared_info; /* MACHINE address of shared info struct. */
- uint32_t flags; /* SIF_xxx flags. */
- xen_pfn_t store_mfn; /* MACHINE page number of shared page. */
- uint32_t store_evtchn; /* Event channel for store communication. */
- union {
- struct {
- xen_pfn_t mfn; /* MACHINE page number of console page. */
- uint32_t evtchn; /* Event channel for console page. */
- } domU;
- struct {
- uint32_t info_off; /* Offset of console_info struct. */
- uint32_t info_size; /* Size of console_info struct from start.*/
- } dom0;
- } console;
- /* THE FOLLOWING ARE ONLY FILLED IN ON INITIAL BOOT (NOT RESUME). */
- ULONG_PTR pt_base; /* VIRTUAL address of page directory. */
- ULONG_PTR nr_pt_frames; /* Number of bootstrap p.t. frames. */
- ULONG_PTR mfn_list; /* VIRTUAL address of page-frame list. */
- ULONG_PTR mod_start; /* VIRTUAL address of pre-loaded module */
- /* (PFN of pre-loaded module if */
- /* SIF_MOD_START_PFN set in flags). */
- ULONG_PTR mod_len; /* Size (bytes) of pre-loaded module. */
- int8_t cmd_line[MAX_GUEST_CMDLINE];
- /* The pfn range here covers both page table and p->m table frames. */
- ULONG_PTR first_p2m_pfn;/* 1st pfn forming initial P->M table. */
- ULONG_PTR nr_p2m_frames;/* # of pfns forming initial P->M table. */
-};
-typedef struct start_info start_info_t;
-
-/* New console union for dom0 introduced in 0x00030203. */
-#if __XEN_INTERFACE_VERSION__ < 0x00030203
-#define console_mfn console.domU.mfn
-#define console_evtchn console.domU.evtchn
-#endif
-
-/* These flags are passed in the 'flags' field of start_info_t. */
-#define SIF_PRIVILEGED (1<<0) /* Is the domain privileged? */
-#define SIF_INITDOMAIN (1<<1) /* Is this the initial control domain? */
-#define SIF_MULTIBOOT_MOD (1<<2) /* Is mod_start a multiboot module? */
-#define SIF_MOD_START_PFN (1<<3) /* Is mod_start a PFN? */
-#define SIF_PM_MASK (0xFF<<8) /* reserve 1 byte for xen-pm options */
-
-/*
- * A multiboot module is a package containing modules very similar to a
- * multiboot module array. The only differences are:
- * - the array of module descriptors is by convention simply at the beginning
- * of the multiboot module,
- * - addresses in the module descriptors are based on the beginning of the
- * multiboot module,
- * - the number of modules is determined by a termination descriptor that has
- * mod_start == 0.
- *
- * This permits to both build it statically and reference it in a configuration
- * file, and let the PV guest easily rebase the addresses to virtual addresses
- * and at the same time count the number of modules.
- */
-struct xen_multiboot_mod_list
-{
- /* Address of first byte of the module */
- uint32_t mod_start;
- /* Address of last byte of the module (inclusive) */
- uint32_t mod_end;
- /* Address of zero-terminated command line */
- uint32_t cmdline;
- /* Unused, must be zero */
- uint32_t pad;
-};
-
-typedef struct dom0_vga_console_info {
- uint8_t video_type; /* DOM0_VGA_CONSOLE_??? */
-#define XEN_VGATYPE_TEXT_MODE_3 0x03
-#define XEN_VGATYPE_VESA_LFB 0x23
-
- union {
- struct {
- /* Font height, in pixels. */
- uint16_t font_height;
- /* Cursor location (column, row). */
- uint16_t cursor_x, cursor_y;
- /* Number of rows and columns (dimensions in characters). */
- uint16_t rows, columns;
- } text_mode_3;
-
- struct {
- /* Width and height, in pixels. */
- uint16_t width, height;
- /* Bytes per scan line. */
- uint16_t bytes_per_line;
- /* Bits per pixel. */
- uint16_t bits_per_pixel;
- /* LFB physical address, and size (in units of 64kB). */
- uint32_t lfb_base;
- uint32_t lfb_size;
- /* RGB mask offsets and sizes, as defined by VBE 1.2+ */
- uint8_t red_pos, red_size;
- uint8_t green_pos, green_size;
- uint8_t blue_pos, blue_size;
- uint8_t rsvd_pos, rsvd_size;
-#if __XEN_INTERFACE_VERSION__ >= 0x00030206
- /* VESA capabilities (offset 0xa, VESA command 0x4f00). */
- uint32_t gbl_caps;
- /* Mode attributes (offset 0x0, VESA command 0x4f01). */
- uint16_t mode_attrs;
-#endif
- } vesa_lfb;
- } u;
-} dom0_vga_console_info_t;
-#define xen_vga_console_info dom0_vga_console_info
-#define xen_vga_console_info_t dom0_vga_console_info_t
-
-typedef uint8_t xen_domain_handle_t[16];
-
-/* Turn a plain number into a C ULONG_PTR constant. */
-#define __mk_unsigned_long(x) x ## UL
-#define mk_unsigned_long(x) __mk_unsigned_long(x)
-
-__DEFINE_XEN_GUEST_HANDLE(uint8, uint8_t);
-__DEFINE_XEN_GUEST_HANDLE(uint16, uint16_t);
-__DEFINE_XEN_GUEST_HANDLE(uint32, uint32_t);
-__DEFINE_XEN_GUEST_HANDLE(uint64, uint64_t);
-
-#else /* __ASSEMBLY__ */
-
-/* In assembly code we cannot use C numeric constant suffixes. */
-#define mk_unsigned_long(x) x
-
-#endif /* !__ASSEMBLY__ */
-
-/* Default definitions for macros used by domctl/sysctl. */
-#if defined(__XEN__) || defined(__XEN_TOOLS__)
-
-#ifndef uint64_aligned_t
-#define uint64_aligned_t uint64_t
-#endif
-#ifndef XEN_GUEST_HANDLE_64
-#define XEN_GUEST_HANDLE_64(name) XEN_GUEST_HANDLE(name)
-#endif
-
-#ifndef __ASSEMBLY__
-struct xenctl_cpumap {
- XEN_GUEST_HANDLE_64(uint8) bitmap;
- uint32_t nr_cpus;
-};
-#endif
-
-#endif /* defined(__XEN__) || defined(__XEN_TOOLS__) */
-
-#endif /* __XEN_PUBLIC_XEN_H__ */
-
-/*
- * Local variables:
- * mode: C
- * c-set-style: "BSD"
- * c-basic-offset: 4
- * tab-width: 4
- * indent-tabs-mode: nil
- * End:
- */
+/******************************************************************************\r
+ * xen.h\r
+ * \r
+ * Guest OS interface to Xen.\r
+ * \r
+ * Permission is hereby granted, free of charge, to any person obtaining a copy\r
+ * of this software and associated documentation files (the "Software"), to\r
+ * deal in the Software without restriction, including without limitation the\r
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\r
+ * sell copies of the Software, and to permit persons to whom the Software is\r
+ * furnished to do so, subject to the following conditions:\r
+ *\r
+ * The above copyright notice and this permission notice shall be included in\r
+ * all copies or substantial portions of the Software.\r
+ *\r
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\r
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER\r
+ * DEALINGS IN THE SOFTWARE.\r
+ *\r
+ * Copyright (c) 2004, K A Fraser\r
+ */\r
+\r
+#ifndef __XEN_PUBLIC_XEN_H__\r
+#define __XEN_PUBLIC_XEN_H__\r
+\r
+#include "xen-compat.h"\r
+\r
+#if defined(__i386__) || defined(__x86_64__)\r
+#include "arch-x86/xen.h"\r
+#elif defined(__arm__) || defined (__aarch64__)\r
+#include "arch-arm.h"\r
+#else\r
+#error "Unsupported architecture"\r
+#endif\r
+\r
+#ifndef __ASSEMBLY__\r
+/* Guest handles for primitive C types. */\r
+DEFINE_XEN_GUEST_HANDLE(char);\r
+__DEFINE_XEN_GUEST_HANDLE(uchar, unsigned char);\r
+DEFINE_XEN_GUEST_HANDLE(int);\r
+__DEFINE_XEN_GUEST_HANDLE(uint, unsigned int);\r
+#if __XEN_INTERFACE_VERSION__ < 0x00040300\r
+DEFINE_XEN_GUEST_HANDLE(LONG_PTR);\r
+__DEFINE_XEN_GUEST_HANDLE(ulong, ULONG_PTR);\r
+#endif\r
+DEFINE_XEN_GUEST_HANDLE(void);\r
+\r
+DEFINE_XEN_GUEST_HANDLE(uint64_t);\r
+DEFINE_XEN_GUEST_HANDLE(xen_pfn_t);\r
+DEFINE_XEN_GUEST_HANDLE(xen_ulong_t);\r
+#endif\r
+\r
+/*\r
+ * HYPERCALLS\r
+ */\r
+\r
+/* `incontents 100 hcalls List of hypercalls\r
+ * ` enum hypercall_num { // __HYPERVISOR_* => HYPERVISOR_*()\r
+ */\r
+\r
+#define __HYPERVISOR_set_trap_table 0\r
+#define __HYPERVISOR_mmu_update 1\r
+#define __HYPERVISOR_set_gdt 2\r
+#define __HYPERVISOR_stack_switch 3\r
+#define __HYPERVISOR_set_callbacks 4\r
+#define __HYPERVISOR_fpu_taskswitch 5\r
+#define __HYPERVISOR_sched_op_compat 6 /* compat since 0x00030101 */\r
+#define __HYPERVISOR_platform_op 7\r
+#define __HYPERVISOR_set_debugreg 8\r
+#define __HYPERVISOR_get_debugreg 9\r
+#define __HYPERVISOR_update_descriptor 10\r
+#define __HYPERVISOR_memory_op 12\r
+#define __HYPERVISOR_multicall 13\r
+#define __HYPERVISOR_update_va_mapping 14\r
+#define __HYPERVISOR_set_timer_op 15\r
+#define __HYPERVISOR_event_channel_op_compat 16 /* compat since 0x00030202 */\r
+#define __HYPERVISOR_xen_version 17\r
+#define __HYPERVISOR_console_io 18\r
+#define __HYPERVISOR_physdev_op_compat 19 /* compat since 0x00030202 */\r
+#define __HYPERVISOR_grant_table_op 20\r
+#define __HYPERVISOR_vm_assist 21\r
+#define __HYPERVISOR_update_va_mapping_otherdomain 22\r
+#define __HYPERVISOR_iret 23 /* x86 only */\r
+#define __HYPERVISOR_vcpu_op 24\r
+#define __HYPERVISOR_set_segment_base 25 /* x86/64 only */\r
+#define __HYPERVISOR_mmuext_op 26\r
+#define __HYPERVISOR_xsm_op 27\r
+#define __HYPERVISOR_nmi_op 28\r
+#define __HYPERVISOR_sched_op 29\r
+#define __HYPERVISOR_callback_op 30\r
+#define __HYPERVISOR_xenoprof_op 31\r
+#define __HYPERVISOR_event_channel_op 32\r
+#define __HYPERVISOR_physdev_op 33\r
+#define __HYPERVISOR_hvm_op 34\r
+#define __HYPERVISOR_sysctl 35\r
+#define __HYPERVISOR_domctl 36\r
+#define __HYPERVISOR_kexec_op 37\r
+#define __HYPERVISOR_tmem_op 38\r
+#define __HYPERVISOR_xc_reserved_op 39 /* reserved for XenClient */\r
+\r
+/* Architecture-specific hypercall definitions. */\r
+#define __HYPERVISOR_arch_0 48\r
+#define __HYPERVISOR_arch_1 49\r
+#define __HYPERVISOR_arch_2 50\r
+#define __HYPERVISOR_arch_3 51\r
+#define __HYPERVISOR_arch_4 52\r
+#define __HYPERVISOR_arch_5 53\r
+#define __HYPERVISOR_arch_6 54\r
+#define __HYPERVISOR_arch_7 55\r
+\r
+/* ` } */\r
+\r
+/*\r
+ * HYPERCALL COMPATIBILITY.\r
+ */\r
+\r
+/* New sched_op hypercall introduced in 0x00030101. */\r
+#if __XEN_INTERFACE_VERSION__ < 0x00030101\r
+#undef __HYPERVISOR_sched_op\r
+#define __HYPERVISOR_sched_op __HYPERVISOR_sched_op_compat\r
+#endif\r
+\r
+/* New event-channel and physdev hypercalls introduced in 0x00030202. */\r
+#if __XEN_INTERFACE_VERSION__ < 0x00030202\r
+#undef __HYPERVISOR_event_channel_op\r
+#define __HYPERVISOR_event_channel_op __HYPERVISOR_event_channel_op_compat\r
+#undef __HYPERVISOR_physdev_op\r
+#define __HYPERVISOR_physdev_op __HYPERVISOR_physdev_op_compat\r
+#endif\r
+\r
+/* New platform_op hypercall introduced in 0x00030204. */\r
+#if __XEN_INTERFACE_VERSION__ < 0x00030204\r
+#define __HYPERVISOR_dom0_op __HYPERVISOR_platform_op\r
+#endif\r
+\r
+/* \r
+ * VIRTUAL INTERRUPTS\r
+ * \r
+ * Virtual interrupts that a guest OS may receive from Xen.\r
+ * \r
+ * In the side comments, 'V.' denotes a per-VCPU VIRQ while 'G.' denotes a\r
+ * global VIRQ. The former can be bound once per VCPU and cannot be re-bound.\r
+ * The latter can be allocated only once per guest: they must initially be\r
+ * allocated to VCPU0 but can subsequently be re-bound.\r
+ */\r
+/* ` enum virq { */\r
+#define VIRQ_TIMER 0 /* V. Timebase update, and/or requested timeout. */\r
+#define VIRQ_DEBUG 1 /* V. Request guest to dump debug info. */\r
+#define VIRQ_CONSOLE 2 /* G. (DOM0) Bytes received on emergency console. */\r
+#define VIRQ_DOM_EXC 3 /* G. (DOM0) Exceptional event for some domain. */\r
+#define VIRQ_TBUF 4 /* G. (DOM0) Trace buffer has records available. */\r
+#define VIRQ_DEBUGGER 6 /* G. (DOM0) A domain has paused for debugging. */\r
+#define VIRQ_XENOPROF 7 /* V. XenOprofile interrupt: new sample available */\r
+#define VIRQ_CON_RING 8 /* G. (DOM0) Bytes received on console */\r
+#define VIRQ_PCPU_STATE 9 /* G. (DOM0) PCPU state changed */\r
+#define VIRQ_MEM_EVENT 10 /* G. (DOM0) A memory event has occured */\r
+#define VIRQ_XC_RESERVED 11 /* G. Reserved for XenClient */\r
+#define VIRQ_ENOMEM 12 /* G. (DOM0) Low on heap memory */\r
+\r
+/* Architecture-specific VIRQ definitions. */\r
+#define VIRQ_ARCH_0 16\r
+#define VIRQ_ARCH_1 17\r
+#define VIRQ_ARCH_2 18\r
+#define VIRQ_ARCH_3 19\r
+#define VIRQ_ARCH_4 20\r
+#define VIRQ_ARCH_5 21\r
+#define VIRQ_ARCH_6 22\r
+#define VIRQ_ARCH_7 23\r
+/* ` } */\r
+\r
+#define NR_VIRQS 24\r
+\r
+/*\r
+ * ` enum neg_errnoval\r
+ * ` HYPERVISOR_mmu_update(const struct mmu_update reqs[],\r
+ * ` unsigned count, unsigned *done_out,\r
+ * ` unsigned foreigndom)\r
+ * `\r
+ * @reqs is an array of mmu_update_t structures ((ptr, val) pairs).\r
+ * @count is the length of the above array.\r
+ * @pdone is an output parameter indicating number of completed operations\r
+ * @foreigndom[15:0]: FD, the expected owner of data pages referenced in this\r
+ * hypercall invocation. Can be DOMID_SELF.\r
+ * @foreigndom[31:16]: PFD, the expected owner of pagetable pages referenced\r
+ * in this hypercall invocation. The value of this field\r
+ * (x) encodes the PFD as follows:\r
+ * x == 0 => PFD == DOMID_SELF\r
+ * x != 0 => PFD == x - 1\r
+ * \r
+ * Sub-commands: ptr[1:0] specifies the appropriate MMU_* command.\r
+ * -------------\r
+ * ptr[1:0] == MMU_NORMAL_PT_UPDATE:\r
+ * Updates an entry in a page table belonging to PFD. If updating an L1 table,\r
+ * and the new table entry is valid/present, the mapped frame must belong to\r
+ * FD. If attempting to map an I/O page then the caller assumes the privilege\r
+ * of the FD.\r
+ * FD == DOMID_IO: Permit /only/ I/O mappings, at the priv level of the caller.\r
+ * FD == DOMID_XEN: Map restricted areas of Xen's heap space.\r
+ * ptr[:2] -- Machine address of the page-table entry to modify.\r
+ * val -- Value to write.\r
+ *\r
+ * There also certain implicit requirements when using this hypercall. The\r
+ * pages that make up a pagetable must be mapped read-only in the guest.\r
+ * This prevents uncontrolled guest updates to the pagetable. Xen strictly\r
+ * enforces this, and will disallow any pagetable update which will end up\r
+ * mapping pagetable page RW, and will disallow using any writable page as a\r
+ * pagetable. In practice it means that when constructing a page table for a\r
+ * process, thread, etc, we MUST be very dilligient in following these rules:\r
+ * 1). Start with top-level page (PGD or in Xen language: L4). Fill out\r
+ * the entries.\r
+ * 2). Keep on going, filling out the upper (PUD or L3), and middle (PMD\r
+ * or L2).\r
+ * 3). Start filling out the PTE table (L1) with the PTE entries. Once\r
+ * done, make sure to set each of those entries to RO (so writeable bit\r
+ * is unset). Once that has been completed, set the PMD (L2) for this\r
+ * PTE table as RO.\r
+ * 4). When completed with all of the PMD (L2) entries, and all of them have\r
+ * been set to RO, make sure to set RO the PUD (L3). Do the same\r
+ * operation on PGD (L4) pagetable entries that have a PUD (L3) entry.\r
+ * 5). Now before you can use those pages (so setting the cr3), you MUST also\r
+ * pin them so that the hypervisor can verify the entries. This is done\r
+ * via the HYPERVISOR_mmuext_op(MMUEXT_PIN_L4_TABLE, guest physical frame\r
+ * number of the PGD (L4)). And this point the HYPERVISOR_mmuext_op(\r
+ * MMUEXT_NEW_BASEPTR, guest physical frame number of the PGD (L4)) can be\r
+ * issued.\r
+ * For 32-bit guests, the L4 is not used (as there is less pagetables), so\r
+ * instead use L3.\r
+ * At this point the pagetables can be modified using the MMU_NORMAL_PT_UPDATE\r
+ * hypercall. Also if so desired the OS can also try to write to the PTE\r
+ * and be trapped by the hypervisor (as the PTE entry is RO).\r
+ *\r
+ * To deallocate the pages, the operations are the reverse of the steps\r
+ * mentioned above. The argument is MMUEXT_UNPIN_TABLE for all levels and the\r
+ * pagetable MUST not be in use (meaning that the cr3 is not set to it).\r
+ * \r
+ * ptr[1:0] == MMU_MACHPHYS_UPDATE:\r
+ * Updates an entry in the machine->pseudo-physical mapping table.\r
+ * ptr[:2] -- Machine address within the frame whose mapping to modify.\r
+ * The frame must belong to the FD, if one is specified.\r
+ * val -- Value to write into the mapping entry.\r
+ * \r
+ * ptr[1:0] == MMU_PT_UPDATE_PRESERVE_AD:\r
+ * As MMU_NORMAL_PT_UPDATE above, but A/D bits currently in the PTE are ORed\r
+ * with those in @val.\r
+ *\r
+ * @val is usually the machine frame number along with some attributes.\r
+ * The attributes by default follow the architecture defined bits. Meaning that\r
+ * if this is a X86_64 machine and four page table layout is used, the layout\r
+ * of val is:\r
+ * - 63 if set means No execute (NX)\r
+ * - 46-13 the machine frame number\r
+ * - 12 available for guest\r
+ * - 11 available for guest\r
+ * - 10 available for guest\r
+ * - 9 available for guest\r
+ * - 8 global\r
+ * - 7 PAT (PSE is disabled, must use hypercall to make 4MB or 2MB pages)\r
+ * - 6 dirty\r
+ * - 5 accessed\r
+ * - 4 page cached disabled\r
+ * - 3 page write through\r
+ * - 2 userspace accessible\r
+ * - 1 writeable\r
+ * - 0 present\r
+ *\r
+ * The one bits that does not fit with the default layout is the PAGE_PSE\r
+ * also called PAGE_PAT). The MMUEXT_[UN]MARK_SUPER arguments to the\r
+ * HYPERVISOR_mmuext_op serve as mechanism to set a pagetable to be 4MB\r
+ * (or 2MB) instead of using the PAGE_PSE bit.\r
+ *\r
+ * The reason that the PAGE_PSE (bit 7) is not being utilized is due to Xen\r
+ * using it as the Page Attribute Table (PAT) bit - for details on it please\r
+ * refer to Intel SDM 10.12. The PAT allows to set the caching attributes of\r
+ * pages instead of using MTRRs.\r
+ *\r
+ * The PAT MSR is as follows (it is a 64-bit value, each entry is 8 bits):\r
+ * PAT4 PAT0\r
+ * +-----+-----+----+----+----+-----+----+----+\r
+ * | UC | UC- | WC | WB | UC | UC- | WC | WB | <= Linux\r
+ * +-----+-----+----+----+----+-----+----+----+\r
+ * | UC | UC- | WT | WB | UC | UC- | WT | WB | <= BIOS (default when machine boots)\r
+ * +-----+-----+----+----+----+-----+----+----+\r
+ * | rsv | rsv | WP | WC | UC | UC- | WT | WB | <= Xen\r
+ * +-----+-----+----+----+----+-----+----+----+\r
+ *\r
+ * The lookup of this index table translates to looking up\r
+ * Bit 7, Bit 4, and Bit 3 of val entry:\r
+ *\r
+ * PAT/PSE (bit 7) ... PCD (bit 4) .. PWT (bit 3).\r
+ *\r
+ * If all bits are off, then we are using PAT0. If bit 3 turned on,\r
+ * then we are using PAT1, if bit 3 and bit 4, then PAT2..\r
+ *\r
+ * As you can see, the Linux PAT1 translates to PAT4 under Xen. Which means\r
+ * that if a guest that follows Linux's PAT setup and would like to set Write\r
+ * Combined on pages it MUST use PAT4 entry. Meaning that Bit 7 (PAGE_PAT) is\r
+ * set. For example, under Linux it only uses PAT0, PAT1, and PAT2 for the\r
+ * caching as:\r
+ *\r
+ * WB = none (so PAT0)\r
+ * WC = PWT (bit 3 on)\r
+ * UC = PWT | PCD (bit 3 and 4 are on).\r
+ *\r
+ * To make it work with Xen, it needs to translate the WC bit as so:\r
+ *\r
+ * PWT (so bit 3 on) --> PAT (so bit 7 is on) and clear bit 3\r
+ *\r
+ * And to translate back it would:\r
+ *\r
+ * PAT (bit 7 on) --> PWT (bit 3 on) and clear bit 7.\r
+ */\r
+#define MMU_NORMAL_PT_UPDATE 0 /* checked '*ptr = val'. ptr is MA. */\r
+#define MMU_MACHPHYS_UPDATE 1 /* ptr = MA of frame to modify entry for */\r
+#define MMU_PT_UPDATE_PRESERVE_AD 2 /* atomically: *ptr = val | (*ptr&(A|D)) */\r
+\r
+/*\r
+ * MMU EXTENDED OPERATIONS\r
+ *\r
+ * ` enum neg_errnoval\r
+ * ` HYPERVISOR_mmuext_op(mmuext_op_t uops[],\r
+ * ` unsigned int count,\r
+ * ` unsigned int *pdone,\r
+ * ` unsigned int foreigndom)\r
+ */\r
+/* HYPERVISOR_mmuext_op() accepts a list of mmuext_op structures.\r
+ * A foreigndom (FD) can be specified (or DOMID_SELF for none).\r
+ * Where the FD has some effect, it is described below.\r
+ *\r
+ * cmd: MMUEXT_(UN)PIN_*_TABLE\r
+ * mfn: Machine frame number to be (un)pinned as a p.t. page.\r
+ * The frame must belong to the FD, if one is specified.\r
+ *\r
+ * cmd: MMUEXT_NEW_BASEPTR\r
+ * mfn: Machine frame number of new page-table base to install in MMU.\r
+ *\r
+ * cmd: MMUEXT_NEW_USER_BASEPTR [x86/64 only]\r
+ * mfn: Machine frame number of new page-table base to install in MMU\r
+ * when in user space.\r
+ *\r
+ * cmd: MMUEXT_TLB_FLUSH_LOCAL\r
+ * No additional arguments. Flushes local TLB.\r
+ *\r
+ * cmd: MMUEXT_INVLPG_LOCAL\r
+ * linear_addr: Linear address to be flushed from the local TLB.\r
+ *\r
+ * cmd: MMUEXT_TLB_FLUSH_MULTI\r
+ * vcpumask: Pointer to bitmap of VCPUs to be flushed.\r
+ *\r
+ * cmd: MMUEXT_INVLPG_MULTI\r
+ * linear_addr: Linear address to be flushed.\r
+ * vcpumask: Pointer to bitmap of VCPUs to be flushed.\r
+ *\r
+ * cmd: MMUEXT_TLB_FLUSH_ALL\r
+ * No additional arguments. Flushes all VCPUs' TLBs.\r
+ *\r
+ * cmd: MMUEXT_INVLPG_ALL\r
+ * linear_addr: Linear address to be flushed from all VCPUs' TLBs.\r
+ *\r
+ * cmd: MMUEXT_FLUSH_CACHE\r
+ * No additional arguments. Writes back and flushes cache contents.\r
+ *\r
+ * cmd: MMUEXT_FLUSH_CACHE_GLOBAL\r
+ * No additional arguments. Writes back and flushes cache contents\r
+ * on all CPUs in the system.\r
+ *\r
+ * cmd: MMUEXT_SET_LDT\r
+ * linear_addr: Linear address of LDT base (NB. must be page-aligned).\r
+ * nr_ents: Number of entries in LDT.\r
+ *\r
+ * cmd: MMUEXT_CLEAR_PAGE\r
+ * mfn: Machine frame number to be cleared.\r
+ *\r
+ * cmd: MMUEXT_COPY_PAGE\r
+ * mfn: Machine frame number of the destination page.\r
+ * src_mfn: Machine frame number of the source page.\r
+ *\r
+ * cmd: MMUEXT_[UN]MARK_SUPER\r
+ * mfn: Machine frame number of head of superpage to be [un]marked.\r
+ */\r
+/* ` enum mmuext_cmd { */\r
+#define MMUEXT_PIN_L1_TABLE 0\r
+#define MMUEXT_PIN_L2_TABLE 1\r
+#define MMUEXT_PIN_L3_TABLE 2\r
+#define MMUEXT_PIN_L4_TABLE 3\r
+#define MMUEXT_UNPIN_TABLE 4\r
+#define MMUEXT_NEW_BASEPTR 5\r
+#define MMUEXT_TLB_FLUSH_LOCAL 6\r
+#define MMUEXT_INVLPG_LOCAL 7\r
+#define MMUEXT_TLB_FLUSH_MULTI 8\r
+#define MMUEXT_INVLPG_MULTI 9\r
+#define MMUEXT_TLB_FLUSH_ALL 10\r
+#define MMUEXT_INVLPG_ALL 11\r
+#define MMUEXT_FLUSH_CACHE 12\r
+#define MMUEXT_SET_LDT 13\r
+#define MMUEXT_NEW_USER_BASEPTR 15\r
+#define MMUEXT_CLEAR_PAGE 16\r
+#define MMUEXT_COPY_PAGE 17\r
+#define MMUEXT_FLUSH_CACHE_GLOBAL 18\r
+#define MMUEXT_MARK_SUPER 19\r
+#define MMUEXT_UNMARK_SUPER 20\r
+/* ` } */\r
+\r
+#ifndef __ASSEMBLY__\r
+struct mmuext_op {\r
+ unsigned int cmd; /* => enum mmuext_cmd */\r
+ union {\r
+ /* [UN]PIN_TABLE, NEW_BASEPTR, NEW_USER_BASEPTR\r
+ * CLEAR_PAGE, COPY_PAGE, [UN]MARK_SUPER */\r
+ xen_pfn_t mfn;\r
+ /* INVLPG_LOCAL, INVLPG_ALL, SET_LDT */\r
+ ULONG_PTR linear_addr;\r
+ } arg1;\r
+ union {\r
+ /* SET_LDT */\r
+ unsigned int nr_ents;\r
+ /* TLB_FLUSH_MULTI, INVLPG_MULTI */\r
+#if __XEN_INTERFACE_VERSION__ >= 0x00030205\r
+ XEN_GUEST_HANDLE(const_void) vcpumask;\r
+#else\r
+ const void *vcpumask;\r
+#endif\r
+ /* COPY_PAGE */\r
+ xen_pfn_t src_mfn;\r
+ } arg2;\r
+};\r
+typedef struct mmuext_op mmuext_op_t;\r
+DEFINE_XEN_GUEST_HANDLE(mmuext_op_t);\r
+#endif\r
+\r
+/*\r
+ * ` enum neg_errnoval\r
+ * ` HYPERVISOR_update_va_mapping(ULONG_PTR va, u64 val,\r
+ * ` enum uvm_flags flags)\r
+ * `\r
+ * ` enum neg_errnoval\r
+ * ` HYPERVISOR_update_va_mapping_otherdomain(ULONG_PTR va, u64 val,\r
+ * ` enum uvm_flags flags,\r
+ * ` domid_t domid)\r
+ * `\r
+ * ` @va: The virtual address whose mapping we want to change\r
+ * ` @val: The new page table entry, must contain a machine address\r
+ * ` @flags: Control TLB flushes\r
+ */\r
+/* These are passed as 'flags' to update_va_mapping. They can be ORed. */\r
+/* When specifying UVMF_MULTI, also OR in a pointer to a CPU bitmap. */\r
+/* UVMF_LOCAL is merely UVMF_MULTI with a NULL bitmap pointer. */\r
+/* ` enum uvm_flags { */\r
+#define UVMF_NONE (0UL<<0) /* No flushing at all. */\r
+#define UVMF_TLB_FLUSH (1UL<<0) /* Flush entire TLB(s). */\r
+#define UVMF_INVLPG (2UL<<0) /* Flush only one entry. */\r
+#define UVMF_FLUSHTYPE_MASK (3UL<<0)\r
+#define UVMF_MULTI (0UL<<2) /* Flush subset of TLBs. */\r
+#define UVMF_LOCAL (0UL<<2) /* Flush local TLB. */\r
+#define UVMF_ALL (1UL<<2) /* Flush all TLBs. */\r
+/* ` } */\r
+\r
+/*\r
+ * Commands to HYPERVISOR_console_io().\r
+ */\r
+#define CONSOLEIO_write 0\r
+#define CONSOLEIO_read 1\r
+\r
+/*\r
+ * Commands to HYPERVISOR_vm_assist().\r
+ */\r
+#define VMASST_CMD_enable 0\r
+#define VMASST_CMD_disable 1\r
+\r
+/* x86/32 guests: simulate full 4GB segment limits. */\r
+#define VMASST_TYPE_4gb_segments 0\r
+\r
+/* x86/32 guests: trap (vector 15) whenever above vmassist is used. */\r
+#define VMASST_TYPE_4gb_segments_notify 1\r
+\r
+/*\r
+ * x86 guests: support writes to bottom-level PTEs.\r
+ * NB1. Page-directory entries cannot be written.\r
+ * NB2. Guest must continue to remove all writable mappings of PTEs.\r
+ */\r
+#define VMASST_TYPE_writable_pagetables 2\r
+\r
+/* x86/PAE guests: support PDPTs above 4GB. */\r
+#define VMASST_TYPE_pae_extended_cr3 3\r
+\r
+#define MAX_VMASST_TYPE 3\r
+\r
+#ifndef __ASSEMBLY__\r
+\r
+typedef uint16_t domid_t;\r
+\r
+/* Domain ids >= DOMID_FIRST_RESERVED cannot be used for ordinary domains. */\r
+#define DOMID_FIRST_RESERVED (0x7FF0U)\r
+\r
+/* DOMID_SELF is used in certain contexts to refer to oneself. */\r
+#define DOMID_SELF (0x7FF0U)\r
+\r
+/*\r
+ * DOMID_IO is used to restrict page-table updates to mapping I/O memory.\r
+ * Although no Foreign Domain need be specified to map I/O pages, DOMID_IO\r
+ * is useful to ensure that no mappings to the OS's own heap are accidentally\r
+ * installed. (e.g., in Linux this could cause havoc as reference counts\r
+ * aren't adjusted on the I/O-mapping code path).\r
+ * This only makes sense in MMUEXT_SET_FOREIGNDOM, but in that context can\r
+ * be specified by any calling domain.\r
+ */\r
+#define DOMID_IO (0x7FF1U)\r
+\r
+/*\r
+ * DOMID_XEN is used to allow privileged domains to map restricted parts of\r
+ * Xen's heap space (e.g., the machine_to_phys table).\r
+ * This only makes sense in MMUEXT_SET_FOREIGNDOM, and is only permitted if\r
+ * the caller is privileged.\r
+ */\r
+#define DOMID_XEN (0x7FF2U)\r
+\r
+/*\r
+ * DOMID_COW is used as the owner of sharable pages */\r
+#define DOMID_COW (0x7FF3U)\r
+\r
+/* DOMID_INVALID is used to identify pages with unknown owner. */\r
+#define DOMID_INVALID (0x7FF4U)\r
+\r
+/* Idle domain. */\r
+#define DOMID_IDLE (0x7FFFU)\r
+\r
+/*\r
+ * Send an array of these to HYPERVISOR_mmu_update().\r
+ * NB. The fields are natural pointer/address size for this architecture.\r
+ */\r
+struct mmu_update {\r
+ uint64_t ptr; /* Machine address of PTE. */\r
+ uint64_t val; /* New contents of PTE. */\r
+};\r
+typedef struct mmu_update mmu_update_t;\r
+DEFINE_XEN_GUEST_HANDLE(mmu_update_t);\r
+\r
+/*\r
+ * ` enum neg_errnoval\r
+ * ` HYPERVISOR_multicall(multicall_entry_t call_list[],\r
+ * ` unsigned int nr_calls);\r
+ *\r
+ * NB. The fields are natural register size for this architecture.\r
+ */\r
+struct multicall_entry {\r
+ ULONG_PTR op, result;\r
+ ULONG_PTR args[6];\r
+};\r
+typedef struct multicall_entry multicall_entry_t;\r
+DEFINE_XEN_GUEST_HANDLE(multicall_entry_t);\r
+\r
+/*\r
+ * Event channel endpoints per domain:\r
+ * 1024 if a LONG_PTR is 32 bits; 4096 if a LONG_PTR is 64 bits.\r
+ */\r
+#define NR_EVENT_CHANNELS (sizeof(xen_ulong_t) * sizeof(xen_ulong_t) * 64)\r
+\r
+struct vcpu_time_info {\r
+ /*\r
+ * Updates to the following values are preceded and followed by an\r
+ * increment of 'version'. The guest can therefore detect updates by\r
+ * looking for changes to 'version'. If the least-significant bit of\r
+ * the version number is set then an update is in progress and the guest\r
+ * must wait to read a consistent set of values.\r
+ * The correct way to interact with the version number is similar to\r
+ * Linux's seqlock: see the implementations of read_seqbegin/read_seqretry.\r
+ */\r
+ uint32_t version;\r
+ uint32_t pad0;\r
+ uint64_t tsc_timestamp; /* TSC at last update of time vals. */\r
+ uint64_t system_time; /* Time, in nanosecs, since boot. */\r
+ /*\r
+ * Current system time:\r
+ * system_time +\r
+ * ((((tsc - tsc_timestamp) << tsc_shift) * tsc_to_system_mul) >> 32)\r
+ * CPU frequency (Hz):\r
+ * ((10^9 << 32) / tsc_to_system_mul) >> tsc_shift\r
+ */\r
+ uint32_t tsc_to_system_mul;\r
+ int8_t tsc_shift;\r
+ int8_t pad1[3];\r
+}; /* 32 bytes */\r
+typedef struct vcpu_time_info vcpu_time_info_t;\r
+\r
+struct vcpu_info {\r
+ /*\r
+ * 'evtchn_upcall_pending' is written non-zero by Xen to indicate\r
+ * a pending notification for a particular VCPU. It is then cleared \r
+ * by the guest OS /before/ checking for pending work, thus avoiding\r
+ * a set-and-check race. Note that the mask is only accessed by Xen\r
+ * on the CPU that is currently hosting the VCPU. This means that the\r
+ * pending and mask flags can be updated by the guest without special\r
+ * synchronisation (i.e., no need for the x86 LOCK prefix).\r
+ * This may seem suboptimal because if the pending flag is set by\r
+ * a different CPU then an IPI may be scheduled even when the mask\r
+ * is set. However, note:\r
+ * 1. The task of 'interrupt holdoff' is covered by the per-event-\r
+ * channel mask bits. A 'noisy' event that is continually being\r
+ * triggered can be masked at source at this very precise\r
+ * granularity.\r
+ * 2. The main purpose of the per-VCPU mask is therefore to restrict\r
+ * reentrant execution: whether for concurrency control, or to\r
+ * prevent unbounded stack usage. Whatever the purpose, we expect\r
+ * that the mask will be asserted only for short periods at a time,\r
+ * and so the likelihood of a 'spurious' IPI is suitably small.\r
+ * The mask is read before making an event upcall to the guest: a\r
+ * non-zero mask therefore guarantees that the VCPU will not receive\r
+ * an upcall activation. The mask is cleared when the VCPU requests\r
+ * to block: this avoids wakeup-waiting races.\r
+ */\r
+ uint8_t evtchn_upcall_pending;\r
+#ifdef XEN_HAVE_PV_UPCALL_MASK\r
+ uint8_t evtchn_upcall_mask;\r
+#else /* XEN_HAVE_PV_UPCALL_MASK */\r
+ uint8_t pad0;\r
+#endif /* XEN_HAVE_PV_UPCALL_MASK */\r
+ xen_ulong_t evtchn_pending_sel;\r
+ struct arch_vcpu_info arch;\r
+ struct vcpu_time_info time;\r
+}; /* 64 bytes (x86) */\r
+#ifndef __XEN__\r
+typedef struct vcpu_info vcpu_info_t;\r
+#endif\r
+\r
+/*\r
+ * `incontents 200 startofday_shared Start-of-day shared data structure\r
+ * Xen/kernel shared data -- pointer provided in start_info.\r
+ *\r
+ * This structure is defined to be both smaller than a page, and the\r
+ * only data on the shared page, but may vary in actual size even within\r
+ * compatible Xen versions; guests should not rely on the size\r
+ * of this structure remaining constant.\r
+ */\r
+struct shared_info {\r
+ struct vcpu_info vcpu_info[XEN_LEGACY_MAX_VCPUS];\r
+\r
+ /*\r
+ * A domain can create "event channels" on which it can send and receive\r
+ * asynchronous event notifications. There are three classes of event that\r
+ * are delivered by this mechanism:\r
+ * 1. Bi-directional inter- and intra-domain connections. Domains must\r
+ * arrange out-of-band to set up a connection (usually by allocating\r
+ * an unbound 'listener' port and avertising that via a storage service\r
+ * such as xenstore).\r
+ * 2. Physical interrupts. A domain with suitable hardware-access\r
+ * privileges can bind an event-channel port to a physical interrupt\r
+ * source.\r
+ * 3. Virtual interrupts ('events'). A domain can bind an event-channel\r
+ * port to a virtual interrupt source, such as the virtual-timer\r
+ * device or the emergency console.\r
+ * \r
+ * Event channels are addressed by a "port index". Each channel is\r
+ * associated with two bits of information:\r
+ * 1. PENDING -- notifies the domain that there is a pending notification\r
+ * to be processed. This bit is cleared by the guest.\r
+ * 2. MASK -- if this bit is clear then a 0->1 transition of PENDING\r
+ * will cause an asynchronous upcall to be scheduled. This bit is only\r
+ * updated by the guest. It is read-only within Xen. If a channel\r
+ * becomes pending while the channel is masked then the 'edge' is lost\r
+ * (i.e., when the channel is unmasked, the guest must manually handle\r
+ * pending notifications as no upcall will be scheduled by Xen).\r
+ * \r
+ * To expedite scanning of pending notifications, any 0->1 pending\r
+ * transition on an unmasked channel causes a corresponding bit in a\r
+ * per-vcpu selector word to be set. Each bit in the selector covers a\r
+ * 'C LONG_PTR' in the PENDING bitfield array.\r
+ */\r
+ xen_ulong_t evtchn_pending[sizeof(xen_ulong_t) * 8];\r
+ xen_ulong_t evtchn_mask[sizeof(xen_ulong_t) * 8];\r
+\r
+ /*\r
+ * Wallclock time: updated only by control software. Guests should base\r
+ * their gettimeofday() syscall on this wallclock-base value.\r
+ */\r
+ uint32_t wc_version; /* Version counter: see vcpu_time_info_t. */\r
+ uint32_t wc_sec; /* Secs 00:00:00 UTC, Jan 1, 1970. */\r
+ uint32_t wc_nsec; /* Nsecs 00:00:00 UTC, Jan 1, 1970. */\r
+\r
+ struct arch_shared_info arch;\r
+\r
+};\r
+#ifndef __XEN__\r
+typedef struct shared_info shared_info_t;\r
+#endif\r
+\r
+/*\r
+ * `incontents 200 startofday Start-of-day memory layout\r
+ *\r
+ * 1. The domain is started within contiguous virtual-memory region.\r
+ * 2. The contiguous region ends on an aligned 4MB boundary.\r
+ * 3. This the order of bootstrap elements in the initial virtual region:\r
+ * a. relocated kernel image\r
+ * b. initial ram disk [mod_start, mod_len]\r
+ * c. list of allocated page frames [mfn_list, nr_pages]\r
+ * (unless relocated due to XEN_ELFNOTE_INIT_P2M)\r
+ * d. start_info_t structure [register ESI (x86)]\r
+ * e. bootstrap page tables [pt_base and CR3 (x86)]\r
+ * f. bootstrap stack [register ESP (x86)]\r
+ * 4. Bootstrap elements are packed together, but each is 4kB-aligned.\r
+ * 5. The initial ram disk may be omitted.\r
+ * 6. The list of page frames forms a contiguous 'pseudo-physical' memory\r
+ * layout for the domain. In particular, the bootstrap virtual-memory\r
+ * region is a 1:1 mapping to the first section of the pseudo-physical map.\r
+ * 7. All bootstrap elements are mapped read-writable for the guest OS. The\r
+ * only exception is the bootstrap page table, which is mapped read-only.\r
+ * 8. There is guaranteed to be at least 512kB padding after the final\r
+ * bootstrap element. If necessary, the bootstrap virtual region is\r
+ * extended by an extra 4MB to ensure this.\r
+ *\r
+ * Note: Prior to 25833:bb85bbccb1c9. ("x86/32-on-64 adjust Dom0 initial page\r
+ * table layout") a bug caused the pt_base (3.e above) and cr3 to not point\r
+ * to the start of the guest page tables (it was offset by two pages).\r
+ * This only manifested itself on 32-on-64 dom0 kernels and not 32-on-64 domU\r
+ * or 64-bit kernels of any colour. The page tables for a 32-on-64 dom0 got\r
+ * allocated in the order: 'first L1','first L2', 'first L3', so the offset\r
+ * to the page table base is by two pages back. The initial domain if it is\r
+ * 32-bit and runs under a 64-bit hypervisor should _NOT_ use two of the\r
+ * pages preceding pt_base and mark them as reserved/unused.\r
+ */\r
+#ifdef XEN_HAVE_PV_GUEST_ENTRY\r
+struct start_info {\r
+ /* THE FOLLOWING ARE FILLED IN BOTH ON INITIAL BOOT AND ON RESUME. */\r
+ char magic[32]; /* "xen-<version>-<platform>". */\r
+ ULONG_PTR nr_pages; /* Total pages allocated to this domain. */\r
+ ULONG_PTR shared_info; /* MACHINE address of shared info struct. */\r
+ uint32_t flags; /* SIF_xxx flags. */\r
+ xen_pfn_t store_mfn; /* MACHINE page number of shared page. */\r
+ uint32_t store_evtchn; /* Event channel for store communication. */\r
+ union {\r
+ struct {\r
+ xen_pfn_t mfn; /* MACHINE page number of console page. */\r
+ uint32_t evtchn; /* Event channel for console page. */\r
+ } domU;\r
+ struct {\r
+ uint32_t info_off; /* Offset of console_info struct. */\r
+ uint32_t info_size; /* Size of console_info struct from start.*/\r
+ } dom0;\r
+ } console;\r
+ /* THE FOLLOWING ARE ONLY FILLED IN ON INITIAL BOOT (NOT RESUME). */\r
+ ULONG_PTR pt_base; /* VIRTUAL address of page directory. */\r
+ ULONG_PTR nr_pt_frames; /* Number of bootstrap p.t. frames. */\r
+ ULONG_PTR mfn_list; /* VIRTUAL address of page-frame list. */\r
+ ULONG_PTR mod_start; /* VIRTUAL address of pre-loaded module */\r
+ /* (PFN of pre-loaded module if */\r
+ /* SIF_MOD_START_PFN set in flags). */\r
+ ULONG_PTR mod_len; /* Size (bytes) of pre-loaded module. */\r
+#define MAX_GUEST_CMDLINE 1024\r
+ int8_t cmd_line[MAX_GUEST_CMDLINE];\r
+ /* The pfn range here covers both page table and p->m table frames. */\r
+ ULONG_PTR first_p2m_pfn;/* 1st pfn forming initial P->M table. */\r
+ ULONG_PTR nr_p2m_frames;/* # of pfns forming initial P->M table. */\r
+};\r
+typedef struct start_info start_info_t;\r
+\r
+/* New console union for dom0 introduced in 0x00030203. */\r
+#if __XEN_INTERFACE_VERSION__ < 0x00030203\r
+#define console_mfn console.domU.mfn\r
+#define console_evtchn console.domU.evtchn\r
+#endif\r
+#endif /* XEN_HAVE_PV_GUEST_ENTRY */\r
+\r
+/* These flags are passed in the 'flags' field of start_info_t. */\r
+#define SIF_PRIVILEGED (1<<0) /* Is the domain privileged? */\r
+#define SIF_INITDOMAIN (1<<1) /* Is this the initial control domain? */\r
+#define SIF_MULTIBOOT_MOD (1<<2) /* Is mod_start a multiboot module? */\r
+#define SIF_MOD_START_PFN (1<<3) /* Is mod_start a PFN? */\r
+#define SIF_PM_MASK (0xFF<<8) /* reserve 1 byte for xen-pm options */\r
+\r
+/*\r
+ * A multiboot module is a package containing modules very similar to a\r
+ * multiboot module array. The only differences are:\r
+ * - the array of module descriptors is by convention simply at the beginning\r
+ * of the multiboot module,\r
+ * - addresses in the module descriptors are based on the beginning of the\r
+ * multiboot module,\r
+ * - the number of modules is determined by a termination descriptor that has\r
+ * mod_start == 0.\r
+ *\r
+ * This permits to both build it statically and reference it in a configuration\r
+ * file, and let the PV guest easily rebase the addresses to virtual addresses\r
+ * and at the same time count the number of modules.\r
+ */\r
+struct xen_multiboot_mod_list\r
+{\r
+ /* Address of first byte of the module */\r
+ uint32_t mod_start;\r
+ /* Address of last byte of the module (inclusive) */\r
+ uint32_t mod_end;\r
+ /* Address of zero-terminated command line */\r
+ uint32_t cmdline;\r
+ /* Unused, must be zero */\r
+ uint32_t pad;\r
+};\r
+/*\r
+ * `incontents 200 startofday_dom0_console Dom0_console\r
+ *\r
+ * The console structure in start_info.console.dom0\r
+ *\r
+ * This structure includes a variety of information required to\r
+ * have a working VGA/VESA console.\r
+ */\r
+typedef struct dom0_vga_console_info {\r
+ uint8_t video_type; /* DOM0_VGA_CONSOLE_??? */\r
+#define XEN_VGATYPE_TEXT_MODE_3 0x03\r
+#define XEN_VGATYPE_VESA_LFB 0x23\r
+#define XEN_VGATYPE_EFI_LFB 0x70\r
+\r
+ union {\r
+ struct {\r
+ /* Font height, in pixels. */\r
+ uint16_t font_height;\r
+ /* Cursor location (column, row). */\r
+ uint16_t cursor_x, cursor_y;\r
+ /* Number of rows and columns (dimensions in characters). */\r
+ uint16_t rows, columns;\r
+ } text_mode_3;\r
+\r
+ struct {\r
+ /* Width and height, in pixels. */\r
+ uint16_t width, height;\r
+ /* Bytes per scan line. */\r
+ uint16_t bytes_per_line;\r
+ /* Bits per pixel. */\r
+ uint16_t bits_per_pixel;\r
+ /* LFB physical address, and size (in units of 64kB). */\r
+ uint32_t lfb_base;\r
+ uint32_t lfb_size;\r
+ /* RGB mask offsets and sizes, as defined by VBE 1.2+ */\r
+ uint8_t red_pos, red_size;\r
+ uint8_t green_pos, green_size;\r
+ uint8_t blue_pos, blue_size;\r
+ uint8_t rsvd_pos, rsvd_size;\r
+#if __XEN_INTERFACE_VERSION__ >= 0x00030206\r
+ /* VESA capabilities (offset 0xa, VESA command 0x4f00). */\r
+ uint32_t gbl_caps;\r
+ /* Mode attributes (offset 0x0, VESA command 0x4f01). */\r
+ uint16_t mode_attrs;\r
+#endif\r
+ } vesa_lfb;\r
+ } u;\r
+} dom0_vga_console_info_t;\r
+#define xen_vga_console_info dom0_vga_console_info\r
+#define xen_vga_console_info_t dom0_vga_console_info_t\r
+\r
+typedef uint8_t xen_domain_handle_t[16];\r
+\r
+/* Turn a plain number into a C ULONG_PTR constant. */\r
+#define __mk_unsigned_long(x) x ## UL\r
+#define mk_unsigned_long(x) __mk_unsigned_long(x)\r
+\r
+__DEFINE_XEN_GUEST_HANDLE(uint8, uint8_t);\r
+__DEFINE_XEN_GUEST_HANDLE(uint16, uint16_t);\r
+__DEFINE_XEN_GUEST_HANDLE(uint32, uint32_t);\r
+__DEFINE_XEN_GUEST_HANDLE(uint64, uint64_t);\r
+\r
+#else /* __ASSEMBLY__ */\r
+\r
+/* In assembly code we cannot use C numeric constant suffixes. */\r
+#define mk_unsigned_long(x) x\r
+\r
+#endif /* !__ASSEMBLY__ */\r
+\r
+/* Default definitions for macros used by domctl/sysctl. */\r
+#if defined(__XEN__) || defined(__XEN_TOOLS__)\r
+\r
+#ifndef uint64_aligned_t\r
+#define uint64_aligned_t uint64_t\r
+#endif\r
+#ifndef XEN_GUEST_HANDLE_64\r
+#define XEN_GUEST_HANDLE_64(name) XEN_GUEST_HANDLE(name)\r
+#endif\r
+\r
+#ifndef __ASSEMBLY__\r
+struct xenctl_bitmap {\r
+ XEN_GUEST_HANDLE_64(uint8) bitmap;\r
+ uint32_t nr_bits;\r
+};\r
+#endif\r
+\r
+#endif /* defined(__XEN__) || defined(__XEN_TOOLS__) */\r
+\r
+#endif /* __XEN_PUBLIC_XEN_H__ */\r
+\r
+/*\r
+ * Local variables:\r
+ * mode: C\r
+ * c-file-style: "BSD"\r
+ * c-basic-offset: 4\r
+ * tab-width: 4\r
+ * indent-tabs-mode: nil\r
+ * End:\r
+ */\r
NTSTATUS status;
// This, unfortunately, seems to be a necessary hack to
- // get the domain wallclock updated correctly.
- // The HVM parameter in question is defined in Xen kernel
- // patch 32-on-64-geneva-drivers.patch.
+ // get the domain wallclock updated correctly on older
+ // versions of XenServer.
#define HVM_PARAM_32BIT 8
#if defined(__i386__)
- status = HvmSetParam(HVM_PARAM_32BIT, 1);
+ (VOID) HvmSetParam(HVM_PARAM_32BIT, 1);
#elif defined(__x86_64__)
- status = HvmSetParam(HVM_PARAM_32BIT, 0);
+ (VOID) HvmSetParam(HVM_PARAM_32BIT, 0);
#else
#error 'Unrecognised architecture'
#endif
- ASSERT(NT_SUCCESS(status));
#undef HVM_PARAM_32BIT