aboutsummaryrefslogtreecommitdiffstats
path: root/main/grub/0001-xen-Add-some-Xen-headers.patch
diff options
context:
space:
mode:
Diffstat (limited to 'main/grub/0001-xen-Add-some-Xen-headers.patch')
-rw-r--r--main/grub/0001-xen-Add-some-Xen-headers.patch2322
1 files changed, 0 insertions, 2322 deletions
diff --git a/main/grub/0001-xen-Add-some-Xen-headers.patch b/main/grub/0001-xen-Add-some-Xen-headers.patch
deleted file mode 100644
index fc3f138537..0000000000
--- a/main/grub/0001-xen-Add-some-Xen-headers.patch
+++ /dev/null
@@ -1,2322 +0,0 @@
-From d05d23ac337d951d94b94002211b684759619634 Mon Sep 17 00:00:00 2001
-From: Juergen Gross <jgross@suse.com>
-Date: Fri, 7 Dec 2018 13:11:29 +0100
-Subject: [PATCH 01/20] xen: Add some Xen headers
-
-In order to support grub2 in Xen PVH environment some additional Xen
-headers are needed as grub2 will be started in PVH mode requiring to
-use several HVM hypercalls and structures.
-
-Add the needed headers from Xen 4.10 being the first Xen version with
-full (not only experimental) PVH guest support.
-
-Signed-off-by: Juergen Gross <jgross@suse.com>
-Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
-Tested-by: Hans van Kranenburg <hans@knorrie.org>
-(cherry picked from commit 9118effd1b1fb67d82168b37cf6dd1142feced3b)
----
- include/xen/hvm/hvm_op.h | 296 ++++++++++++++++
- include/xen/hvm/params.h | 284 +++++++++++++++
- include/xen/hvm/start_info.h | 98 ++++++
- include/xen/memory.h | 665 +++++++++++++++++++++++++++++++++++
- include/xen/physdev.h | 387 ++++++++++++++++++++
- include/xen/trace.h | 339 ++++++++++++++++++
- include/xen/xen.h | 104 ++++--
- 7 files changed, 2142 insertions(+), 31 deletions(-)
- create mode 100644 include/xen/hvm/hvm_op.h
- create mode 100644 include/xen/hvm/params.h
- create mode 100644 include/xen/hvm/start_info.h
- create mode 100644 include/xen/memory.h
- create mode 100644 include/xen/physdev.h
- create mode 100644 include/xen/trace.h
-
-diff --git a/include/xen/hvm/hvm_op.h b/include/xen/hvm/hvm_op.h
-new file mode 100644
-index 000000000..0bdafdf59
---- /dev/null
-+++ b/include/xen/hvm/hvm_op.h
-@@ -0,0 +1,296 @@
-+/*
-+ * 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) 2007, Keir Fraser
-+ */
-+
-+#ifndef __XEN_PUBLIC_HVM_HVM_OP_H__
-+#define __XEN_PUBLIC_HVM_HVM_OP_H__
-+
-+#include "../xen.h"
-+#include "../trace.h"
-+#include "../event_channel.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);
-+
-+#if __XEN_INTERFACE_VERSION__ < 0x00040900
-+
-+/* 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);
-+
-+#endif /* __XEN_INTERFACE_VERSION__ < 0x00040900 */
-+
-+/* 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 */
-+#if __XEN_INTERFACE_VERSION__ < 0x00040700
-+ HVMMEM_mmio_write_dm, /* Read-only; writes go to the device model */
-+#else
-+ HVMMEM_unused, /* Placeholder; setting memory to this type
-+ will fail for code after 4.7.0 */
-+#endif
-+ HVMMEM_ioreq_server /* Memory type claimed by an ioreq server; type
-+ changes to this value are only allowed after
-+ an ioreq server has claimed its ownership.
-+ Only pages with HVMMEM_ram_rw are allowed to
-+ change to this type; conversely, pages with
-+ this type are only allowed to be changed back
-+ to HVMMEM_ram_rw. */
-+} hvmmem_type_t;
-+
-+/* 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__)
-+
-+/* Deprecated by XENMEM_access_op_set_access */
-+#define HVMOP_set_mem_access 12
-+
-+/* Deprecated by XENMEM_access_op_get_access */
-+#define HVMOP_get_mem_access 13
-+
-+#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);
-+
-+/* Following tools-only interfaces may change in future. */
-+#if defined(__XEN__) || defined(__XEN_TOOLS__)
-+
-+/*
-+ * Definitions relating to DMOP_create_ioreq_server. (Defined here for
-+ * backwards compatibility).
-+ */
-+
-+#define HVM_IOREQSRV_BUFIOREQ_OFF 0
-+#define HVM_IOREQSRV_BUFIOREQ_LEGACY 1
-+/*
-+ * Use this when read_pointer gets updated atomically and
-+ * the pointer pair gets read atomically:
-+ */
-+#define HVM_IOREQSRV_BUFIOREQ_ATOMIC 2
-+
-+#endif /* defined(__XEN__) || defined(__XEN_TOOLS__) */
-+
-+#if defined(__i386__) || defined(__x86_64__)
-+
-+/*
-+ * HVMOP_set_evtchn_upcall_vector: Set a <vector> that should be used for event
-+ * channel upcalls on the specified <vcpu>. If set,
-+ * this vector will be used in preference to the
-+ * domain global callback via (see
-+ * HVM_PARAM_CALLBACK_IRQ).
-+ */
-+#define HVMOP_set_evtchn_upcall_vector 23
-+struct xen_hvm_evtchn_upcall_vector {
-+ uint32_t vcpu;
-+ uint8_t vector;
-+};
-+typedef struct xen_hvm_evtchn_upcall_vector xen_hvm_evtchn_upcall_vector_t;
-+DEFINE_XEN_GUEST_HANDLE(xen_hvm_evtchn_upcall_vector_t);
-+
-+#endif /* defined(__i386__) || defined(__x86_64__) */
-+
-+#define HVMOP_guest_request_vm_event 24
-+
-+/* HVMOP_altp2m: perform altp2m state operations */
-+#define HVMOP_altp2m 25
-+
-+#define HVMOP_ALTP2M_INTERFACE_VERSION 0x00000001
-+
-+struct xen_hvm_altp2m_domain_state {
-+ /* IN or OUT variable on/off */
-+ uint8_t state;
-+};
-+typedef struct xen_hvm_altp2m_domain_state xen_hvm_altp2m_domain_state_t;
-+DEFINE_XEN_GUEST_HANDLE(xen_hvm_altp2m_domain_state_t);
-+
-+struct xen_hvm_altp2m_vcpu_enable_notify {
-+ uint32_t vcpu_id;
-+ uint32_t pad;
-+ /* #VE info area gfn */
-+ uint64_t gfn;
-+};
-+typedef struct xen_hvm_altp2m_vcpu_enable_notify xen_hvm_altp2m_vcpu_enable_notify_t;
-+DEFINE_XEN_GUEST_HANDLE(xen_hvm_altp2m_vcpu_enable_notify_t);
-+
-+struct xen_hvm_altp2m_view {
-+ /* IN/OUT variable */
-+ uint16_t view;
-+ /* Create view only: default access type
-+ * NOTE: currently ignored */
-+ uint16_t hvmmem_default_access; /* xenmem_access_t */
-+};
-+typedef struct xen_hvm_altp2m_view xen_hvm_altp2m_view_t;
-+DEFINE_XEN_GUEST_HANDLE(xen_hvm_altp2m_view_t);
-+
-+struct xen_hvm_altp2m_set_mem_access {
-+ /* view */
-+ uint16_t view;
-+ /* Memory type */
-+ uint16_t hvmmem_access; /* xenmem_access_t */
-+ uint32_t pad;
-+ /* gfn */
-+ uint64_t gfn;
-+};
-+typedef struct xen_hvm_altp2m_set_mem_access xen_hvm_altp2m_set_mem_access_t;
-+DEFINE_XEN_GUEST_HANDLE(xen_hvm_altp2m_set_mem_access_t);
-+
-+struct xen_hvm_altp2m_change_gfn {
-+ /* view */
-+ uint16_t view;
-+ uint16_t pad1;
-+ uint32_t pad2;
-+ /* old gfn */
-+ uint64_t old_gfn;
-+ /* new gfn, INVALID_GFN (~0UL) means revert */
-+ uint64_t new_gfn;
-+};
-+typedef struct xen_hvm_altp2m_change_gfn xen_hvm_altp2m_change_gfn_t;
-+DEFINE_XEN_GUEST_HANDLE(xen_hvm_altp2m_change_gfn_t);
-+
-+struct xen_hvm_altp2m_op {
-+ uint32_t version; /* HVMOP_ALTP2M_INTERFACE_VERSION */
-+ uint32_t cmd;
-+/* Get/set the altp2m state for a domain */
-+#define HVMOP_altp2m_get_domain_state 1
-+#define HVMOP_altp2m_set_domain_state 2
-+/* Set the current VCPU to receive altp2m event notifications */
-+#define HVMOP_altp2m_vcpu_enable_notify 3
-+/* Create a new view */
-+#define HVMOP_altp2m_create_p2m 4
-+/* Destroy a view */
-+#define HVMOP_altp2m_destroy_p2m 5
-+/* Switch view for an entire domain */
-+#define HVMOP_altp2m_switch_p2m 6
-+/* Notify that a page of memory is to have specific access types */
-+#define HVMOP_altp2m_set_mem_access 7
-+/* Change a p2m entry to have a different gfn->mfn mapping */
-+#define HVMOP_altp2m_change_gfn 8
-+ domid_t domain;
-+ uint16_t pad1;
-+ uint32_t pad2;
-+ union {
-+ struct xen_hvm_altp2m_domain_state domain_state;
-+ struct xen_hvm_altp2m_vcpu_enable_notify enable_notify;
-+ struct xen_hvm_altp2m_view view;
-+ struct xen_hvm_altp2m_set_mem_access set_mem_access;
-+ struct xen_hvm_altp2m_change_gfn change_gfn;
-+ uint8_t pad[64];
-+ } u;
-+};
-+typedef struct xen_hvm_altp2m_op xen_hvm_altp2m_op_t;
-+DEFINE_XEN_GUEST_HANDLE(xen_hvm_altp2m_op_t);
-+
-+#endif /* __XEN_PUBLIC_HVM_HVM_OP_H__ */
-+
-+/*
-+ * Local variables:
-+ * mode: C
-+ * c-file-style: "BSD"
-+ * c-basic-offset: 4
-+ * tab-width: 4
-+ * indent-tabs-mode: nil
-+ * End:
-+ */
-diff --git a/include/xen/hvm/params.h b/include/xen/hvm/params.h
-new file mode 100644
-index 000000000..2ec2e7c80
---- /dev/null
-+++ b/include/xen/hvm/params.h
-@@ -0,0 +1,284 @@
-+/*
-+ * 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) 2007, Keir Fraser
-+ */
-+
-+#ifndef __XEN_PUBLIC_HVM_PARAMS_H__
-+#define __XEN_PUBLIC_HVM_PARAMS_H__
-+
-+#include "hvm_op.h"
-+
-+/*
-+ * Parameter space for HVMOP_{set,get}_param.
-+ */
-+
-+#define HVM_PARAM_CALLBACK_IRQ 0
-+#define HVM_PARAM_CALLBACK_IRQ_TYPE_MASK xen_mk_ullong(0xFF00000000000000)
-+/*
-+ * How should CPU0 event-channel notifications be delivered?
-+ *
-+ * If val == 0 then CPU0 event-channel notifications are not delivered.
-+ * If val != 0, val[63:56] encodes the type, as follows:
-+ */
-+
-+#define HVM_PARAM_CALLBACK_TYPE_GSI 0
-+/*
-+ * val[55:0] is a delivery GSI. GSI 0 cannot be used, as it aliases val == 0,
-+ * and disables all notifications.
-+ */
-+
-+#define HVM_PARAM_CALLBACK_TYPE_PCI_INTX 1
-+/*
-+ * val[55:0] is a delivery PCI INTx line:
-+ * Domain = val[47:32], Bus = val[31:16] DevFn = val[15:8], IntX = val[1:0]
-+ */
-+
-+#if defined(__i386__) || defined(__x86_64__)
-+#define HVM_PARAM_CALLBACK_TYPE_VECTOR 2
-+/*
-+ * val[7:0] is a vector number. Check for XENFEAT_hvm_callback_vector to know
-+ * if this delivery method is available.
-+ */
-+#elif defined(__arm__) || defined(__aarch64__)
-+#define HVM_PARAM_CALLBACK_TYPE_PPI 2
-+/*
-+ * val[55:16] needs to be zero.
-+ * val[15:8] is interrupt flag of the PPI used by event-channel:
-+ * bit 8: the PPI is edge(1) or level(0) triggered
-+ * bit 9: the PPI is active low(1) or high(0)
-+ * val[7:0] is a PPI number used by event-channel.
-+ * This is only used by ARM/ARM64 and masking/eoi the interrupt associated to
-+ * the notification is handled by the interrupt controller.
-+ */
-+#define HVM_PARAM_CALLBACK_TYPE_PPI_FLAG_MASK 0xFF00
-+#define HVM_PARAM_CALLBACK_TYPE_PPI_FLAG_LOW_LEVEL 2
-+#endif
-+
-+/*
-+ * 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
-+#define HVM_PARAM_BUFIOREQ_EVTCHN 26
-+
-+#if defined(__i386__) || defined(__x86_64__)
-+
-+/*
-+ * Viridian enlightenments
-+ *
-+ * (See http://download.microsoft.com/download/A/B/4/AB43A34E-BDD0-4FA6-BDEF-79EEF16E880B/Hypervisor%20Top%20Level%20Functional%20Specification%20v4.0.docx)
-+ *
-+ * To expose viridian enlightenments to the guest set this parameter
-+ * to the desired feature mask. The base feature set must be present
-+ * in any valid feature mask.
-+ */
-+#define HVM_PARAM_VIRIDIAN 9
-+
-+/* Base+Freq viridian feature sets:
-+ *
-+ * - Hypercall MSRs (HV_X64_MSR_GUEST_OS_ID and HV_X64_MSR_HYPERCALL)
-+ * - APIC access MSRs (HV_X64_MSR_EOI, HV_X64_MSR_ICR and HV_X64_MSR_TPR)
-+ * - Virtual Processor index MSR (HV_X64_MSR_VP_INDEX)
-+ * - Timer frequency MSRs (HV_X64_MSR_TSC_FREQUENCY and
-+ * HV_X64_MSR_APIC_FREQUENCY)
-+ */
-+#define _HVMPV_base_freq 0
-+#define HVMPV_base_freq (1 << _HVMPV_base_freq)
-+
-+/* Feature set modifications */
-+
-+/* Disable timer frequency MSRs (HV_X64_MSR_TSC_FREQUENCY and
-+ * HV_X64_MSR_APIC_FREQUENCY).
-+ * This modification restores the viridian feature set to the
-+ * original 'base' set exposed in releases prior to Xen 4.4.
-+ */
-+#define _HVMPV_no_freq 1
-+#define HVMPV_no_freq (1 << _HVMPV_no_freq)
-+
-+/* Enable Partition Time Reference Counter (HV_X64_MSR_TIME_REF_COUNT) */
-+#define _HVMPV_time_ref_count 2
-+#define HVMPV_time_ref_count (1 << _HVMPV_time_ref_count)
-+
-+/* Enable Reference TSC Page (HV_X64_MSR_REFERENCE_TSC) */
-+#define _HVMPV_reference_tsc 3
-+#define HVMPV_reference_tsc (1 << _HVMPV_reference_tsc)
-+
-+/* Use Hypercall for remote TLB flush */
-+#define _HVMPV_hcall_remote_tlb_flush 4
-+#define HVMPV_hcall_remote_tlb_flush (1 << _HVMPV_hcall_remote_tlb_flush)
-+
-+/* Use APIC assist */
-+#define _HVMPV_apic_assist 5
-+#define HVMPV_apic_assist (1 << _HVMPV_apic_assist)
-+
-+/* Enable crash MSRs */
-+#define _HVMPV_crash_ctl 6
-+#define HVMPV_crash_ctl (1 << _HVMPV_crash_ctl)
-+
-+#define HVMPV_feature_mask \
-+ (HVMPV_base_freq | \
-+ HVMPV_no_freq | \
-+ HVMPV_time_ref_count | \
-+ HVMPV_reference_tsc | \
-+ HVMPV_hcall_remote_tlb_flush | \
-+ HVMPV_apic_assist | \
-+ HVMPV_crash_ctl)
-+
-+#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
-+
-+/* Deprecated */
-+#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 HVM_PARAM_MEMORY_EVENT_MSR 30
-+
-+/* Boolean: Enable nestedhvm (hvm only) */
-+#define HVM_PARAM_NESTEDHVM 24
-+
-+/* Params for the mem event rings */
-+#define HVM_PARAM_PAGING_RING_PFN 27
-+#define HVM_PARAM_MONITOR_RING_PFN 28
-+#define HVM_PARAM_SHARING_RING_PFN 29
-+
-+/* SHUTDOWN_* action in case of a triple fault */
-+#define HVM_PARAM_TRIPLE_FAULT_REASON 31
-+
-+#define HVM_PARAM_IOREQ_SERVER_PFN 32
-+#define HVM_PARAM_NR_IOREQ_SERVER_PAGES 33
-+
-+/* Location of the VM Generation ID in guest physical address space. */
-+#define HVM_PARAM_VM_GENERATION_ID_ADDR 34
-+
-+/*
-+ * Set mode for altp2m:
-+ * disabled: don't activate altp2m (default)
-+ * mixed: allow access to all altp2m ops for both in-guest and external tools
-+ * external: allow access to external privileged tools only
-+ * limited: guest only has limited access (ie. control VMFUNC and #VE)
-+ */
-+#define HVM_PARAM_ALTP2M 35
-+#define XEN_ALTP2M_disabled 0
-+#define XEN_ALTP2M_mixed 1
-+#define XEN_ALTP2M_external 2
-+#define XEN_ALTP2M_limited 3
-+
-+/*
-+ * Size of the x87 FPU FIP/FDP registers that the hypervisor needs to
-+ * save/restore. This is a workaround for a hardware limitation that
-+ * does not allow the full FIP/FDP and FCS/FDS to be restored.
-+ *
-+ * Valid values are:
-+ *
-+ * 8: save/restore 64-bit FIP/FDP and clear FCS/FDS (default if CPU
-+ * has FPCSDS feature).
-+ *
-+ * 4: save/restore 32-bit FIP/FDP, FCS/FDS, and clear upper 32-bits of
-+ * FIP/FDP.
-+ *
-+ * 0: allow hypervisor to choose based on the value of FIP/FDP
-+ * (default if CPU does not have FPCSDS).
-+ *
-+ * If FPCSDS (bit 13 in CPUID leaf 0x7, subleaf 0x0) is set, the CPU
-+ * never saves FCS/FDS and this parameter should be left at the
-+ * default of 8.
-+ */
-+#define HVM_PARAM_X87_FIP_WIDTH 36
-+
-+/*
-+ * TSS (and its size) used on Intel when CR0.PE=0. The address occupies
-+ * the low 32 bits, while the size is in the high 32 ones.
-+ */
-+#define HVM_PARAM_VM86_TSS_SIZED 37
-+
-+/* Enable MCA capabilities. */
-+#define HVM_PARAM_MCA_CAP 38
-+#define XEN_HVM_MCA_CAP_LMCE (xen_mk_ullong(1) << 0)
-+#define XEN_HVM_MCA_CAP_MASK XEN_HVM_MCA_CAP_LMCE
-+
-+#define HVM_NR_PARAMS 39
-+
-+#endif /* __XEN_PUBLIC_HVM_PARAMS_H__ */
-diff --git a/include/xen/hvm/start_info.h b/include/xen/hvm/start_info.h
-new file mode 100644
-index 000000000..648415976
---- /dev/null
-+++ b/include/xen/hvm/start_info.h
-@@ -0,0 +1,98 @@
-+/*
-+ * 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) 2016, Citrix Systems, Inc.
-+ */
-+
-+#ifndef __XEN_PUBLIC_ARCH_X86_HVM_START_INFO_H__
-+#define __XEN_PUBLIC_ARCH_X86_HVM_START_INFO_H__
-+
-+/*
-+ * Start of day structure passed to PVH guests and to HVM guests in %ebx.
-+ *
-+ * NOTE: nothing will be loaded at physical address 0, so a 0 value in any
-+ * of the address fields should be treated as not present.
-+ *
-+ * 0 +----------------+
-+ * | magic | Contains the magic value XEN_HVM_START_MAGIC_VALUE
-+ * | | ("xEn3" with the 0x80 bit of the "E" set).
-+ * 4 +----------------+
-+ * | version | Version of this structure. Current version is 0. New
-+ * | | versions are guaranteed to be backwards-compatible.
-+ * 8 +----------------+
-+ * | flags | SIF_xxx flags.
-+ * 12 +----------------+
-+ * | nr_modules | Number of modules passed to the kernel.
-+ * 16 +----------------+
-+ * | modlist_paddr | Physical address of an array of modules
-+ * | | (layout of the structure below).
-+ * 24 +----------------+
-+ * | cmdline_paddr | Physical address of the command line,
-+ * | | a zero-terminated ASCII string.
-+ * 32 +----------------+
-+ * | rsdp_paddr | Physical address of the RSDP ACPI data structure.
-+ * 40 +----------------+
-+ *
-+ * The layout of each entry in the module structure is the following:
-+ *
-+ * 0 +----------------+
-+ * | paddr | Physical address of the module.
-+ * 8 +----------------+
-+ * | size | Size of the module in bytes.
-+ * 16 +----------------+
-+ * | cmdline_paddr | Physical address of the command line,
-+ * | | a zero-terminated ASCII string.
-+ * 24 +----------------+
-+ * | reserved |
-+ * 32 +----------------+
-+ *
-+ * The address and sizes are always a 64bit little endian unsigned integer.
-+ *
-+ * NB: Xen on x86 will always try to place all the data below the 4GiB
-+ * boundary.
-+ */
-+#define XEN_HVM_START_MAGIC_VALUE 0x336ec578
-+
-+/*
-+ * C representation of the x86/HVM start info layout.
-+ *
-+ * The canonical definition of this layout is above, this is just a way to
-+ * represent the layout described there using C types.
-+ */
-+struct hvm_start_info {
-+ uint32_t magic; /* Contains the magic value 0x336ec578 */
-+ /* ("xEn3" with the 0x80 bit of the "E" set).*/
-+ uint32_t version; /* Version of this structure. */
-+ uint32_t flags; /* SIF_xxx flags. */
-+ uint32_t nr_modules; /* Number of modules passed to the kernel. */
-+ uint64_t modlist_paddr; /* Physical address of an array of */
-+ /* hvm_modlist_entry. */
-+ uint64_t cmdline_paddr; /* Physical address of the command line. */
-+ uint64_t rsdp_paddr; /* Physical address of the RSDP ACPI data */
-+ /* structure. */
-+};
-+
-+struct hvm_modlist_entry {
-+ uint64_t paddr; /* Physical address of the module. */
-+ uint64_t size; /* Size of the module in bytes. */
-+ uint64_t cmdline_paddr; /* Physical address of the command line. */
-+ uint64_t reserved;
-+};
-+
-+#endif /* __XEN_PUBLIC_ARCH_X86_HVM_START_INFO_H__ */
-diff --git a/include/xen/memory.h b/include/xen/memory.h
-new file mode 100644
-index 000000000..20deef5cb
---- /dev/null
-+++ b/include/xen/memory.h
-@@ -0,0 +1,665 @@
-+/******************************************************************************
-+ * 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"
-+#include "physdev.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)
-+/* Flag to indicate the node specified is virtual node */
-+#define XENMEMF_vnode (1<<18)
-+#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)
-+ * XENMEM_claim_pages:
-+ * IN: must be zero
-+ */
-+ 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.
-+ *
-+ * Note that only PV guests can use this operation.
-+ */
-+#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);
-+
-+/*
-+ * For a compat caller, this is identical to XENMEM_machphys_mfn_list.
-+ *
-+ * For a non compat caller, this functions similarly to
-+ * XENMEM_machphys_mfn_list, but returns the mfns making up the compatibility
-+ * m2p table.
-+ */
-+#define XENMEM_machphys_compat_mfn_list 25
-+
-+/*
-+ * 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);
-+
-+/* Source mapping space. */
-+/* ` enum phys_map_space { */
-+#define XENMAPSPACE_shared_info 0 /* shared info page */
-+#define XENMAPSPACE_grant_table 1 /* grant table page */
-+#define XENMAPSPACE_gmfn 2 /* GMFN */
-+#define XENMAPSPACE_gmfn_range 3 /* GMFN range, XENMEM_add_to_physmap only. */
-+#define XENMAPSPACE_gmfn_foreign 4 /* GMFN from another dom,
-+ * XENMEM_add_to_physmap_batch only. */
-+#define XENMAPSPACE_dev_mmio 5 /* device mmio region
-+ ARM only; the region is mapped in
-+ Stage-2 using the Normal Memory
-+ Inner/Outer Write-Back Cacheable
-+ memory attribute. */
-+/* ` } */
-+
-+/*
-+ * 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;
-+
-+ /* Number of pages to go through for gmfn_range */
-+ uint16_t size;
-+
-+ unsigned int space; /* => enum phys_map_space */
-+
-+#define XENMAPIDX_grant_table_status 0x80000000
-+
-+ /* Index into space being mapped. */
-+ xen_ulong_t idx;
-+
-+ /* GPFN in domid 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);
-+
-+/* A batched version of add_to_physmap. */
-+#define XENMEM_add_to_physmap_batch 23
-+struct xen_add_to_physmap_batch {
-+ /* IN */
-+ /* Which domain to change the mapping for. */
-+ domid_t domid;
-+ uint16_t space; /* => enum phys_map_space */
-+
-+ /* Number of pages to go through */
-+ uint16_t size;
-+
-+#if __XEN_INTERFACE_VERSION__ < 0x00040700
-+ domid_t foreign_domid; /* IFF gmfn_foreign. Should be 0 for other spaces. */
-+#else
-+ union xen_add_to_physmap_batch_extra {
-+ domid_t foreign_domid; /* gmfn_foreign */
-+ uint16_t res0; /* All the other spaces. Should be 0 */
-+ } u;
-+#endif
-+
-+ /* Indexes into space being mapped. */
-+ XEN_GUEST_HANDLE(xen_ulong_t) idxs;
-+
-+ /* GPFN in domid where the source mapping page should appear. */
-+ XEN_GUEST_HANDLE(xen_pfn_t) gpfns;
-+
-+ /* OUT */
-+
-+ /* Per index error code. */
-+ XEN_GUEST_HANDLE(int) errs;
-+};
-+typedef struct xen_add_to_physmap_batch xen_add_to_physmap_batch_t;
-+DEFINE_XEN_GUEST_HANDLE(xen_add_to_physmap_batch_t);
-+
-+#if __XEN_INTERFACE_VERSION__ < 0x00040400
-+#define XENMEM_add_to_physmap_range XENMEM_add_to_physmap_batch
-+#define xen_add_to_physmap_range xen_add_to_physmap_batch
-+typedef struct xen_add_to_physmap_batch xen_add_to_physmap_range_t;
-+DEFINE_XEN_GUEST_HANDLE(xen_add_to_physmap_range_t);
-+#endif
-+
-+/*
-+ * Unmaps the page appearing at a particular GPFN from the specified guest's
-+ * pseudophysical address space.
-+ * arg == addr of xen_remove_from_physmap_t.
-+ */
-+#define XENMEM_remove_from_physmap 15
-+struct xen_remove_from_physmap {
-+ /* Which domain to change the mapping for. */
-+ domid_t domid;
-+
-+ /* GPFN of the current mapping of the page. */
-+ xen_pfn_t gpfn;
-+};
-+typedef struct xen_remove_from_physmap xen_remove_from_physmap_t;
-+DEFINE_XEN_GUEST_HANDLE(xen_remove_from_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.
-+ * Specifying buffer as NULL will return the number of entries required
-+ * to store the complete 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;
-+
-+#if defined(__XEN__) || defined(__XEN_TOOLS__)
-+
-+#ifndef uint64_aligned_t
-+#define uint64_aligned_t uint64_t
-+#endif
-+
-+/*
-+ * Get the number of MFNs saved through memory sharing.
-+ * The call never fails.
-+ */
-+#define XENMEM_get_sharing_freed_pages 18
-+#define XENMEM_get_sharing_shared_pages 19
-+
-+#define XENMEM_paging_op 20
-+#define XENMEM_paging_op_nominate 0
-+#define XENMEM_paging_op_evict 1
-+#define XENMEM_paging_op_prep 2
-+
-+struct xen_mem_paging_op {
-+ uint8_t op; /* XENMEM_paging_op_* */
-+ domid_t domain;
-+
-+ /* PAGING_PREP IN: buffer to immediately fill page in */
-+ uint64_aligned_t buffer;
-+ /* Other OPs */
-+ uint64_aligned_t gfn; /* IN: gfn of page being operated on */
-+};
-+typedef struct xen_mem_paging_op xen_mem_paging_op_t;
-+DEFINE_XEN_GUEST_HANDLE(xen_mem_paging_op_t);
-+
-+#define XENMEM_access_op 21
-+#define XENMEM_access_op_set_access 0
-+#define XENMEM_access_op_get_access 1
-+/*
-+ * XENMEM_access_op_enable_emulate and XENMEM_access_op_disable_emulate are
-+ * currently unused, but since they have been in use please do not reuse them.
-+ *
-+ * #define XENMEM_access_op_enable_emulate 2
-+ * #define XENMEM_access_op_disable_emulate 3
-+ */
-+#define XENMEM_access_op_set_access_multi 4
-+
-+typedef enum {
-+ XENMEM_access_n,
-+ XENMEM_access_r,
-+ XENMEM_access_w,
-+ XENMEM_access_rw,
-+ XENMEM_access_x,
-+ XENMEM_access_rx,
-+ XENMEM_access_wx,
-+ XENMEM_access_rwx,
-+ /*
-+ * Page starts off as r-x, but automatically
-+ * change to r-w on a write
-+ */
-+ XENMEM_access_rx2rw,
-+ /*
-+ * Log access: starts off as n, automatically
-+ * goes to rwx, generating an event without
-+ * pausing the vcpu
-+ */
-+ XENMEM_access_n2rwx,
-+ /* Take the domain default */
-+ XENMEM_access_default
-+} xenmem_access_t;
-+
-+struct xen_mem_access_op {
-+ /* XENMEM_access_op_* */
-+ uint8_t op;
-+ /* xenmem_access_t */
-+ uint8_t access;
-+ domid_t domid;
-+ /*
-+ * Number of pages for set op (or size of pfn_list for
-+ * XENMEM_access_op_set_access_multi)
-+ * Ignored on setting default access and other ops
-+ */
-+ uint32_t nr;
-+ /*
-+ * First pfn for set op
-+ * pfn for get op
-+ * ~0ull is used to set and get the default access for pages
-+ */
-+ uint64_aligned_t pfn;
-+ /*
-+ * List of pfns to set access for
-+ * Used only with XENMEM_access_op_set_access_multi
-+ */
-+ XEN_GUEST_HANDLE(const_uint64) pfn_list;
-+ /*
-+ * Corresponding list of access settings for pfn_list
-+ * Used only with XENMEM_access_op_set_access_multi
-+ */
-+ XEN_GUEST_HANDLE(const_uint8) access_list;
-+};
-+typedef struct xen_mem_access_op xen_mem_access_op_t;
-+DEFINE_XEN_GUEST_HANDLE(xen_mem_access_op_t);
-+
-+#define XENMEM_sharing_op 22
-+#define XENMEM_sharing_op_nominate_gfn 0
-+#define XENMEM_sharing_op_nominate_gref 1
-+#define XENMEM_sharing_op_share 2
-+#define XENMEM_sharing_op_debug_gfn 3
-+#define XENMEM_sharing_op_debug_mfn 4
-+#define XENMEM_sharing_op_debug_gref 5
-+#define XENMEM_sharing_op_add_physmap 6
-+#define XENMEM_sharing_op_audit 7
-+#define XENMEM_sharing_op_range_share 8
-+
-+#define XENMEM_SHARING_OP_S_HANDLE_INVALID (-10)
-+#define XENMEM_SHARING_OP_C_HANDLE_INVALID (-9)
-+
-+/* The following allows sharing of grant refs. This is useful
-+ * for sharing utilities sitting as "filters" in IO backends
-+ * (e.g. memshr + blktap(2)). The IO backend is only exposed
-+ * to grant references, and this allows sharing of the grefs */
-+#define XENMEM_SHARING_OP_FIELD_IS_GREF_FLAG (xen_mk_ullong(1) << 62)
-+
-+#define XENMEM_SHARING_OP_FIELD_MAKE_GREF(field, val) \
-+ (field) = (XENMEM_SHARING_OP_FIELD_IS_GREF_FLAG | val)
-+#define XENMEM_SHARING_OP_FIELD_IS_GREF(field) \
-+ ((field) & XENMEM_SHARING_OP_FIELD_IS_GREF_FLAG)
-+#define XENMEM_SHARING_OP_FIELD_GET_GREF(field) \
-+ ((field) & (~XENMEM_SHARING_OP_FIELD_IS_GREF_FLAG))
-+
-+struct xen_mem_sharing_op {
-+ uint8_t op; /* XENMEM_sharing_op_* */
-+ domid_t domain;
-+
-+ union {
-+ struct mem_sharing_op_nominate { /* OP_NOMINATE_xxx */
-+ union {
-+ uint64_aligned_t gfn; /* IN: gfn to nominate */
-+ uint32_t grant_ref; /* IN: grant ref to nominate */
-+ } u;
-+ uint64_aligned_t handle; /* OUT: the handle */
-+ } nominate;
-+ struct mem_sharing_op_share { /* OP_SHARE/ADD_PHYSMAP */
-+ uint64_aligned_t source_gfn; /* IN: the gfn of the source page */
-+ uint64_aligned_t source_handle; /* IN: handle to the source page */
-+ uint64_aligned_t client_gfn; /* IN: the client gfn */
-+ uint64_aligned_t client_handle; /* IN: handle to the client page */
-+ domid_t client_domain; /* IN: the client domain id */
-+ } share;
-+ struct mem_sharing_op_range { /* OP_RANGE_SHARE */
-+ uint64_aligned_t first_gfn; /* IN: the first gfn */
-+ uint64_aligned_t last_gfn; /* IN: the last gfn */
-+ uint64_aligned_t opaque; /* Must be set to 0 */
-+ domid_t client_domain; /* IN: the client domain id */
-+ uint16_t _pad[3]; /* Must be set to 0 */
-+ } range;
-+ struct mem_sharing_op_debug { /* OP_DEBUG_xxx */
-+ union {
-+ uint64_aligned_t gfn; /* IN: gfn to debug */
-+ uint64_aligned_t mfn; /* IN: mfn to debug */
-+ uint32_t gref; /* IN: gref to debug */
-+ } u;
-+ } debug;
-+ } u;
-+};
-+typedef struct xen_mem_sharing_op xen_mem_sharing_op_t;
-+DEFINE_XEN_GUEST_HANDLE(xen_mem_sharing_op_t);
-+
-+/*
-+ * Attempt to stake a claim for a domain on a quantity of pages
-+ * of system RAM, but _not_ assign specific pageframes. Only
-+ * arithmetic is performed so the hypercall is very fast and need
-+ * not be preemptible, thus sidestepping time-of-check-time-of-use
-+ * races for memory allocation. Returns 0 if the hypervisor page
-+ * allocator has atomically and successfully claimed the requested
-+ * number of pages, else non-zero.
-+ *
-+ * Any domain may have only one active claim. When sufficient memory
-+ * has been allocated to resolve the claim, the claim silently expires.
-+ * Claiming zero pages effectively resets any outstanding claim and
-+ * is always successful.
-+ *
-+ * Note that a valid claim may be staked even after memory has been
-+ * allocated for a domain. In this case, the claim is not incremental,
-+ * i.e. if the domain's tot_pages is 3, and a claim is staked for 10,
-+ * only 7 additional pages are claimed.
-+ *
-+ * Caller must be privileged or the hypercall fails.
-+ */
-+#define XENMEM_claim_pages 24
-+
-+/*
-+ * XENMEM_claim_pages flags - the are no flags at this time.
-+ * The zero value is appropriate.
-+ */
-+
-+/*
-+ * With some legacy devices, certain guest-physical addresses cannot safely
-+ * be used for other purposes, e.g. to map guest RAM. This hypercall
-+ * enumerates those regions so the toolstack can avoid using them.
-+ */
-+#define XENMEM_reserved_device_memory_map 27
-+struct xen_reserved_device_memory {
-+ xen_pfn_t start_pfn;
-+ xen_ulong_t nr_pages;
-+};
-+typedef struct xen_reserved_device_memory xen_reserved_device_memory_t;
-+DEFINE_XEN_GUEST_HANDLE(xen_reserved_device_memory_t);
-+
-+struct xen_reserved_device_memory_map {
-+#define XENMEM_RDM_ALL 1 /* Request all regions (ignore dev union). */
-+ /* IN */
-+ uint32_t flags;
-+ /*
-+ * IN/OUT
-+ *
-+ * Gets set to the required number of entries when too low,
-+ * signaled by error code -ERANGE.
-+ */
-+ unsigned int nr_entries;
-+ /* OUT */
-+ XEN_GUEST_HANDLE(xen_reserved_device_memory_t) buffer;
-+ /* IN */
-+ union {
-+ struct physdev_pci_device pci;
-+ } dev;
-+};
-+typedef struct xen_reserved_device_memory_map xen_reserved_device_memory_map_t;
-+DEFINE_XEN_GUEST_HANDLE(xen_reserved_device_memory_map_t);
-+
-+#endif /* defined(__XEN__) || defined(__XEN_TOOLS__) */
-+
-+/*
-+ * XENMEM_get_vnumainfo used by guest to get
-+ * vNUMA topology from hypervisor.
-+ */
-+#define XENMEM_get_vnumainfo 26
-+
-+/* vNUMA node memory ranges */
-+struct xen_vmemrange {
-+ uint64_t start, end;
-+ unsigned int flags;
-+ unsigned int nid;
-+};
-+typedef struct xen_vmemrange xen_vmemrange_t;
-+DEFINE_XEN_GUEST_HANDLE(xen_vmemrange_t);
-+
-+/*
-+ * vNUMA topology specifies vNUMA node number, distance table,
-+ * memory ranges and vcpu mapping provided for guests.
-+ * XENMEM_get_vnumainfo hypercall expects to see from guest
-+ * nr_vnodes, nr_vmemranges and nr_vcpus to indicate available memory.
-+ * After filling guests structures, nr_vnodes, nr_vmemranges and nr_vcpus
-+ * copied back to guest. Domain returns expected values of nr_vnodes,
-+ * nr_vmemranges and nr_vcpus to guest if the values where incorrect.
-+ */
-+struct xen_vnuma_topology_info {
-+ /* IN */
-+ domid_t domid;
-+ uint16_t pad;
-+ /* IN/OUT */
-+ unsigned int nr_vnodes;
-+ unsigned int nr_vcpus;
-+ unsigned int nr_vmemranges;
-+ /* OUT */
-+ union {
-+ XEN_GUEST_HANDLE(uint) h;
-+ uint64_t pad;
-+ } vdistance;
-+ union {
-+ XEN_GUEST_HANDLE(uint) h;
-+ uint64_t pad;
-+ } vcpu_to_vnode;
-+ union {
-+ XEN_GUEST_HANDLE(xen_vmemrange_t) h;
-+ uint64_t pad;
-+ } vmemrange;
-+};
-+typedef struct xen_vnuma_topology_info xen_vnuma_topology_info_t;
-+DEFINE_XEN_GUEST_HANDLE(xen_vnuma_topology_info_t);
-+
-+/* Next available subop number is 28 */
-+
-+#endif /* __XEN_PUBLIC_MEMORY_H__ */
-+
-+/*
-+ * Local variables:
-+ * mode: C
-+ * c-file-style: "BSD"
-+ * c-basic-offset: 4
-+ * tab-width: 4
-+ * indent-tabs-mode: nil
-+ * End:
-+ */
-diff --git a/include/xen/physdev.h b/include/xen/physdev.h
-new file mode 100644
-index 000000000..b6faf8350
---- /dev/null
-+++ b/include/xen/physdev.h
-@@ -0,0 +1,387 @@
-+/*
-+ * 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, Keir Fraser
-+ */
-+
-+#ifndef __XEN_PUBLIC_PHYSDEV_H__
-+#define __XEN_PUBLIC_PHYSDEV_H__
-+
-+#include "xen.h"
-+
-+/*
-+ * Prototype for this hypercall is:
-+ * int physdev_op(int cmd, void *args)
-+ * @cmd == PHYSDEVOP_??? (physdev operation).
-+ * @args == Operation-specific extra arguments (NULL if none).
-+ */
-+
-+/*
-+ * Notify end-of-interrupt (EOI) for the specified IRQ.
-+ * @arg == pointer to physdev_eoi structure.
-+ */
-+#define PHYSDEVOP_eoi 12
-+struct physdev_eoi {
-+ /* IN */
-+ uint32_t irq;
-+};
-+typedef struct physdev_eoi physdev_eoi_t;
-+DEFINE_XEN_GUEST_HANDLE(physdev_eoi_t);
-+
-+/*
-+ * Register a shared page for the hypervisor to indicate whether the guest
-+ * must issue PHYSDEVOP_eoi. The semantics of PHYSDEVOP_eoi change slightly
-+ * once the guest used this function in that the associated event channel
-+ * will automatically get unmasked. The page registered is used as a bit
-+ * array indexed by Xen's PIRQ value.
-+ */
-+#define PHYSDEVOP_pirq_eoi_gmfn_v1 17
-+/*
-+ * Register a shared page for the hypervisor to indicate whether the
-+ * guest must issue PHYSDEVOP_eoi. This hypercall is very similar to
-+ * PHYSDEVOP_pirq_eoi_gmfn_v1 but it doesn't change the semantics of
-+ * PHYSDEVOP_eoi. The page registered is used as a bit array indexed by
-+ * Xen's PIRQ value.
-+ */
-+#define PHYSDEVOP_pirq_eoi_gmfn_v2 28
-+struct physdev_pirq_eoi_gmfn {
-+ /* IN */
-+ xen_pfn_t gmfn;
-+};
-+typedef struct physdev_pirq_eoi_gmfn physdev_pirq_eoi_gmfn_t;
-+DEFINE_XEN_GUEST_HANDLE(physdev_pirq_eoi_gmfn_t);
-+
-+/*
-+ * Query the status of an IRQ line.
-+ * @arg == pointer to physdev_irq_status_query structure.
-+ */
-+#define PHYSDEVOP_irq_status_query 5
-+struct physdev_irq_status_query {
-+ /* IN */
-+ uint32_t irq;
-+ /* OUT */
-+ uint32_t flags; /* XENIRQSTAT_* */
-+};
-+typedef struct physdev_irq_status_query physdev_irq_status_query_t;
-+DEFINE_XEN_GUEST_HANDLE(physdev_irq_status_query_t);
-+
-+/* Need to call PHYSDEVOP_eoi when the IRQ has been serviced? */
-+#define _XENIRQSTAT_needs_eoi (0)
-+#define XENIRQSTAT_needs_eoi (1U<<_XENIRQSTAT_needs_eoi)
-+
-+/* IRQ shared by multiple guests? */
-+#define _XENIRQSTAT_shared (1)
-+#define XENIRQSTAT_shared (1U<<_XENIRQSTAT_shared)
-+
-+/*
-+ * Set the current VCPU's I/O privilege level.
-+ * @arg == pointer to physdev_set_iopl structure.
-+ */
-+#define PHYSDEVOP_set_iopl 6
-+struct physdev_set_iopl {
-+ /* IN */
-+ uint32_t iopl;
-+};
-+typedef struct physdev_set_iopl physdev_set_iopl_t;
-+DEFINE_XEN_GUEST_HANDLE(physdev_set_iopl_t);
-+
-+/*
-+ * Set the current VCPU's I/O-port permissions bitmap.
-+ * @arg == pointer to physdev_set_iobitmap structure.
-+ */
-+#define PHYSDEVOP_set_iobitmap 7
-+struct physdev_set_iobitmap {
-+ /* IN */
-+#if __XEN_INTERFACE_VERSION__ >= 0x00030205
-+ XEN_GUEST_HANDLE(uint8) bitmap;
-+#else
-+ uint8_t *bitmap;
-+#endif
-+ uint32_t nr_ports;
-+};
-+typedef struct physdev_set_iobitmap physdev_set_iobitmap_t;
-+DEFINE_XEN_GUEST_HANDLE(physdev_set_iobitmap_t);
-+
-+/*
-+ * Read or write an IO-APIC register.
-+ * @arg == pointer to physdev_apic structure.
-+ */
-+#define PHYSDEVOP_apic_read 8
-+#define PHYSDEVOP_apic_write 9
-+struct physdev_apic {
-+ /* IN */
-+ unsigned long apic_physbase;
-+ uint32_t reg;
-+ /* IN or OUT */
-+ uint32_t value;
-+};
-+typedef struct physdev_apic physdev_apic_t;
-+DEFINE_XEN_GUEST_HANDLE(physdev_apic_t);
-+
-+/*
-+ * Allocate or free a physical upcall vector for the specified IRQ line.
-+ * @arg == pointer to physdev_irq structure.
-+ */
-+#define PHYSDEVOP_alloc_irq_vector 10
-+#define PHYSDEVOP_free_irq_vector 11
-+struct physdev_irq {
-+ /* IN */
-+ uint32_t irq;
-+ /* IN or OUT */
-+ uint32_t vector;
-+};
-+typedef struct physdev_irq physdev_irq_t;
-+DEFINE_XEN_GUEST_HANDLE(physdev_irq_t);
-+
-+#define MAP_PIRQ_TYPE_MSI 0x0
-+#define MAP_PIRQ_TYPE_GSI 0x1
-+#define MAP_PIRQ_TYPE_UNKNOWN 0x2
-+#define MAP_PIRQ_TYPE_MSI_SEG 0x3
-+#define MAP_PIRQ_TYPE_MULTI_MSI 0x4
-+
-+#define PHYSDEVOP_map_pirq 13
-+struct physdev_map_pirq {
-+ domid_t domid;
-+ /* IN */
-+ int type;
-+ /* IN (ignored for ..._MULTI_MSI) */
-+ int index;
-+ /* IN or OUT */
-+ int pirq;
-+ /* IN - high 16 bits hold segment for ..._MSI_SEG and ..._MULTI_MSI */
-+ int bus;
-+ /* IN */
-+ int devfn;
-+ /* IN (also OUT for ..._MULTI_MSI) */
-+ int entry_nr;
-+ /* IN */
-+ uint64_t table_base;
-+};
-+typedef struct physdev_map_pirq physdev_map_pirq_t;
-+DEFINE_XEN_GUEST_HANDLE(physdev_map_pirq_t);
-+
-+#define PHYSDEVOP_unmap_pirq 14
-+struct physdev_unmap_pirq {
-+ domid_t domid;
-+ /* IN */
-+ int pirq;
-+};
-+
-+typedef struct physdev_unmap_pirq physdev_unmap_pirq_t;
-+DEFINE_XEN_GUEST_HANDLE(physdev_unmap_pirq_t);
-+
-+#define PHYSDEVOP_manage_pci_add 15
-+#define PHYSDEVOP_manage_pci_remove 16
-+struct physdev_manage_pci {
-+ /* IN */
-+ uint8_t bus;
-+ uint8_t devfn;
-+};
-+
-+typedef struct physdev_manage_pci physdev_manage_pci_t;
-+DEFINE_XEN_GUEST_HANDLE(physdev_manage_pci_t);
-+
-+#define PHYSDEVOP_restore_msi 19
-+struct physdev_restore_msi {
-+ /* IN */
-+ uint8_t bus;
-+ uint8_t devfn;
-+};
-+typedef struct physdev_restore_msi physdev_restore_msi_t;
-+DEFINE_XEN_GUEST_HANDLE(physdev_restore_msi_t);
-+
-+#define PHYSDEVOP_manage_pci_add_ext 20
-+struct physdev_manage_pci_ext {
-+ /* IN */
-+ uint8_t bus;
-+ uint8_t devfn;
-+ unsigned is_extfn;
-+ unsigned is_virtfn;
-+ struct {
-+ uint8_t bus;
-+ uint8_t devfn;
-+ } physfn;
-+};
-+
-+typedef struct physdev_manage_pci_ext physdev_manage_pci_ext_t;
-+DEFINE_XEN_GUEST_HANDLE(physdev_manage_pci_ext_t);
-+
-+/*
-+ * Argument to physdev_op_compat() hypercall. Superceded by new physdev_op()
-+ * hypercall since 0x00030202.
-+ */
-+struct physdev_op {
-+ uint32_t cmd;
-+ union {
-+ struct physdev_irq_status_query irq_status_query;
-+ struct physdev_set_iopl set_iopl;
-+ struct physdev_set_iobitmap set_iobitmap;
-+ struct physdev_apic apic_op;
-+ struct physdev_irq irq_op;
-+ } u;
-+};
-+typedef struct physdev_op physdev_op_t;
-+DEFINE_XEN_GUEST_HANDLE(physdev_op_t);
-+
-+#define PHYSDEVOP_setup_gsi 21
-+struct physdev_setup_gsi {
-+ int gsi;
-+ /* IN */
-+ uint8_t triggering;
-+ /* IN */
-+ uint8_t polarity;
-+ /* IN */
-+};
-+
-+typedef struct physdev_setup_gsi physdev_setup_gsi_t;
-+DEFINE_XEN_GUEST_HANDLE(physdev_setup_gsi_t);
-+
-+/* leave PHYSDEVOP 22 free */
-+
-+/* type is MAP_PIRQ_TYPE_GSI or MAP_PIRQ_TYPE_MSI
-+ * the hypercall returns a free pirq */
-+#define PHYSDEVOP_get_free_pirq 23
-+struct physdev_get_free_pirq {
-+ /* IN */
-+ int type;
-+ /* OUT */
-+ uint32_t pirq;
-+};
-+
-+typedef struct physdev_get_free_pirq physdev_get_free_pirq_t;
-+DEFINE_XEN_GUEST_HANDLE(physdev_get_free_pirq_t);
-+
-+#define XEN_PCI_MMCFG_RESERVED 0x1
-+
-+#define PHYSDEVOP_pci_mmcfg_reserved 24
-+struct physdev_pci_mmcfg_reserved {
-+ uint64_t address;
-+ uint16_t segment;
-+ uint8_t start_bus;
-+ uint8_t end_bus;
-+ uint32_t flags;
-+};
-+typedef struct physdev_pci_mmcfg_reserved physdev_pci_mmcfg_reserved_t;
-+DEFINE_XEN_GUEST_HANDLE(physdev_pci_mmcfg_reserved_t);
-+
-+#define XEN_PCI_DEV_EXTFN 0x1
-+#define XEN_PCI_DEV_VIRTFN 0x2
-+#define XEN_PCI_DEV_PXM 0x4
-+
-+#define PHYSDEVOP_pci_device_add 25
-+struct physdev_pci_device_add {
-+ /* IN */
-+ uint16_t seg;
-+ uint8_t bus;
-+ uint8_t devfn;
-+ uint32_t flags;
-+ struct {
-+ uint8_t bus;
-+ uint8_t devfn;
-+ } physfn;
-+ /*
-+ * Optional parameters array.
-+ * First element ([0]) is PXM domain associated with the device (if
-+ * XEN_PCI_DEV_PXM is set)
-+ */
-+#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
-+ uint32_t optarr[];
-+#elif defined(__GNUC__)
-+ uint32_t optarr[0];
-+#endif
-+};
-+typedef struct physdev_pci_device_add physdev_pci_device_add_t;
-+DEFINE_XEN_GUEST_HANDLE(physdev_pci_device_add_t);
-+
-+#define PHYSDEVOP_pci_device_remove 26
-+#define PHYSDEVOP_restore_msi_ext 27
-+/*
-+ * Dom0 should use these two to announce MMIO resources assigned to
-+ * MSI-X capable devices won't (prepare) or may (release) change.
-+ */
-+#define PHYSDEVOP_prepare_msix 30
-+#define PHYSDEVOP_release_msix 31
-+struct physdev_pci_device {
-+ /* IN */
-+ uint16_t seg;
-+ uint8_t bus;
-+ uint8_t devfn;
-+};
-+typedef struct physdev_pci_device physdev_pci_device_t;
-+DEFINE_XEN_GUEST_HANDLE(physdev_pci_device_t);
-+
-+#define PHYSDEVOP_DBGP_RESET_PREPARE 1
-+#define PHYSDEVOP_DBGP_RESET_DONE 2
-+
-+#define PHYSDEVOP_DBGP_BUS_UNKNOWN 0
-+#define PHYSDEVOP_DBGP_BUS_PCI 1
-+
-+#define PHYSDEVOP_dbgp_op 29
-+struct physdev_dbgp_op {
-+ /* IN */
-+ uint8_t op;
-+ uint8_t bus;
-+ union {
-+ struct physdev_pci_device pci;
-+ } u;
-+};
-+typedef struct physdev_dbgp_op physdev_dbgp_op_t;
-+DEFINE_XEN_GUEST_HANDLE(physdev_dbgp_op_t);
-+
-+/*
-+ * Notify that some PIRQ-bound event channels have been unmasked.
-+ * ** This command is obsolete since interface version 0x00030202 and is **
-+ * ** unsupported by newer versions of Xen. **
-+ */
-+#define PHYSDEVOP_IRQ_UNMASK_NOTIFY 4
-+
-+#if __XEN_INTERFACE_VERSION__ < 0x00040600
-+/*
-+ * These all-capitals physdev operation names are superceded by the new names
-+ * (defined above) since interface version 0x00030202. The guard above was
-+ * added post-4.5 only though and hence shouldn't check for 0x00030202.
-+ */
-+#define PHYSDEVOP_IRQ_STATUS_QUERY PHYSDEVOP_irq_status_query
-+#define PHYSDEVOP_SET_IOPL PHYSDEVOP_set_iopl
-+#define PHYSDEVOP_SET_IOBITMAP PHYSDEVOP_set_iobitmap
-+#define PHYSDEVOP_APIC_READ PHYSDEVOP_apic_read
-+#define PHYSDEVOP_APIC_WRITE PHYSDEVOP_apic_write
-+#define PHYSDEVOP_ASSIGN_VECTOR PHYSDEVOP_alloc_irq_vector
-+#define PHYSDEVOP_FREE_VECTOR PHYSDEVOP_free_irq_vector
-+#define PHYSDEVOP_IRQ_NEEDS_UNMASK_NOTIFY XENIRQSTAT_needs_eoi
-+#define PHYSDEVOP_IRQ_SHARED XENIRQSTAT_shared
-+#endif
-+
-+#if __XEN_INTERFACE_VERSION__ < 0x00040200
-+#define PHYSDEVOP_pirq_eoi_gmfn PHYSDEVOP_pirq_eoi_gmfn_v1
-+#else
-+#define PHYSDEVOP_pirq_eoi_gmfn PHYSDEVOP_pirq_eoi_gmfn_v2
-+#endif
-+
-+#endif /* __XEN_PUBLIC_PHYSDEV_H__ */
-+
-+/*
-+ * Local variables:
-+ * mode: C
-+ * c-file-style: "BSD"
-+ * c-basic-offset: 4
-+ * tab-width: 4
-+ * indent-tabs-mode: nil
-+ * End:
-+ */
-diff --git a/include/xen/trace.h b/include/xen/trace.h
-new file mode 100644
-index 000000000..a00c01733
---- /dev/null
-+++ b/include/xen/trace.h
-@@ -0,0 +1,339 @@
-+/******************************************************************************
-+ * 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_HW 0x0080f000 /* Xen hardware-related traces */
-+#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_HVM_EMUL 0x00084000 /* emulated devices */
-+
-+#define TRC_SCHED_MIN 0x00021000 /* Just runstate changes */
-+#define TRC_SCHED_CLASS 0x00022000 /* Scheduler-specific */
-+#define TRC_SCHED_VERBOSE 0x00028000 /* More inclusive scheduling */
-+
-+/*
-+ * The highest 3 bits of the last 12 bits of TRC_SCHED_CLASS above are
-+ * reserved for encoding what scheduler produced the information. The
-+ * actual event is encoded in the last 9 bits.
-+ *
-+ * This means we have 8 scheduling IDs available (which means at most 8
-+ * schedulers generating events) and, in each scheduler, up to 512
-+ * different events.
-+ */
-+#define TRC_SCHED_ID_BITS 3
-+#define TRC_SCHED_ID_SHIFT (TRC_SUBCLS_SHIFT - TRC_SCHED_ID_BITS)
-+#define TRC_SCHED_ID_MASK (((1UL<<TRC_SCHED_ID_BITS) - 1) << TRC_SCHED_ID_SHIFT)
-+#define TRC_SCHED_EVT_MASK (~(TRC_SCHED_ID_MASK))
-+
-+/* Per-scheduler IDs, to identify scheduler specific events */
-+#define TRC_SCHED_CSCHED 0
-+#define TRC_SCHED_CSCHED2 1
-+/* #define XEN_SCHEDULER_SEDF 2 (Removed) */
-+#define TRC_SCHED_ARINC653 3
-+#define TRC_SCHED_RTDS 4
-+#define TRC_SCHED_SNULL 5
-+
-+/* Per-scheduler tracing */
-+#define TRC_SCHED_CLASS_EVT(_c, _e) \
-+ ( ( TRC_SCHED_CLASS | \
-+ ((TRC_SCHED_##_c << TRC_SCHED_ID_SHIFT) & TRC_SCHED_ID_MASK) ) + \
-+ (_e & TRC_SCHED_EVT_MASK) )
-+
-+/* Trace classes for DOM0 operations */
-+#define TRC_DOM0_DOMOPS 0x00041000 /* Domains manipulations */
-+
-+/* Trace classes for Hardware */
-+#define TRC_HW_PM 0x00801000 /* Power management traces */
-+#define TRC_HW_IRQ 0x00802000 /* Traces relating to the handling of IRQs */
-+
-+/* 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_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_SCHED_SWITCH_INFCONT (TRC_SCHED_VERBOSE + 17)
-+
-+#define TRC_DOM0_DOM_ADD (TRC_DOM0_DOMOPS + 1)
-+#define TRC_DOM0_DOM_REM (TRC_DOM0_DOMOPS + 2)
-+
-+#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_ENTRY 0x00201000 /* Hypervisor entry points for PV guests. */
-+#define TRC_PV_SUBCALL 0x00202000 /* Sub-call in a multicall hypercall */
-+
-+#define TRC_PV_HYPERCALL (TRC_PV_ENTRY + 1)
-+#define TRC_PV_TRAP (TRC_PV_ENTRY + 3)
-+#define TRC_PV_PAGE_FAULT (TRC_PV_ENTRY + 4)
-+#define TRC_PV_FORCED_INVALID_OP (TRC_PV_ENTRY + 5)
-+#define TRC_PV_EMULATE_PRIVOP (TRC_PV_ENTRY + 6)
-+#define TRC_PV_EMULATE_4GB (TRC_PV_ENTRY + 7)
-+#define TRC_PV_MATH_STATE_RESTORE (TRC_PV_ENTRY + 8)
-+#define TRC_PV_PAGING_FIXUP (TRC_PV_ENTRY + 9)
-+#define TRC_PV_GDT_LDT_MAPPING_FAULT (TRC_PV_ENTRY + 10)
-+#define TRC_PV_PTWR_EMULATION (TRC_PV_ENTRY + 11)
-+#define TRC_PV_PTWR_EMULATION_PAE (TRC_PV_ENTRY + 12)
-+#define TRC_PV_HYPERCALL_V2 (TRC_PV_ENTRY + 13)
-+#define TRC_PV_HYPERCALL_SUBCALL (TRC_PV_SUBCALL + 14)
-+
-+/*
-+ * TRC_PV_HYPERCALL_V2 format
-+ *
-+ * Only some of the hypercall argument are recorded. Bit fields A0 to
-+ * A5 in the first extra word are set if the argument is present and
-+ * the arguments themselves are packed sequentially in the following
-+ * words.
-+ *
-+ * The TRC_64_FLAG bit is not set for these events (even if there are
-+ * 64-bit arguments in the record).
-+ *
-+ * Word
-+ * 0 bit 31 30|29 28|27 26|25 24|23 22|21 20|19 ... 0
-+ * A5 |A4 |A3 |A2 |A1 |A0 |Hypercall op
-+ * 1 First 32 bit (or low word of first 64 bit) arg in record
-+ * 2 Second 32 bit (or high word of first 64 bit) arg in record
-+ * ...
-+ *
-+ * A0-A5 bitfield values:
-+ *
-+ * 00b Argument not present
-+ * 01b 32-bit argument present
-+ * 10b 64-bit argument present
-+ * 11b Reserved
-+ */
-+#define TRC_PV_HYPERCALL_V2_ARG_32(i) (0x1 << (20 + 2*(i)))
-+#define TRC_PV_HYPERCALL_V2_ARG_64(i) (0x2 << (20 + 2*(i)))
-+#define TRC_PV_HYPERCALL_V2_ARG_MASK (0xfff00000)
-+
-+#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_NESTEDFLAG (0x400)
-+#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_REALMODE_EMULATE (TRC_HVM_HANDLER + 0x22)
-+#define TRC_HVM_TRAP (TRC_HVM_HANDLER + 0x23)
-+#define TRC_HVM_TRAP_DEBUG (TRC_HVM_HANDLER + 0x24)
-+#define TRC_HVM_VLAPIC (TRC_HVM_HANDLER + 0x25)
-+
-+#define TRC_HVM_IOPORT_WRITE (TRC_HVM_HANDLER + 0x216)
-+#define TRC_HVM_IOMEM_WRITE (TRC_HVM_HANDLER + 0x217)
-+
-+/* Trace events for emulated devices */
-+#define TRC_HVM_EMUL_HPET_START_TIMER (TRC_HVM_EMUL + 0x1)
-+#define TRC_HVM_EMUL_PIT_START_TIMER (TRC_HVM_EMUL + 0x2)
-+#define TRC_HVM_EMUL_RTC_START_TIMER (TRC_HVM_EMUL + 0x3)
-+#define TRC_HVM_EMUL_LAPIC_START_TIMER (TRC_HVM_EMUL + 0x4)
-+#define TRC_HVM_EMUL_HPET_STOP_TIMER (TRC_HVM_EMUL + 0x5)
-+#define TRC_HVM_EMUL_PIT_STOP_TIMER (TRC_HVM_EMUL + 0x6)
-+#define TRC_HVM_EMUL_RTC_STOP_TIMER (TRC_HVM_EMUL + 0x7)
-+#define TRC_HVM_EMUL_LAPIC_STOP_TIMER (TRC_HVM_EMUL + 0x8)
-+#define TRC_HVM_EMUL_PIT_TIMER_CB (TRC_HVM_EMUL + 0x9)
-+#define TRC_HVM_EMUL_LAPIC_TIMER_CB (TRC_HVM_EMUL + 0xA)
-+#define TRC_HVM_EMUL_PIC_INT_OUTPUT (TRC_HVM_EMUL + 0xB)
-+#define TRC_HVM_EMUL_PIC_KICK (TRC_HVM_EMUL + 0xC)
-+#define TRC_HVM_EMUL_PIC_INTACK (TRC_HVM_EMUL + 0xD)
-+#define TRC_HVM_EMUL_PIC_POSEDGE (TRC_HVM_EMUL + 0xE)
-+#define TRC_HVM_EMUL_PIC_NEGEDGE (TRC_HVM_EMUL + 0xF)
-+#define TRC_HVM_EMUL_PIC_PEND_IRQ_CALL (TRC_HVM_EMUL + 0x10)
-+#define TRC_HVM_EMUL_LAPIC_PIC_INTR (TRC_HVM_EMUL + 0x11)
-+
-+/* trace events for per class */
-+#define TRC_PM_FREQ_CHANGE (TRC_HW_PM + 0x01)
-+#define TRC_PM_IDLE_ENTRY (TRC_HW_PM + 0x02)
-+#define TRC_PM_IDLE_EXIT (TRC_HW_PM + 0x03)
-+
-+/* Trace events for IRQs */
-+#define TRC_HW_IRQ_MOVE_CLEANUP_DELAY (TRC_HW_IRQ + 0x1)
-+#define TRC_HW_IRQ_MOVE_CLEANUP (TRC_HW_IRQ + 0x2)
-+#define TRC_HW_IRQ_BIND_VECTOR (TRC_HW_IRQ + 0x3)
-+#define TRC_HW_IRQ_CLEAR_VECTOR (TRC_HW_IRQ + 0x4)
-+#define TRC_HW_IRQ_MOVE_FINISH (TRC_HW_IRQ + 0x5)
-+#define TRC_HW_IRQ_ASSIGN_VECTOR (TRC_HW_IRQ + 0x6)
-+#define TRC_HW_IRQ_UNMAPPED_VECTOR (TRC_HW_IRQ + 0x7)
-+#define TRC_HW_IRQ_HANDLED (TRC_HW_IRQ + 0x8)
-+
-+/*
-+ * Event Flags
-+ *
-+ * Some events (e.g, TRC_PV_TRAP and TRC_HVM_IOMEM_READ) have multiple
-+ * record formats. These event flags distinguish between the
-+ * different formats.
-+ */
-+#define TRC_64_FLAG 0x100 /* Addresses are 64 bits (instead of 32 bits) */
-+
-+/* 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 ((unsigned long *)(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-file-style: "BSD"
-+ * c-basic-offset: 4
-+ * tab-width: 4
-+ * indent-tabs-mode: nil
-+ * End:
-+ */
-diff --git a/include/xen/xen.h b/include/xen/xen.h
-index 6c9e42b2b..308109f17 100644
---- a/include/xen/xen.h
-+++ b/include/xen/xen.h
-@@ -53,17 +53,22 @@ DEFINE_XEN_GUEST_HANDLE(uint64_t);
- DEFINE_XEN_GUEST_HANDLE(xen_pfn_t);
- DEFINE_XEN_GUEST_HANDLE(xen_ulong_t);
-
--/* Turn a plain number into a C unsigned (long) constant. */
-+/* Turn a plain number into a C unsigned (long (long)) constant. */
- #define __xen_mk_uint(x) x ## U
- #define __xen_mk_ulong(x) x ## UL
-+#ifndef __xen_mk_ullong
-+# define __xen_mk_ullong(x) x ## ULL
-+#endif
- #define xen_mk_uint(x) __xen_mk_uint(x)
- #define xen_mk_ulong(x) __xen_mk_ulong(x)
-+#define xen_mk_ullong(x) __xen_mk_ullong(x)
-
- #else
-
- /* In assembly code we cannot use C numeric constant suffixes. */
--#define xen_mk_uint(x) x
--#define xen_mk_ulong(x) x
-+#define xen_mk_uint(x) x
-+#define xen_mk_ulong(x) x
-+#define xen_mk_ullong(x) x
-
- #endif
-
-@@ -115,6 +120,7 @@ DEFINE_XEN_GUEST_HANDLE(xen_ulong_t);
- #define __HYPERVISOR_tmem_op 38
- #define __HYPERVISOR_xc_reserved_op 39 /* reserved for XenClient */
- #define __HYPERVISOR_xenpmu_op 40
-+#define __HYPERVISOR_dm_op 41
-
- /* Architecture-specific hypercall definitions. */
- #define __HYPERVISOR_arch_0 48
-@@ -501,6 +507,21 @@ DEFINE_XEN_GUEST_HANDLE(mmuext_op_t);
- /* x86/PAE guests: support PDPTs above 4GB. */
- #define VMASST_TYPE_pae_extended_cr3 3
-
-+/*
-+ * x86 guests: Sane behaviour for virtual iopl
-+ * - virtual iopl updated from do_iret() hypercalls.
-+ * - virtual iopl reported in bounce frames.
-+ * - guest kernels assumed to be level 0 for the purpose of iopl checks.
-+ */
-+#define VMASST_TYPE_architectural_iopl 4
-+
-+/*
-+ * All guests: activate update indicator in vcpu_runstate_info
-+ * Enable setting the XEN_RUNSTATE_UPDATE flag in guest memory mapped
-+ * vcpu_runstate_info during updates of the runstate information.
-+ */
-+#define VMASST_TYPE_runstate_update_flag 5
-+
- /*
- * x86/64 guests: strictly hide M2P from user mode.
- * This allows the guest to control respective hypervisor behavior:
-@@ -529,16 +550,21 @@ DEFINE_XEN_GUEST_HANDLE(mmuext_op_t);
- * 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.
-+ * This only makes sense as HYPERVISOR_mmu_update()'s and
-+ * HYPERVISOR_update_va_mapping_otherdomain()'s "foreigndom" argument. For
-+ * HYPERVISOR_mmu_update() context it can be specified by any calling domain,
-+ * otherwise it's only permitted if the caller is privileged.
- */
- #define DOMID_IO xen_mk_uint(0x7FF1)
-
- /*
- * 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.
-+ * This only makes sense as
-+ * - HYPERVISOR_mmu_update()'s, HYPERVISOR_mmuext_op()'s, or
-+ * HYPERVISOR_update_va_mapping_otherdomain()'s "foreigndom" argument,
-+ * - with XENMAPSPACE_gmfn_foreign,
-+ * and is only permitted if the caller is privileged.
- */
- #define DOMID_XEN xen_mk_uint(0x7FF2)
-
-@@ -614,10 +640,18 @@ struct vcpu_time_info {
- */
- uint32_t tsc_to_system_mul;
- int8_t tsc_shift;
-+#if __XEN_INTERFACE_VERSION__ > 0x040600
-+ uint8_t flags;
-+ uint8_t pad1[2];
-+#else
- int8_t pad1[3];
-+#endif
- }; /* 32 bytes */
- typedef struct vcpu_time_info vcpu_time_info_t;
-
-+#define XEN_PVCLOCK_TSC_STABLE_BIT (1 << 0)
-+#define XEN_PVCLOCK_GUEST_STOPPED (1 << 1)
-+
- struct vcpu_info {
- /*
- * 'evtchn_upcall_pending' is written non-zero by Xen to indicate
-@@ -736,7 +770,7 @@ typedef struct shared_info shared_info_t;
- * (may be omitted)
- * 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)]
-+ * d. start_info_t structure [register rSI (x86)]
- * in case of dom0 this page contains the console info, too
- * e. unless dom0: xenstore ring page
- * f. unless dom0: console ring page
-@@ -797,29 +831,6 @@ struct start_info {
- };
- typedef struct start_info start_info_t;
-
--/*
-- * Start of day structure passed to PVH guests in %ebx.
-- *
-- * NOTE: nothing will be loaded at physical address 0, so
-- * a 0 value in any of the address fields should be treated
-- * as not present.
-- */
--struct hvm_start_info {
--#define HVM_START_MAGIC_VALUE 0x336ec578
-- uint32_t magic; /* Contains the magic value 0x336ec578 */
-- /* ("xEn3" with the 0x80 bit of the "E" set).*/
-- uint32_t flags; /* SIF_xxx flags. */
-- uint32_t cmdline_paddr; /* Physical address of the command line. */
-- uint32_t nr_modules; /* Number of modules passed to the kernel. */
-- uint32_t modlist_paddr; /* Physical address of an array of */
-- /* hvm_modlist_entry. */
--};
--
--struct hvm_modlist_entry {
-- uint32_t paddr; /* Physical address of the module. */
-- uint32_t size; /* Size of the module in bytes. */
--};
--
- /* New console union for dom0 introduced in 0x00030203. */
- #if __XEN_INTERFACE_VERSION__ < 0x00030203
- #define console_mfn console.domU.mfn
-@@ -919,6 +930,37 @@ __DEFINE_XEN_GUEST_HANDLE(uint16, uint16_t);
- __DEFINE_XEN_GUEST_HANDLE(uint32, uint32_t);
- __DEFINE_XEN_GUEST_HANDLE(uint64, uint64_t);
-
-+typedef struct {
-+ uint8_t a[16];
-+} xen_uuid_t;
-+
-+/*
-+ * XEN_DEFINE_UUID(0x00112233, 0x4455, 0x6677, 0x8899,
-+ * 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff)
-+ * will construct UUID 00112233-4455-6677-8899-aabbccddeeff presented as
-+ * {0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88,
-+ * 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff};
-+ *
-+ * NB: This is compatible with Linux kernel and with libuuid, but it is not
-+ * compatible with Microsoft, as they use mixed-endian encoding (some
-+ * components are little-endian, some are big-endian).
-+ */
-+#define XEN_DEFINE_UUID_(a, b, c, d, e1, e2, e3, e4, e5, e6) \
-+ {{((a) >> 24) & 0xFF, ((a) >> 16) & 0xFF, \
-+ ((a) >> 8) & 0xFF, ((a) >> 0) & 0xFF, \
-+ ((b) >> 8) & 0xFF, ((b) >> 0) & 0xFF, \
-+ ((c) >> 8) & 0xFF, ((c) >> 0) & 0xFF, \
-+ ((d) >> 8) & 0xFF, ((d) >> 0) & 0xFF, \
-+ e1, e2, e3, e4, e5, e6}}
-+
-+#if defined(__STDC_VERSION__) ? __STDC_VERSION__ >= 199901L : defined(__GNUC__)
-+#define XEN_DEFINE_UUID(a, b, c, d, e1, e2, e3, e4, e5, e6) \
-+ ((xen_uuid_t)XEN_DEFINE_UUID_(a, b, c, d, e1, e2, e3, e4, e5, e6))
-+#else
-+#define XEN_DEFINE_UUID(a, b, c, d, e1, e2, e3, e4, e5, e6) \
-+ XEN_DEFINE_UUID_(a, b, c, d, e1, e2, e3, e4, e5, e6)
-+#endif /* __STDC_VERSION__ / __GNUC__ */
-+
- #endif /* !__ASSEMBLY__ */
-
- /* Default definitions for macros used by domctl/sysctl. */
---
-2.21.0
-