Remove build dependency on Xen header files - closes #308495

From: Ian Campbell <ian.campbell@citrix.com>


git-svn-id: svn://svn.valgrind.org/valgrind/trunk@13081 a5019735-40e9-0310-863c-91ae7b9d1cf9
diff --git a/include/vki/vki-linux.h b/include/vki/vki-linux.h
index 089bccd..64ba6a4 100644
--- a/include/vki/vki-linux.h
+++ b/include/vki/vki-linux.h
@@ -224,11 +224,13 @@
 //----------------------------------------------------------------------
 
 typedef		__vki_s32	vki_int32_t;
+typedef		__vki_s16	vki_int16_t;
 typedef		__vki_s64	vki_int64_t;
 
 typedef		__vki_u8	vki_uint8_t;
 typedef		__vki_u16	vki_uint16_t;
 typedef		__vki_u32	vki_uint32_t;
+typedef		__vki_u64	vki_uint64_t;
 
 typedef		__vki_u16	__vki_le16;
 
diff --git a/include/vki/vki-xen-domctl.h b/include/vki/vki-xen-domctl.h
new file mode 100644
index 0000000..241c008
--- /dev/null
+++ b/include/vki/vki-xen-domctl.h
@@ -0,0 +1,293 @@
+#ifndef __VKI_XEN_DOMCTL_H
+#define __VKI_XEN_DOMCTL_H
+
+/*
+ * The domctl interface is versioned via the interface_version
+ * field. This structures in this header supports domctl interfaces:
+ *
+ * - 00000007: Xen 4.1
+ * - 00000008: Xen 4.2
+ *
+ * When adding a new subop be sure to include the variants used by all
+ * of the above, both here and in syswrap-xen.c
+ *
+ * Structs which are identical in all supported versions have no
+ * version suffix. Structs which do differ are defined multiple times
+ * and use the suffix of the latest version to contain that particular
+ * variant.
+ */
+
+#define VKI_XEN_DOMCTL_createdomain                   1
+#define VKI_XEN_DOMCTL_destroydomain                  2
+#define VKI_XEN_DOMCTL_pausedomain                    3
+#define VKI_XEN_DOMCTL_unpausedomain                  4
+#define VKI_XEN_DOMCTL_getdomaininfo                  5
+#define VKI_XEN_DOMCTL_getmemlist                     6
+#define VKI_XEN_DOMCTL_getpageframeinfo               7
+#define VKI_XEN_DOMCTL_getpageframeinfo2              8
+#define VKI_XEN_DOMCTL_setvcpuaffinity                9
+#define VKI_XEN_DOMCTL_shadow_op                     10
+#define VKI_XEN_DOMCTL_max_mem                       11
+#define VKI_XEN_DOMCTL_setvcpucontext                12
+#define VKI_XEN_DOMCTL_getvcpucontext                13
+#define VKI_XEN_DOMCTL_getvcpuinfo                   14
+#define VKI_XEN_DOMCTL_max_vcpus                     15
+#define VKI_XEN_DOMCTL_scheduler_op                  16
+#define VKI_XEN_DOMCTL_setdomainhandle               17
+#define VKI_XEN_DOMCTL_setdebugging                  18
+#define VKI_XEN_DOMCTL_irq_permission                19
+#define VKI_XEN_DOMCTL_iomem_permission              20
+#define VKI_XEN_DOMCTL_ioport_permission             21
+#define VKI_XEN_DOMCTL_hypercall_init                22
+#define VKI_XEN_DOMCTL_arch_setup                    23
+#define VKI_XEN_DOMCTL_settimeoffset                 24
+#define VKI_XEN_DOMCTL_getvcpuaffinity               25
+#define VKI_XEN_DOMCTL_real_mode_area                26
+#define VKI_XEN_DOMCTL_resumedomain                  27
+#define VKI_XEN_DOMCTL_sendtrigger                   28
+#define VKI_XEN_DOMCTL_subscribe                     29
+#define VKI_XEN_DOMCTL_gethvmcontext                 33
+#define VKI_XEN_DOMCTL_sethvmcontext                 34
+#define VKI_XEN_DOMCTL_set_address_size              35
+#define VKI_XEN_DOMCTL_get_address_size              36
+#define VKI_XEN_DOMCTL_assign_device                 37
+#define VKI_XEN_DOMCTL_bind_pt_irq                   38
+#define VKI_XEN_DOMCTL_memory_mapping                39
+#define VKI_XEN_DOMCTL_ioport_mapping                40
+#define VKI_XEN_DOMCTL_pin_mem_cacheattr             41
+#define VKI_XEN_DOMCTL_set_ext_vcpucontext           42
+#define VKI_XEN_DOMCTL_get_ext_vcpucontext           43
+#define VKI_XEN_DOMCTL_set_opt_feature               44
+#define VKI_XEN_DOMCTL_test_assign_device            45
+#define VKI_XEN_DOMCTL_set_target                    46
+#define VKI_XEN_DOMCTL_deassign_device               47
+#define VKI_XEN_DOMCTL_unbind_pt_irq                 48
+#define VKI_XEN_DOMCTL_set_cpuid                     49
+#define VKI_XEN_DOMCTL_get_device_group              50
+#define VKI_XEN_DOMCTL_set_machine_address_size      51
+#define VKI_XEN_DOMCTL_get_machine_address_size      52
+#define VKI_XEN_DOMCTL_suppress_spurious_page_faults 53
+#define VKI_XEN_DOMCTL_debug_op                      54
+#define VKI_XEN_DOMCTL_gethvmcontext_partial         55
+#define VKI_XEN_DOMCTL_mem_event_op                  56
+#define VKI_XEN_DOMCTL_mem_sharing_op                57
+#define VKI_XEN_DOMCTL_disable_migrate               58
+#define VKI_XEN_DOMCTL_gettscinfo                    59
+#define VKI_XEN_DOMCTL_settscinfo                    60
+#define VKI_XEN_DOMCTL_getpageframeinfo3             61
+#define VKI_XEN_DOMCTL_setvcpuextstate               62
+#define VKI_XEN_DOMCTL_getvcpuextstate               63
+#define VKI_XEN_DOMCTL_set_access_required           64
+#define VKI_XEN_DOMCTL_audit_p2m                     65
+#define VKI_XEN_DOMCTL_set_virq_handler              66
+#define VKI_XEN_DOMCTL_gdbsx_guestmemio            1000
+#define VKI_XEN_DOMCTL_gdbsx_pausevcpu             1001
+#define VKI_XEN_DOMCTL_gdbsx_unpausevcpu           1002
+#define VKI_XEN_DOMCTL_gdbsx_domstatus             1003
+
+struct vki_xen_domctl_createdomain {
+    /* IN parameters */
+    vki_uint32_t ssidref;
+    vki_xen_domain_handle_t handle;
+    vki_uint32_t flags;
+};
+
+struct vki_xen_domctl_getdomaininfo_00000007 {
+    /* OUT variables. */
+    vki_xen_domid_t  domain;
+    vki_uint32_t flags;
+    vki_xen_uint64_aligned_t tot_pages;
+    vki_xen_uint64_aligned_t max_pages;
+    vki_xen_uint64_aligned_t shr_pages;
+    vki_xen_uint64_aligned_t paged_pages;
+    vki_xen_uint64_aligned_t shared_info_frame;
+    vki_xen_uint64_aligned_t cpu_time;
+    vki_uint32_t nr_online_vcpus;
+    vki_uint32_t max_vcpu_id;
+    vki_uint32_t ssidref;
+    vki_xen_domain_handle_t handle;
+    vki_uint32_t cpupool;
+};
+typedef struct vki_xen_domctl_getdomaininfo_00000007 vki_xen_domctl_getdomaininfo_00000007_t;
+DEFINE_VKI_XEN_GUEST_HANDLE(vki_xen_domctl_getdomaininfo_00000007_t);
+
+struct vki_xen_domctl_getdomaininfo_00000008 {
+    /* OUT variables. */
+    vki_xen_domid_t  domain;
+    vki_uint32_t flags;
+    vki_xen_uint64_aligned_t tot_pages;
+    vki_xen_uint64_aligned_t max_pages;
+    vki_xen_uint64_aligned_t shr_pages;
+    vki_xen_uint64_aligned_t paged_pages;
+    vki_xen_uint64_aligned_t shared_info_frame;
+    vki_xen_uint64_aligned_t cpu_time;
+    vki_uint32_t nr_online_vcpus;
+    vki_uint32_t max_vcpu_id;
+    vki_uint32_t ssidref;
+    vki_xen_domain_handle_t handle;
+    vki_uint32_t cpupool;
+};
+typedef struct vki_xen_domctl_getdomaininfo_00000008 vki_xen_domctl_getdomaininfo_00000008_t;
+DEFINE_VKI_XEN_GUEST_HANDLE(vki_xen_domctl_getdomaininfo_00000008_t);
+
+struct vki_xen_domctl_vcpuaffinity {
+    vki_uint32_t  vcpu;              /* IN */
+    struct vki_xenctl_cpumap cpumap; /* IN/OUT */
+};
+
+struct vki_xen_domctl_max_mem {
+    /* IN variables. */
+    vki_xen_uint64_aligned_t max_memkb;
+};
+
+struct vki_xen_domctl_vcpucontext {
+    vki_uint32_t              vcpu;                  /* IN */
+    VKI_XEN_GUEST_HANDLE_64(vki_xen_vcpu_guest_context_t) ctxt; /* IN/OUT */
+};
+
+struct vki_xen_domctl_getvcpuinfo {
+    /* IN variables. */
+    vki_uint32_t vcpu;
+    /* OUT variables. */
+    vki_uint8_t  online;              /* currently online (not hotplugged)? */
+    vki_uint8_t  blocked;             /* blocked waiting for an event? */
+    vki_uint8_t  running;             /* currently scheduled on its CPU? */
+    vki_xen_uint64_aligned_t cpu_time;/* total cpu time consumed (ns) */
+    vki_uint32_t cpu;                 /* current mapping   */
+};
+
+struct vki_xen_domctl_scheduler_op {
+    vki_uint32_t sched_id;  /* VKI_XEN_SCHEDULER_* */
+#define VKI_XEN_SCHEDULER_SEDF     4
+#define VKI_XEN_SCHEDULER_CREDIT   5
+#define VKI_XEN_SCHEDULER_CREDIT2  6
+#define VKI_XEN_SCHEDULER_ARINC653 7
+    vki_uint32_t cmd;       /* VKI_XEN_DOMCTL_SCHEDOP_* */
+#define VKI_XEN_DOMCTL_SCHEDOP_putinfo 0
+#define VKI_XEN_DOMCTL_SCHEDOP_getinfo 1
+    union {
+        struct xen_domctl_sched_sedf {
+            vki_xen_uint64_aligned_t period;
+            vki_xen_uint64_aligned_t slice;
+            vki_xen_uint64_aligned_t latency;
+            vki_uint32_t extratime;
+            vki_uint32_t weight;
+        } sedf;
+        struct xen_domctl_sched_credit {
+            vki_uint16_t weight;
+            vki_uint16_t cap;
+        } credit;
+        struct xen_domctl_sched_credit2 {
+            vki_uint16_t weight;
+        } credit2;
+    } u;
+};
+
+struct vki_xen_domctl_max_vcpus {
+    vki_uint32_t max;           /* maximum number of vcpus */
+};
+
+struct vki_xen_domctl_hypercall_init {
+    vki_xen_uint64_aligned_t  gmfn;           /* GMFN to be initialised */
+};
+
+struct vki_xen_domctl_cpuid {
+  vki_uint32_t input[2];
+  vki_uint32_t eax;
+  vki_uint32_t ebx;
+  vki_uint32_t ecx;
+  vki_uint32_t edx;
+};
+
+struct vki_xen_guest_tsc_info {
+    vki_uint32_t tsc_mode;
+    vki_uint32_t gtsc_khz;
+    vki_uint32_t incarnation;
+    vki_uint32_t pad;
+    vki_xen_uint64_aligned_t elapsed_nsec;
+};
+typedef struct vki_xen_guest_tsc_info vki_xen_guest_tsc_info_t;
+DEFINE_VKI_XEN_GUEST_HANDLE(vki_xen_guest_tsc_info_t);
+
+struct vki_xen_domctl_tsc_info {
+    VKI_XEN_GUEST_HANDLE_64(vki_xen_guest_tsc_info_t) out_info; /* OUT */
+    vki_xen_guest_tsc_info_t info; /* IN */
+};
+
+struct vki_xen_domctl_vcpuextstate {
+    vki_uint32_t         vcpu;
+    vki_xen_uint64_aligned_t         xfeature_mask;
+    vki_xen_uint64_aligned_t         size;
+    VKI_XEN_GUEST_HANDLE_64(vki_uint64) buffer;
+};
+
+struct vki_xen_domctl_address_size {
+    vki_uint32_t size;
+};
+
+struct vki_xen_domctl {
+    vki_uint32_t cmd;
+    vki_uint32_t interface_version; /* XEN_DOMCTL_INTERFACE_VERSION */
+    vki_xen_domid_t  domain;
+    union {
+        struct vki_xen_domctl_createdomain      createdomain;
+        struct vki_xen_domctl_getdomaininfo_00000007 getdomaininfo_00000007;
+        struct vki_xen_domctl_getdomaininfo_00000008 getdomaininfo_00000008;
+        //struct vki_xen_domctl_getmemlist        getmemlist;
+        //struct vki_xen_domctl_getpageframeinfo  getpageframeinfo;
+        //struct vki_xen_domctl_getpageframeinfo2 getpageframeinfo2;
+        //struct vki_xen_domctl_getpageframeinfo3 getpageframeinfo3;
+        struct vki_xen_domctl_vcpuaffinity      vcpuaffinity;
+        //struct vki_xen_domctl_shadow_op         shadow_op;
+        struct vki_xen_domctl_max_mem           max_mem;
+        struct vki_xen_domctl_vcpucontext       vcpucontext;
+        struct vki_xen_domctl_getvcpuinfo       getvcpuinfo;
+        struct vki_xen_domctl_max_vcpus         max_vcpus;
+        struct vki_xen_domctl_scheduler_op      scheduler_op;
+        //struct vki_xen_domctl_setdomainhandle   setdomainhandle;
+        //struct vki_xen_domctl_setdebugging      setdebugging;
+        //struct vki_xen_domctl_irq_permission    irq_permission;
+        //struct vki_xen_domctl_iomem_permission  iomem_permission;
+        //struct vki_xen_domctl_ioport_permission ioport_permission;
+        struct vki_xen_domctl_hypercall_init    hypercall_init;
+        //struct vki_xen_domctl_arch_setup        arch_setup;
+        //struct vki_xen_domctl_settimeoffset     settimeoffset;
+        //struct vki_xen_domctl_disable_migrate   disable_migrate;
+        struct vki_xen_domctl_tsc_info          tsc_info;
+        //struct vki_xen_domctl_real_mode_area    real_mode_area;
+        //struct vki_xen_domctl_hvmcontext        hvmcontext;
+        //struct vki_xen_domctl_hvmcontext_partial hvmcontext_partial;
+        struct vki_xen_domctl_address_size      address_size;
+        //struct vki_xen_domctl_sendtrigger       sendtrigger;
+        //struct vki_xen_domctl_get_device_group  get_device_group;
+        //struct vki_xen_domctl_assign_device     assign_device;
+        //struct vki_xen_domctl_bind_pt_irq       bind_pt_irq;
+        //struct vki_xen_domctl_memory_mapping    memory_mapping;
+        //struct vki_xen_domctl_ioport_mapping    ioport_mapping;
+        //struct vki_xen_domctl_pin_mem_cacheattr pin_mem_cacheattr;
+        //struct vki_xen_domctl_ext_vcpucontext   ext_vcpucontext;
+        //struct vki_xen_domctl_set_opt_feature   set_opt_feature;
+        //struct vki_xen_domctl_set_target        set_target;
+        //struct vki_xen_domctl_subscribe         subscribe;
+        //struct vki_xen_domctl_debug_op          debug_op;
+        //struct vki_xen_domctl_mem_event_op      mem_event_op;
+        //struct vki_xen_domctl_mem_sharing_op    mem_sharing_op;
+#if defined(__i386__) || defined(__x86_64__)
+        struct vki_xen_domctl_cpuid             cpuid;
+        struct vki_xen_domctl_vcpuextstate      vcpuextstate;
+#endif
+        //struct vki_xen_domctl_set_access_required access_required;
+        //struct vki_xen_domctl_audit_p2m         audit_p2m;
+        //struct vki_xen_domctl_set_virq_handler  set_virq_handler;
+        //struct vki_xen_domctl_gdbsx_memio       gdbsx_guest_memio;
+        //struct vki_xen_domctl_gdbsx_pauseunp_vcpu gdbsx_pauseunp_vcpu;
+        //struct vki_xen_domctl_gdbsx_domstatus   gdbsx_domstatus;
+        vki_uint8_t                         pad[128];
+    } u;
+};
+
+#endif // __VKI_XEN_DOMCTL_H
+
+/*--------------------------------------------------------------------*/
+/*--- end                                                          ---*/
+/*--------------------------------------------------------------------*/
diff --git a/include/vki/vki-xen-evtchn.h b/include/vki/vki-xen-evtchn.h
new file mode 100644
index 0000000..e7a3310
--- /dev/null
+++ b/include/vki/vki-xen-evtchn.h
@@ -0,0 +1,46 @@
+#ifndef __VKI_XEN_EVTCHN_H
+#define __VKI_XEN_EVTCHN_H
+
+#define VKI_XEN_EVTCHNOP_bind_interdomain 0
+#define VKI_XEN_EVTCHNOP_bind_virq        1
+#define VKI_XEN_EVTCHNOP_bind_pirq        2
+#define VKI_XEN_EVTCHNOP_close            3
+#define VKI_XEN_EVTCHNOP_send             4
+#define VKI_XEN_EVTCHNOP_status           5
+#define VKI_XEN_EVTCHNOP_alloc_unbound    6
+#define VKI_XEN_EVTCHNOP_bind_ipi         7
+#define VKI_XEN_EVTCHNOP_bind_vcpu        8
+#define VKI_XEN_EVTCHNOP_unmask           9
+#define VKI_XEN_EVTCHNOP_reset           10
+
+typedef vki_uint32_t vki_xen_evtchn_port_t;
+DEFINE_VKI_XEN_GUEST_HANDLE(vki_xen_evtchn_port_t);
+
+struct vki_xen_evtchn_alloc_unbound {
+    /* IN parameters */
+    vki_xen_domid_t dom, remote_dom;
+    /* OUT parameters */
+    vki_xen_evtchn_port_t port;
+};
+
+struct vki_xen_evtchn_op {
+    vki_uint32_t cmd; /* enum event_channel_op */
+    union {
+        struct vki_xen_evtchn_alloc_unbound    alloc_unbound;
+        //struct vki_xen_evtchn_bind_interdomain bind_interdomain;
+        //struct vki_xen_evtchn_bind_virq        bind_virq;
+        //struct vki_xen_evtchn_bind_pirq        bind_pirq;
+        //struct vki_xen_evtchn_bind_ipi         bind_ipi;
+        //struct vki_xen_evtchn_close            close;
+        //struct vki_xen_evtchn_send             send;
+        //struct vki_xen_evtchn_status           status;
+        //struct vki_xen_evtchn_bind_vcpu        bind_vcpu;
+        //struct vki_xen_evtchn_unmask           unmask;
+    } u;
+};
+
+#endif // __VKI_XEN_EVTCHN_H
+
+/*--------------------------------------------------------------------*/
+/*--- end                                                          ---*/
+/*--------------------------------------------------------------------*/
diff --git a/include/vki/vki-xen-gnttab.h b/include/vki/vki-xen-gnttab.h
new file mode 100644
index 0000000..97ca6d8
--- /dev/null
+++ b/include/vki/vki-xen-gnttab.h
@@ -0,0 +1,32 @@
+#ifndef __VKI_XEN_GNTTAB_H
+#define __VKI_XEN_GNTTAB_H
+
+typedef vki_uint32_t vki_xen_grant_ref_t;
+
+#define VKI_XEN_GNTTABOP_map_grant_ref        0
+#define VKI_XEN_GNTTABOP_unmap_grant_ref      1
+#define VKI_XEN_GNTTABOP_setup_table          2
+#define VKI_XEN_GNTTABOP_dump_table           3
+#define VKI_XEN_GNTTABOP_transfer             4
+#define VKI_XEN_GNTTABOP_copy                 5
+#define VKI_XEN_GNTTABOP_query_size           6
+#define VKI_XEN_GNTTABOP_unmap_and_replace    7
+#define VKI_XEN_GNTTABOP_set_version          8
+#define VKI_XEN_GNTTABOP_get_status_frames    9
+#define VKI_XEN_GNTTABOP_get_version          10
+#define VKI_XEN_GNTTABOP_swap_grant_ref	      11
+
+struct vki_xen_gnttab_setup_table {
+    /* IN parameters. */
+    vki_xen_domid_t  dom;
+    vki_uint32_t nr_frames;
+    /* OUT parameters. */
+    vki_int16_t  status;              /* => enum grant_status */
+    VKI_XEN_GUEST_HANDLE(vki_ulong) frame_list;
+};
+
+#endif // __VKI_XEN_GNTTAB_H
+
+/*--------------------------------------------------------------------*/
+/*--- end                                                          ---*/
+/*--------------------------------------------------------------------*/
diff --git a/include/vki/vki-xen-hvm.h b/include/vki/vki-xen-hvm.h
new file mode 100644
index 0000000..a64d4f3
--- /dev/null
+++ b/include/vki/vki-xen-hvm.h
@@ -0,0 +1,17 @@
+#ifndef __VKI_XEN_HVM_H
+#define __VKI_XEN_HVM_H
+
+/* Get/set subcommands: extra argument == pointer to xen_hvm_param struct. */
+#define VKI_XEN_HVMOP_set_param           0
+#define VKI_XEN_HVMOP_get_param           1
+struct vki_xen_hvm_param {
+    vki_xen_domid_t  domid;    /* IN */
+    vki_uint32_t index;    /* IN */
+    vki_uint64_t value;    /* IN/OUT */
+};
+
+#endif // __VKI_XEN_HVM_H
+
+/*--------------------------------------------------------------------*/
+/*--- end                                                          ---*/
+/*--------------------------------------------------------------------*/
diff --git a/include/vki/vki-xen-memory.h b/include/vki/vki-xen-memory.h
new file mode 100644
index 0000000..7de8d33
--- /dev/null
+++ b/include/vki/vki-xen-memory.h
@@ -0,0 +1,46 @@
+#ifndef __VKI_XEN_MEMORY_H
+#define __VKI_XEN_MEMORY_H
+
+#define VKI_XENMEM_increase_reservation 0
+#define VKI_XENMEM_decrease_reservation 1
+#define VKI_XENMEM_maximum_ram_page     2
+#define VKI_XENMEM_current_reservation  3
+#define VKI_XENMEM_maximum_reservation  4
+#define VKI_XENMEM_machphys_mfn_list    5
+#define VKI_XENMEM_populate_physmap     6
+#define VKI_XENMEM_add_to_physmap       7
+#define VKI_XENMEM_memory_map           9
+#define VKI_XENMEM_machine_memory_map   10
+#define VKI_XENMEM_exchange             11
+#define VKI_XENMEM_machphys_mapping     12
+#define VKI_XENMEM_set_memory_map       13
+#define VKI_XENMEM_maximum_gpfn         14
+#define VKI_XENMEM_remove_from_physmap  15
+#define VKI_XENMEM_set_pod_target       16
+#define VKI_XENMEM_get_pod_target       17
+#define VKI_XENMEM_get_sharing_freed_pages    18
+#define VKI_XENMEM_get_sharing_shared_pages   19
+
+struct vki_xen_memory_map {
+    unsigned int nr_entries;
+    VKI_XEN_GUEST_HANDLE(void) buffer;
+};
+
+struct vki_xen_foreign_memory_map {
+    vki_xen_domid_t domid;
+    struct vki_xen_memory_map map;
+};
+
+struct xen_memory_reservation {
+    VKI_XEN_GUEST_HANDLE(vki_xen_pfn_t) extent_start;
+    vki_xen_ulong_t    nr_extents;
+    unsigned int   extent_order;
+    unsigned int   mem_flags;
+    vki_xen_domid_t domid;
+};
+
+#endif // __VKI_XEN_MEMORY_H
+
+/*--------------------------------------------------------------------*/
+/*--- end                                                          ---*/
+/*--------------------------------------------------------------------*/
diff --git a/include/vki/vki-xen-mmuext.h b/include/vki/vki-xen-mmuext.h
new file mode 100644
index 0000000..e6f06f7
--- /dev/null
+++ b/include/vki/vki-xen-mmuext.h
@@ -0,0 +1,48 @@
+#ifndef __VKI_XEN_MMUEXT_H
+#define __VKI_XEN_MMUEXT_H
+
+#define VKI_XEN_MMUEXT_PIN_L1_TABLE      0
+#define VKI_XEN_MMUEXT_PIN_L2_TABLE      1
+#define VKI_XEN_MMUEXT_PIN_L3_TABLE      2
+#define VKI_XEN_MMUEXT_PIN_L4_TABLE      3
+#define VKI_XEN_MMUEXT_UNPIN_TABLE       4
+#define VKI_XEN_MMUEXT_NEW_BASEPTR       5
+#define VKI_XEN_MMUEXT_TLB_FLUSH_LOCAL   6
+#define VKI_XEN_MMUEXT_INVLPG_LOCAL      7
+#define VKI_XEN_MMUEXT_TLB_FLUSH_MULTI   8
+#define VKI_XEN_MMUEXT_INVLPG_MULTI      9
+#define VKI_XEN_MMUEXT_TLB_FLUSH_ALL    10
+#define VKI_XEN_MMUEXT_INVLPG_ALL       11
+#define VKI_XEN_MMUEXT_FLUSH_CACHE      12
+#define VKI_XEN_MMUEXT_SET_LDT          13
+#define VKI_XEN_MMUEXT_NEW_USER_BASEPTR 15
+#define VKI_XEN_MMUEXT_CLEAR_PAGE       16
+#define VKI_XEN_MMUEXT_COPY_PAGE        17
+#define VKI_XEN_MMUEXT_FLUSH_CACHE_GLOBAL 18
+#define VKI_XEN_MMUEXT_MARK_SUPER       19
+#define VKI_XEN_MMUEXT_UNMARK_SUPER     20
+
+struct vki_xen_mmuext_op {
+    unsigned int cmd;
+    union {
+        /* [UN]PIN_TABLE, NEW_BASEPTR, NEW_USER_BASEPTR
+         * CLEAR_PAGE, COPY_PAGE, [UN]MARK_SUPER */
+        vki_xen_pfn_t     mfn;
+        /* INVLPG_LOCAL, INVLPG_ALL, SET_LDT */
+        unsigned long linear_addr;
+    } arg1;
+    union {
+        /* SET_LDT */
+        unsigned int nr_ents;
+        /* TLB_FLUSH_MULTI, INVLPG_MULTI */
+        VKI_XEN_GUEST_HANDLE(const_void) vcpumask;
+        /* COPY_PAGE */
+        vki_xen_pfn_t src_mfn;
+    } arg2;
+};
+
+#endif // __VKI_XEN_MMUEXT_H
+
+/*--------------------------------------------------------------------*/
+/*--- end                                                          ---*/
+/*--------------------------------------------------------------------*/
diff --git a/include/vki/vki-xen-sysctl.h b/include/vki/vki-xen-sysctl.h
new file mode 100644
index 0000000..c5178d7
--- /dev/null
+++ b/include/vki/vki-xen-sysctl.h
@@ -0,0 +1,135 @@
+#ifndef __VKI_XEN_SYSCTL_H
+#define __VKI_XEN_SYSCTL_H
+
+/*
+ * The sysctl interface is versioned via the interface_version
+ * field. This structures in this header supports sysctl interfaces:
+ *
+ * - 00000008: Xen 4.1
+ * - 00000009: Xen 4.2
+ *
+ * When adding a new subop be sure to include the variants used by all
+ * of the above, both here and in syswrap-xen.c
+ *
+ * Structs which are identical in all supported versions have no
+ * version suffix. Structs which do differ are defined multiple times
+ * and use the suffix of the latest version to contain that particular
+ * variant.
+ */
+
+#define VKI_XEN_SYSCTL_readconsole                    1
+#define VKI_XEN_SYSCTL_tbuf_op                        2
+#define VKI_XEN_SYSCTL_physinfo                       3
+#define VKI_XEN_SYSCTL_sched_id                       4
+#define VKI_XEN_SYSCTL_perfc_op                       5
+#define VKI_XEN_SYSCTL_getdomaininfolist              6
+#define VKI_XEN_SYSCTL_debug_keys                     7
+#define VKI_XEN_SYSCTL_getcpuinfo                     8
+#define VKI_XEN_SYSCTL_availheap                      9
+#define VKI_XEN_SYSCTL_get_pmstat                    10
+#define VKI_XEN_SYSCTL_cpu_hotplug                   11
+#define VKI_XEN_SYSCTL_pm_op                         12
+#define VKI_XEN_SYSCTL_page_offline_op               14
+#define VKI_XEN_SYSCTL_lockprof_op                   15
+#define VKI_XEN_SYSCTL_topologyinfo                  16
+#define VKI_XEN_SYSCTL_numainfo                      17
+#define VKI_XEN_SYSCTL_cpupool_op                    18
+#define VKI_XEN_SYSCTL_scheduler_op                  19
+
+struct vki_xen_sysctl_getdomaininfolist_00000008 {
+    /* IN variables. */
+    vki_xen_domid_t           first_domain;
+    vki_uint32_t              max_domains;
+    VKI_XEN_GUEST_HANDLE_64(vki_xen_domctl_getdomaininfo_00000007_t) buffer;
+    /* OUT variables. */
+    vki_uint32_t              num_domains;
+};
+
+struct vki_xen_sysctl_getdomaininfolist_00000009 {
+    /* IN variables. */
+    vki_xen_domid_t           first_domain;
+    vki_uint32_t              max_domains;
+    VKI_XEN_GUEST_HANDLE_64(vki_xen_domctl_getdomaininfo_00000008_t) buffer;
+    /* OUT variables. */
+    vki_uint32_t              num_domains;
+};
+
+#define VKI_XEN_SYSCTL_CPUPOOL_OP_CREATE                1  /* C */
+#define VKI_XEN_SYSCTL_CPUPOOL_OP_DESTROY               2  /* D */
+#define VKI_XEN_SYSCTL_CPUPOOL_OP_INFO                  3  /* I */
+#define VKI_XEN_SYSCTL_CPUPOOL_OP_ADDCPU                4  /* A */
+#define VKI_XEN_SYSCTL_CPUPOOL_OP_RMCPU                 5  /* R */
+#define VKI_XEN_SYSCTL_CPUPOOL_OP_MOVEDOMAIN            6  /* M */
+#define VKI_XEN_SYSCTL_CPUPOOL_OP_FREEINFO              7  /* F */
+#define VKI_XEN_SYSCTL_CPUPOOL_PAR_ANY     0xFFFFFFFF
+struct vki_xen_sysctl_cpupool_op {
+    vki_uint32_t op;          /* IN */
+    vki_uint32_t cpupool_id;  /* IN: CDIARM OUT: CI */
+    vki_uint32_t sched_id;    /* IN: C      OUT: I  */
+    vki_uint32_t domid;       /* IN: M              */
+    vki_uint32_t cpu;         /* IN: AR             */
+    vki_uint32_t n_dom;       /*            OUT: I  */
+    struct vki_xenctl_cpumap cpumap; /*     OUT: IF */
+};
+
+struct vki_xen_sysctl_topologyinfo {
+    vki_uint32_t max_cpu_index;
+    VKI_XEN_GUEST_HANDLE_64(vki_uint32) cpu_to_core;
+    VKI_XEN_GUEST_HANDLE_64(vki_uint32) cpu_to_socket;
+    VKI_XEN_GUEST_HANDLE_64(vki_uint32) cpu_to_node;
+};
+
+struct vki_xen_sysctl_numainfo {
+    vki_uint32_t max_node_index;
+    VKI_XEN_GUEST_HANDLE_64(vki_uint64) node_to_memsize;
+    VKI_XEN_GUEST_HANDLE_64(vki_uint64) node_to_memfree;
+    VKI_XEN_GUEST_HANDLE_64(vki_uint32) node_to_node_distance;
+};
+struct vki_xen_sysctl_physinfo {
+    vki_uint32_t threads_per_core;
+    vki_uint32_t cores_per_socket;
+    vki_uint32_t nr_cpus;     /* # CPUs currently online */
+    vki_uint32_t max_cpu_id;  /* Largest possible CPU ID on this host */
+    vki_uint32_t nr_nodes;    /* # nodes currently online */
+    vki_uint32_t max_node_id; /* Largest possible node ID on this host */
+    vki_uint32_t cpu_khz;
+    vki_xen_uint64_aligned_t total_pages;
+    vki_xen_uint64_aligned_t free_pages;
+    vki_xen_uint64_aligned_t scrub_pages;
+    vki_uint32_t hw_cap[8];
+
+    vki_uint32_t capabilities;
+};
+
+struct vki_xen_sysctl {
+    vki_uint32_t cmd;
+    vki_uint32_t interface_version; /* XEN_SYSCTL_INTERFACE_VERSION */
+    union {
+        //struct vki_xen_sysctl_readconsole       readconsole;
+        //struct vki_xen_sysctl_tbuf_op           tbuf_op;
+        struct vki_xen_sysctl_physinfo          physinfo;
+        struct vki_xen_sysctl_topologyinfo      topologyinfo;
+        struct vki_xen_sysctl_numainfo          numainfo;
+        //struct vki_xen_sysctl_sched_id          sched_id;
+        //struct vki_xen_sysctl_perfc_op          perfc_op;
+        struct vki_xen_sysctl_getdomaininfolist_00000008 getdomaininfolist_00000008;
+        struct vki_xen_sysctl_getdomaininfolist_00000009 getdomaininfolist_00000009;
+        //struct vki_xen_sysctl_debug_keys        debug_keys;
+        //struct vki_xen_sysctl_getcpuinfo        getcpuinfo;
+        //struct vki_xen_sysctl_availheap         availheap;
+        //struct vki_xen_sysctl_get_pmstat        get_pmstat;
+        //struct vki_xen_sysctl_cpu_hotplug       cpu_hotplug;
+        //struct vki_xen_sysctl_pm_op             pm_op;
+        //struct vki_xen_sysctl_page_offline_op   page_offline;
+        //struct vki_xen_sysctl_lockprof_op       lockprof_op;
+        struct vki_xen_sysctl_cpupool_op        cpupool_op;
+        //struct vki_xen_sysctl_scheduler_op      scheduler_op;
+        vki_uint8_t                             pad[128];
+    } u;
+};
+
+#endif // __VKI_XEN_SYSCTL_H
+
+/*--------------------------------------------------------------------*/
+/*--- end                                                          ---*/
+/*--------------------------------------------------------------------*/
diff --git a/include/vki/vki-xen-version.h b/include/vki/vki-xen-version.h
new file mode 100644
index 0000000..6c6cae0
--- /dev/null
+++ b/include/vki/vki-xen-version.h
@@ -0,0 +1,43 @@
+#ifndef __VKI_XEN_VERSION_H
+#define __VKI_XEN_VERSION_H
+
+#define VKI_XENVER_version      0
+#define VKI_XENVER_extraversion 1
+#define VKI_XENVER_compile_info 2
+#define VKI_XENVER_capabilities 3
+#define VKI_XENVER_changeset 4
+#define VKI_XENVER_platform_parameters 5
+#define VKI_XENVER_get_features 6
+#define VKI_XENVER_pagesize 7
+#define VKI_XENVER_guest_handle 8
+#define VKI_XENVER_commandline 9
+
+typedef char vki_xen_extraversion_t[16];
+
+struct vki_xen_compile_info {
+    char compiler[64];
+    char compile_by[16];
+    char compile_domain[32];
+    char compile_date[32];
+};
+
+typedef char vki_xen_capabilities_info_t[1024];
+
+typedef char vki_xen_changeset_info_t[64];
+
+struct vki_xen_platform_parameters {
+    unsigned long virt_start;
+};
+
+struct vki_xen_feature_info {
+    unsigned int submap_idx;    /* IN: which 32-bit submap to return */
+    vki_uint32_t     submap;        /* OUT: 32-bit submap */
+};
+
+typedef char vki_xen_commandline_t[1024];
+
+#endif // __VKI_XEN_VERSION_H
+
+/*--------------------------------------------------------------------*/
+/*--- end                                                          ---*/
+/*--------------------------------------------------------------------*/
diff --git a/include/vki/vki-xen-x86.h b/include/vki/vki-xen-x86.h
new file mode 100644
index 0000000..240865b
--- /dev/null
+++ b/include/vki/vki-xen-x86.h
@@ -0,0 +1,130 @@
+#ifndef __VKI_XEN_X86_H
+#define __VKI_XEN_X86_H
+
+#if defined(__i386__)
+#define ___DEFINE_VKI_XEN_GUEST_HANDLE(name, type)			\
+    typedef struct { type *p; }						\
+        __vki_xen_guest_handle_ ## name;                                \
+    typedef struct { union { type *p; vki_xen_uint64_aligned_t q; }; }  \
+        __vki_xen_guest_handle_64_ ## name
+#define vki_xen_uint64_aligned_t vki_uint64_t __attribute__((aligned(8)))
+#define __VKI_XEN_GUEST_HANDLE_64(name) __vki_xen_guest_handle_64_ ## name
+#define VKI_XEN_GUEST_HANDLE_64(name) __VKI_XEN_GUEST_HANDLE_64(name)
+#else
+#define ___DEFINE_VKI_XEN_GUEST_HANDLE(name, type) \
+    typedef struct { type *p; } __vki_xen_guest_handle_ ## name
+#define vki_xen_uint64_aligned_t vki_uint64_t
+#define __DEFINE_VKI_XEN_GUEST_HANDLE(name, type) \
+    ___DEFINE_VKI_XEN_GUEST_HANDLE(name, type);   \
+    ___DEFINE_VKI_XEN_GUEST_HANDLE(const_##name, const type)
+#define DEFINE_VKI_XEN_GUEST_HANDLE(name)   __DEFINE_VKI_XEN_GUEST_HANDLE(name, name)
+#define VKI_XEN_GUEST_HANDLE_64(name) VKI_XEN_GUEST_HANDLE(name)
+#endif
+
+#define __VKI_XEN_GUEST_HANDLE(name)  __vki_xen_guest_handle_ ## name
+#define VKI_XEN_GUEST_HANDLE(name)    __VKI_XEN_GUEST_HANDLE(name)
+
+typedef unsigned long vki_xen_pfn_t;
+typedef unsigned long vki_xen_ulong_t;
+
+#if defined(__i386__)
+struct vki_xen_cpu_user_regs {
+    vki_uint32_t ebx;
+    vki_uint32_t ecx;
+    vki_uint32_t edx;
+    vki_uint32_t esi;
+    vki_uint32_t edi;
+    vki_uint32_t ebp;
+    vki_uint32_t eax;
+    vki_uint16_t error_code;    /* private */
+    vki_uint16_t entry_vector;  /* private */
+    vki_uint32_t eip;
+    vki_uint16_t cs;
+    vki_uint8_t  saved_upcall_mask;
+    vki_uint8_t  _pad0;
+    vki_uint32_t eflags;        /* eflags.IF == !saved_upcall_mask */
+    vki_uint32_t esp;
+    vki_uint16_t ss, _pad1;
+    vki_uint16_t es, _pad2;
+    vki_uint16_t ds, _pad3;
+    vki_uint16_t fs, _pad4;
+    vki_uint16_t gs, _pad5;
+};
+#else
+struct vki_xen_cpu_user_regs {
+    vki_uint64_t r15;
+    vki_uint64_t r14;
+    vki_uint64_t r13;
+    vki_uint64_t r12;
+    vki_uint64_t rbp;
+    vki_uint64_t rbx;
+    vki_uint64_t r11;
+    vki_uint64_t r10;
+    vki_uint64_t r9;
+    vki_uint64_t r8;
+    vki_uint64_t rax;
+    vki_uint64_t rcx;
+    vki_uint64_t rdx;
+    vki_uint64_t rsi;
+    vki_uint64_t rdi;
+    vki_uint32_t error_code;    /* private */
+    vki_uint32_t entry_vector;  /* private */
+    vki_uint64_t rip;
+    vki_uint16_t cs, _pad0[1];
+    vki_uint8_t  saved_upcall_mask;
+    vki_uint8_t  _pad1[3];
+    vki_uint64_t rflags;      /* rflags.IF == !saved_upcall_mask */
+    vki_uint64_t rsp;
+    vki_uint16_t ss, _pad2[3];
+    vki_uint16_t es, _pad3[3];
+    vki_uint16_t ds, _pad4[3];
+    vki_uint16_t fs, _pad5[3]; /* Non-zero => takes precedence over fs_base.     */
+    vki_uint16_t gs, _pad6[3]; /* Non-zero => takes precedence over gs_base_usr. */
+};
+#endif
+
+struct vki_xen_trap_info {
+    vki_uint8_t   vector;  /* exception vector                              */
+    vki_uint8_t   flags;   /* 0-3: privilege level; 4: clear event enable?  */
+    vki_uint16_t  cs;      /* code selector                                 */
+    unsigned long address; /* code offset                                   */
+};
+
+struct vki_xen_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     */
+    unsigned long flags;                    /* VGCF_* flags                 */
+    struct vki_xen_cpu_user_regs user_regs; /* User-level CPU registers     */
+    struct vki_xen_trap_info trap_ctxt[256];/* Virtual IDT                  */
+    unsigned long ldt_base, ldt_ents;       /* LDT (linear address, # ents) */
+    unsigned long gdt_frames[16], gdt_ents; /* GDT (machine frames, # ents) */
+    unsigned long kernel_ss, kernel_sp;     /* Virtual TSS (only SS1/SP1)   */
+    /* NB. User pagetable on x86/64 is placed in ctrlreg[1]. */
+    unsigned long ctrlreg[8];               /* CR0-CR7 (control registers)  */
+    unsigned long debugreg[8];              /* DB0-DB7 (debug registers)    */
+#ifdef __i386__
+    unsigned long event_callback_cs;        /* CS:EIP of event callback     */
+    unsigned long event_callback_eip;
+    unsigned long failsafe_callback_cs;     /* CS:EIP of failsafe callback  */
+    unsigned long failsafe_callback_eip;
+#else
+    unsigned long event_callback_eip;
+    unsigned long failsafe_callback_eip;
+    unsigned long syscall_callback_eip;
+#endif
+    unsigned long vm_assist;                /* VMASST_TYPE_* bitmap */
+#ifdef __x86_64__
+    /* Segment base addresses. */
+    vki_uint64_t  fs_base;
+    vki_uint64_t  gs_base_kernel;
+    vki_uint64_t  gs_base_user;
+#endif
+};
+typedef struct vki_xen_vcpu_guest_context vki_xen_vcpu_guest_context_t;
+DEFINE_VKI_XEN_GUEST_HANDLE(vki_xen_vcpu_guest_context_t);
+
+#endif // __VKI_XEN_H
+
+/*--------------------------------------------------------------------*/
+/*--- end                                                          ---*/
+/*--------------------------------------------------------------------*/
diff --git a/include/vki/vki-xen.h b/include/vki/vki-xen.h
index 7842cc9..ed3cc1b 100644
--- a/include/vki/vki-xen.h
+++ b/include/vki/vki-xen.h
@@ -1,6 +1,90 @@
 #ifndef __VKI_XEN_H
 #define __VKI_XEN_H
 
+#define ENABLE_XEN 1
+
+#define __VKI_XEN_set_trap_table        0
+#define __VKI_XEN_mmu_update            1
+#define __VKI_XEN_set_gdt               2
+#define __VKI_XEN_stack_switch          3
+#define __VKI_XEN_set_callbacks         4
+#define __VKI_XEN_fpu_taskswitch        5
+#define __VKI_XEN_sched_op_compat       6 /* compat since 0x00030101 */
+#define __VKI_XEN_platform_op           7
+#define __VKI_XEN_set_debugreg          8
+#define __VKI_XEN_get_debugreg          9
+#define __VKI_XEN_update_descriptor    10
+#define __VKI_XEN_memory_op            12
+#define __VKI_XEN_multicall            13
+#define __VKI_XEN_update_va_mapping    14
+#define __VKI_XEN_set_timer_op         15
+#define __VKI_XEN_event_channel_op_compat 16 /* compat since 0x00030202 */
+#define __VKI_XEN_xen_version          17
+#define __VKI_XEN_console_io           18
+#define __VKI_XEN_physdev_op_compat    19 /* compat since 0x00030202 */
+#define __VKI_XEN_grant_table_op       20
+#define __VKI_XEN_vm_assist            21
+#define __VKI_XEN_update_va_mapping_otherdomain 22
+#define __VKI_XEN_iret                 23 /* x86 only */
+#define __VKI_XEN_vcpu_op              24
+#define __VKI_XEN_set_segment_base     25 /* x86/64 only */
+#define __VKI_XEN_mmuext_op            26
+#define __VKI_XEN_xsm_op               27
+#define __VKI_XEN_nmi_op               28
+#define __VKI_XEN_sched_op             29
+#define __VKI_XEN_callback_op          30
+#define __VKI_XEN_xenoprof_op          31
+#define __VKI_XEN_event_channel_op     32
+#define __VKI_XEN_physdev_op           33
+#define __VKI_XEN_hvm_op               34
+#define __VKI_XEN_sysctl               35
+#define __VKI_XEN_domctl               36
+#define __VKI_XEN_kexec_op             37
+#define __VKI_XEN_tmem_op              38
+#define __VKI_XEN_xc_reserved_op       39 /* reserved for XenClient */
+
+#define __DEFINE_VKI_XEN_GUEST_HANDLE(name, type) \
+    ___DEFINE_VKI_XEN_GUEST_HANDLE(name, type);   \
+    ___DEFINE_VKI_XEN_GUEST_HANDLE(const_##name, const type)
+#define DEFINE_VKI_XEN_GUEST_HANDLE(name)   __DEFINE_VKI_XEN_GUEST_HANDLE(name, name)
+
+typedef vki_uint8_t vki_xen_domain_handle_t[16];
+typedef vki_uint16_t vki_xen_domid_t;
+
+#if defined(__i386__) || defined(__x86_64__)
+#include <vki/vki-xen-x86.h>
+#else
+#error "Need to define per-ARCH Xen types for this platform"
+#endif
+
+DEFINE_VKI_XEN_GUEST_HANDLE(void);
+DEFINE_VKI_XEN_GUEST_HANDLE(vki_xen_pfn_t);
+
+__DEFINE_VKI_XEN_GUEST_HANDLE(vki_ulong, unsigned long);
+
+__DEFINE_VKI_XEN_GUEST_HANDLE(vki_int16, vki_int16_t);
+__DEFINE_VKI_XEN_GUEST_HANDLE(vki_int32, vki_int32_t);
+__DEFINE_VKI_XEN_GUEST_HANDLE(vki_int64, vki_int64_t);
+
+__DEFINE_VKI_XEN_GUEST_HANDLE(vki_uint8, vki_uint8_t);
+__DEFINE_VKI_XEN_GUEST_HANDLE(vki_uint16, vki_uint16_t);
+__DEFINE_VKI_XEN_GUEST_HANDLE(vki_uint32, vki_uint32_t);
+__DEFINE_VKI_XEN_GUEST_HANDLE(vki_uint64, vki_uint64_t);
+
+struct vki_xenctl_cpumap {
+    VKI_XEN_GUEST_HANDLE_64(vki_uint8) bitmap;
+    vki_uint32_t nr_cpus;
+};
+
+#include <vki/vki-xen-domctl.h>
+#include <vki/vki-xen-sysctl.h>
+#include <vki/vki-xen-mmuext.h>
+#include <vki/vki-xen-memory.h>
+#include <vki/vki-xen-evtchn.h>
+#include <vki/vki-xen-gnttab.h>
+#include <vki/vki-xen-version.h>
+#include <vki/vki-xen-hvm.h>
+
 #endif // __VKI_XEN_H
 
 /*--------------------------------------------------------------------*/