diff options
Diffstat (limited to 'main/grub/0001-xen-Add-some-Xen-headers.patch')
-rw-r--r-- | main/grub/0001-xen-Add-some-Xen-headers.patch | 2322 |
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 - |