]> xenbits.xensource.com Git - people/pauldu/xenbus.git/commitdiff
Switch to Xen 3.4 headers for backwards compatibility
authorPaul Durrant <paul.durrant@citrix.com>
Wed, 25 Sep 2013 10:18:42 +0000 (11:18 +0100)
committerPaul Durrant <paul.durrant@citrix.com>
Wed, 25 Sep 2013 10:18:42 +0000 (11:18 +0100)
Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
16 files changed:
get_xen_headers.py [new file with mode: 0644]
include/xen/arch-x86/xen-x86_32.h
include/xen/arch-x86/xen-x86_64.h
include/xen/arch-x86/xen.h
include/xen/errno.h
include/xen/event_channel.h
include/xen/grant_table.h
include/xen/hvm/hvm_op.h
include/xen/hvm/params.h
include/xen/io/xs_wire.h
include/xen/memory.h
include/xen/sched.h
include/xen/trace.h
include/xen/xen-compat.h
include/xen/xen.h
src/xenbus/shared_info.c

diff --git a/get_xen_headers.py b/get_xen_headers.py
new file mode 100644 (file)
index 0000000..ba3b44e
--- /dev/null
@@ -0,0 +1,72 @@
+#!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
index 5c125fb7d87eba5874560e9d83b0b6f8659b050d..c6ba3b9694231e70fa9ef19e51c867db703b69d0 100644 (file)
-/******************************************************************************
- * 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
index 1821e3a03b5c93c8c80950f2746e04b6665f7d86..76e1273e35cf1012cc01c56fa73da3d45491154e 100644 (file)
-/******************************************************************************
- * 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
index 72eb853413b46238345c207b685b8a4376d56b9d..2da04b8acbc5b411e03ed7622dcfcd1c927bcede 100644 (file)
-/******************************************************************************
- * 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
index 3dccad060ae65a4b1a832892b1611b9b18bc4145..a38b85ed93113d3f74658db20aa60be391e8c1fe 100644 (file)
-#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
index 03d4ce7a4dd868f04ac98812f7b23db08b36da8c..388f40bd3d6661beb53afbb144692c10ea6a4d7b 100644 (file)
-/******************************************************************************
- * 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
index c003d5c62e6e6e0350407fa2a987d5f9def08afc..75ce949ed6efaee8f0bae535e4e875764b31bb48 100644 (file)
-/******************************************************************************
- * 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
index 2a597da7d67188c20765ce234cf9c24fc70c839c..7beb701e73200709022c7bdc1b77e60b1a751bca 100644 (file)
-/*
- * 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
index 1c98277d781f86a3eed761642052f75a2fc549c2..9646b9b1458245a4399c3c474326711831947138 100644 (file)
-/*
- * 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
index e1debceb63bf950a157a8a8c9125aed6936775bf..50423234d3178e0736682949901bf747cb4b8029 100644 (file)
-/*
- * 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
index 08355e3c3caba7a201ea11de9925ea71b06f0e67..e086f3716134f829acf4d8beb94bd7c329f329eb 100644 (file)
-/******************************************************************************
- * 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
index 8041ef48bee52057b6036897c50c7fb219e1aeb0..8600d48589816da88180b2a93fe4ffba092f8de1 100644 (file)
-/******************************************************************************
- * 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
index 52289e58fac3fe64589c69591678ea72e05a1f07..caf031805dedbbe1bd20e4262c6b5724145d71a4 100644 (file)
-/******************************************************************************
- * 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
index 2e38003f256e6897cabb7e01fc17f05c0087e02c..8b3c703f84a35771655145a310cdde00e9618262 100644 (file)
@@ -1,44 +1,44 @@
-/******************************************************************************
- * 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
index d673be15c03e4db387fb357c48b7fe02ced9573c..1d2b940e313826156d346984da0faa4c9d5ae562 100644 (file)
-/******************************************************************************
- * 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
index ae5bd6a8192313755d74a9169e44aef14c2e08fc..b0477969f475451c10517ce45ca41814e7ce6d01 100644 (file)
@@ -393,19 +393,17 @@ __SharedInfoMap(
     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