diff --git a/sys/xen/interface/COPYING b/sys/xen/interface/COPYING deleted file mode 100644 index ffc6d6166ffc..000000000000 --- a/sys/xen/interface/COPYING +++ /dev/null @@ -1,38 +0,0 @@ -XEN NOTICE -========== - -This copyright applies to all files within this subdirectory and its -subdirectories: - include/public/*.h - include/public/hvm/*.h - include/public/io/*.h - -The intention is that these files can be freely copied into the source -tree of an operating system when porting that OS to run on Xen. Doing -so does *not* cause the OS to become subject to the terms of the GPL. - -All other files in the Xen source distribution are covered by version -2 of the GNU General Public License except where explicitly stated -otherwise within individual source files. - - -- Keir Fraser (on behalf of the Xen team) - -===================================================================== - -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. diff --git a/sys/xen/interface/arch-arm.h b/sys/xen/interface/arch-arm.h deleted file mode 100644 index c365b1b39eaa..000000000000 --- a/sys/xen/interface/arch-arm.h +++ /dev/null @@ -1,484 +0,0 @@ -/****************************************************************************** - * arch-arm.h - * - * Guest OS interface to ARM Xen. - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to - * deal in the Software without restriction, including without limitation the - * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or - * sell copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - * - * Copyright 2011 (C) Citrix Systems - */ - -#ifndef __XEN_PUBLIC_ARCH_ARM_H__ -#define __XEN_PUBLIC_ARCH_ARM_H__ - -/* - * `incontents 50 arm_abi Hypercall Calling Convention - * - * A hypercall is issued using the ARM HVC instruction. - * - * A hypercall can take up to 5 arguments. These are passed in - * registers, the first argument in x0/r0 (for arm64/arm32 guests - * respectively irrespective of whether the underlying hypervisor is - * 32- or 64-bit), the second argument in x1/r1, the third in x2/r2, - * the forth in x3/r3 and the fifth in x4/r4. - * - * The hypercall number is passed in r12 (arm) or x16 (arm64). In both - * cases the relevant ARM procedure calling convention specifies this - * is an inter-procedure-call scratch register (e.g. for use in linker - * stubs). This use does not conflict with use during a hypercall. - * - * The HVC ISS must contain a Xen specific TAG: XEN_HYPERCALL_TAG. - * - * The return value is in x0/r0. - * - * The hypercall will clobber x16/r12 and the argument registers used - * by that hypercall (except r0 which is the return value) i.e. in - * addition to x16/r12 a 2 argument hypercall will clobber x1/r1 and a - * 4 argument hypercall will clobber x1/r1, x2/r2 and x3/r3. - * - * Parameter structs passed to hypercalls are laid out according to - * the Procedure Call Standard for the ARM Architecture (AAPCS, AKA - * EABI) and Procedure Call Standard for the ARM 64-bit Architecture - * (AAPCS64). Where there is a conflict the 64-bit standard should be - * used regardless of guest type. Structures which are passed as - * hypercall arguments are always little endian. - * - * All memory which is shared with other entities in the system - * (including the hypervisor and other guests) must reside in memory - * which is mapped as Normal Inner Write-Back Outer Write-Back Inner-Shareable. - * This applies to: - * - hypercall arguments passed via a pointer to guest memory. - * - memory shared via the grant table mechanism (including PV I/O - * rings etc). - * - memory shared with the hypervisor (struct shared_info, struct - * vcpu_info, the grant table, etc). - * - * Any cache allocation hints are acceptable. - */ - -/* - * `incontents 55 arm_hcall Supported Hypercalls - * - * Xen on ARM makes extensive use of hardware facilities and therefore - * only a subset of the potential hypercalls are required. - * - * Since ARM uses second stage paging any machine/physical addresses - * passed to hypercalls are Guest Physical Addresses (Intermediate - * Physical Addresses) unless otherwise noted. - * - * The following hypercalls (and sub operations) are supported on the - * ARM platform. Other hypercalls should be considered - * unavailable/unsupported. - * - * HYPERVISOR_memory_op - * All generic sub-operations - * - * HYPERVISOR_domctl - * All generic sub-operations, with the exception of: - * * XEN_DOMCTL_irq_permission (not yet implemented) - * - * HYPERVISOR_sched_op - * All generic sub-operations, with the exception of: - * * SCHEDOP_block -- prefer wfi hardware instruction - * - * HYPERVISOR_console_io - * All generic sub-operations - * - * HYPERVISOR_xen_version - * All generic sub-operations - * - * HYPERVISOR_event_channel_op - * All generic sub-operations - * - * HYPERVISOR_physdev_op - * No sub-operations are currenty supported - * - * HYPERVISOR_sysctl - * All generic sub-operations, with the exception of: - * * XEN_SYSCTL_page_offline_op - * * XEN_SYSCTL_get_pmstat - * * XEN_SYSCTL_pm_op - * - * HYPERVISOR_hvm_op - * Exactly these sub-operations are supported: - * * HVMOP_set_param - * * HVMOP_get_param - * - * HYPERVISOR_grant_table_op - * All generic sub-operations - * - * HYPERVISOR_vcpu_op - * Exactly these sub-operations are supported: - * * VCPUOP_register_vcpu_info - * * VCPUOP_register_runstate_memory_area - * - * - * Other notes on the ARM ABI: - * - * - struct start_info is not exported to ARM guests. - * - * - struct shared_info is mapped by ARM guests using the - * HYPERVISOR_memory_op sub-op XENMEM_add_to_physmap, passing - * XENMAPSPACE_shared_info as space parameter. - * - * - All the per-cpu struct vcpu_info are mapped by ARM guests using the - * HYPERVISOR_vcpu_op sub-op VCPUOP_register_vcpu_info, including cpu0 - * struct vcpu_info. - * - * - The grant table is mapped using the HYPERVISOR_memory_op sub-op - * XENMEM_add_to_physmap, passing XENMAPSPACE_grant_table as space - * parameter. The memory range specified under the Xen compatible - * hypervisor node on device tree can be used as target gpfn for the - * mapping. - * - * - Xenstore is initialized by using the two hvm_params - * HVM_PARAM_STORE_PFN and HVM_PARAM_STORE_EVTCHN. They can be read - * with the HYPERVISOR_hvm_op sub-op HVMOP_get_param. - * - * - The paravirtualized console is initialized by using the two - * hvm_params HVM_PARAM_CONSOLE_PFN and HVM_PARAM_CONSOLE_EVTCHN. They - * can be read with the HYPERVISOR_hvm_op sub-op HVMOP_get_param. - * - * - Event channel notifications are delivered using the percpu GIC - * interrupt specified under the Xen compatible hypervisor node on - * device tree. - * - * - The device tree Xen compatible node is fully described under Linux - * at Documentation/devicetree/bindings/arm/xen.txt. - */ - -#define XEN_HYPERCALL_TAG 0XEA1 - -#define int64_aligned_t int64_t __attribute__((aligned(8))) -#define uint64_aligned_t uint64_t __attribute__((aligned(8))) - -#ifndef __ASSEMBLY__ -#define ___DEFINE_XEN_GUEST_HANDLE(name, type) \ - typedef union { type *p; unsigned long q; } \ - __guest_handle_ ## name; \ - typedef union { type *p; uint64_aligned_t q; } \ - __guest_handle_64_ ## name - -/* - * XEN_GUEST_HANDLE represents a guest pointer, when passed as a field - * in a struct in memory. On ARM is always 8 bytes sizes and 8 bytes - * aligned. - * XEN_GUEST_HANDLE_PARAM represents a guest pointer, when passed as an - * hypercall argument. It is 4 bytes on aarch32 and 8 bytes on aarch64. - */ -#define __DEFINE_XEN_GUEST_HANDLE(name, type) \ - ___DEFINE_XEN_GUEST_HANDLE(name, type); \ - ___DEFINE_XEN_GUEST_HANDLE(const_##name, const type) -#define DEFINE_XEN_GUEST_HANDLE(name) __DEFINE_XEN_GUEST_HANDLE(name, name) -#define __XEN_GUEST_HANDLE(name) __guest_handle_64_ ## name -#define XEN_GUEST_HANDLE(name) __XEN_GUEST_HANDLE(name) -#define XEN_GUEST_HANDLE_PARAM(name) __guest_handle_ ## name -#define set_xen_guest_handle_raw(hnd, val) \ - do { \ - typeof(&(hnd)) _sxghr_tmp = &(hnd); \ - _sxghr_tmp->q = 0; \ - _sxghr_tmp->p = val; \ - } while ( 0 ) -#define set_xen_guest_handle(hnd, val) set_xen_guest_handle_raw(hnd, val) - -typedef uint64_t xen_pfn_t; -#define PRI_xen_pfn PRIx64 -#define PRIu_xen_pfn PRIu64 - -/* - * Maximum number of virtual CPUs in legacy multi-processor guests. - * Only one. All other VCPUS must use VCPUOP_register_vcpu_info. - */ -#define XEN_LEGACY_MAX_VCPUS 1 - -typedef uint64_t xen_ulong_t; -#define PRI_xen_ulong PRIx64 - -#if defined(__XEN__) || defined(__XEN_TOOLS__) -#if defined(__GNUC__) && !defined(__STRICT_ANSI__) -/* Anonymous union includes both 32- and 64-bit names (e.g., r0/x0). */ -# define __DECL_REG(n64, n32) union { \ - uint64_t n64; \ - uint32_t n32; \ - } -#else -/* Non-gcc sources must always use the proper 64-bit name (e.g., x0). */ -#define __DECL_REG(n64, n32) uint64_t n64 -#endif - -struct vcpu_guest_core_regs -{ - /* Aarch64 Aarch32 */ - __DECL_REG(x0, r0_usr); - __DECL_REG(x1, r1_usr); - __DECL_REG(x2, r2_usr); - __DECL_REG(x3, r3_usr); - __DECL_REG(x4, r4_usr); - __DECL_REG(x5, r5_usr); - __DECL_REG(x6, r6_usr); - __DECL_REG(x7, r7_usr); - __DECL_REG(x8, r8_usr); - __DECL_REG(x9, r9_usr); - __DECL_REG(x10, r10_usr); - __DECL_REG(x11, r11_usr); - __DECL_REG(x12, r12_usr); - - __DECL_REG(x13, sp_usr); - __DECL_REG(x14, lr_usr); - - __DECL_REG(x15, __unused_sp_hyp); - - __DECL_REG(x16, lr_irq); - __DECL_REG(x17, sp_irq); - - __DECL_REG(x18, lr_svc); - __DECL_REG(x19, sp_svc); - - __DECL_REG(x20, lr_abt); - __DECL_REG(x21, sp_abt); - - __DECL_REG(x22, lr_und); - __DECL_REG(x23, sp_und); - - __DECL_REG(x24, r8_fiq); - __DECL_REG(x25, r9_fiq); - __DECL_REG(x26, r10_fiq); - __DECL_REG(x27, r11_fiq); - __DECL_REG(x28, r12_fiq); - - __DECL_REG(x29, sp_fiq); - __DECL_REG(x30, lr_fiq); - - /* Return address and mode */ - __DECL_REG(pc64, pc32); /* ELR_EL2 */ - uint32_t cpsr; /* SPSR_EL2 */ - - union { - uint32_t spsr_el1; /* AArch64 */ - uint32_t spsr_svc; /* AArch32 */ - }; - - /* AArch32 guests only */ - uint32_t spsr_fiq, spsr_irq, spsr_und, spsr_abt; - - /* AArch64 guests only */ - uint64_t sp_el0; - uint64_t sp_el1, elr_el1; -}; -typedef struct vcpu_guest_core_regs vcpu_guest_core_regs_t; -DEFINE_XEN_GUEST_HANDLE(vcpu_guest_core_regs_t); - -#undef __DECL_REG - -struct vcpu_guest_context { -#define _VGCF_online 0 -#define VGCF_online (1<<_VGCF_online) - uint32_t flags; /* VGCF_* */ - - struct vcpu_guest_core_regs user_regs; /* Core CPU registers */ - - uint64_t sctlr; - uint64_t ttbcr, ttbr0, ttbr1; -}; -typedef struct vcpu_guest_context vcpu_guest_context_t; -DEFINE_XEN_GUEST_HANDLE(vcpu_guest_context_t); - -/* - * struct xen_arch_domainconfig's ABI is covered by - * XEN_DOMCTL_INTERFACE_VERSION. - */ -#define XEN_DOMCTL_CONFIG_GIC_NATIVE 0 -#define XEN_DOMCTL_CONFIG_GIC_V2 1 -#define XEN_DOMCTL_CONFIG_GIC_V3 2 - -#define XEN_DOMCTL_CONFIG_TEE_NONE 0 -#define XEN_DOMCTL_CONFIG_TEE_OPTEE 1 - -struct xen_arch_domainconfig { - /* IN/OUT */ - uint8_t gic_version; - /* IN */ - uint16_t tee_type; - /* IN */ - uint32_t nr_spis; - /* - * OUT - * Based on the property clock-frequency in the DT timer node. - * The property may be present when the bootloader/firmware doesn't - * set correctly CNTFRQ which hold the timer frequency. - * - * As it's not possible to trap this register, we have to replicate - * the value in the guest DT. - * - * = 0 => property not present - * > 0 => Value of the property - * - */ - uint32_t clock_frequency; -}; -#endif /* __XEN__ || __XEN_TOOLS__ */ - -struct arch_vcpu_info { -}; -typedef struct arch_vcpu_info arch_vcpu_info_t; - -struct arch_shared_info { -}; -typedef struct arch_shared_info arch_shared_info_t; -typedef uint64_t xen_callback_t; - -#endif - -#if defined(__XEN__) || defined(__XEN_TOOLS__) - -/* PSR bits (CPSR, SPSR) */ - -#define PSR_THUMB (1<<5) /* Thumb Mode enable */ -#define PSR_FIQ_MASK (1<<6) /* Fast Interrupt mask */ -#define PSR_IRQ_MASK (1<<7) /* Interrupt mask */ -#define PSR_ABT_MASK (1<<8) /* Asynchronous Abort mask */ -#define PSR_BIG_ENDIAN (1<<9) /* arm32: Big Endian Mode */ -#define PSR_DBG_MASK (1<<9) /* arm64: Debug Exception mask */ -#define PSR_IT_MASK (0x0600fc00) /* Thumb If-Then Mask */ -#define PSR_JAZELLE (1<<24) /* Jazelle Mode */ - -/* 32 bit modes */ -#define PSR_MODE_USR 0x10 -#define PSR_MODE_FIQ 0x11 -#define PSR_MODE_IRQ 0x12 -#define PSR_MODE_SVC 0x13 -#define PSR_MODE_MON 0x16 -#define PSR_MODE_ABT 0x17 -#define PSR_MODE_HYP 0x1a -#define PSR_MODE_UND 0x1b -#define PSR_MODE_SYS 0x1f - -/* 64 bit modes */ -#define PSR_MODE_BIT 0x10 /* Set iff AArch32 */ -#define PSR_MODE_EL3h 0x0d -#define PSR_MODE_EL3t 0x0c -#define PSR_MODE_EL2h 0x09 -#define PSR_MODE_EL2t 0x08 -#define PSR_MODE_EL1h 0x05 -#define PSR_MODE_EL1t 0x04 -#define PSR_MODE_EL0t 0x00 - -#define PSR_GUEST32_INIT (PSR_ABT_MASK|PSR_FIQ_MASK|PSR_IRQ_MASK|PSR_MODE_SVC) -#define PSR_GUEST64_INIT (PSR_ABT_MASK|PSR_FIQ_MASK|PSR_IRQ_MASK|PSR_MODE_EL1h) - -#define SCTLR_GUEST_INIT xen_mk_ullong(0x00c50078) - -/* - * Virtual machine platform (memory layout, interrupts) - * - * These are defined for consistency between the tools and the - * hypervisor. Guests must not rely on these hardcoded values but - * should instead use the FDT. - */ - -/* Physical Address Space */ - -/* - * vGIC mappings: Only one set of mapping is used by the guest. - * Therefore they can overlap. - */ - -/* vGIC v2 mappings */ -#define GUEST_GICD_BASE xen_mk_ullong(0x03001000) -#define GUEST_GICD_SIZE xen_mk_ullong(0x00001000) -#define GUEST_GICC_BASE xen_mk_ullong(0x03002000) -#define GUEST_GICC_SIZE xen_mk_ullong(0x00002000) - -/* vGIC v3 mappings */ -#define GUEST_GICV3_GICD_BASE xen_mk_ullong(0x03001000) -#define GUEST_GICV3_GICD_SIZE xen_mk_ullong(0x00010000) - -#define GUEST_GICV3_RDIST_REGIONS 1 - -#define GUEST_GICV3_GICR0_BASE xen_mk_ullong(0x03020000) /* vCPU0..127 */ -#define GUEST_GICV3_GICR0_SIZE xen_mk_ullong(0x01000000) - -/* ACPI tables physical address */ -#define GUEST_ACPI_BASE xen_mk_ullong(0x20000000) -#define GUEST_ACPI_SIZE xen_mk_ullong(0x02000000) - -/* PL011 mappings */ -#define GUEST_PL011_BASE xen_mk_ullong(0x22000000) -#define GUEST_PL011_SIZE xen_mk_ullong(0x00001000) - -/* - * 16MB == 4096 pages reserved for guest to use as a region to map its - * grant table in. - */ -#define GUEST_GNTTAB_BASE xen_mk_ullong(0x38000000) -#define GUEST_GNTTAB_SIZE xen_mk_ullong(0x01000000) - -#define GUEST_MAGIC_BASE xen_mk_ullong(0x39000000) -#define GUEST_MAGIC_SIZE xen_mk_ullong(0x01000000) - -#define GUEST_RAM_BANKS 2 - -#define GUEST_RAM0_BASE xen_mk_ullong(0x40000000) /* 3GB of low RAM @ 1GB */ -#define GUEST_RAM0_SIZE xen_mk_ullong(0xc0000000) - -#define GUEST_RAM1_BASE xen_mk_ullong(0x0200000000) /* 1016GB of RAM @ 8GB */ -#define GUEST_RAM1_SIZE xen_mk_ullong(0xfe00000000) - -#define GUEST_RAM_BASE GUEST_RAM0_BASE /* Lowest RAM address */ -/* Largest amount of actual RAM, not including holes */ -#define GUEST_RAM_MAX (GUEST_RAM0_SIZE + GUEST_RAM1_SIZE) -/* Suitable for e.g. const uint64_t ramfoo[] = GUEST_RAM_BANK_FOOS; */ -#define GUEST_RAM_BANK_BASES { GUEST_RAM0_BASE, GUEST_RAM1_BASE } -#define GUEST_RAM_BANK_SIZES { GUEST_RAM0_SIZE, GUEST_RAM1_SIZE } - -/* Current supported guest VCPUs */ -#define GUEST_MAX_VCPUS 128 - -/* Interrupts */ -#define GUEST_TIMER_VIRT_PPI 27 -#define GUEST_TIMER_PHYS_S_PPI 29 -#define GUEST_TIMER_PHYS_NS_PPI 30 -#define GUEST_EVTCHN_PPI 31 - -#define GUEST_VPL011_SPI 32 - -/* PSCI functions */ -#define PSCI_cpu_suspend 0 -#define PSCI_cpu_off 1 -#define PSCI_cpu_on 2 -#define PSCI_migrate 3 - -#endif - -#ifndef __ASSEMBLY__ -/* Stub definition of PMU structure */ -typedef struct xen_pmu_arch { uint8_t dummy; } xen_pmu_arch_t; -#endif - -#endif /* __XEN_PUBLIC_ARCH_ARM_H__ */ - -/* - * Local variables: - * mode: C - * c-file-style: "BSD" - * c-basic-offset: 4 - * tab-width: 4 - * indent-tabs-mode: nil - * End: - */ diff --git a/sys/xen/interface/arch-arm/hvm/save.h b/sys/xen/interface/arch-arm/hvm/save.h deleted file mode 100644 index 75b8e65bcb80..000000000000 --- a/sys/xen/interface/arch-arm/hvm/save.h +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Structure definitions for HVM state that is held by Xen and must - * be saved along with the domain's memory and device-model state. - * - * Copyright (c) 2012 Citrix Systems Ltd. - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to - * deal in the Software without restriction, including without limitation the - * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or - * sell copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ - -#ifndef __XEN_PUBLIC_HVM_SAVE_ARM_H__ -#define __XEN_PUBLIC_HVM_SAVE_ARM_H__ - -#endif - -/* - * Local variables: - * mode: C - * c-file-style: "BSD" - * c-basic-offset: 4 - * tab-width: 4 - * indent-tabs-mode: nil - * End: - */ diff --git a/sys/xen/interface/arch-arm/smccc.h b/sys/xen/interface/arch-arm/smccc.h deleted file mode 100644 index 17dc6d8829e6..000000000000 --- a/sys/xen/interface/arch-arm/smccc.h +++ /dev/null @@ -1,66 +0,0 @@ -/* - * smccc.h - * - * SMC/HVC interface in accordance with SMC Calling Convention. - * - * 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 2017 (C) EPAM Systems - */ - -#ifndef __XEN_PUBLIC_ARCH_ARM_SMCCC_H__ -#define __XEN_PUBLIC_ARCH_ARM_SMCCC_H__ - -#include "public/xen.h" - -/* - * Hypervisor Service version. - * - * We can't use XEN version here, because of SMCCC requirements: - * Major revision should change every time SMC/HVC function is removed. - * Minor revision should change every time SMC/HVC function is added. - * So, it is SMCCC protocol revision code, not XEN version. - * - * Those values are subjected to change, when interface will be extended. - */ -#define XEN_SMCCC_MAJOR_REVISION 0 -#define XEN_SMCCC_MINOR_REVISION 1 - -/* Hypervisor Service UID. Randomly generated with uuidgen. */ -#define XEN_SMCCC_UID XEN_DEFINE_UUID(0xa71812dc, 0xc698, 0x4369, 0x9acf, \ - 0x79, 0xd1, 0x8d, 0xde, 0xe6, 0x67) - -/* Standard Service Service Call version. */ -#define SSSC_SMCCC_MAJOR_REVISION 0 -#define SSSC_SMCCC_MINOR_REVISION 1 - -/* Standard Service Call UID. Randomly generated with uuidgen. */ -#define SSSC_SMCCC_UID XEN_DEFINE_UUID(0xf863386f, 0x4b39, 0x4cbd, 0x9220,\ - 0xce, 0x16, 0x41, 0xe5, 0x9f, 0x6f) - -#endif /* __XEN_PUBLIC_ARCH_ARM_SMCCC_H__ */ - -/* - * Local variables: - * mode: C - * c-file-style: "BSD" - * c-basic-offset: 4 - * indent-tabs-mode: nil - * End:b - */ diff --git a/sys/xen/interface/arch-x86/cpufeatureset.h b/sys/xen/interface/arch-x86/cpufeatureset.h deleted file mode 100644 index d06a2fd4c8e2..000000000000 --- a/sys/xen/interface/arch-x86/cpufeatureset.h +++ /dev/null @@ -1,295 +0,0 @@ -/* - * arch-x86/cpufeatureset.h - * - * CPU featureset definitions - * - * 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) 2015, 2016 Citrix Systems, Inc. - */ - -/* - * There are two expected ways of including this header. - * - * 1) The "default" case (expected from tools etc). - * - * Simply #include - * - * In this circumstance, normal header guards apply and the includer shall get - * an enumeration in the XEN_X86_FEATURE_xxx namespace. - * - * 2) The special case where the includer provides XEN_CPUFEATURE() in scope. - * - * In this case, no inclusion guards apply and the caller is responsible for - * their XEN_CPUFEATURE() being appropriate in the included context. - */ - -#ifndef XEN_CPUFEATURE - -/* - * Includer has not provided a custom XEN_CPUFEATURE(). Arrange for normal - * header guards, an enum and constants in the XEN_X86_FEATURE_xxx namespace. - */ -#ifndef __XEN_PUBLIC_ARCH_X86_CPUFEATURESET_H__ -#define __XEN_PUBLIC_ARCH_X86_CPUFEATURESET_H__ - -#define XEN_CPUFEATURESET_DEFAULT_INCLUDE - -#define XEN_CPUFEATURE(name, value) XEN_X86_FEATURE_##name = value, -enum { - -#endif /* __XEN_PUBLIC_ARCH_X86_CPUFEATURESET_H__ */ -#endif /* !XEN_CPUFEATURE */ - - -#ifdef XEN_CPUFEATURE -/* - * A featureset is a bitmap of x86 features, represented as a collection of - * 32bit words. - * - * Words are as specified in vendors programming manuals, and shall not - * contain any synthesied values. New words may be added to the end of - * featureset. - * - * All featureset words currently originate from leaves specified for the - * CPUID instruction, but this is not preclude other sources of information. - */ - -/* - * Attribute syntax: - * - * Attributes for a particular feature are provided as characters before the - * first space in the comment immediately following the feature value. Note - - * none of these attributes form part of the Xen public ABI. - * - * Special: '!' - * This bit has special properties and is not a straight indication of a - * piece of new functionality. Xen will handle these differently, - * and may override toolstack settings completely. - * - * Applicability to guests: 'A', 'S' or 'H' - * 'A' = All guests. - * 'S' = All HVM guests (not PV guests). - * 'H' = HVM HAP guests (not PV or HVM Shadow guests). - * Upper case => Available by default - * Lower case => Can be opted-in to, but not available by default. - */ - -/* Intel-defined CPU features, CPUID level 0x00000001.edx, word 0 */ -XEN_CPUFEATURE(FPU, 0*32+ 0) /*A Onboard FPU */ -XEN_CPUFEATURE(VME, 0*32+ 1) /*S Virtual Mode Extensions */ -XEN_CPUFEATURE(DE, 0*32+ 2) /*A Debugging Extensions */ -XEN_CPUFEATURE(PSE, 0*32+ 3) /*S Page Size Extensions */ -XEN_CPUFEATURE(TSC, 0*32+ 4) /*A Time Stamp Counter */ -XEN_CPUFEATURE(MSR, 0*32+ 5) /*A Model-Specific Registers, RDMSR, WRMSR */ -XEN_CPUFEATURE(PAE, 0*32+ 6) /*A Physical Address Extensions */ -XEN_CPUFEATURE(MCE, 0*32+ 7) /*A Machine Check Architecture */ -XEN_CPUFEATURE(CX8, 0*32+ 8) /*A CMPXCHG8 instruction */ -XEN_CPUFEATURE(APIC, 0*32+ 9) /*!A Onboard APIC */ -XEN_CPUFEATURE(SEP, 0*32+11) /*A SYSENTER/SYSEXIT */ -XEN_CPUFEATURE(MTRR, 0*32+12) /*S Memory Type Range Registers */ -XEN_CPUFEATURE(PGE, 0*32+13) /*S Page Global Enable */ -XEN_CPUFEATURE(MCA, 0*32+14) /*A Machine Check Architecture */ -XEN_CPUFEATURE(CMOV, 0*32+15) /*A CMOV instruction (FCMOVCC and FCOMI too if FPU present) */ -XEN_CPUFEATURE(PAT, 0*32+16) /*A Page Attribute Table */ -XEN_CPUFEATURE(PSE36, 0*32+17) /*S 36-bit PSEs */ -XEN_CPUFEATURE(CLFLUSH, 0*32+19) /*A CLFLUSH instruction */ -XEN_CPUFEATURE(DS, 0*32+21) /* Debug Store */ -XEN_CPUFEATURE(ACPI, 0*32+22) /*A ACPI via MSR */ -XEN_CPUFEATURE(MMX, 0*32+23) /*A Multimedia Extensions */ -XEN_CPUFEATURE(FXSR, 0*32+24) /*A FXSAVE and FXRSTOR instructions */ -XEN_CPUFEATURE(SSE, 0*32+25) /*A Streaming SIMD Extensions */ -XEN_CPUFEATURE(SSE2, 0*32+26) /*A Streaming SIMD Extensions-2 */ -XEN_CPUFEATURE(SS, 0*32+27) /*A CPU self snoop */ -XEN_CPUFEATURE(HTT, 0*32+28) /*!A Hyper-Threading Technology */ -XEN_CPUFEATURE(TM1, 0*32+29) /* Thermal Monitor 1 */ -XEN_CPUFEATURE(PBE, 0*32+31) /* Pending Break Enable */ - -/* Intel-defined CPU features, CPUID level 0x00000001.ecx, word 1 */ -XEN_CPUFEATURE(SSE3, 1*32+ 0) /*A Streaming SIMD Extensions-3 */ -XEN_CPUFEATURE(PCLMULQDQ, 1*32+ 1) /*A Carry-less multiplication */ -XEN_CPUFEATURE(DTES64, 1*32+ 2) /* 64-bit Debug Store */ -XEN_CPUFEATURE(MONITOR, 1*32+ 3) /* Monitor/Mwait support */ -XEN_CPUFEATURE(DSCPL, 1*32+ 4) /* CPL Qualified Debug Store */ -XEN_CPUFEATURE(VMX, 1*32+ 5) /*S Virtual Machine Extensions */ -XEN_CPUFEATURE(SMX, 1*32+ 6) /* Safer Mode Extensions */ -XEN_CPUFEATURE(EIST, 1*32+ 7) /* Enhanced SpeedStep */ -XEN_CPUFEATURE(TM2, 1*32+ 8) /* Thermal Monitor 2 */ -XEN_CPUFEATURE(SSSE3, 1*32+ 9) /*A Supplemental Streaming SIMD Extensions-3 */ -XEN_CPUFEATURE(FMA, 1*32+12) /*A Fused Multiply Add */ -XEN_CPUFEATURE(CX16, 1*32+13) /*A CMPXCHG16B */ -XEN_CPUFEATURE(XTPR, 1*32+14) /* Send Task Priority Messages */ -XEN_CPUFEATURE(PDCM, 1*32+15) /* Perf/Debug Capability MSR */ -XEN_CPUFEATURE(PCID, 1*32+17) /*H Process Context ID */ -XEN_CPUFEATURE(DCA, 1*32+18) /* Direct Cache Access */ -XEN_CPUFEATURE(SSE4_1, 1*32+19) /*A Streaming SIMD Extensions 4.1 */ -XEN_CPUFEATURE(SSE4_2, 1*32+20) /*A Streaming SIMD Extensions 4.2 */ -XEN_CPUFEATURE(X2APIC, 1*32+21) /*!A Extended xAPIC */ -XEN_CPUFEATURE(MOVBE, 1*32+22) /*A movbe instruction */ -XEN_CPUFEATURE(POPCNT, 1*32+23) /*A POPCNT instruction */ -XEN_CPUFEATURE(TSC_DEADLINE, 1*32+24) /*S TSC Deadline Timer */ -XEN_CPUFEATURE(AESNI, 1*32+25) /*A AES instructions */ -XEN_CPUFEATURE(XSAVE, 1*32+26) /*A XSAVE/XRSTOR/XSETBV/XGETBV */ -XEN_CPUFEATURE(OSXSAVE, 1*32+27) /*! OSXSAVE */ -XEN_CPUFEATURE(AVX, 1*32+28) /*A Advanced Vector Extensions */ -XEN_CPUFEATURE(F16C, 1*32+29) /*A Half-precision convert instruction */ -XEN_CPUFEATURE(RDRAND, 1*32+30) /*!A Digital Random Number Generator */ -XEN_CPUFEATURE(HYPERVISOR, 1*32+31) /*!A Running under some hypervisor */ - -/* AMD-defined CPU features, CPUID level 0x80000001.edx, word 2 */ -XEN_CPUFEATURE(SYSCALL, 2*32+11) /*A SYSCALL/SYSRET */ -XEN_CPUFEATURE(NX, 2*32+20) /*A Execute Disable */ -XEN_CPUFEATURE(MMXEXT, 2*32+22) /*A AMD MMX extensions */ -XEN_CPUFEATURE(FFXSR, 2*32+25) /*A FFXSR instruction optimizations */ -XEN_CPUFEATURE(PAGE1GB, 2*32+26) /*H 1Gb large page support */ -XEN_CPUFEATURE(RDTSCP, 2*32+27) /*A RDTSCP */ -XEN_CPUFEATURE(LM, 2*32+29) /*A Long Mode (x86-64) */ -XEN_CPUFEATURE(3DNOWEXT, 2*32+30) /*A AMD 3DNow! extensions */ -XEN_CPUFEATURE(3DNOW, 2*32+31) /*A 3DNow! */ - -/* AMD-defined CPU features, CPUID level 0x80000001.ecx, word 3 */ -XEN_CPUFEATURE(LAHF_LM, 3*32+ 0) /*A LAHF/SAHF in long mode */ -XEN_CPUFEATURE(CMP_LEGACY, 3*32+ 1) /*!A If yes HyperThreading not valid */ -XEN_CPUFEATURE(SVM, 3*32+ 2) /*S Secure virtual machine */ -XEN_CPUFEATURE(EXTAPIC, 3*32+ 3) /* Extended APIC space */ -XEN_CPUFEATURE(CR8_LEGACY, 3*32+ 4) /*S CR8 in 32-bit mode */ -XEN_CPUFEATURE(ABM, 3*32+ 5) /*A Advanced bit manipulation */ -XEN_CPUFEATURE(SSE4A, 3*32+ 6) /*A SSE-4A */ -XEN_CPUFEATURE(MISALIGNSSE, 3*32+ 7) /*A Misaligned SSE mode */ -XEN_CPUFEATURE(3DNOWPREFETCH, 3*32+ 8) /*A 3DNow prefetch instructions */ -XEN_CPUFEATURE(OSVW, 3*32+ 9) /* OS Visible Workaround */ -XEN_CPUFEATURE(IBS, 3*32+10) /* Instruction Based Sampling */ -XEN_CPUFEATURE(XOP, 3*32+11) /*A extended AVX instructions */ -XEN_CPUFEATURE(SKINIT, 3*32+12) /* SKINIT/STGI instructions */ -XEN_CPUFEATURE(WDT, 3*32+13) /* Watchdog timer */ -XEN_CPUFEATURE(LWP, 3*32+15) /* Light Weight Profiling */ -XEN_CPUFEATURE(FMA4, 3*32+16) /*A 4 operands MAC instructions */ -XEN_CPUFEATURE(NODEID_MSR, 3*32+19) /* NodeId MSR */ -XEN_CPUFEATURE(TBM, 3*32+21) /*A trailing bit manipulations */ -XEN_CPUFEATURE(TOPOEXT, 3*32+22) /* topology extensions CPUID leafs */ -XEN_CPUFEATURE(DBEXT, 3*32+26) /*A data breakpoint extension */ -XEN_CPUFEATURE(MONITORX, 3*32+29) /* MONITOR extension (MONITORX/MWAITX) */ - -/* Intel-defined CPU features, CPUID level 0x0000000D:1.eax, word 4 */ -XEN_CPUFEATURE(XSAVEOPT, 4*32+ 0) /*A XSAVEOPT instruction */ -XEN_CPUFEATURE(XSAVEC, 4*32+ 1) /*A XSAVEC/XRSTORC instructions */ -XEN_CPUFEATURE(XGETBV1, 4*32+ 2) /*A XGETBV with %ecx=1 */ -XEN_CPUFEATURE(XSAVES, 4*32+ 3) /*S XSAVES/XRSTORS instructions */ - -/* Intel-defined CPU features, CPUID level 0x00000007:0.ebx, word 5 */ -XEN_CPUFEATURE(FSGSBASE, 5*32+ 0) /*A {RD,WR}{FS,GS}BASE instructions */ -XEN_CPUFEATURE(TSC_ADJUST, 5*32+ 1) /*S TSC_ADJUST MSR available */ -XEN_CPUFEATURE(SGX, 5*32+ 2) /* Software Guard extensions */ -XEN_CPUFEATURE(BMI1, 5*32+ 3) /*A 1st bit manipulation extensions */ -XEN_CPUFEATURE(HLE, 5*32+ 4) /*A Hardware Lock Elision */ -XEN_CPUFEATURE(AVX2, 5*32+ 5) /*A AVX2 instructions */ -XEN_CPUFEATURE(FDP_EXCP_ONLY, 5*32+ 6) /*! x87 FDP only updated on exception. */ -XEN_CPUFEATURE(SMEP, 5*32+ 7) /*S Supervisor Mode Execution Protection */ -XEN_CPUFEATURE(BMI2, 5*32+ 8) /*A 2nd bit manipulation extensions */ -XEN_CPUFEATURE(ERMS, 5*32+ 9) /*A Enhanced REP MOVSB/STOSB */ -XEN_CPUFEATURE(INVPCID, 5*32+10) /*H Invalidate Process Context ID */ -XEN_CPUFEATURE(RTM, 5*32+11) /*A Restricted Transactional Memory */ -XEN_CPUFEATURE(PQM, 5*32+12) /* Platform QoS Monitoring */ -XEN_CPUFEATURE(NO_FPU_SEL, 5*32+13) /*! FPU CS/DS stored as zero */ -XEN_CPUFEATURE(MPX, 5*32+14) /*s Memory Protection Extensions */ -XEN_CPUFEATURE(PQE, 5*32+15) /* Platform QoS Enforcement */ -XEN_CPUFEATURE(AVX512F, 5*32+16) /*A AVX-512 Foundation Instructions */ -XEN_CPUFEATURE(AVX512DQ, 5*32+17) /*A AVX-512 Doubleword & Quadword Instrs */ -XEN_CPUFEATURE(RDSEED, 5*32+18) /*A RDSEED instruction */ -XEN_CPUFEATURE(ADX, 5*32+19) /*A ADCX, ADOX instructions */ -XEN_CPUFEATURE(SMAP, 5*32+20) /*S Supervisor Mode Access Prevention */ -XEN_CPUFEATURE(AVX512_IFMA, 5*32+21) /*A AVX-512 Integer Fused Multiply Add */ -XEN_CPUFEATURE(CLFLUSHOPT, 5*32+23) /*A CLFLUSHOPT instruction */ -XEN_CPUFEATURE(CLWB, 5*32+24) /*A CLWB instruction */ -XEN_CPUFEATURE(AVX512PF, 5*32+26) /*A AVX-512 Prefetch Instructions */ -XEN_CPUFEATURE(AVX512ER, 5*32+27) /*A AVX-512 Exponent & Reciprocal Instrs */ -XEN_CPUFEATURE(AVX512CD, 5*32+28) /*A AVX-512 Conflict Detection Instrs */ -XEN_CPUFEATURE(SHA, 5*32+29) /*A SHA1 & SHA256 instructions */ -XEN_CPUFEATURE(AVX512BW, 5*32+30) /*A AVX-512 Byte and Word Instructions */ -XEN_CPUFEATURE(AVX512VL, 5*32+31) /*A AVX-512 Vector Length Extensions */ - -/* Intel-defined CPU features, CPUID level 0x00000007:0.ecx, word 6 */ -XEN_CPUFEATURE(PREFETCHWT1, 6*32+ 0) /*A PREFETCHWT1 instruction */ -XEN_CPUFEATURE(AVX512_VBMI, 6*32+ 1) /*A AVX-512 Vector Byte Manipulation Instrs */ -XEN_CPUFEATURE(UMIP, 6*32+ 2) /*S User Mode Instruction Prevention */ -XEN_CPUFEATURE(PKU, 6*32+ 3) /*H Protection Keys for Userspace */ -XEN_CPUFEATURE(OSPKE, 6*32+ 4) /*! OS Protection Keys Enable */ -XEN_CPUFEATURE(AVX512_VBMI2, 6*32+ 6) /*A Additional AVX-512 Vector Byte Manipulation Instrs */ -XEN_CPUFEATURE(CET_SS, 6*32+ 7) /* CET - Shadow Stacks */ -XEN_CPUFEATURE(GFNI, 6*32+ 8) /*A Galois Field Instrs */ -XEN_CPUFEATURE(VAES, 6*32+ 9) /*A Vector AES Instrs */ -XEN_CPUFEATURE(VPCLMULQDQ, 6*32+10) /*A Vector Carry-less Multiplication Instrs */ -XEN_CPUFEATURE(AVX512_VNNI, 6*32+11) /*A Vector Neural Network Instrs */ -XEN_CPUFEATURE(AVX512_BITALG, 6*32+12) /*A Support for VPOPCNT[B,W] and VPSHUFBITQMB */ -XEN_CPUFEATURE(AVX512_VPOPCNTDQ, 6*32+14) /*A POPCNT for vectors of DW/QW */ -XEN_CPUFEATURE(TSXLDTRK, 6*32+16) /*a TSX load tracking suspend/resume insns */ -XEN_CPUFEATURE(RDPID, 6*32+22) /*A RDPID instruction */ -XEN_CPUFEATURE(CLDEMOTE, 6*32+25) /*A CLDEMOTE instruction */ -XEN_CPUFEATURE(MOVDIRI, 6*32+27) /*a MOVDIRI instruction */ -XEN_CPUFEATURE(MOVDIR64B, 6*32+28) /*a MOVDIR64B instruction */ -XEN_CPUFEATURE(ENQCMD, 6*32+29) /* ENQCMD{,S} instructions */ - -/* AMD-defined CPU features, CPUID level 0x80000007.edx, word 7 */ -XEN_CPUFEATURE(ITSC, 7*32+ 8) /* Invariant TSC */ -XEN_CPUFEATURE(EFRO, 7*32+10) /* APERF/MPERF Read Only interface */ - -/* AMD-defined CPU features, CPUID level 0x80000008.ebx, word 8 */ -XEN_CPUFEATURE(CLZERO, 8*32+ 0) /*A CLZERO instruction */ -XEN_CPUFEATURE(RSTR_FP_ERR_PTRS, 8*32+ 2) /*A (F)X{SAVE,RSTOR} always saves/restores FPU Error pointers */ -XEN_CPUFEATURE(WBNOINVD, 8*32+ 9) /* WBNOINVD instruction */ -XEN_CPUFEATURE(IBPB, 8*32+12) /*A IBPB support only (no IBRS, used by AMD) */ -XEN_CPUFEATURE(AMD_PPIN, 8*32+23) /* Protected Processor Inventory Number */ - -/* Intel-defined CPU features, CPUID level 0x00000007:0.edx, word 9 */ -XEN_CPUFEATURE(AVX512_4VNNIW, 9*32+ 2) /*A AVX512 Neural Network Instructions */ -XEN_CPUFEATURE(AVX512_4FMAPS, 9*32+ 3) /*A AVX512 Multiply Accumulation Single Precision */ -XEN_CPUFEATURE(SRBDS_CTRL, 9*32+ 9) /* MSR_MCU_OPT_CTRL and RNGDS_MITG_DIS. */ -XEN_CPUFEATURE(MD_CLEAR, 9*32+10) /*A VERW clears microarchitectural buffers */ -XEN_CPUFEATURE(TSX_FORCE_ABORT, 9*32+13) /* MSR_TSX_FORCE_ABORT.RTM_ABORT */ -XEN_CPUFEATURE(SERIALIZE, 9*32+14) /*a SERIALIZE insn */ -XEN_CPUFEATURE(CET_IBT, 9*32+20) /* CET - Indirect Branch Tracking */ -XEN_CPUFEATURE(IBRSB, 9*32+26) /*A IBRS and IBPB support (used by Intel) */ -XEN_CPUFEATURE(STIBP, 9*32+27) /*A STIBP */ -XEN_CPUFEATURE(L1D_FLUSH, 9*32+28) /*S MSR_FLUSH_CMD and L1D flush. */ -XEN_CPUFEATURE(ARCH_CAPS, 9*32+29) /*a IA32_ARCH_CAPABILITIES MSR */ -XEN_CPUFEATURE(CORE_CAPS, 9*32+30) /* IA32_CORE_CAPABILITIES MSR */ -XEN_CPUFEATURE(SSBD, 9*32+31) /*A MSR_SPEC_CTRL.SSBD available */ - -/* Intel-defined CPU features, CPUID level 0x00000007:1.eax, word 10 */ -XEN_CPUFEATURE(AVX512_BF16, 10*32+ 5) /*A AVX512 BFloat16 Instructions */ - -#endif /* XEN_CPUFEATURE */ - -/* Clean up from a default include. Close the enum (for C). */ -#ifdef XEN_CPUFEATURESET_DEFAULT_INCLUDE -#undef XEN_CPUFEATURESET_DEFAULT_INCLUDE -#undef XEN_CPUFEATURE -}; - -#endif /* XEN_CPUFEATURESET_DEFAULT_INCLUDE */ - -/* - * Local variables: - * mode: C - * c-file-style: "BSD" - * c-basic-offset: 4 - * tab-width: 4 - * indent-tabs-mode: nil - * End: - */ diff --git a/sys/xen/interface/arch-x86/cpuid.h b/sys/xen/interface/arch-x86/cpuid.h deleted file mode 100644 index ce46305bee99..000000000000 --- a/sys/xen/interface/arch-x86/cpuid.h +++ /dev/null @@ -1,118 +0,0 @@ -/****************************************************************************** - * arch-x86/cpuid.h - * - * CPUID interface to Xen. - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to - * deal in the Software without restriction, including without limitation the - * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or - * sell copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - * - * Copyright (c) 2007 Citrix Systems, Inc. - * - * Authors: - * Keir Fraser - */ - -#ifndef __XEN_PUBLIC_ARCH_X86_CPUID_H__ -#define __XEN_PUBLIC_ARCH_X86_CPUID_H__ - -/* - * For compatibility with other hypervisor interfaces, the Xen cpuid leaves - * can be found at the first otherwise unused 0x100 aligned boundary starting - * from 0x40000000. - * - * e.g If viridian extensions are enabled for an HVM domain, the Xen cpuid - * leaves will start at 0x40000100 - */ - -#define XEN_CPUID_FIRST_LEAF 0x40000000 -#define XEN_CPUID_LEAF(i) (XEN_CPUID_FIRST_LEAF + (i)) - -/* - * Leaf 1 (0x40000x00) - * EAX: Largest Xen-information leaf. All leaves up to an including @EAX - * are supported by the Xen host. - * EBX-EDX: "XenVMMXenVMM" signature, allowing positive identification - * of a Xen host. - */ -#define XEN_CPUID_SIGNATURE_EBX 0x566e6558 /* "XenV" */ -#define XEN_CPUID_SIGNATURE_ECX 0x65584d4d /* "MMXe" */ -#define XEN_CPUID_SIGNATURE_EDX 0x4d4d566e /* "nVMM" */ - -/* - * Leaf 2 (0x40000x01) - * EAX[31:16]: Xen major version. - * EAX[15: 0]: Xen minor version. - * EBX-EDX: Reserved (currently all zeroes). - */ - -/* - * Leaf 3 (0x40000x02) - * EAX: Number of hypercall transfer pages. This register is always guaranteed - * to specify one hypercall page. - * EBX: Base address of Xen-specific MSRs. - * ECX: Features 1. Unused bits are set to zero. - * EDX: Features 2. Unused bits are set to zero. - */ - -/* Does the host support MMU_PT_UPDATE_PRESERVE_AD for this guest? */ -#define _XEN_CPUID_FEAT1_MMU_PT_UPDATE_PRESERVE_AD 0 -#define XEN_CPUID_FEAT1_MMU_PT_UPDATE_PRESERVE_AD (1u<<0) - -/* - * Leaf 4 (0x40000x03) - * Sub-leaf 0: EAX: bit 0: emulated tsc - * bit 1: host tsc is known to be reliable - * bit 2: RDTSCP instruction available - * EBX: tsc_mode: 0=default (emulate if necessary), 1=emulate, - * 2=no emulation, 3=no emulation + TSC_AUX support - * ECX: guest tsc frequency in kHz - * EDX: guest tsc incarnation (migration count) - * Sub-leaf 1: EAX: tsc offset low part - * EBX: tsc offset high part - * ECX: multiplicator for tsc->ns conversion - * EDX: shift amount for tsc->ns conversion - * Sub-leaf 2: EAX: host tsc frequency in kHz - */ - -/* - * Leaf 5 (0x40000x04) - * HVM-specific features - * Sub-leaf 0: EAX: Features - * Sub-leaf 0: EBX: vcpu id (iff EAX has XEN_HVM_CPUID_VCPU_ID_PRESENT flag) - * Sub-leaf 0: ECX: domain id (iff EAX has XEN_HVM_CPUID_DOMID_PRESENT flag) - */ -#define XEN_HVM_CPUID_APIC_ACCESS_VIRT (1u << 0) /* Virtualized APIC registers */ -#define XEN_HVM_CPUID_X2APIC_VIRT (1u << 1) /* Virtualized x2APIC accesses */ -/* Memory mapped from other domains has valid IOMMU entries */ -#define XEN_HVM_CPUID_IOMMU_MAPPINGS (1u << 2) -#define XEN_HVM_CPUID_VCPU_ID_PRESENT (1u << 3) /* vcpu id is present in EBX */ -#define XEN_HVM_CPUID_DOMID_PRESENT (1u << 4) /* domid is present in ECX */ - -/* - * Leaf 6 (0x40000x05) - * PV-specific parameters - * Sub-leaf 0: EAX: max available sub-leaf - * Sub-leaf 0: EBX: bits 0-7: max machine address width - */ - -/* Max. address width in bits taking memory hotplug into account. */ -#define XEN_CPUID_MACHINE_ADDRESS_WIDTH_MASK (0xffu << 0) - -#define XEN_CPUID_MAX_NUM_LEAVES 5 - -#endif /* __XEN_PUBLIC_ARCH_X86_CPUID_H__ */ diff --git a/sys/xen/interface/arch-x86/hvm/save.h b/sys/xen/interface/arch-x86/hvm/save.h deleted file mode 100644 index 773a380bc22b..000000000000 --- a/sys/xen/interface/arch-x86/hvm/save.h +++ /dev/null @@ -1,661 +0,0 @@ -/* - * Structure definitions for HVM state that is held by Xen and must - * be saved along with the domain's memory and device-model state. - * - * Copyright (c) 2007 XenSource Ltd. - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to - * deal in the Software without restriction, including without limitation the - * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or - * sell copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ - -#ifndef __XEN_PUBLIC_HVM_SAVE_X86_H__ -#define __XEN_PUBLIC_HVM_SAVE_X86_H__ - -#include "../../xen.h" - -/* - * Save/restore header: general info about the save file. - */ - -#define HVM_FILE_MAGIC 0x54381286 -#define HVM_FILE_VERSION 0x00000001 - -struct hvm_save_header { - uint32_t magic; /* Must be HVM_FILE_MAGIC */ - uint32_t version; /* File format version */ - uint64_t changeset; /* Version of Xen that saved this file */ - uint32_t cpuid; /* CPUID[0x01][%eax] on the saving machine */ - uint32_t gtsc_khz; /* Guest's TSC frequency in kHz */ -}; - -DECLARE_HVM_SAVE_TYPE(HEADER, 1, struct hvm_save_header); - - -/* - * Processor - * - * Compat: - * - Pre-3.4 didn't have msr_tsc_aux - * - Pre-4.7 didn't have fpu_initialised - */ - -struct hvm_hw_cpu { - uint8_t fpu_regs[512]; - - uint64_t rax; - uint64_t rbx; - uint64_t rcx; - uint64_t rdx; - uint64_t rbp; - uint64_t rsi; - uint64_t rdi; - uint64_t rsp; - uint64_t r8; - uint64_t r9; - uint64_t r10; - uint64_t r11; - uint64_t r12; - uint64_t r13; - uint64_t r14; - uint64_t r15; - - uint64_t rip; - uint64_t rflags; - - uint64_t cr0; - uint64_t cr2; - uint64_t cr3; - uint64_t cr4; - - uint64_t dr0; - uint64_t dr1; - uint64_t dr2; - uint64_t dr3; - uint64_t dr6; - uint64_t dr7; - - uint32_t cs_sel; - uint32_t ds_sel; - uint32_t es_sel; - uint32_t fs_sel; - uint32_t gs_sel; - uint32_t ss_sel; - uint32_t tr_sel; - uint32_t ldtr_sel; - - uint32_t cs_limit; - uint32_t ds_limit; - uint32_t es_limit; - uint32_t fs_limit; - uint32_t gs_limit; - uint32_t ss_limit; - uint32_t tr_limit; - uint32_t ldtr_limit; - uint32_t idtr_limit; - uint32_t gdtr_limit; - - uint64_t cs_base; - uint64_t ds_base; - uint64_t es_base; - uint64_t fs_base; - uint64_t gs_base; - uint64_t ss_base; - uint64_t tr_base; - uint64_t ldtr_base; - uint64_t idtr_base; - uint64_t gdtr_base; - - uint32_t cs_arbytes; - uint32_t ds_arbytes; - uint32_t es_arbytes; - uint32_t fs_arbytes; - uint32_t gs_arbytes; - uint32_t ss_arbytes; - uint32_t tr_arbytes; - uint32_t ldtr_arbytes; - - uint64_t sysenter_cs; - uint64_t sysenter_esp; - uint64_t sysenter_eip; - - /* msr for em64t */ - uint64_t shadow_gs; - - /* msr content saved/restored. */ - uint64_t msr_flags; /* Obsolete, ignored. */ - uint64_t msr_lstar; - uint64_t msr_star; - uint64_t msr_cstar; - uint64_t msr_syscall_mask; - uint64_t msr_efer; - uint64_t msr_tsc_aux; - - /* guest's idea of what rdtsc() would return */ - uint64_t tsc; - - /* pending event, if any */ - union { - uint32_t pending_event; - struct { - uint8_t pending_vector:8; - uint8_t pending_type:3; - uint8_t pending_error_valid:1; - uint32_t pending_reserved:19; - uint8_t pending_valid:1; - }; - }; - /* error code for pending event */ - uint32_t error_code; - -#define _XEN_X86_FPU_INITIALISED 0 -#define XEN_X86_FPU_INITIALISED (1U<<_XEN_X86_FPU_INITIALISED) - uint32_t flags; - uint32_t pad0; -}; - -struct hvm_hw_cpu_compat { - uint8_t fpu_regs[512]; - - uint64_t rax; - uint64_t rbx; - uint64_t rcx; - uint64_t rdx; - uint64_t rbp; - uint64_t rsi; - uint64_t rdi; - uint64_t rsp; - uint64_t r8; - uint64_t r9; - uint64_t r10; - uint64_t r11; - uint64_t r12; - uint64_t r13; - uint64_t r14; - uint64_t r15; - - uint64_t rip; - uint64_t rflags; - - uint64_t cr0; - uint64_t cr2; - uint64_t cr3; - uint64_t cr4; - - uint64_t dr0; - uint64_t dr1; - uint64_t dr2; - uint64_t dr3; - uint64_t dr6; - uint64_t dr7; - - uint32_t cs_sel; - uint32_t ds_sel; - uint32_t es_sel; - uint32_t fs_sel; - uint32_t gs_sel; - uint32_t ss_sel; - uint32_t tr_sel; - uint32_t ldtr_sel; - - uint32_t cs_limit; - uint32_t ds_limit; - uint32_t es_limit; - uint32_t fs_limit; - uint32_t gs_limit; - uint32_t ss_limit; - uint32_t tr_limit; - uint32_t ldtr_limit; - uint32_t idtr_limit; - uint32_t gdtr_limit; - - uint64_t cs_base; - uint64_t ds_base; - uint64_t es_base; - uint64_t fs_base; - uint64_t gs_base; - uint64_t ss_base; - uint64_t tr_base; - uint64_t ldtr_base; - uint64_t idtr_base; - uint64_t gdtr_base; - - uint32_t cs_arbytes; - uint32_t ds_arbytes; - uint32_t es_arbytes; - uint32_t fs_arbytes; - uint32_t gs_arbytes; - uint32_t ss_arbytes; - uint32_t tr_arbytes; - uint32_t ldtr_arbytes; - - uint64_t sysenter_cs; - uint64_t sysenter_esp; - uint64_t sysenter_eip; - - /* msr for em64t */ - uint64_t shadow_gs; - - /* msr content saved/restored. */ - uint64_t msr_flags; /* Obsolete, ignored. */ - uint64_t msr_lstar; - uint64_t msr_star; - uint64_t msr_cstar; - uint64_t msr_syscall_mask; - uint64_t msr_efer; - /*uint64_t msr_tsc_aux; COMPAT */ - - /* guest's idea of what rdtsc() would return */ - uint64_t tsc; - - /* pending event, if any */ - union { - uint32_t pending_event; - struct { - uint8_t pending_vector:8; - uint8_t pending_type:3; - uint8_t pending_error_valid:1; - uint32_t pending_reserved:19; - uint8_t pending_valid:1; - }; - }; - /* error code for pending event */ - uint32_t error_code; -}; - -static inline int _hvm_hw_fix_cpu(void *h, uint32_t size) { - - union hvm_hw_cpu_union { - struct hvm_hw_cpu nat; - struct hvm_hw_cpu_compat cmp; - } *ucpu = (union hvm_hw_cpu_union *)h; - - if ( size == sizeof(struct hvm_hw_cpu_compat) ) - { - /* - * If we copy from the end backwards, we should - * be able to do the modification in-place. - */ - ucpu->nat.error_code = ucpu->cmp.error_code; - ucpu->nat.pending_event = ucpu->cmp.pending_event; - ucpu->nat.tsc = ucpu->cmp.tsc; - ucpu->nat.msr_tsc_aux = 0; - } - /* Mimic the old behaviour by unconditionally setting fpu_initialised. */ - ucpu->nat.flags = XEN_X86_FPU_INITIALISED; - - return 0; -} - -DECLARE_HVM_SAVE_TYPE_COMPAT(CPU, 2, struct hvm_hw_cpu, \ - struct hvm_hw_cpu_compat, _hvm_hw_fix_cpu); - -/* - * PIC - */ - -struct hvm_hw_vpic { - /* IR line bitmasks. */ - uint8_t irr; - uint8_t imr; - uint8_t isr; - - /* Line IRx maps to IRQ irq_base+x */ - uint8_t irq_base; - - /* - * Where are we in ICW2-4 initialisation (0 means no init in progress)? - * Bits 0-1 (=x): Next write at A=1 sets ICW(x+1). - * Bit 2: ICW1.IC4 (1 == ICW4 included in init sequence) - * Bit 3: ICW1.SNGL (0 == ICW3 included in init sequence) - */ - uint8_t init_state:4; - - /* IR line with highest priority. */ - uint8_t priority_add:4; - - /* Reads from A=0 obtain ISR or IRR? */ - uint8_t readsel_isr:1; - - /* Reads perform a polling read? */ - uint8_t poll:1; - - /* Automatically clear IRQs from the ISR during INTA? */ - uint8_t auto_eoi:1; - - /* Automatically rotate IRQ priorities during AEOI? */ - uint8_t rotate_on_auto_eoi:1; - - /* Exclude slave inputs when considering in-service IRQs? */ - uint8_t special_fully_nested_mode:1; - - /* Special mask mode excludes masked IRs from AEOI and priority checks. */ - uint8_t special_mask_mode:1; - - /* Is this a master PIC or slave PIC? (NB. This is not programmable.) */ - uint8_t is_master:1; - - /* Edge/trigger selection. */ - uint8_t elcr; - - /* Virtual INT output. */ - uint8_t int_output; -}; - -DECLARE_HVM_SAVE_TYPE(PIC, 3, struct hvm_hw_vpic); - - -/* - * IO-APIC - */ - -union vioapic_redir_entry -{ - uint64_t bits; - struct { - uint8_t vector; - uint8_t delivery_mode:3; - uint8_t dest_mode:1; - uint8_t delivery_status:1; - uint8_t polarity:1; - uint8_t remote_irr:1; - uint8_t trig_mode:1; - uint8_t mask:1; - uint8_t reserve:7; - uint8_t reserved[4]; - uint8_t dest_id; - } fields; -}; - -#define VIOAPIC_NUM_PINS 48 /* 16 ISA IRQs, 32 non-legacy PCI IRQS. */ - -#define XEN_HVM_VIOAPIC(name, cnt) \ - struct name { \ - uint64_t base_address; \ - uint32_t ioregsel; \ - uint32_t id; \ - union vioapic_redir_entry redirtbl[cnt]; \ - } - -XEN_HVM_VIOAPIC(hvm_hw_vioapic, VIOAPIC_NUM_PINS); - -#ifndef __XEN__ -#undef XEN_HVM_VIOAPIC -#else -#undef VIOAPIC_NUM_PINS -#endif - -DECLARE_HVM_SAVE_TYPE(IOAPIC, 4, struct hvm_hw_vioapic); - - -/* - * LAPIC - */ - -struct hvm_hw_lapic { - uint64_t apic_base_msr; - uint32_t disabled; /* VLAPIC_xx_DISABLED */ - uint32_t timer_divisor; - uint64_t tdt_msr; -}; - -DECLARE_HVM_SAVE_TYPE(LAPIC, 5, struct hvm_hw_lapic); - -struct hvm_hw_lapic_regs { - uint8_t data[1024]; -}; - -DECLARE_HVM_SAVE_TYPE(LAPIC_REGS, 6, struct hvm_hw_lapic_regs); - - -/* - * IRQs - */ - -struct hvm_hw_pci_irqs { - /* - * Virtual interrupt wires for a single PCI bus. - * Indexed by: device*4 + INTx#. - */ - union { - unsigned long i[16 / sizeof (unsigned long)]; /* DECLARE_BITMAP(i, 32*4); */ - uint64_t pad[2]; - }; -}; - -DECLARE_HVM_SAVE_TYPE(PCI_IRQ, 7, struct hvm_hw_pci_irqs); - -struct hvm_hw_isa_irqs { - /* - * Virtual interrupt wires for ISA devices. - * Indexed by ISA IRQ (assumes no ISA-device IRQ sharing). - */ - union { - unsigned long i[1]; /* DECLARE_BITMAP(i, 16); */ - uint64_t pad[1]; - }; -}; - -DECLARE_HVM_SAVE_TYPE(ISA_IRQ, 8, struct hvm_hw_isa_irqs); - -struct hvm_hw_pci_link { - /* - * PCI-ISA interrupt router. - * Each PCI is 'wire-ORed' into one of four links using - * the traditional 'barber's pole' mapping ((device + INTx#) & 3). - * The router provides a programmable mapping from each link to a GSI. - */ - uint8_t route[4]; - uint8_t pad0[4]; -}; - -DECLARE_HVM_SAVE_TYPE(PCI_LINK, 9, struct hvm_hw_pci_link); - -/* - * PIT - */ - -struct hvm_hw_pit { - struct hvm_hw_pit_channel { - uint32_t count; /* can be 65536 */ - uint16_t latched_count; - uint8_t count_latched; - uint8_t status_latched; - uint8_t status; - uint8_t read_state; - uint8_t write_state; - uint8_t write_latch; - uint8_t rw_mode; - uint8_t mode; - uint8_t bcd; /* not supported */ - uint8_t gate; /* timer start */ - } channels[3]; /* 3 x 16 bytes */ - uint32_t speaker_data_on; - uint32_t pad0; -}; - -DECLARE_HVM_SAVE_TYPE(PIT, 10, struct hvm_hw_pit); - - -/* - * RTC - */ - -#define RTC_CMOS_SIZE 14 -struct hvm_hw_rtc { - /* CMOS bytes */ - uint8_t cmos_data[RTC_CMOS_SIZE]; - /* Index register for 2-part operations */ - uint8_t cmos_index; - uint8_t pad0; - /* RTC offset from host time */ - int64_t rtc_offset; -}; - -DECLARE_HVM_SAVE_TYPE(RTC, 11, struct hvm_hw_rtc); - - -/* - * HPET - */ - -#define HPET_TIMER_NUM 3 /* 3 timers supported now */ -struct hvm_hw_hpet { - /* Memory-mapped, software visible registers */ - uint64_t capability; /* capabilities */ - uint64_t res0; /* reserved */ - uint64_t config; /* configuration */ - uint64_t res1; /* reserved */ - uint64_t isr; /* interrupt status reg */ - uint64_t res2[25]; /* reserved */ - uint64_t mc64; /* main counter */ - uint64_t res3; /* reserved */ - struct { /* timers */ - uint64_t config; /* configuration/cap */ - uint64_t cmp; /* comparator */ - uint64_t fsb; /* FSB route, not supported now */ - uint64_t res4; /* reserved */ - } timers[HPET_TIMER_NUM]; - uint64_t res5[4*(24-HPET_TIMER_NUM)]; /* reserved, up to 0x3ff */ - - /* Hidden register state */ - uint64_t period[HPET_TIMER_NUM]; /* Last value written to comparator */ -}; - -DECLARE_HVM_SAVE_TYPE(HPET, 12, struct hvm_hw_hpet); - - -/* - * PM timer - */ - -struct hvm_hw_pmtimer { - uint32_t tmr_val; /* PM_TMR_BLK.TMR_VAL: 32bit free-running counter */ - uint16_t pm1a_sts; /* PM1a_EVT_BLK.PM1a_STS: status register */ - uint16_t pm1a_en; /* PM1a_EVT_BLK.PM1a_EN: enable register */ -}; - -DECLARE_HVM_SAVE_TYPE(PMTIMER, 13, struct hvm_hw_pmtimer); - -/* - * MTRR MSRs - */ - -struct hvm_hw_mtrr { -#define MTRR_VCNT 8 -#define NUM_FIXED_MSR 11 - uint64_t msr_pat_cr; - /* mtrr physbase & physmask msr pair*/ - uint64_t msr_mtrr_var[MTRR_VCNT*2]; - uint64_t msr_mtrr_fixed[NUM_FIXED_MSR]; - uint64_t msr_mtrr_cap; - uint64_t msr_mtrr_def_type; -}; - -DECLARE_HVM_SAVE_TYPE(MTRR, 14, struct hvm_hw_mtrr); - -/* - * The save area of XSAVE/XRSTOR. - */ - -struct hvm_hw_cpu_xsave { - uint64_t xfeature_mask; /* Ignored */ - uint64_t xcr0; /* Updated by XSETBV */ - uint64_t xcr0_accum; /* Updated by XSETBV */ - struct { - struct { char x[512]; } fpu_sse; - - struct hvm_hw_cpu_xsave_hdr { - uint64_t xstate_bv; /* Updated by XRSTOR */ - uint64_t xcomp_bv; /* Updated by XRSTOR{C,S} */ - uint64_t reserved[6]; - } xsave_hdr; /* The 64-byte header */ - } save_area; -}; - -#define CPU_XSAVE_CODE 16 - -/* - * Viridian hypervisor context. - */ - -struct hvm_viridian_domain_context { - uint64_t hypercall_gpa; - uint64_t guest_os_id; - uint64_t time_ref_count; - uint64_t reference_tsc; -}; - -DECLARE_HVM_SAVE_TYPE(VIRIDIAN_DOMAIN, 15, struct hvm_viridian_domain_context); - -struct hvm_viridian_vcpu_context { - uint64_t vp_assist_msr; - uint8_t apic_assist_pending; - uint8_t _pad[7]; - uint64_t simp_msr; - uint64_t sint_msr[16]; - uint64_t stimer_config_msr[4]; - uint64_t stimer_count_msr[4]; -}; - -DECLARE_HVM_SAVE_TYPE(VIRIDIAN_VCPU, 17, struct hvm_viridian_vcpu_context); - -struct hvm_vmce_vcpu { - uint64_t caps; - uint64_t mci_ctl2_bank0; - uint64_t mci_ctl2_bank1; - uint64_t mcg_ext_ctl; -}; - -DECLARE_HVM_SAVE_TYPE(VMCE_VCPU, 18, struct hvm_vmce_vcpu); - -struct hvm_tsc_adjust { - uint64_t tsc_adjust; -}; - -DECLARE_HVM_SAVE_TYPE(TSC_ADJUST, 19, struct hvm_tsc_adjust); - - -struct hvm_msr { - uint32_t count; - struct hvm_one_msr { - uint32_t index; - uint32_t _rsvd; - uint64_t val; - } msr[XEN_FLEX_ARRAY_DIM]; -}; - -#define CPU_MSR_CODE 20 - -/* Range 22 - 34 (inclusive) reserved for Amazon */ - -/* - * Largest type-code in use - */ -#define HVM_SAVE_CODE_MAX 20 - -#endif /* __XEN_PUBLIC_HVM_SAVE_X86_H__ */ - -/* - * Local variables: - * mode: C - * c-file-style: "BSD" - * c-basic-offset: 4 - * tab-width: 4 - * indent-tabs-mode: nil - * End: - */ diff --git a/sys/xen/interface/arch-x86/hvm/start_info.h b/sys/xen/interface/arch-x86/hvm/start_info.h deleted file mode 100644 index 50af9ea2ff1e..000000000000 --- a/sys/xen/interface/arch-x86/hvm/start_info.h +++ /dev/null @@ -1,159 +0,0 @@ -/* - * 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 1. 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 +----------------+ - * | memmap_paddr | Physical address of the (optional) memory map. Only - * | | present in version 1 and newer of the structure. - * 48 +----------------+ - * | memmap_entries | Number of entries in the memory map table. Zero - * | | if there is no memory map being provided. Only - * | | present in version 1 and newer of the structure. - * 52 +----------------+ - * | reserved | Version 1 and newer only. - * 56 +----------------+ - * - * 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 layout of each entry in the memory map table is as follows: - * - * 0 +----------------+ - * | addr | Base address - * 8 +----------------+ - * | size | Size of mapping in bytes - * 16 +----------------+ - * | type | Type of mapping as defined between the hypervisor - * | | and guest. See XEN_HVM_MEMMAP_TYPE_* values below. - * 20 +----------------| - * | reserved | - * 24 +----------------+ - * - * 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. - * - * Version numbers of the hvm_start_info structure have evolved like this: - * - * Version 0: Initial implementation. - * - * Version 1: Added the memmap_paddr/memmap_entries fields (plus 4 bytes of - * padding) to the end of the hvm_start_info struct. These new - * fields can be used to pass a memory map to the guest. The - * memory map is optional and so guests that understand version 1 - * of the structure must check that memmap_entries is non-zero - * before trying to read the memory map. - */ -#define XEN_HVM_START_MAGIC_VALUE 0x336ec578 - -/* - * The values used in the type field of the memory map table entries are - * defined below and match the Address Range Types as defined in the "System - * Address Map Interfaces" section of the ACPI Specification. Please refer to - * section 15 in version 6.2 of the ACPI spec: http://uefi.org/specifications - */ -#define XEN_HVM_MEMMAP_TYPE_RAM 1 -#define XEN_HVM_MEMMAP_TYPE_RESERVED 2 -#define XEN_HVM_MEMMAP_TYPE_ACPI 3 -#define XEN_HVM_MEMMAP_TYPE_NVS 4 -#define XEN_HVM_MEMMAP_TYPE_UNUSABLE 5 -#define XEN_HVM_MEMMAP_TYPE_DISABLED 6 -#define XEN_HVM_MEMMAP_TYPE_PMEM 7 - -/* - * 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. */ - /* All following fields only present in version 1 and newer */ - uint64_t memmap_paddr; /* Physical address of an array of */ - /* hvm_memmap_table_entry. */ - uint32_t memmap_entries; /* Number of entries in the memmap table. */ - /* Value will be zero if there is no memory */ - /* map being provided. */ - uint32_t reserved; /* Must be zero. */ -}; - -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; -}; - -struct hvm_memmap_table_entry { - uint64_t addr; /* Base address of the memory region */ - uint64_t size; /* Size of the memory region in bytes */ - uint32_t type; /* Mapping type */ - uint32_t reserved; /* Must be zero for Version 1. */ -}; - -#endif /* __XEN_PUBLIC_ARCH_X86_HVM_START_INFO_H__ */ diff --git a/sys/xen/interface/arch-x86/pmu.h b/sys/xen/interface/arch-x86/pmu.h deleted file mode 100644 index c421cb7a4a13..000000000000 --- a/sys/xen/interface/arch-x86/pmu.h +++ /dev/null @@ -1,159 +0,0 @@ -/* - * 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) 2015 Oracle and/or its affiliates. All rights reserved. - */ - -#ifndef __XEN_PUBLIC_ARCH_X86_PMU_H__ -#define __XEN_PUBLIC_ARCH_X86_PMU_H__ - -/* x86-specific PMU definitions */ - -/* AMD PMU registers and structures */ -struct xen_pmu_amd_ctxt { - /* - * Offsets to counter and control MSRs (relative to xen_pmu_arch.c.amd). - * For PV(H) guests these fields are RO. - */ - uint32_t counters; - uint32_t ctrls; - - /* Counter MSRs */ - uint64_t regs[XEN_FLEX_ARRAY_DIM]; -}; -typedef struct xen_pmu_amd_ctxt xen_pmu_amd_ctxt_t; -DEFINE_XEN_GUEST_HANDLE(xen_pmu_amd_ctxt_t); - -/* Intel PMU registers and structures */ -struct xen_pmu_cntr_pair { - uint64_t counter; - uint64_t control; -}; -typedef struct xen_pmu_cntr_pair xen_pmu_cntr_pair_t; -DEFINE_XEN_GUEST_HANDLE(xen_pmu_cntr_pair_t); - -struct xen_pmu_intel_ctxt { - /* - * Offsets to fixed and architectural counter MSRs (relative to - * xen_pmu_arch.c.intel). - * For PV(H) guests these fields are RO. - */ - uint32_t fixed_counters; - uint32_t arch_counters; - - /* PMU registers */ - uint64_t global_ctrl; - uint64_t global_ovf_ctrl; - uint64_t global_status; - uint64_t fixed_ctrl; - uint64_t ds_area; - uint64_t pebs_enable; - uint64_t debugctl; - - /* Fixed and architectural counter MSRs */ - uint64_t regs[XEN_FLEX_ARRAY_DIM]; -}; -typedef struct xen_pmu_intel_ctxt xen_pmu_intel_ctxt_t; -DEFINE_XEN_GUEST_HANDLE(xen_pmu_intel_ctxt_t); - -/* Sampled domain's registers */ -struct xen_pmu_regs { - uint64_t ip; - uint64_t sp; - uint64_t flags; - uint16_t cs; - uint16_t ss; - uint8_t cpl; - uint8_t pad[3]; -}; -typedef struct xen_pmu_regs xen_pmu_regs_t; -DEFINE_XEN_GUEST_HANDLE(xen_pmu_regs_t); - -/* PMU flags */ -#define PMU_CACHED (1<<0) /* PMU MSRs are cached in the context */ -#define PMU_SAMPLE_USER (1<<1) /* Sample is from user or kernel mode */ -#define PMU_SAMPLE_REAL (1<<2) /* Sample is from realmode */ -#define PMU_SAMPLE_PV (1<<3) /* Sample from a PV guest */ - -/* - * Architecture-specific information describing state of the processor at - * the time of PMU interrupt. - * Fields of this structure marked as RW for guest should only be written by - * the guest when PMU_CACHED bit in pmu_flags is set (which is done by the - * hypervisor during PMU interrupt). Hypervisor will read updated data in - * XENPMU_flush hypercall and clear PMU_CACHED bit. - */ -struct xen_pmu_arch { - union { - /* - * Processor's registers at the time of interrupt. - * WO for hypervisor, RO for guests. - */ - struct xen_pmu_regs regs; - /* Padding for adding new registers to xen_pmu_regs in the future */ -#define XENPMU_REGS_PAD_SZ 64 - uint8_t pad[XENPMU_REGS_PAD_SZ]; - } r; - - /* WO for hypervisor, RO for guest */ - uint64_t pmu_flags; - - /* - * APIC LVTPC register. - * RW for both hypervisor and guest. - * Only APIC_LVT_MASKED bit is loaded by the hypervisor into hardware - * during XENPMU_flush or XENPMU_lvtpc_set. - */ - union { - uint32_t lapic_lvtpc; - uint64_t pad; - } l; - - /* - * Vendor-specific PMU registers. - * RW for both hypervisor and guest (see exceptions above). - * Guest's updates to this field are verified and then loaded by the - * hypervisor into hardware during XENPMU_flush - */ - union { - struct xen_pmu_amd_ctxt amd; - struct xen_pmu_intel_ctxt intel; - - /* - * Padding for contexts (fixed parts only, does not include MSR banks - * that are specified by offsets) - */ -#define XENPMU_CTXT_PAD_SZ 128 - uint8_t pad[XENPMU_CTXT_PAD_SZ]; - } c; -}; -typedef struct xen_pmu_arch xen_pmu_arch_t; -DEFINE_XEN_GUEST_HANDLE(xen_pmu_arch_t); - -#endif /* __XEN_PUBLIC_ARCH_X86_PMU_H__ */ -/* - * Local variables: - * mode: C - * c-file-style: "BSD" - * c-basic-offset: 4 - * tab-width: 4 - * indent-tabs-mode: nil - * End: - */ - diff --git a/sys/xen/interface/arch-x86/xen-mca.h b/sys/xen/interface/arch-x86/xen-mca.h deleted file mode 100644 index b5e04b544466..000000000000 --- a/sys/xen/interface/arch-x86/xen-mca.h +++ /dev/null @@ -1,448 +0,0 @@ -/****************************************************************************** - * arch-x86/mca.h - * - * Contributed by Advanced Micro Devices, Inc. - * Author: Christoph Egger - * - * Guest OS machine check interface to x86 Xen. - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to - * deal in the Software without restriction, including without limitation the - * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or - * sell copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ - -/* Full MCA functionality has the following Usecases from the guest side: - * - * Must have's: - * 1. Dom0 and DomU register machine check trap callback handlers - * (already done via "set_trap_table" hypercall) - * 2. Dom0 registers machine check event callback handler - * (doable via EVTCHNOP_bind_virq) - * 3. Dom0 and DomU fetches machine check data - * 4. Dom0 wants Xen to notify a DomU - * 5. Dom0 gets DomU ID from physical address - * 6. Dom0 wants Xen to kill DomU (already done for "xm destroy") - * - * Nice to have's: - * 7. Dom0 wants Xen to deactivate a physical CPU - * This is better done as separate task, physical CPU hotplugging, - * and hypercall(s) should be sysctl's - * 8. Page migration proposed from Xen NUMA work, where Dom0 can tell Xen to - * move a DomU (or Dom0 itself) away from a malicious page - * producing correctable errors. - * 9. offlining physical page: - * Xen free's and never re-uses a certain physical page. - * 10. Testfacility: Allow Dom0 to write values into machine check MSR's - * and tell Xen to trigger a machine check - */ - -#ifndef __XEN_PUBLIC_ARCH_X86_MCA_H__ -#define __XEN_PUBLIC_ARCH_X86_MCA_H__ - -/* Hypercall */ -#define __HYPERVISOR_mca __HYPERVISOR_arch_0 - -/* - * The xen-unstable repo has interface version 0x03000001; out interface - * is incompatible with that and any future minor revisions, so we - * choose a different version number range that is numerically less - * than that used in xen-unstable. - */ -#define XEN_MCA_INTERFACE_VERSION 0x01ecc003 - -/* IN: Dom0 calls hypercall to retrieve nonurgent telemetry */ -#define XEN_MC_NONURGENT 0x0001 -/* IN: Dom0/DomU calls hypercall to retrieve urgent telemetry */ -#define XEN_MC_URGENT 0x0002 -/* IN: Dom0 acknowledges previosly-fetched telemetry */ -#define XEN_MC_ACK 0x0004 - -/* OUT: All is ok */ -#define XEN_MC_OK 0x0 -/* OUT: Domain could not fetch data. */ -#define XEN_MC_FETCHFAILED 0x1 -/* OUT: There was no machine check data to fetch. */ -#define XEN_MC_NODATA 0x2 -/* OUT: Between notification time and this hypercall an other - * (most likely) correctable error happened. The fetched data, - * does not match the original machine check data. */ -#define XEN_MC_NOMATCH 0x4 - -/* OUT: DomU did not register MC NMI handler. Try something else. */ -#define XEN_MC_CANNOTHANDLE 0x8 -/* OUT: Notifying DomU failed. Retry later or try something else. */ -#define XEN_MC_NOTDELIVERED 0x10 -/* Note, XEN_MC_CANNOTHANDLE and XEN_MC_NOTDELIVERED are mutually exclusive. */ - -/* Applicable to all mc_vcpuid fields below. */ -#define XEN_MC_VCPUID_INVALID 0xffff - -#ifndef __ASSEMBLY__ - -#define VIRQ_MCA VIRQ_ARCH_0 /* G. (DOM0) Machine Check Architecture */ - -/* - * Machine Check Architecure: - * structs are read-only and used to report all kinds of - * correctable and uncorrectable errors detected by the HW. - * Dom0 and DomU: register a handler to get notified. - * Dom0 only: Correctable errors are reported via VIRQ_MCA - * Dom0 and DomU: Uncorrectable errors are reported via nmi handlers - */ -#define MC_TYPE_GLOBAL 0 -#define MC_TYPE_BANK 1 -#define MC_TYPE_EXTENDED 2 -#define MC_TYPE_RECOVERY 3 - -struct mcinfo_common { - uint16_t type; /* structure type */ - uint16_t size; /* size of this struct in bytes */ -}; - - -#define MC_FLAG_CORRECTABLE (1 << 0) -#define MC_FLAG_UNCORRECTABLE (1 << 1) -#define MC_FLAG_RECOVERABLE (1 << 2) -#define MC_FLAG_POLLED (1 << 3) -#define MC_FLAG_RESET (1 << 4) -#define MC_FLAG_CMCI (1 << 5) -#define MC_FLAG_MCE (1 << 6) -/* contains global x86 mc information */ -struct mcinfo_global { - struct mcinfo_common common; - - /* running domain at the time in error (most likely the impacted one) */ - uint16_t mc_domid; - uint16_t mc_vcpuid; /* virtual cpu scheduled for mc_domid */ - uint32_t mc_socketid; /* physical socket of the physical core */ - uint16_t mc_coreid; /* physical impacted core */ - uint16_t mc_core_threadid; /* core thread of physical core */ - uint32_t mc_apicid; - uint32_t mc_flags; - uint64_t mc_gstatus; /* global status */ -}; - -/* contains bank local x86 mc information */ -struct mcinfo_bank { - struct mcinfo_common common; - - uint16_t mc_bank; /* bank nr */ - uint16_t mc_domid; /* Usecase 5: domain referenced by mc_addr on dom0 - * and if mc_addr is valid. Never valid on DomU. */ - uint64_t mc_status; /* bank status */ - uint64_t mc_addr; /* bank address, only valid - * if addr bit is set in mc_status */ - uint64_t mc_misc; - uint64_t mc_ctrl2; - uint64_t mc_tsc; -}; - - -struct mcinfo_msr { - uint64_t reg; /* MSR */ - uint64_t value; /* MSR value */ -}; - -/* contains mc information from other - * or additional mc MSRs */ -struct mcinfo_extended { - struct mcinfo_common common; - - /* You can fill up to five registers. - * If you need more, then use this structure - * multiple times. */ - - uint32_t mc_msrs; /* Number of msr with valid values. */ - /* - * Currently Intel extended MSR (32/64) include all gp registers - * and E(R)FLAGS, E(R)IP, E(R)MISC, up to 11/19 of them might be - * useful at present. So expand this array to 32 to leave room. - */ - struct mcinfo_msr mc_msr[32]; -}; - -/* Recovery Action flags. Giving recovery result information to DOM0 */ - -/* Xen takes successful recovery action, the error is recovered */ -#define REC_ACTION_RECOVERED (0x1 << 0) -/* No action is performed by XEN */ -#define REC_ACTION_NONE (0x1 << 1) -/* It's possible DOM0 might take action ownership in some case */ -#define REC_ACTION_NEED_RESET (0x1 << 2) - -/* Different Recovery Action types, if the action is performed successfully, - * REC_ACTION_RECOVERED flag will be returned. - */ - -/* Page Offline Action */ -#define MC_ACTION_PAGE_OFFLINE (0x1 << 0) -/* CPU offline Action */ -#define MC_ACTION_CPU_OFFLINE (0x1 << 1) -/* L3 cache disable Action */ -#define MC_ACTION_CACHE_SHRINK (0x1 << 2) - -/* Below interface used between XEN/DOM0 for passing XEN's recovery action - * information to DOM0. - * usage Senario: After offlining broken page, XEN might pass its page offline - * recovery action result to DOM0. DOM0 will save the information in - * non-volatile memory for further proactive actions, such as offlining the - * easy broken page earlier when doing next reboot. -*/ -struct page_offline_action -{ - /* Params for passing the offlined page number to DOM0 */ - uint64_t mfn; - uint64_t status; -}; - -struct cpu_offline_action -{ - /* Params for passing the identity of the offlined CPU to DOM0 */ - uint32_t mc_socketid; - uint16_t mc_coreid; - uint16_t mc_core_threadid; -}; - -#define MAX_UNION_SIZE 16 -struct mcinfo_recovery -{ - struct mcinfo_common common; - uint16_t mc_bank; /* bank nr */ - uint8_t action_flags; - uint8_t action_types; - union { - struct page_offline_action page_retire; - struct cpu_offline_action cpu_offline; - uint8_t pad[MAX_UNION_SIZE]; - } action_info; -}; - - -#define MCINFO_HYPERCALLSIZE 1024 -#define MCINFO_MAXSIZE 768 - -#define MCINFO_FLAGS_UNCOMPLETE 0x1 -struct mc_info { - /* Number of mcinfo_* entries in mi_data */ - uint32_t mi_nentries; - uint32_t flags; - uint64_t mi_data[(MCINFO_MAXSIZE - 1) / 8]; -}; -typedef struct mc_info mc_info_t; -DEFINE_XEN_GUEST_HANDLE(mc_info_t); - -#define __MC_MSR_ARRAYSIZE 8 -#if __XEN_INTERFACE_VERSION__ <= 0x00040d00 -#define __MC_NMSRS 1 -#endif -#define MC_NCAPS 7 /* 7 CPU feature flag words */ -#define MC_CAPS_STD_EDX 0 /* cpuid level 0x00000001 (%edx) */ -#define MC_CAPS_AMD_EDX 1 /* cpuid level 0x80000001 (%edx) */ -#define MC_CAPS_TM 2 /* cpuid level 0x80860001 (TransMeta) */ -#define MC_CAPS_LINUX 3 /* Linux-defined */ -#define MC_CAPS_STD_ECX 4 /* cpuid level 0x00000001 (%ecx) */ -#define MC_CAPS_VIA 5 /* cpuid level 0xc0000001 */ -#define MC_CAPS_AMD_ECX 6 /* cpuid level 0x80000001 (%ecx) */ - -struct mcinfo_logical_cpu { - uint32_t mc_cpunr; - uint32_t mc_chipid; - uint16_t mc_coreid; - uint16_t mc_threadid; - uint32_t mc_apicid; - uint32_t mc_clusterid; - uint32_t mc_ncores; - uint32_t mc_ncores_active; - uint32_t mc_nthreads; - int32_t mc_cpuid_level; - uint32_t mc_family; - uint32_t mc_vendor; - uint32_t mc_model; - uint32_t mc_step; - char mc_vendorid[16]; - char mc_brandid[64]; - uint32_t mc_cpu_caps[MC_NCAPS]; - uint32_t mc_cache_size; - uint32_t mc_cache_alignment; - int32_t mc_nmsrvals; - struct mcinfo_msr mc_msrvalues[__MC_MSR_ARRAYSIZE]; -}; -typedef struct mcinfo_logical_cpu xen_mc_logical_cpu_t; -DEFINE_XEN_GUEST_HANDLE(xen_mc_logical_cpu_t); - - -/* - * OS's should use these instead of writing their own lookup function - * each with its own bugs and drawbacks. - * We use macros instead of static inline functions to allow guests - * to include this header in assembly files (*.S). - */ -/* Prototype: - * uint32_t x86_mcinfo_nentries(struct mc_info *mi); - */ -#define x86_mcinfo_nentries(_mi) \ - (_mi)->mi_nentries -/* Prototype: - * struct mcinfo_common *x86_mcinfo_first(struct mc_info *mi); - */ -#define x86_mcinfo_first(_mi) \ - ((struct mcinfo_common *)(_mi)->mi_data) -/* Prototype: - * struct mcinfo_common *x86_mcinfo_next(struct mcinfo_common *mic); - */ -#define x86_mcinfo_next(_mic) \ - ((struct mcinfo_common *)((uint8_t *)(_mic) + (_mic)->size)) - -/* Prototype: - * void x86_mcinfo_lookup(void *ret, struct mc_info *mi, uint16_t type); - */ -#define x86_mcinfo_lookup(_ret, _mi, _type) \ - do { \ - uint32_t found, i; \ - struct mcinfo_common *_mic; \ - \ - found = 0; \ - (_ret) = NULL; \ - if (_mi == NULL) break; \ - _mic = x86_mcinfo_first(_mi); \ - for (i = 0; i < x86_mcinfo_nentries(_mi); i++) { \ - if (_mic->type == (_type)) { \ - found = 1; \ - break; \ - } \ - _mic = x86_mcinfo_next(_mic); \ - } \ - (_ret) = found ? _mic : NULL; \ - } while (0) - - -/* Usecase 1 - * Register machine check trap callback handler - * (already done via "set_trap_table" hypercall) - */ - -/* Usecase 2 - * Dom0 registers machine check event callback handler - * done by EVTCHNOP_bind_virq - */ - -/* Usecase 3 - * Fetch machine check data from hypervisor. - * Note, this hypercall is special, because both Dom0 and DomU must use this. - */ -#define XEN_MC_fetch 1 -struct xen_mc_fetch { - /* IN/OUT variables. */ - uint32_t flags; /* IN: XEN_MC_NONURGENT, XEN_MC_URGENT, - XEN_MC_ACK if ack'ing an earlier fetch */ - /* OUT: XEN_MC_OK, XEN_MC_FETCHFAILED, - XEN_MC_NODATA, XEN_MC_NOMATCH */ - uint32_t _pad0; - uint64_t fetch_id; /* OUT: id for ack, IN: id we are ack'ing */ - - /* OUT variables. */ - XEN_GUEST_HANDLE(mc_info_t) data; -}; -typedef struct xen_mc_fetch xen_mc_fetch_t; -DEFINE_XEN_GUEST_HANDLE(xen_mc_fetch_t); - - -/* Usecase 4 - * This tells the hypervisor to notify a DomU about the machine check error - */ -#define XEN_MC_notifydomain 2 -struct xen_mc_notifydomain { - /* IN variables. */ - uint16_t mc_domid; /* The unprivileged domain to notify. */ - uint16_t mc_vcpuid; /* The vcpu in mc_domid to notify. - * Usually echo'd value from the fetch hypercall. */ - - /* IN/OUT variables. */ - uint32_t flags; - -/* IN: XEN_MC_CORRECTABLE, XEN_MC_TRAP */ -/* OUT: XEN_MC_OK, XEN_MC_CANNOTHANDLE, XEN_MC_NOTDELIVERED, XEN_MC_NOMATCH */ -}; -typedef struct xen_mc_notifydomain xen_mc_notifydomain_t; -DEFINE_XEN_GUEST_HANDLE(xen_mc_notifydomain_t); - -#define XEN_MC_physcpuinfo 3 -struct xen_mc_physcpuinfo { - /* IN/OUT */ - uint32_t ncpus; - uint32_t _pad0; - /* OUT */ - XEN_GUEST_HANDLE(xen_mc_logical_cpu_t) info; -}; - -#define XEN_MC_msrinject 4 -#define MC_MSRINJ_MAXMSRS 8 -struct xen_mc_msrinject { - /* IN */ - uint32_t mcinj_cpunr; /* target processor id */ - uint32_t mcinj_flags; /* see MC_MSRINJ_F_* below */ - uint32_t mcinj_count; /* 0 .. count-1 in array are valid */ - domid_t mcinj_domid; /* valid only if MC_MSRINJ_F_GPADDR is - present in mcinj_flags */ - uint16_t _pad0; - struct mcinfo_msr mcinj_msr[MC_MSRINJ_MAXMSRS]; -}; - -/* Flags for mcinj_flags above; bits 16-31 are reserved */ -#define MC_MSRINJ_F_INTERPOSE 0x1 -#define MC_MSRINJ_F_GPADDR 0x2 - -#define XEN_MC_mceinject 5 -struct xen_mc_mceinject { - unsigned int mceinj_cpunr; /* target processor id */ -}; - -#if defined(__XEN__) || defined(__XEN_TOOLS__) -#define XEN_MC_inject_v2 6 -#define XEN_MC_INJECT_TYPE_MASK 0x7 -#define XEN_MC_INJECT_TYPE_MCE 0x0 -#define XEN_MC_INJECT_TYPE_CMCI 0x1 -#define XEN_MC_INJECT_TYPE_LMCE 0x2 - -#define XEN_MC_INJECT_CPU_BROADCAST 0x8 - -struct xen_mc_inject_v2 { - uint32_t flags; - struct xenctl_bitmap cpumap; -}; -#endif - -struct xen_mc { - uint32_t cmd; - uint32_t interface_version; /* XEN_MCA_INTERFACE_VERSION */ - union { - struct xen_mc_fetch mc_fetch; - struct xen_mc_notifydomain mc_notifydomain; - struct xen_mc_physcpuinfo mc_physcpuinfo; - struct xen_mc_msrinject mc_msrinject; - struct xen_mc_mceinject mc_mceinject; -#if defined(__XEN__) || defined(__XEN_TOOLS__) - struct xen_mc_inject_v2 mc_inject_v2; -#endif - } u; -}; -typedef struct xen_mc xen_mc_t; -DEFINE_XEN_GUEST_HANDLE(xen_mc_t); - -#endif /* __ASSEMBLY__ */ - -#endif /* __XEN_PUBLIC_ARCH_X86_MCA_H__ */ diff --git a/sys/xen/interface/arch-x86/xen-x86_32.h b/sys/xen/interface/arch-x86/xen-x86_32.h deleted file mode 100644 index 19d7388633ec..000000000000 --- a/sys/xen/interface/arch-x86/xen-x86_32.h +++ /dev/null @@ -1,194 +0,0 @@ -/****************************************************************************** - * xen-x86_32.h - * - * Guest OS interface to x86 32-bit Xen. - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to - * deal in the Software without restriction, including without limitation the - * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or - * sell copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - * - * Copyright (c) 2004-2007, K A Fraser - */ - -#ifndef __XEN_PUBLIC_ARCH_X86_XEN_X86_32_H__ -#define __XEN_PUBLIC_ARCH_X86_XEN_X86_32_H__ - -/* - * Hypercall interface: - * Input: %ebx, %ecx, %edx, %esi, %edi, %ebp (arguments 1-6) - * Output: %eax - * Access is via hypercall page (set up by guest loader or via a Xen MSR): - * call hypercall_page + hypercall-number * 32 - * Clobbered: Argument registers (e.g., 2-arg hypercall clobbers %ebx,%ecx) - */ - -/* - * These flat segments are in the Xen-private section of every GDT. Since these - * are also present in the initial GDT, many OSes will be able to avoid - * installing their own GDT. - */ -#define FLAT_RING1_CS 0xe019 /* GDT index 259 */ -#define FLAT_RING1_DS 0xe021 /* GDT index 260 */ -#define FLAT_RING1_SS 0xe021 /* GDT index 260 */ -#define FLAT_RING3_CS 0xe02b /* GDT index 261 */ -#define FLAT_RING3_DS 0xe033 /* GDT index 262 */ -#define FLAT_RING3_SS 0xe033 /* GDT index 262 */ - -#define FLAT_KERNEL_CS FLAT_RING1_CS -#define FLAT_KERNEL_DS FLAT_RING1_DS -#define FLAT_KERNEL_SS FLAT_RING1_SS -#define FLAT_USER_CS FLAT_RING3_CS -#define FLAT_USER_DS FLAT_RING3_DS -#define FLAT_USER_SS FLAT_RING3_SS - -#define __HYPERVISOR_VIRT_START_PAE 0xF5800000 -#define __MACH2PHYS_VIRT_START_PAE 0xF5800000 -#define __MACH2PHYS_VIRT_END_PAE 0xF6800000 -#define HYPERVISOR_VIRT_START_PAE xen_mk_ulong(__HYPERVISOR_VIRT_START_PAE) -#define MACH2PHYS_VIRT_START_PAE xen_mk_ulong(__MACH2PHYS_VIRT_START_PAE) -#define MACH2PHYS_VIRT_END_PAE xen_mk_ulong(__MACH2PHYS_VIRT_END_PAE) - -/* Non-PAE bounds are obsolete. */ -#define __HYPERVISOR_VIRT_START_NONPAE 0xFC000000 -#define __MACH2PHYS_VIRT_START_NONPAE 0xFC000000 -#define __MACH2PHYS_VIRT_END_NONPAE 0xFC400000 -#define HYPERVISOR_VIRT_START_NONPAE \ - xen_mk_ulong(__HYPERVISOR_VIRT_START_NONPAE) -#define MACH2PHYS_VIRT_START_NONPAE \ - xen_mk_ulong(__MACH2PHYS_VIRT_START_NONPAE) -#define MACH2PHYS_VIRT_END_NONPAE \ - xen_mk_ulong(__MACH2PHYS_VIRT_END_NONPAE) - -#define __HYPERVISOR_VIRT_START __HYPERVISOR_VIRT_START_PAE -#define __MACH2PHYS_VIRT_START __MACH2PHYS_VIRT_START_PAE -#define __MACH2PHYS_VIRT_END __MACH2PHYS_VIRT_END_PAE - -#ifndef HYPERVISOR_VIRT_START -#define HYPERVISOR_VIRT_START xen_mk_ulong(__HYPERVISOR_VIRT_START) -#endif - -#define MACH2PHYS_VIRT_START xen_mk_ulong(__MACH2PHYS_VIRT_START) -#define MACH2PHYS_VIRT_END xen_mk_ulong(__MACH2PHYS_VIRT_END) -#define MACH2PHYS_NR_ENTRIES ((MACH2PHYS_VIRT_END-MACH2PHYS_VIRT_START)>>2) -#ifndef machine_to_phys_mapping -#define machine_to_phys_mapping ((unsigned long *)MACH2PHYS_VIRT_START) -#endif - -/* 32-/64-bit invariability for control interfaces (domctl/sysctl). */ -#if defined(__XEN__) || defined(__XEN_TOOLS__) -#undef ___DEFINE_XEN_GUEST_HANDLE -#define ___DEFINE_XEN_GUEST_HANDLE(name, type) \ - typedef struct { type *p; } \ - __guest_handle_ ## name; \ - typedef struct { union { type *p; uint64_aligned_t q; }; } \ - __guest_handle_64_ ## name -#undef set_xen_guest_handle_raw -#define set_xen_guest_handle_raw(hnd, val) \ - do { if ( sizeof(hnd) == 8 ) *(uint64_t *)&(hnd) = 0; \ - (hnd).p = val; \ - } while ( 0 ) -#define int64_aligned_t int64_t __attribute__((aligned(8))) -#define uint64_aligned_t uint64_t __attribute__((aligned(8))) -#define __XEN_GUEST_HANDLE_64(name) __guest_handle_64_ ## name -#define XEN_GUEST_HANDLE_64(name) __XEN_GUEST_HANDLE_64(name) -#endif - -#ifndef __ASSEMBLY__ - -#if defined(XEN_GENERATING_COMPAT_HEADERS) -/* nothing */ -#elif defined(__XEN__) || defined(__XEN_TOOLS__) -/* Anonymous unions include all permissible names (e.g., al/ah/ax/eax). */ -#define __DECL_REG_LO8(which) union { \ - uint32_t e ## which ## x; \ - uint16_t which ## x; \ - struct { \ - uint8_t which ## l; \ - uint8_t which ## h; \ - }; \ -} -#define __DECL_REG_LO16(name) union { \ - uint32_t e ## name, _e ## name; \ - uint16_t name; \ -} -#else -/* Other sources must always use the proper 32-bit name (e.g., eax). */ -#define __DECL_REG_LO8(which) uint32_t e ## which ## x -#define __DECL_REG_LO16(name) uint32_t e ## name -#endif - -struct cpu_user_regs { - __DECL_REG_LO8(b); - __DECL_REG_LO8(c); - __DECL_REG_LO8(d); - __DECL_REG_LO16(si); - __DECL_REG_LO16(di); - __DECL_REG_LO16(bp); - __DECL_REG_LO8(a); - uint16_t error_code; /* private */ - uint16_t entry_vector; /* private */ - __DECL_REG_LO16(ip); - uint16_t cs; - uint8_t saved_upcall_mask; - uint8_t _pad0; - __DECL_REG_LO16(flags); /* eflags.IF == !saved_upcall_mask */ - __DECL_REG_LO16(sp); - uint16_t ss, _pad1; - uint16_t es, _pad2; - uint16_t ds, _pad3; - uint16_t fs, _pad4; - uint16_t gs, _pad5; -}; -typedef struct cpu_user_regs cpu_user_regs_t; -DEFINE_XEN_GUEST_HANDLE(cpu_user_regs_t); - -#undef __DECL_REG_LO8 -#undef __DECL_REG_LO16 - -/* - * Page-directory addresses above 4GB do not fit into architectural %cr3. - * When accessing %cr3, or equivalent field in vcpu_guest_context, guests - * must use the following accessor macros to pack/unpack valid MFNs. - */ -#define xen_pfn_to_cr3(pfn) (((unsigned)(pfn) << 12) | ((unsigned)(pfn) >> 20)) -#define xen_cr3_to_pfn(cr3) (((unsigned)(cr3) >> 12) | ((unsigned)(cr3) << 20)) - -struct arch_vcpu_info { - unsigned long cr2; - unsigned long pad[5]; /* sizeof(vcpu_info_t) == 64 */ -}; -typedef struct arch_vcpu_info arch_vcpu_info_t; - -struct xen_callback { - unsigned long cs; - unsigned long eip; -}; -typedef struct xen_callback xen_callback_t; - -#endif /* !__ASSEMBLY__ */ - -#endif /* __XEN_PUBLIC_ARCH_X86_XEN_X86_32_H__ */ - -/* - * Local variables: - * mode: C - * c-file-style: "BSD" - * c-basic-offset: 4 - * tab-width: 4 - * indent-tabs-mode: nil - * End: - */ diff --git a/sys/xen/interface/arch-x86/xen-x86_64.h b/sys/xen/interface/arch-x86/xen-x86_64.h deleted file mode 100644 index 40aed14366d3..000000000000 --- a/sys/xen/interface/arch-x86/xen-x86_64.h +++ /dev/null @@ -1,241 +0,0 @@ -/****************************************************************************** - * xen-x86_64.h - * - * Guest OS interface to x86 64-bit Xen. - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to - * deal in the Software without restriction, including without limitation the - * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or - * sell copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - * - * Copyright (c) 2004-2006, K A Fraser - */ - -#ifndef __XEN_PUBLIC_ARCH_X86_XEN_X86_64_H__ -#define __XEN_PUBLIC_ARCH_X86_XEN_X86_64_H__ - -/* - * Hypercall interface: - * Input: %rdi, %rsi, %rdx, %r10, %r8, %r9 (arguments 1-6) - * Output: %rax - * Access is via hypercall page (set up by guest loader or via a Xen MSR): - * call hypercall_page + hypercall-number * 32 - * Clobbered: argument registers (e.g., 2-arg hypercall clobbers %rdi,%rsi) - */ - -/* - * 64-bit segment selectors - * These flat segments are in the Xen-private section of every GDT. Since these - * are also present in the initial GDT, many OSes will be able to avoid - * installing their own GDT. - */ - -#define FLAT_RING3_CS32 0xe023 /* GDT index 260 */ -#define FLAT_RING3_CS64 0xe033 /* GDT index 262 */ -#define FLAT_RING3_DS32 0xe02b /* GDT index 261 */ -#define FLAT_RING3_DS64 0x0000 /* NULL selector */ -#define FLAT_RING3_SS32 0xe02b /* GDT index 261 */ -#define FLAT_RING3_SS64 0xe02b /* GDT index 261 */ - -#define FLAT_KERNEL_DS64 FLAT_RING3_DS64 -#define FLAT_KERNEL_DS32 FLAT_RING3_DS32 -#define FLAT_KERNEL_DS FLAT_KERNEL_DS64 -#define FLAT_KERNEL_CS64 FLAT_RING3_CS64 -#define FLAT_KERNEL_CS32 FLAT_RING3_CS32 -#define FLAT_KERNEL_CS FLAT_KERNEL_CS64 -#define FLAT_KERNEL_SS64 FLAT_RING3_SS64 -#define FLAT_KERNEL_SS32 FLAT_RING3_SS32 -#define FLAT_KERNEL_SS FLAT_KERNEL_SS64 - -#define FLAT_USER_DS64 FLAT_RING3_DS64 -#define FLAT_USER_DS32 FLAT_RING3_DS32 -#define FLAT_USER_DS FLAT_USER_DS64 -#define FLAT_USER_CS64 FLAT_RING3_CS64 -#define FLAT_USER_CS32 FLAT_RING3_CS32 -#define FLAT_USER_CS FLAT_USER_CS64 -#define FLAT_USER_SS64 FLAT_RING3_SS64 -#define FLAT_USER_SS32 FLAT_RING3_SS32 -#define FLAT_USER_SS FLAT_USER_SS64 - -#define __HYPERVISOR_VIRT_START 0xFFFF800000000000 -#define __HYPERVISOR_VIRT_END 0xFFFF880000000000 -#define __MACH2PHYS_VIRT_START 0xFFFF800000000000 -#define __MACH2PHYS_VIRT_END 0xFFFF804000000000 - -#ifndef HYPERVISOR_VIRT_START -#define HYPERVISOR_VIRT_START xen_mk_ulong(__HYPERVISOR_VIRT_START) -#define HYPERVISOR_VIRT_END xen_mk_ulong(__HYPERVISOR_VIRT_END) -#endif - -#define MACH2PHYS_VIRT_START xen_mk_ulong(__MACH2PHYS_VIRT_START) -#define MACH2PHYS_VIRT_END xen_mk_ulong(__MACH2PHYS_VIRT_END) -#define MACH2PHYS_NR_ENTRIES ((MACH2PHYS_VIRT_END-MACH2PHYS_VIRT_START)>>3) -#ifndef machine_to_phys_mapping -#define machine_to_phys_mapping ((unsigned long *)HYPERVISOR_VIRT_START) -#endif - -/* - * int HYPERVISOR_set_segment_base(unsigned int which, unsigned long base) - * @which == SEGBASE_* ; @base == 64-bit base address - * Returns 0 on success. - */ -#define SEGBASE_FS 0 -#define SEGBASE_GS_USER 1 -#define SEGBASE_GS_KERNEL 2 -#define SEGBASE_GS_USER_SEL 3 /* Set user %gs specified in base[15:0] */ - -/* - * int HYPERVISOR_iret(void) - * All arguments are on the kernel stack, in the following format. - * Never returns if successful. Current kernel context is lost. - * The saved CS is mapped as follows: - * RING0 -> RING3 kernel mode. - * RING1 -> RING3 kernel mode. - * RING2 -> RING3 kernel mode. - * RING3 -> RING3 user mode. - * However RING0 indicates that the guest kernel should return to iteself - * directly with - * orb $3,1*8(%rsp) - * iretq - * If flags contains VGCF_in_syscall: - * Restore RAX, RIP, RFLAGS, RSP. - * Discard R11, RCX, CS, SS. - * Otherwise: - * Restore RAX, R11, RCX, CS:RIP, RFLAGS, SS:RSP. - * All other registers are saved on hypercall entry and restored to user. - */ -/* Guest exited in SYSCALL context? Return to guest with SYSRET? */ -#define _VGCF_in_syscall 8 -#define VGCF_in_syscall (1<<_VGCF_in_syscall) -#define VGCF_IN_SYSCALL VGCF_in_syscall - -#ifndef __ASSEMBLY__ - -struct iret_context { - /* Top of stack (%rsp at point of hypercall). */ - uint64_t rax, r11, rcx, flags, rip, cs, rflags, rsp, ss; - /* Bottom of iret stack frame. */ -}; - -#if defined(__XEN__) || defined(__XEN_TOOLS__) -/* Anonymous unions include all permissible names (e.g., al/ah/ax/eax/rax). */ -#define __DECL_REG_LOHI(which) union { \ - uint64_t r ## which ## x; \ - uint32_t e ## which ## x; \ - uint16_t which ## x; \ - struct { \ - uint8_t which ## l; \ - uint8_t which ## h; \ - }; \ -} -#define __DECL_REG_LO8(name) union { \ - uint64_t r ## name; \ - uint32_t e ## name; \ - uint16_t name; \ - uint8_t name ## l; \ -} -#define __DECL_REG_LO16(name) union { \ - uint64_t r ## name; \ - uint32_t e ## name; \ - uint16_t name; \ -} -#define __DECL_REG_HI(num) union { \ - uint64_t r ## num; \ - uint32_t r ## num ## d; \ - uint16_t r ## num ## w; \ - uint8_t r ## num ## b; \ -} -#elif defined(__GNUC__) && !defined(__STRICT_ANSI__) -/* Anonymous union includes both 32- and 64-bit names (e.g., eax/rax). */ -#define __DECL_REG(name) union { \ - uint64_t r ## name, e ## name; \ - uint32_t _e ## name; \ -} -#else -/* Non-gcc sources must always use the proper 64-bit name (e.g., rax). */ -#define __DECL_REG(name) uint64_t r ## name -#endif - -#ifndef __DECL_REG_LOHI -#define __DECL_REG_LOHI(name) __DECL_REG(name ## x) -#define __DECL_REG_LO8 __DECL_REG -#define __DECL_REG_LO16 __DECL_REG -#define __DECL_REG_HI(num) uint64_t r ## num -#endif - -struct cpu_user_regs { - __DECL_REG_HI(15); - __DECL_REG_HI(14); - __DECL_REG_HI(13); - __DECL_REG_HI(12); - __DECL_REG_LO8(bp); - __DECL_REG_LOHI(b); - __DECL_REG_HI(11); - __DECL_REG_HI(10); - __DECL_REG_HI(9); - __DECL_REG_HI(8); - __DECL_REG_LOHI(a); - __DECL_REG_LOHI(c); - __DECL_REG_LOHI(d); - __DECL_REG_LO8(si); - __DECL_REG_LO8(di); - uint32_t error_code; /* private */ - uint32_t entry_vector; /* private */ - __DECL_REG_LO16(ip); - uint16_t cs, _pad0[1]; - uint8_t saved_upcall_mask; - uint8_t _pad1[3]; - __DECL_REG_LO16(flags); /* rflags.IF == !saved_upcall_mask */ - __DECL_REG_LO8(sp); - uint16_t ss, _pad2[3]; - uint16_t es, _pad3[3]; - uint16_t ds, _pad4[3]; - uint16_t fs, _pad5[3]; - uint16_t gs, _pad6[3]; -}; -typedef struct cpu_user_regs cpu_user_regs_t; -DEFINE_XEN_GUEST_HANDLE(cpu_user_regs_t); - -#undef __DECL_REG -#undef __DECL_REG_LOHI -#undef __DECL_REG_LO8 -#undef __DECL_REG_LO16 -#undef __DECL_REG_HI - -#define xen_pfn_to_cr3(pfn) ((unsigned long)(pfn) << 12) -#define xen_cr3_to_pfn(cr3) ((unsigned long)(cr3) >> 12) - -struct arch_vcpu_info { - unsigned long cr2; - unsigned long pad; /* sizeof(vcpu_info_t) == 64 */ -}; -typedef struct arch_vcpu_info arch_vcpu_info_t; - -typedef unsigned long xen_callback_t; - -#endif /* !__ASSEMBLY__ */ - -#endif /* __XEN_PUBLIC_ARCH_X86_XEN_X86_64_H__ */ - -/* - * Local variables: - * mode: C - * c-file-style: "BSD" - * c-basic-offset: 4 - * tab-width: 4 - * indent-tabs-mode: nil - * End: - */ diff --git a/sys/xen/interface/arch-x86/xen.h b/sys/xen/interface/arch-x86/xen.h deleted file mode 100644 index 629cb2ba400a..000000000000 --- a/sys/xen/interface/arch-x86/xen.h +++ /dev/null @@ -1,384 +0,0 @@ -/****************************************************************************** - * arch-x86/xen.h - * - * Guest OS interface to x86 Xen. - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to - * deal in the Software without restriction, including without limitation the - * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or - * sell copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - * - * Copyright (c) 2004-2006, K A Fraser - */ - -#include "../xen.h" - -#ifndef __XEN_PUBLIC_ARCH_X86_XEN_H__ -#define __XEN_PUBLIC_ARCH_X86_XEN_H__ - -/* Structural guest handles introduced in 0x00030201. */ -#if __XEN_INTERFACE_VERSION__ >= 0x00030201 -#define ___DEFINE_XEN_GUEST_HANDLE(name, type) \ - typedef struct { type *p; } __guest_handle_ ## name -#else -#define ___DEFINE_XEN_GUEST_HANDLE(name, type) \ - typedef type * __guest_handle_ ## name -#endif - -/* - * XEN_GUEST_HANDLE represents a guest pointer, when passed as a field - * in a struct in memory. - * XEN_GUEST_HANDLE_PARAM represent a guest pointer, when passed as an - * hypercall argument. - * XEN_GUEST_HANDLE_PARAM and XEN_GUEST_HANDLE are the same on X86 but - * they might not be on other architectures. - */ -#define __DEFINE_XEN_GUEST_HANDLE(name, type) \ - ___DEFINE_XEN_GUEST_HANDLE(name, type); \ - ___DEFINE_XEN_GUEST_HANDLE(const_##name, const type) -#define DEFINE_XEN_GUEST_HANDLE(name) __DEFINE_XEN_GUEST_HANDLE(name, name) -#define __XEN_GUEST_HANDLE(name) __guest_handle_ ## name -#define XEN_GUEST_HANDLE(name) __XEN_GUEST_HANDLE(name) -#define XEN_GUEST_HANDLE_PARAM(name) XEN_GUEST_HANDLE(name) -#define set_xen_guest_handle_raw(hnd, val) do { (hnd).p = val; } while (0) -#define set_xen_guest_handle(hnd, val) set_xen_guest_handle_raw(hnd, val) - -#if defined(__i386__) -# ifdef __XEN__ -__DeFiNe__ __DECL_REG_LO8(which) uint32_t e ## which ## x -__DeFiNe__ __DECL_REG_LO16(name) union { uint32_t e ## name; } -# endif -#include "xen-x86_32.h" -# ifdef __XEN__ -__UnDeF__ __DECL_REG_LO8 -__UnDeF__ __DECL_REG_LO16 -__DeFiNe__ __DECL_REG_LO8(which) e ## which ## x -__DeFiNe__ __DECL_REG_LO16(name) e ## name -# endif -#elif defined(__x86_64__) -#include "xen-x86_64.h" -#endif - -#ifndef __ASSEMBLY__ -typedef unsigned long xen_pfn_t; -#define PRI_xen_pfn "lx" -#define PRIu_xen_pfn "lu" -#endif - -#define XEN_HAVE_PV_GUEST_ENTRY 1 - -#define XEN_HAVE_PV_UPCALL_MASK 1 - -/* - * `incontents 200 segdesc Segment Descriptor Tables - */ -/* - * ` enum neg_errnoval - * ` HYPERVISOR_set_gdt(const xen_pfn_t frames[], unsigned int entries); - * ` - */ -/* - * A number of GDT entries are reserved by Xen. These are not situated at the - * start of the GDT because some stupid OSes export hard-coded selector values - * in their ABI. These hard-coded values are always near the start of the GDT, - * so Xen places itself out of the way, at the far end of the GDT. - * - * NB The LDT is set using the MMUEXT_SET_LDT op of HYPERVISOR_mmuext_op - */ -#define FIRST_RESERVED_GDT_PAGE 14 -#define FIRST_RESERVED_GDT_BYTE (FIRST_RESERVED_GDT_PAGE * 4096) -#define FIRST_RESERVED_GDT_ENTRY (FIRST_RESERVED_GDT_BYTE / 8) - - -/* - * ` enum neg_errnoval - * ` HYPERVISOR_update_descriptor(u64 pa, u64 desc); - * ` - * ` @pa The machine physical address of the descriptor to - * ` update. Must be either a descriptor page or writable. - * ` @desc The descriptor value to update, in the same format as a - * ` native descriptor table entry. - */ - -/* Maximum number of virtual CPUs in legacy multi-processor guests. */ -#define XEN_LEGACY_MAX_VCPUS 32 - -#ifndef __ASSEMBLY__ - -typedef unsigned long xen_ulong_t; -#define PRI_xen_ulong "lx" - -/* - * ` enum neg_errnoval - * ` HYPERVISOR_stack_switch(unsigned long ss, unsigned long esp); - * ` - * Sets the stack segment and pointer for the current vcpu. - */ - -/* - * ` enum neg_errnoval - * ` HYPERVISOR_set_trap_table(const struct trap_info traps[]); - * ` - */ -/* - * Send an array of these to HYPERVISOR_set_trap_table(). - * Terminate the array with a sentinel entry, with traps[].address==0. - * The privilege level specifies which modes may enter a trap via a software - * interrupt. On x86/64, since rings 1 and 2 are unavailable, we allocate - * privilege levels as follows: - * Level == 0: Noone may enter - * Level == 1: Kernel may enter - * Level == 2: Kernel may enter - * Level == 3: Everyone may enter - */ -#define TI_GET_DPL(_ti) ((_ti)->flags & 3) -#define TI_GET_IF(_ti) ((_ti)->flags & 4) -#define TI_SET_DPL(_ti,_dpl) ((_ti)->flags |= (_dpl)) -#define TI_SET_IF(_ti,_if) ((_ti)->flags |= ((!!(_if))<<2)) -struct trap_info { - uint8_t vector; /* exception vector */ - uint8_t flags; /* 0-3: privilege level; 4: clear event enable? */ - uint16_t cs; /* code selector */ - unsigned long address; /* code offset */ -}; -typedef struct trap_info trap_info_t; -DEFINE_XEN_GUEST_HANDLE(trap_info_t); - -typedef uint64_t tsc_timestamp_t; /* RDTSC timestamp */ - -/* - * The following is all CPU context. Note that the fpu_ctxt block is filled - * in by FXSAVE if the CPU has feature FXSR; otherwise FSAVE is used. - * - * Also note that when calling DOMCTL_setvcpucontext for HVM guests, not all - * information in this structure is updated, the fields read include: fpu_ctxt - * (if VGCT_I387_VALID is set), flags, user_regs and debugreg[*]. - * - * Note: VCPUOP_initialise for HVM guests is non-symetric with - * DOMCTL_setvcpucontext, and uses struct vcpu_hvm_context from hvm/hvm_vcpu.h - */ -struct vcpu_guest_context { - /* FPU registers come first so they can be aligned for FXSAVE/FXRSTOR. */ - struct { char x[512]; } fpu_ctxt; /* User-level FPU registers */ -#define VGCF_I387_VALID (1<<0) -#define VGCF_IN_KERNEL (1<<2) -#define _VGCF_i387_valid 0 -#define VGCF_i387_valid (1<<_VGCF_i387_valid) -#define _VGCF_in_kernel 2 -#define VGCF_in_kernel (1<<_VGCF_in_kernel) -#define _VGCF_failsafe_disables_events 3 -#define VGCF_failsafe_disables_events (1<<_VGCF_failsafe_disables_events) -#define _VGCF_syscall_disables_events 4 -#define VGCF_syscall_disables_events (1<<_VGCF_syscall_disables_events) -#define _VGCF_online 5 -#define VGCF_online (1<<_VGCF_online) - unsigned long flags; /* VGCF_* flags */ - struct cpu_user_regs user_regs; /* User-level CPU registers */ - struct trap_info trap_ctxt[256]; /* Virtual IDT */ - unsigned long ldt_base, ldt_ents; /* LDT (linear address, # ents) */ - unsigned long gdt_frames[16], gdt_ents; /* GDT (machine frames, # ents) */ - unsigned long kernel_ss, kernel_sp; /* Virtual TSS (only SS1/SP1) */ - /* NB. User pagetable on x86/64 is placed in ctrlreg[1]. */ - unsigned long ctrlreg[8]; /* CR0-CR7 (control registers) */ - unsigned long debugreg[8]; /* DB0-DB7 (debug registers) */ -#ifdef __i386__ - unsigned long event_callback_cs; /* CS:EIP of event callback */ - unsigned long event_callback_eip; - unsigned long failsafe_callback_cs; /* CS:EIP of failsafe callback */ - unsigned long failsafe_callback_eip; -#else - unsigned long event_callback_eip; - unsigned long failsafe_callback_eip; -#ifdef __XEN__ - union { - unsigned long syscall_callback_eip; - struct { - unsigned int event_callback_cs; /* compat CS of event cb */ - unsigned int failsafe_callback_cs; /* compat CS of failsafe cb */ - }; - }; -#else - unsigned long syscall_callback_eip; -#endif -#endif - unsigned long vm_assist; /* VMASST_TYPE_* bitmap */ -#ifdef __x86_64__ - /* Segment base addresses. */ - uint64_t fs_base; - uint64_t gs_base_kernel; - uint64_t gs_base_user; -#endif -}; -typedef struct vcpu_guest_context vcpu_guest_context_t; -DEFINE_XEN_GUEST_HANDLE(vcpu_guest_context_t); - -struct arch_shared_info { - /* - * Number of valid entries in the p2m table(s) anchored at - * pfn_to_mfn_frame_list_list and/or p2m_vaddr. - */ - unsigned long max_pfn; - /* - * Frame containing list of mfns containing list of mfns containing p2m. - * A value of 0 indicates it has not yet been set up, ~0 indicates it has - * been set to invalid e.g. due to the p2m being too large for the 3-level - * p2m tree. In this case the linear mapper p2m list anchored at p2m_vaddr - * is to be used. - */ - xen_pfn_t pfn_to_mfn_frame_list_list; - unsigned long nmi_reason; - /* - * Following three fields are valid if p2m_cr3 contains a value different - * from 0. - * p2m_cr3 is the root of the address space where p2m_vaddr is valid. - * p2m_cr3 is in the same format as a cr3 value in the vcpu register state - * and holds the folded machine frame number (via xen_pfn_to_cr3) of a - * L3 or L4 page table. - * p2m_vaddr holds the virtual address of the linear p2m list. All entries - * in the range [0...max_pfn[ are accessible via this pointer. - * p2m_generation will be incremented by the guest before and after each - * change of the mappings of the p2m list. p2m_generation starts at 0 and - * a value with the least significant bit set indicates that a mapping - * update is in progress. This allows guest external software (e.g. in Dom0) - * to verify that read mappings are consistent and whether they have changed - * since the last check. - * Modifying a p2m element in the linear p2m list is allowed via an atomic - * write only. - */ - unsigned long p2m_cr3; /* cr3 value of the p2m address space */ - unsigned long p2m_vaddr; /* virtual address of the p2m list */ - unsigned long p2m_generation; /* generation count of p2m mapping */ -#ifdef __i386__ - /* There's no room for this field in the generic structure. */ - uint32_t wc_sec_hi; -#endif -}; -typedef struct arch_shared_info arch_shared_info_t; - -#if defined(__XEN__) || defined(__XEN_TOOLS__) -/* - * struct xen_arch_domainconfig's ABI is covered by - * XEN_DOMCTL_INTERFACE_VERSION. - */ -struct xen_arch_domainconfig { -#define _XEN_X86_EMU_LAPIC 0 -#define XEN_X86_EMU_LAPIC (1U<<_XEN_X86_EMU_LAPIC) -#define _XEN_X86_EMU_HPET 1 -#define XEN_X86_EMU_HPET (1U<<_XEN_X86_EMU_HPET) -#define _XEN_X86_EMU_PM 2 -#define XEN_X86_EMU_PM (1U<<_XEN_X86_EMU_PM) -#define _XEN_X86_EMU_RTC 3 -#define XEN_X86_EMU_RTC (1U<<_XEN_X86_EMU_RTC) -#define _XEN_X86_EMU_IOAPIC 4 -#define XEN_X86_EMU_IOAPIC (1U<<_XEN_X86_EMU_IOAPIC) -#define _XEN_X86_EMU_PIC 5 -#define XEN_X86_EMU_PIC (1U<<_XEN_X86_EMU_PIC) -#define _XEN_X86_EMU_VGA 6 -#define XEN_X86_EMU_VGA (1U<<_XEN_X86_EMU_VGA) -#define _XEN_X86_EMU_IOMMU 7 -#define XEN_X86_EMU_IOMMU (1U<<_XEN_X86_EMU_IOMMU) -#define _XEN_X86_EMU_PIT 8 -#define XEN_X86_EMU_PIT (1U<<_XEN_X86_EMU_PIT) -#define _XEN_X86_EMU_USE_PIRQ 9 -#define XEN_X86_EMU_USE_PIRQ (1U<<_XEN_X86_EMU_USE_PIRQ) -#define _XEN_X86_EMU_VPCI 10 -#define XEN_X86_EMU_VPCI (1U<<_XEN_X86_EMU_VPCI) - -#define XEN_X86_EMU_ALL (XEN_X86_EMU_LAPIC | XEN_X86_EMU_HPET | \ - XEN_X86_EMU_PM | XEN_X86_EMU_RTC | \ - XEN_X86_EMU_IOAPIC | XEN_X86_EMU_PIC | \ - XEN_X86_EMU_VGA | XEN_X86_EMU_IOMMU | \ - XEN_X86_EMU_PIT | XEN_X86_EMU_USE_PIRQ |\ - XEN_X86_EMU_VPCI) - uint32_t emulation_flags; -}; - -/* Location of online VCPU bitmap. */ -#define XEN_ACPI_CPU_MAP 0xaf00 -#define XEN_ACPI_CPU_MAP_LEN ((HVM_MAX_VCPUS + 7) / 8) - -/* GPE0 bit set during CPU hotplug */ -#define XEN_ACPI_GPE0_CPUHP_BIT 2 -#endif - -/* - * Representations of architectural CPUID and MSR information. Used as the - * serialised version of Xen's internal representation. - */ -typedef struct xen_cpuid_leaf { -#define XEN_CPUID_NO_SUBLEAF 0xffffffffu - uint32_t leaf, subleaf; - uint32_t a, b, c, d; -} xen_cpuid_leaf_t; -DEFINE_XEN_GUEST_HANDLE(xen_cpuid_leaf_t); - -typedef struct xen_msr_entry { - uint32_t idx; - uint32_t flags; /* Reserved MBZ. */ - uint64_t val; -} xen_msr_entry_t; -DEFINE_XEN_GUEST_HANDLE(xen_msr_entry_t); - -#endif /* !__ASSEMBLY__ */ - -/* - * ` enum neg_errnoval - * ` HYPERVISOR_fpu_taskswitch(int set); - * ` - * Sets (if set!=0) or clears (if set==0) CR0.TS. - */ - -/* - * ` enum neg_errnoval - * ` HYPERVISOR_set_debugreg(int regno, unsigned long value); - * - * ` unsigned long - * ` HYPERVISOR_get_debugreg(int regno); - * For 0<=reg<=7, returns the debug register value. - * For other values of reg, returns ((unsigned long)-EINVAL). - * (Unfortunately, this interface is defective.) - */ - -/* - * Prefix forces emulation of some non-trapping instructions. - * Currently only CPUID. - */ -#ifdef __ASSEMBLY__ -#define XEN_EMULATE_PREFIX .byte 0x0f,0x0b,0x78,0x65,0x6e ; -#define XEN_CPUID XEN_EMULATE_PREFIX cpuid -#else -#define XEN_EMULATE_PREFIX ".byte 0x0f,0x0b,0x78,0x65,0x6e ; " -#define XEN_CPUID XEN_EMULATE_PREFIX "cpuid" -#endif - -/* - * Debug console IO port, also called "port E9 hack". Each character written - * to this IO port will be printed on the hypervisor console, subject to log - * level restrictions. - */ -#define XEN_HVM_DEBUGCONS_IOPORT 0xe9 - -#endif /* __XEN_PUBLIC_ARCH_X86_XEN_H__ */ - -/* - * Local variables: - * mode: C - * c-file-style: "BSD" - * c-basic-offset: 4 - * tab-width: 4 - * indent-tabs-mode: nil - * End: - */ diff --git a/sys/xen/interface/arch-x86_32.h b/sys/xen/interface/arch-x86_32.h deleted file mode 100644 index dfabdcc3453f..000000000000 --- a/sys/xen/interface/arch-x86_32.h +++ /dev/null @@ -1,27 +0,0 @@ -/****************************************************************************** - * arch-x86_32.h - * - * Guest OS interface to x86 32-bit Xen. - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to - * deal in the Software without restriction, including without limitation the - * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or - * sell copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - * - * Copyright (c) 2004-2006, K A Fraser - */ - -#include "arch-x86/xen.h" diff --git a/sys/xen/interface/arch-x86_64.h b/sys/xen/interface/arch-x86_64.h deleted file mode 100644 index c40b3f96516b..000000000000 --- a/sys/xen/interface/arch-x86_64.h +++ /dev/null @@ -1,43 +0,0 @@ -/****************************************************************************** - * arch-x86_64.h - * - * Guest OS interface to x86 64-bit Xen. - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to - * deal in the Software without restriction, including without limitation the - * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or - * sell copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - * - * Copyright (c) 2004-2006, K A Fraser - */ - -#include "arch-x86/xen.h" - -/* - * ` enum neg_errnoval - * ` HYPERVISOR_set_callbacks(unsigned long event_selector, - * ` unsigned long event_address, - * ` unsigned long failsafe_selector, - * ` unsigned long failsafe_address); - * ` - * Register for callbacks on events. When an event (from an event - * channel) occurs, event_address is used as the value of eip. - * - * A similar callback occurs if the segment selectors are invalid. - * failsafe_address is used as the value of eip. - * - * On x86_64, event_selector and failsafe_selector are ignored (???). - */ diff --git a/sys/xen/interface/argo.h b/sys/xen/interface/argo.h deleted file mode 100644 index 6b645f34e61b..000000000000 --- a/sys/xen/interface/argo.h +++ /dev/null @@ -1,255 +0,0 @@ -/****************************************************************************** - * Argo : Hypervisor-Mediated data eXchange - * - * Derived from v4v, the version 2 of v2v. - * - * Copyright (c) 2010, Citrix Systems - * Copyright (c) 2018-2019, BAE Systems - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to - * deal in the Software without restriction, including without limitation the - * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or - * sell copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - * - */ - -#ifndef __XEN_PUBLIC_ARGO_H__ -#define __XEN_PUBLIC_ARGO_H__ - -#include "xen.h" - -#define XEN_ARGO_DOMID_ANY DOMID_INVALID - -/* The maximum size of an Argo ring is defined to be: 16MB (0x1000000 bytes). */ -#define XEN_ARGO_MAX_RING_SIZE (0x1000000ULL) - -/* Fixed-width type for "argo port" number. Nothing to do with evtchns. */ -typedef uint32_t xen_argo_port_t; - -/* gfn type: 64-bit fixed-width on all architectures */ -typedef uint64_t xen_argo_gfn_t; - -/* - * XEN_ARGO_MAXIOV : maximum number of iovs accepted in a single sendv. - * Caution is required if this value is increased: this determines the size of - * an array of xen_argo_iov_t structs on the hypervisor stack, so could cause - * stack overflow if the value is too large. - * The Linux Argo driver never passes more than two iovs. -*/ -#define XEN_ARGO_MAXIOV 8U - -typedef struct xen_argo_iov -{ - XEN_GUEST_HANDLE(uint8) iov_hnd; - uint32_t iov_len; - uint32_t pad; -} xen_argo_iov_t; - -typedef struct xen_argo_addr -{ - xen_argo_port_t aport; - domid_t domain_id; - uint16_t pad; -} xen_argo_addr_t; - -typedef struct xen_argo_send_addr -{ - struct xen_argo_addr src; - struct xen_argo_addr dst; -} xen_argo_send_addr_t; - -typedef struct xen_argo_ring -{ - /* Guests should use atomic operations to access rx_ptr */ - uint32_t rx_ptr; - /* Guests should use atomic operations to access tx_ptr */ - uint32_t tx_ptr; - /* - * Header space reserved for later use. Align the start of the ring to a - * multiple of the message slot size. - */ - uint8_t reserved[56]; - uint8_t ring[XEN_FLEX_ARRAY_DIM]; -} xen_argo_ring_t; - -typedef struct xen_argo_register_ring -{ - xen_argo_port_t aport; - domid_t partner_id; - uint16_t pad; - uint32_t len; -} xen_argo_register_ring_t; - -typedef struct xen_argo_unregister_ring -{ - xen_argo_port_t aport; - domid_t partner_id; - uint16_t pad; -} xen_argo_unregister_ring_t; - -/* Messages on the ring are padded to a multiple of this size. */ -#define XEN_ARGO_MSG_SLOT_SIZE 0x10 - -/* - * Notify flags - */ -/* Ring exists */ -#define XEN_ARGO_RING_EXISTS (1U << 0) -/* Ring is shared, not unicast */ -#define XEN_ARGO_RING_SHARED (1U << 1) -/* Ring is empty */ -#define XEN_ARGO_RING_EMPTY (1U << 2) -/* Sufficient space to queue space_required bytes might exist */ -#define XEN_ARGO_RING_SUFFICIENT (1U << 3) -/* Insufficient ring size for space_required bytes */ -#define XEN_ARGO_RING_EMSGSIZE (1U << 4) -/* Too many domains waiting for available space signals for this ring */ -#define XEN_ARGO_RING_EBUSY (1U << 5) - -typedef struct xen_argo_ring_data_ent -{ - struct xen_argo_addr ring; - uint16_t flags; - uint16_t pad; - uint32_t space_required; - uint32_t max_message_size; -} xen_argo_ring_data_ent_t; - -typedef struct xen_argo_ring_data -{ - uint32_t nent; - uint32_t pad; - struct xen_argo_ring_data_ent data[XEN_FLEX_ARRAY_DIM]; -} xen_argo_ring_data_t; - -struct xen_argo_ring_message_header -{ - uint32_t len; - struct xen_argo_addr source; - uint32_t message_type; - uint8_t data[XEN_FLEX_ARRAY_DIM]; -}; - -/* - * Hypercall operations - */ - -/* - * XEN_ARGO_OP_register_ring - * - * Register a ring using the guest-supplied memory pages. - * Also used to reregister an existing ring (eg. after resume from hibernate). - * - * The first argument struct indicates the port number for the ring to register - * and the partner domain, if any, that is to be allowed to send to the ring. - * A wildcard (XEN_ARGO_DOMID_ANY) may be supplied instead of a partner domid, - * and if the hypervisor has wildcard sender rings enabled, this will allow - * any domain (XSM notwithstanding) to send to the ring. - * - * The second argument is an array of guest frame numbers and the third argument - * indicates the size of the array. This operation only supports 4K-sized pages. - * - * arg1: XEN_GUEST_HANDLE(xen_argo_register_ring_t) - * arg2: XEN_GUEST_HANDLE(xen_argo_gfn_t) - * arg3: unsigned long npages - * arg4: unsigned long flags (32-bit value) - */ -#define XEN_ARGO_OP_register_ring 1 - -/* Register op flags */ -/* - * Fail exist: - * If set, reject attempts to (re)register an existing established ring. - * If clear, reregistration occurs if the ring exists, with the new ring - * taking the place of the old, preserving tx_ptr if it remains valid. - */ -#define XEN_ARGO_REGISTER_FLAG_FAIL_EXIST 0x1 - -#ifdef __XEN__ -/* Mask for all defined flags. */ -#define XEN_ARGO_REGISTER_FLAG_MASK XEN_ARGO_REGISTER_FLAG_FAIL_EXIST -#endif - -/* - * XEN_ARGO_OP_unregister_ring - * - * Unregister a previously-registered ring, ending communication. - * - * arg1: XEN_GUEST_HANDLE(xen_argo_unregister_ring_t) - * arg2: NULL - * arg3: 0 (ZERO) - * arg4: 0 (ZERO) - */ -#define XEN_ARGO_OP_unregister_ring 2 - -/* - * XEN_ARGO_OP_sendv - * - * Send a list of buffers contained in iovs. - * - * The send address struct specifies the source and destination addresses - * for the message being sent, which are used to find the destination ring: - * Xen first looks for a most-specific match with a registered ring with - * (id.addr == dst) and (id.partner == sending_domain) ; - * if that fails, it then looks for a wildcard match (aka multicast receiver) - * where (id.addr == dst) and (id.partner == DOMID_ANY). - * - * For each iov entry, send iov_len bytes from iov_base to the destination ring. - * If insufficient space exists in the destination ring, it will return -EAGAIN - * and Xen will notify the caller when sufficient space becomes available. - * - * The message type is a 32-bit data field available to communicate message - * context data (eg. kernel-to-kernel, rather than application layer). - * - * arg1: XEN_GUEST_HANDLE(xen_argo_send_addr_t) source and dest addresses - * arg2: XEN_GUEST_HANDLE(xen_argo_iov_t) iovs - * arg3: unsigned long niov - * arg4: unsigned long message type (32-bit value) - */ -#define XEN_ARGO_OP_sendv 3 - -/* - * XEN_ARGO_OP_notify - * - * Asks Xen for information about other rings in the system. - * - * ent->ring is the xen_argo_addr_t of the ring you want information on. - * Uses the same ring matching rules as XEN_ARGO_OP_sendv. - * - * ent->space_required : if this field is not null then Xen will check - * that there is space in the destination ring for this many bytes of payload. - * If the ring is too small for the requested space_required, it will set the - * XEN_ARGO_RING_EMSGSIZE flag on return. - * If sufficient space is available, it will set XEN_ARGO_RING_SUFFICIENT - * and CANCEL any pending notification for that ent->ring; otherwise it - * will schedule a notification event and the flag will not be set. - * - * These flags are set by Xen when notify replies: - * XEN_ARGO_RING_EXISTS ring exists - * XEN_ARGO_RING_SHARED ring is registered for wildcard partner - * XEN_ARGO_RING_EMPTY ring is empty - * XEN_ARGO_RING_SUFFICIENT sufficient space for space_required is there - * XEN_ARGO_RING_EMSGSIZE space_required is too large for the ring size - * XEN_ARGO_RING_EBUSY too many domains waiting for available space signals - * - * arg1: XEN_GUEST_HANDLE(xen_argo_ring_data_t) ring_data (may be NULL) - * arg2: NULL - * arg3: 0 (ZERO) - * arg4: 0 (ZERO) - */ -#define XEN_ARGO_OP_notify 4 - -#endif diff --git a/sys/xen/interface/callback.h b/sys/xen/interface/callback.h deleted file mode 100644 index 8f937880e200..000000000000 --- a/sys/xen/interface/callback.h +++ /dev/null @@ -1,121 +0,0 @@ -/****************************************************************************** - * callback.h - * - * Register guest OS callbacks with Xen. - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to - * deal in the Software without restriction, including without limitation the - * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or - * sell copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - * - * Copyright (c) 2006, Ian Campbell - */ - -#ifndef __XEN_PUBLIC_CALLBACK_H__ -#define __XEN_PUBLIC_CALLBACK_H__ - -#include "xen.h" - -/* - * Prototype for this hypercall is: - * long callback_op(int cmd, void *extra_args) - * @cmd == CALLBACKOP_??? (callback operation). - * @extra_args == Operation-specific extra arguments (NULL if none). - */ - -/* x86: Callback for event delivery. */ -#define CALLBACKTYPE_event 0 - -/* x86: Failsafe callback when guest state cannot be restored by Xen. */ -#define CALLBACKTYPE_failsafe 1 - -/* x86/64 hypervisor: Syscall by 64-bit guest app ('64-on-64-on-64'). */ -#define CALLBACKTYPE_syscall 2 - -/* - * x86/32 hypervisor: Only available on x86/32 when supervisor_mode_kernel - * feature is enabled. Do not use this callback type in new code. - */ -#define CALLBACKTYPE_sysenter_deprecated 3 - -/* x86: Callback for NMI delivery. */ -#define CALLBACKTYPE_nmi 4 - -/* - * x86: sysenter is only available as follows: - * - 32-bit hypervisor: with the supervisor_mode_kernel feature enabled - * - 64-bit hypervisor: 32-bit guest applications on Intel CPUs - * ('32-on-32-on-64', '32-on-64-on-64') - * [nb. also 64-bit guest applications on Intel CPUs - * ('64-on-64-on-64'), but syscall is preferred] - */ -#define CALLBACKTYPE_sysenter 5 - -/* - * x86/64 hypervisor: Syscall by 32-bit guest app on AMD CPUs - * ('32-on-32-on-64', '32-on-64-on-64') - */ -#define CALLBACKTYPE_syscall32 7 - -/* - * Disable event deliver during callback? This flag is ignored for event and - * NMI callbacks: event delivery is unconditionally disabled. - */ -#define _CALLBACKF_mask_events 0 -#define CALLBACKF_mask_events (1U << _CALLBACKF_mask_events) - -/* - * Register a callback. - */ -#define CALLBACKOP_register 0 -struct callback_register { - uint16_t type; - uint16_t flags; - xen_callback_t address; -}; -typedef struct callback_register callback_register_t; -DEFINE_XEN_GUEST_HANDLE(callback_register_t); - -/* - * Unregister a callback. - * - * Not all callbacks can be unregistered. -EINVAL will be returned if - * you attempt to unregister such a callback. - */ -#define CALLBACKOP_unregister 1 -struct callback_unregister { - uint16_t type; - uint16_t _unused; -}; -typedef struct callback_unregister callback_unregister_t; -DEFINE_XEN_GUEST_HANDLE(callback_unregister_t); - -#if __XEN_INTERFACE_VERSION__ < 0x00030207 -#undef CALLBACKTYPE_sysenter -#define CALLBACKTYPE_sysenter CALLBACKTYPE_sysenter_deprecated -#endif - -#endif /* __XEN_PUBLIC_CALLBACK_H__ */ - -/* - * Local variables: - * mode: C - * c-file-style: "BSD" - * c-basic-offset: 4 - * tab-width: 4 - * indent-tabs-mode: nil - * End: - */ diff --git a/sys/xen/interface/device_tree_defs.h b/sys/xen/interface/device_tree_defs.h deleted file mode 100644 index 209d43de3f95..000000000000 --- a/sys/xen/interface/device_tree_defs.h +++ /dev/null @@ -1,42 +0,0 @@ -#ifndef __XEN_DEVICE_TREE_DEFS_H__ -#define __XEN_DEVICE_TREE_DEFS_H__ - -#if defined(__XEN__) || defined(__XEN_TOOLS__) -/* - * The device tree compiler (DTC) is allocating the phandle from 1 to - * onwards. Reserve a high value for the GIC phandle. - */ -#define GUEST_PHANDLE_GIC (65000) - -#define GUEST_ROOT_ADDRESS_CELLS 2 -#define GUEST_ROOT_SIZE_CELLS 2 - -/** - * IRQ line type. - * - * DT_IRQ_TYPE_NONE - default, unspecified type - * DT_IRQ_TYPE_EDGE_RISING - rising edge triggered - * DT_IRQ_TYPE_EDGE_FALLING - falling edge triggered - * DT_IRQ_TYPE_EDGE_BOTH - rising and falling edge triggered - * DT_IRQ_TYPE_LEVEL_HIGH - high level triggered - * DT_IRQ_TYPE_LEVEL_LOW - low level triggered - * DT_IRQ_TYPE_LEVEL_MASK - Mask to filter out the level bits - * DT_IRQ_TYPE_SENSE_MASK - Mask for all the above bits - * DT_IRQ_TYPE_INVALID - Use to initialize the type - */ -#define DT_IRQ_TYPE_NONE 0x00000000 -#define DT_IRQ_TYPE_EDGE_RISING 0x00000001 -#define DT_IRQ_TYPE_EDGE_FALLING 0x00000002 -#define DT_IRQ_TYPE_EDGE_BOTH \ - (DT_IRQ_TYPE_EDGE_FALLING | DT_IRQ_TYPE_EDGE_RISING) -#define DT_IRQ_TYPE_LEVEL_HIGH 0x00000004 -#define DT_IRQ_TYPE_LEVEL_LOW 0x00000008 -#define DT_IRQ_TYPE_LEVEL_MASK \ - (DT_IRQ_TYPE_LEVEL_LOW | DT_IRQ_TYPE_LEVEL_HIGH) -#define DT_IRQ_TYPE_SENSE_MASK 0x0000000f - -#define DT_IRQ_TYPE_INVALID 0x00000010 - -#endif - -#endif diff --git a/sys/xen/interface/dom0_ops.h b/sys/xen/interface/dom0_ops.h deleted file mode 100644 index 76598dda18ae..000000000000 --- a/sys/xen/interface/dom0_ops.h +++ /dev/null @@ -1,120 +0,0 @@ -/****************************************************************************** - * dom0_ops.h - * - * Process command requests from domain-0 guest OS. - * - * 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) 2002-2003, B Dragovic - * Copyright (c) 2002-2006, K Fraser - */ - -#ifndef __XEN_PUBLIC_DOM0_OPS_H__ -#define __XEN_PUBLIC_DOM0_OPS_H__ - -#include "xen.h" -#include "platform.h" - -#if __XEN_INTERFACE_VERSION__ >= 0x00030204 -#error "dom0_ops.h is a compatibility interface only" -#endif - -#define DOM0_INTERFACE_VERSION XENPF_INTERFACE_VERSION - -#define DOM0_SETTIME XENPF_settime -#define dom0_settime xenpf_settime -#define dom0_settime_t xenpf_settime_t - -#define DOM0_ADD_MEMTYPE XENPF_add_memtype -#define dom0_add_memtype xenpf_add_memtype -#define dom0_add_memtype_t xenpf_add_memtype_t - -#define DOM0_DEL_MEMTYPE XENPF_del_memtype -#define dom0_del_memtype xenpf_del_memtype -#define dom0_del_memtype_t xenpf_del_memtype_t - -#define DOM0_READ_MEMTYPE XENPF_read_memtype -#define dom0_read_memtype xenpf_read_memtype -#define dom0_read_memtype_t xenpf_read_memtype_t - -#define DOM0_MICROCODE XENPF_microcode_update -#define dom0_microcode xenpf_microcode_update -#define dom0_microcode_t xenpf_microcode_update_t - -#define DOM0_PLATFORM_QUIRK XENPF_platform_quirk -#define dom0_platform_quirk xenpf_platform_quirk -#define dom0_platform_quirk_t xenpf_platform_quirk_t - -typedef uint64_t cpumap_t; - -/* Unsupported legacy operation -- defined for API compatibility. */ -#define DOM0_MSR 15 -struct dom0_msr { - /* IN variables. */ - uint32_t write; - cpumap_t cpu_mask; - uint32_t msr; - uint32_t in1; - uint32_t in2; - /* OUT variables. */ - uint32_t out1; - uint32_t out2; -}; -typedef struct dom0_msr dom0_msr_t; -DEFINE_XEN_GUEST_HANDLE(dom0_msr_t); - -/* Unsupported legacy operation -- defined for API compatibility. */ -#define DOM0_PHYSICAL_MEMORY_MAP 40 -struct dom0_memory_map_entry { - uint64_t start, end; - uint32_t flags; /* reserved */ - uint8_t is_ram; -}; -typedef struct dom0_memory_map_entry dom0_memory_map_entry_t; -DEFINE_XEN_GUEST_HANDLE(dom0_memory_map_entry_t); - -struct dom0_op { - uint32_t cmd; - uint32_t interface_version; /* DOM0_INTERFACE_VERSION */ - union { - struct dom0_msr msr; - struct dom0_settime settime; - struct dom0_add_memtype add_memtype; - struct dom0_del_memtype del_memtype; - struct dom0_read_memtype read_memtype; - struct dom0_microcode microcode; - struct dom0_platform_quirk platform_quirk; - struct dom0_memory_map_entry physical_memory_map; - uint8_t pad[128]; - } u; -}; -typedef struct dom0_op dom0_op_t; -DEFINE_XEN_GUEST_HANDLE(dom0_op_t); - -#endif /* __XEN_PUBLIC_DOM0_OPS_H__ */ - -/* - * Local variables: - * mode: C - * c-file-style: "BSD" - * c-basic-offset: 4 - * tab-width: 4 - * indent-tabs-mode: nil - * End: - */ diff --git a/sys/xen/interface/domctl.h b/sys/xen/interface/domctl.h deleted file mode 100644 index f41672249111..000000000000 --- a/sys/xen/interface/domctl.h +++ /dev/null @@ -1,1298 +0,0 @@ -/****************************************************************************** - * domctl.h - * - * Domain management operations. For use by node control stack. - * - * 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) 2002-2003, B Dragovic - * Copyright (c) 2002-2006, K Fraser - */ - -#ifndef __XEN_PUBLIC_DOMCTL_H__ -#define __XEN_PUBLIC_DOMCTL_H__ - -#if !defined(__XEN__) && !defined(__XEN_TOOLS__) -#error "domctl operations are intended for use by node control tools only" -#endif - -#include "xen.h" -#include "event_channel.h" -#include "grant_table.h" -#include "hvm/save.h" -#include "memory.h" - -#define XEN_DOMCTL_INTERFACE_VERSION 0x00000012 - -/* - * NB. xen_domctl.domain is an IN/OUT parameter for this operation. - * If it is specified as an invalid value (0 or >= DOMID_FIRST_RESERVED), - * an id is auto-allocated and returned. - */ -/* XEN_DOMCTL_createdomain */ -struct xen_domctl_createdomain { - /* IN parameters */ - uint32_t ssidref; - xen_domain_handle_t handle; - /* Is this an HVM guest (as opposed to a PV guest)? */ -#define _XEN_DOMCTL_CDF_hvm 0 -#define XEN_DOMCTL_CDF_hvm (1U<<_XEN_DOMCTL_CDF_hvm) - /* Use hardware-assisted paging if available? */ -#define _XEN_DOMCTL_CDF_hap 1 -#define XEN_DOMCTL_CDF_hap (1U<<_XEN_DOMCTL_CDF_hap) - /* Should domain memory integrity be verifed by tboot during Sx? */ -#define _XEN_DOMCTL_CDF_s3_integrity 2 -#define XEN_DOMCTL_CDF_s3_integrity (1U<<_XEN_DOMCTL_CDF_s3_integrity) - /* Disable out-of-sync shadow page tables? */ -#define _XEN_DOMCTL_CDF_oos_off 3 -#define XEN_DOMCTL_CDF_oos_off (1U<<_XEN_DOMCTL_CDF_oos_off) - /* Is this a xenstore domain? */ -#define _XEN_DOMCTL_CDF_xs_domain 4 -#define XEN_DOMCTL_CDF_xs_domain (1U<<_XEN_DOMCTL_CDF_xs_domain) - /* Should this domain be permitted to use the IOMMU? */ -#define _XEN_DOMCTL_CDF_iommu 5 -#define XEN_DOMCTL_CDF_iommu (1U<<_XEN_DOMCTL_CDF_iommu) - -/* Max XEN_DOMCTL_CDF_* constant. Used for ABI checking. */ -#define XEN_DOMCTL_CDF_MAX XEN_DOMCTL_CDF_iommu - - uint32_t flags; - -#define _XEN_DOMCTL_IOMMU_no_sharept 0 -#define XEN_DOMCTL_IOMMU_no_sharept (1U << _XEN_DOMCTL_IOMMU_no_sharept) - -/* Max XEN_DOMCTL_IOMMU_* constant. Used for ABI checking. */ -#define XEN_DOMCTL_IOMMU_MAX XEN_DOMCTL_IOMMU_no_sharept - - uint32_t iommu_opts; - - /* - * Various domain limits, which impact the quantity of resources - * (global mapping space, xenheap, etc) a guest may consume. For - * max_grant_frames and max_maptrack_frames, < 0 means "use the - * default maximum value in the hypervisor". - */ - uint32_t max_vcpus; - uint32_t max_evtchn_port; - int32_t max_grant_frames; - int32_t max_maptrack_frames; - - struct xen_arch_domainconfig arch; -}; - -/* XEN_DOMCTL_getdomaininfo */ -struct xen_domctl_getdomaininfo { - /* OUT variables. */ - domid_t domain; /* Also echoed in domctl.domain */ - /* Domain is scheduled to die. */ -#define _XEN_DOMINF_dying 0 -#define XEN_DOMINF_dying (1U<<_XEN_DOMINF_dying) - /* Domain is an HVM guest (as opposed to a PV guest). */ -#define _XEN_DOMINF_hvm_guest 1 -#define XEN_DOMINF_hvm_guest (1U<<_XEN_DOMINF_hvm_guest) - /* The guest OS has shut down. */ -#define _XEN_DOMINF_shutdown 2 -#define XEN_DOMINF_shutdown (1U<<_XEN_DOMINF_shutdown) - /* Currently paused by control software. */ -#define _XEN_DOMINF_paused 3 -#define XEN_DOMINF_paused (1U<<_XEN_DOMINF_paused) - /* Currently blocked pending an event. */ -#define _XEN_DOMINF_blocked 4 -#define XEN_DOMINF_blocked (1U<<_XEN_DOMINF_blocked) - /* Domain is currently running. */ -#define _XEN_DOMINF_running 5 -#define XEN_DOMINF_running (1U<<_XEN_DOMINF_running) - /* Being debugged. */ -#define _XEN_DOMINF_debugged 6 -#define XEN_DOMINF_debugged (1U<<_XEN_DOMINF_debugged) -/* domain is a xenstore domain */ -#define _XEN_DOMINF_xs_domain 7 -#define XEN_DOMINF_xs_domain (1U<<_XEN_DOMINF_xs_domain) -/* domain has hardware assisted paging */ -#define _XEN_DOMINF_hap 8 -#define XEN_DOMINF_hap (1U<<_XEN_DOMINF_hap) - /* XEN_DOMINF_shutdown guest-supplied code. */ -#define XEN_DOMINF_shutdownmask 255 -#define XEN_DOMINF_shutdownshift 16 - uint32_t flags; /* XEN_DOMINF_* */ - uint64_aligned_t tot_pages; - uint64_aligned_t max_pages; - uint64_aligned_t outstanding_pages; - uint64_aligned_t shr_pages; - uint64_aligned_t paged_pages; - uint64_aligned_t shared_info_frame; /* GMFN of shared_info struct */ - uint64_aligned_t cpu_time; - uint32_t nr_online_vcpus; /* Number of VCPUs currently online. */ -#define XEN_INVALID_MAX_VCPU_ID (~0U) /* Domain has no vcpus? */ - uint32_t max_vcpu_id; /* Maximum VCPUID in use by this domain. */ - uint32_t ssidref; - xen_domain_handle_t handle; - uint32_t cpupool; - struct xen_arch_domainconfig arch_config; -}; -typedef struct xen_domctl_getdomaininfo xen_domctl_getdomaininfo_t; -DEFINE_XEN_GUEST_HANDLE(xen_domctl_getdomaininfo_t); - - -/* XEN_DOMCTL_getpageframeinfo */ - -#define XEN_DOMCTL_PFINFO_LTAB_SHIFT 28 -#define XEN_DOMCTL_PFINFO_NOTAB (0x0U<<28) -#define XEN_DOMCTL_PFINFO_L1TAB (0x1U<<28) -#define XEN_DOMCTL_PFINFO_L2TAB (0x2U<<28) -#define XEN_DOMCTL_PFINFO_L3TAB (0x3U<<28) -#define XEN_DOMCTL_PFINFO_L4TAB (0x4U<<28) -#define XEN_DOMCTL_PFINFO_LTABTYPE_MASK (0x7U<<28) -#define XEN_DOMCTL_PFINFO_LPINTAB (0x1U<<31) -#define XEN_DOMCTL_PFINFO_XTAB (0xfU<<28) /* invalid page */ -#define XEN_DOMCTL_PFINFO_XALLOC (0xeU<<28) /* allocate-only page */ -#define XEN_DOMCTL_PFINFO_BROKEN (0xdU<<28) /* broken page */ -#define XEN_DOMCTL_PFINFO_LTAB_MASK (0xfU<<28) - -/* XEN_DOMCTL_getpageframeinfo3 */ -/* - * Both value `num' and `array' may get modified by the hypercall to allow - * preemption. - */ -struct xen_domctl_getpageframeinfo3 { - /* IN variables. */ - uint64_aligned_t num; - /* IN/OUT variables. */ - XEN_GUEST_HANDLE_64(xen_pfn_t) array; -}; - - -/* - * Control shadow pagetables operation - */ -/* XEN_DOMCTL_shadow_op */ - -/* Disable shadow mode. */ -#define XEN_DOMCTL_SHADOW_OP_OFF 0 - -/* Enable shadow mode (mode contains ORed XEN_DOMCTL_SHADOW_ENABLE_* flags). */ -#define XEN_DOMCTL_SHADOW_OP_ENABLE 32 - -/* Log-dirty bitmap operations. */ - /* Return the bitmap and clean internal copy for next round. */ -#define XEN_DOMCTL_SHADOW_OP_CLEAN 11 - /* Return the bitmap but do not modify internal copy. */ -#define XEN_DOMCTL_SHADOW_OP_PEEK 12 - -/* Memory allocation accessors. */ -#define XEN_DOMCTL_SHADOW_OP_GET_ALLOCATION 30 -#define XEN_DOMCTL_SHADOW_OP_SET_ALLOCATION 31 - -/* Legacy enable operations. */ - /* Equiv. to ENABLE with no mode flags. */ -#define XEN_DOMCTL_SHADOW_OP_ENABLE_TEST 1 - /* Equiv. to ENABLE with mode flag ENABLE_LOG_DIRTY. */ -#define XEN_DOMCTL_SHADOW_OP_ENABLE_LOGDIRTY 2 - /* - * No longer supported, was equiv. to ENABLE with mode flags - * ENABLE_REFCOUNT and ENABLE_TRANSLATE: -#define XEN_DOMCTL_SHADOW_OP_ENABLE_TRANSLATE 3 - */ - -/* Mode flags for XEN_DOMCTL_SHADOW_OP_ENABLE. */ - /* - * Shadow pagetables are refcounted: guest does not use explicit mmu - * operations nor write-protect its pagetables. - */ -#define XEN_DOMCTL_SHADOW_ENABLE_REFCOUNT (1 << 1) - /* - * Log pages in a bitmap as they are dirtied. - * Used for live relocation to determine which pages must be re-sent. - */ -#define XEN_DOMCTL_SHADOW_ENABLE_LOG_DIRTY (1 << 2) - /* - * Automatically translate GPFNs into MFNs. - */ -#define XEN_DOMCTL_SHADOW_ENABLE_TRANSLATE (1 << 3) - /* - * Xen does not steal virtual address space from the guest. - * Requires HVM support. - */ -#define XEN_DOMCTL_SHADOW_ENABLE_EXTERNAL (1 << 4) - -/* Mode flags for XEN_DOMCTL_SHADOW_OP_{CLEAN,PEEK}. */ - /* - * This is the final iteration: Requesting to include pages mapped - * writably by the hypervisor in the dirty bitmap. - */ -#define XEN_DOMCTL_SHADOW_LOGDIRTY_FINAL (1 << 0) - -struct xen_domctl_shadow_op_stats { - uint32_t fault_count; - uint32_t dirty_count; -}; - -struct xen_domctl_shadow_op { - /* IN variables. */ - uint32_t op; /* XEN_DOMCTL_SHADOW_OP_* */ - - /* OP_ENABLE: XEN_DOMCTL_SHADOW_ENABLE_* */ - /* OP_PEAK / OP_CLEAN: XEN_DOMCTL_SHADOW_LOGDIRTY_* */ - uint32_t mode; - - /* OP_GET_ALLOCATION / OP_SET_ALLOCATION */ - uint32_t mb; /* Shadow memory allocation in MB */ - - /* OP_PEEK / OP_CLEAN */ - XEN_GUEST_HANDLE_64(uint8) dirty_bitmap; - uint64_aligned_t pages; /* Size of buffer. Updated with actual size. */ - struct xen_domctl_shadow_op_stats stats; -}; - - -/* XEN_DOMCTL_max_mem */ -struct xen_domctl_max_mem { - /* IN variables. */ - uint64_aligned_t max_memkb; -}; - - -/* XEN_DOMCTL_setvcpucontext */ -/* XEN_DOMCTL_getvcpucontext */ -struct xen_domctl_vcpucontext { - uint32_t vcpu; /* IN */ - XEN_GUEST_HANDLE_64(vcpu_guest_context_t) ctxt; /* IN/OUT */ -}; - - -/* XEN_DOMCTL_getvcpuinfo */ -struct xen_domctl_getvcpuinfo { - /* IN variables. */ - uint32_t vcpu; - /* OUT variables. */ - uint8_t online; /* currently online (not hotplugged)? */ - uint8_t blocked; /* blocked waiting for an event? */ - uint8_t running; /* currently scheduled on its CPU? */ - uint64_aligned_t cpu_time; /* total cpu time consumed (ns) */ - uint32_t cpu; /* current mapping */ -}; - - -/* Get/set the NUMA node(s) with which the guest has affinity with. */ -/* XEN_DOMCTL_setnodeaffinity */ -/* XEN_DOMCTL_getnodeaffinity */ -struct xen_domctl_nodeaffinity { - struct xenctl_bitmap nodemap;/* IN */ -}; - - -/* Get/set which physical cpus a vcpu can execute on. */ -/* XEN_DOMCTL_setvcpuaffinity */ -/* XEN_DOMCTL_getvcpuaffinity */ -struct xen_domctl_vcpuaffinity { - /* IN variables. */ - uint32_t vcpu; - /* Set/get the hard affinity for vcpu */ -#define _XEN_VCPUAFFINITY_HARD 0 -#define XEN_VCPUAFFINITY_HARD (1U<<_XEN_VCPUAFFINITY_HARD) - /* Set/get the soft affinity for vcpu */ -#define _XEN_VCPUAFFINITY_SOFT 1 -#define XEN_VCPUAFFINITY_SOFT (1U<<_XEN_VCPUAFFINITY_SOFT) - /* Undo SCHEDOP_pin_override */ -#define _XEN_VCPUAFFINITY_FORCE 2 -#define XEN_VCPUAFFINITY_FORCE (1U<<_XEN_VCPUAFFINITY_FORCE) - uint32_t flags; - /* - * IN/OUT variables. - * - * Both are IN/OUT for XEN_DOMCTL_setvcpuaffinity, in which case they - * contain effective hard or/and soft affinity. That is, upon successful - * return, cpumap_soft, contains the intersection of the soft affinity, - * hard affinity and the cpupool's online CPUs for the domain (if - * XEN_VCPUAFFINITY_SOFT was set in flags). cpumap_hard contains the - * intersection between hard affinity and the cpupool's online CPUs (if - * XEN_VCPUAFFINITY_HARD was set in flags). - * - * Both are OUT-only for XEN_DOMCTL_getvcpuaffinity, in which case they - * contain the plain hard and/or soft affinity masks that were set during - * previous successful calls to XEN_DOMCTL_setvcpuaffinity (or the - * default values), without intersecting or altering them in any way. - */ - struct xenctl_bitmap cpumap_hard; - struct xenctl_bitmap cpumap_soft; -}; - - -/* - * XEN_DOMCTL_max_vcpus: - * - * The parameter passed to XEN_DOMCTL_max_vcpus must match the value passed to - * XEN_DOMCTL_createdomain. This hypercall is in the process of being removed - * (once the failure paths in domain_create() have been improved), but is - * still required in the short term to allocate the vcpus themselves. - */ -struct xen_domctl_max_vcpus { - uint32_t max; /* maximum number of vcpus */ -}; - - -/* XEN_DOMCTL_scheduler_op */ -/* Scheduler types. */ -/* #define XEN_SCHEDULER_SEDF 4 (Removed) */ -#define XEN_SCHEDULER_CREDIT 5 -#define XEN_SCHEDULER_CREDIT2 6 -#define XEN_SCHEDULER_ARINC653 7 -#define XEN_SCHEDULER_RTDS 8 -#define XEN_SCHEDULER_NULL 9 - -struct xen_domctl_sched_credit { - uint16_t weight; - uint16_t cap; -}; - -struct xen_domctl_sched_credit2 { - uint16_t weight; - uint16_t cap; -}; - -struct xen_domctl_sched_rtds { - uint32_t period; - uint32_t budget; -/* Can this vCPU execute beyond its reserved amount of time? */ -#define _XEN_DOMCTL_SCHEDRT_extra 0 -#define XEN_DOMCTL_SCHEDRT_extra (1U<<_XEN_DOMCTL_SCHEDRT_extra) - uint32_t flags; -}; - -typedef struct xen_domctl_schedparam_vcpu { - union { - struct xen_domctl_sched_credit credit; - struct xen_domctl_sched_credit2 credit2; - struct xen_domctl_sched_rtds rtds; - } u; - uint32_t vcpuid; -} xen_domctl_schedparam_vcpu_t; -DEFINE_XEN_GUEST_HANDLE(xen_domctl_schedparam_vcpu_t); - -/* - * Set or get info? - * For schedulers supporting per-vcpu settings (e.g., RTDS): - * XEN_DOMCTL_SCHEDOP_putinfo sets params for all vcpus; - * XEN_DOMCTL_SCHEDOP_getinfo gets default params; - * XEN_DOMCTL_SCHEDOP_put(get)vcpuinfo sets (gets) params of vcpus; - * - * For schedulers not supporting per-vcpu settings: - * XEN_DOMCTL_SCHEDOP_putinfo sets params for all vcpus; - * XEN_DOMCTL_SCHEDOP_getinfo gets domain-wise params; - * XEN_DOMCTL_SCHEDOP_put(get)vcpuinfo returns error; - */ -#define XEN_DOMCTL_SCHEDOP_putinfo 0 -#define XEN_DOMCTL_SCHEDOP_getinfo 1 -#define XEN_DOMCTL_SCHEDOP_putvcpuinfo 2 -#define XEN_DOMCTL_SCHEDOP_getvcpuinfo 3 -struct xen_domctl_scheduler_op { - uint32_t sched_id; /* XEN_SCHEDULER_* */ - uint32_t cmd; /* XEN_DOMCTL_SCHEDOP_* */ - /* IN/OUT */ - union { - struct xen_domctl_sched_credit credit; - struct xen_domctl_sched_credit2 credit2; - struct xen_domctl_sched_rtds rtds; - struct { - XEN_GUEST_HANDLE_64(xen_domctl_schedparam_vcpu_t) vcpus; - /* - * IN: Number of elements in vcpus array. - * OUT: Number of processed elements of vcpus array. - */ - uint32_t nr_vcpus; - uint32_t padding; - } v; - } u; -}; - - -/* XEN_DOMCTL_setdomainhandle */ -struct xen_domctl_setdomainhandle { - xen_domain_handle_t handle; -}; - - -/* XEN_DOMCTL_setdebugging */ -struct xen_domctl_setdebugging { - uint8_t enable; -}; - - -/* XEN_DOMCTL_irq_permission */ -struct xen_domctl_irq_permission { - uint8_t pirq; - uint8_t allow_access; /* flag to specify enable/disable of IRQ access */ -}; - - -/* XEN_DOMCTL_iomem_permission */ -struct xen_domctl_iomem_permission { - uint64_aligned_t first_mfn;/* first page (physical page number) in range */ - uint64_aligned_t nr_mfns; /* number of pages in range (>0) */ - uint8_t allow_access; /* allow (!0) or deny (0) access to range? */ -}; - - -/* XEN_DOMCTL_ioport_permission */ -struct xen_domctl_ioport_permission { - uint32_t first_port; /* first port int range */ - uint32_t nr_ports; /* size of port range */ - uint8_t allow_access; /* allow or deny access to range? */ -}; - - -/* XEN_DOMCTL_hypercall_init */ -struct xen_domctl_hypercall_init { - uint64_aligned_t gmfn; /* GMFN to be initialised */ -}; - - -/* XEN_DOMCTL_settimeoffset */ -struct xen_domctl_settimeoffset { - int64_aligned_t time_offset_seconds; /* applied to domain wallclock time */ -}; - -/* XEN_DOMCTL_gethvmcontext */ -/* XEN_DOMCTL_sethvmcontext */ -struct xen_domctl_hvmcontext { - uint32_t size; /* IN/OUT: size of buffer / bytes filled */ - XEN_GUEST_HANDLE_64(uint8) buffer; /* IN/OUT: data, or call - * gethvmcontext with NULL - * buffer to get size req'd */ -}; - - -/* XEN_DOMCTL_set_address_size */ -/* XEN_DOMCTL_get_address_size */ -struct xen_domctl_address_size { - uint32_t size; -}; - - -/* XEN_DOMCTL_sendtrigger */ -#define XEN_DOMCTL_SENDTRIGGER_NMI 0 -#define XEN_DOMCTL_SENDTRIGGER_RESET 1 -#define XEN_DOMCTL_SENDTRIGGER_INIT 2 -#define XEN_DOMCTL_SENDTRIGGER_POWER 3 -#define XEN_DOMCTL_SENDTRIGGER_SLEEP 4 -struct xen_domctl_sendtrigger { - uint32_t trigger; /* IN */ - uint32_t vcpu; /* IN */ -}; - - -/* Assign a device to a guest. Sets up IOMMU structures. */ -/* XEN_DOMCTL_assign_device */ -/* - * XEN_DOMCTL_test_assign_device: Pass DOMID_INVALID to find out whether the - * given device is assigned to any DomU at all. Pass a specific domain ID to - * find out whether the given device can be assigned to that domain. - */ -/* - * XEN_DOMCTL_deassign_device: The behavior of this DOMCTL differs - * between the different type of device: - * - PCI device (XEN_DOMCTL_DEV_PCI) will be reassigned to DOM0 - * - DT device (XEN_DOMCTL_DEV_DT) will left unassigned. DOM0 - * will have to call XEN_DOMCTL_assign_device in order to use the - * device. - */ -#define XEN_DOMCTL_DEV_PCI 0 -#define XEN_DOMCTL_DEV_DT 1 -struct xen_domctl_assign_device { - /* IN */ - uint32_t dev; /* XEN_DOMCTL_DEV_* */ - uint32_t flags; -#define XEN_DOMCTL_DEV_RDM_RELAXED 1 /* assign only */ - union { - struct { - uint32_t machine_sbdf; /* machine PCI ID of assigned device */ - } pci; - struct { - uint32_t size; /* Length of the path */ - XEN_GUEST_HANDLE_64(char) path; /* path to the device tree node */ - } dt; - } u; -}; - -/* Retrieve sibling devices information of machine_sbdf */ -/* XEN_DOMCTL_get_device_group */ -struct xen_domctl_get_device_group { - uint32_t machine_sbdf; /* IN */ - uint32_t max_sdevs; /* IN */ - uint32_t num_sdevs; /* OUT */ - XEN_GUEST_HANDLE_64(uint32) sdev_array; /* OUT */ -}; - -/* Pass-through interrupts: bind real irq -> hvm devfn. */ -/* XEN_DOMCTL_bind_pt_irq */ -/* XEN_DOMCTL_unbind_pt_irq */ -enum pt_irq_type { - PT_IRQ_TYPE_PCI, - PT_IRQ_TYPE_ISA, - PT_IRQ_TYPE_MSI, - PT_IRQ_TYPE_MSI_TRANSLATE, - PT_IRQ_TYPE_SPI, /* ARM: valid range 32-1019 */ -}; -struct xen_domctl_bind_pt_irq { - uint32_t machine_irq; - uint32_t irq_type; /* enum pt_irq_type */ - - union { - struct { - uint8_t isa_irq; - } isa; - struct { - uint8_t bus; - uint8_t device; - uint8_t intx; - } pci; - struct { - uint8_t gvec; - uint32_t gflags; -#define XEN_DOMCTL_VMSI_X86_DEST_ID_MASK 0x0000ff -#define XEN_DOMCTL_VMSI_X86_RH_MASK 0x000100 -#define XEN_DOMCTL_VMSI_X86_DM_MASK 0x000200 -#define XEN_DOMCTL_VMSI_X86_DELIV_MASK 0x007000 -#define XEN_DOMCTL_VMSI_X86_TRIG_MASK 0x008000 -#define XEN_DOMCTL_VMSI_X86_UNMASKED 0x010000 - - uint64_aligned_t gtable; - } msi; - struct { - uint16_t spi; - } spi; - } u; -}; - - -/* Bind machine I/O address range -> HVM address range. */ -/* XEN_DOMCTL_memory_mapping */ -/* Returns - - zero success, everything done - - -E2BIG passed in nr_mfns value too large for the implementation - - positive partial success for the first page frames (with - less than nr_mfns), requiring re-invocation by the - caller after updating inputs - - negative error; other than -E2BIG -*/ -#define DPCI_ADD_MAPPING 1 -#define DPCI_REMOVE_MAPPING 0 -struct xen_domctl_memory_mapping { - uint64_aligned_t first_gfn; /* first page (hvm guest phys page) in range */ - uint64_aligned_t first_mfn; /* first page (machine page) in range */ - uint64_aligned_t nr_mfns; /* number of pages in range (>0) */ - uint32_t add_mapping; /* add or remove mapping */ - uint32_t padding; /* padding for 64-bit aligned structure */ -}; - - -/* Bind machine I/O port range -> HVM I/O port range. */ -/* XEN_DOMCTL_ioport_mapping */ -struct xen_domctl_ioport_mapping { - uint32_t first_gport; /* first guest IO port*/ - uint32_t first_mport; /* first machine IO port */ - uint32_t nr_ports; /* size of port range */ - uint32_t add_mapping; /* add or remove mapping */ -}; - - -/* - * Pin caching type of RAM space for x86 HVM domU. - */ -/* XEN_DOMCTL_pin_mem_cacheattr */ -/* Caching types: these happen to be the same as x86 MTRR/PAT type codes. */ -#define XEN_DOMCTL_MEM_CACHEATTR_UC 0 -#define XEN_DOMCTL_MEM_CACHEATTR_WC 1 -#define XEN_DOMCTL_MEM_CACHEATTR_WT 4 -#define XEN_DOMCTL_MEM_CACHEATTR_WP 5 -#define XEN_DOMCTL_MEM_CACHEATTR_WB 6 -#define XEN_DOMCTL_MEM_CACHEATTR_UCM 7 -#define XEN_DOMCTL_DELETE_MEM_CACHEATTR (~(uint32_t)0) - - -/* XEN_DOMCTL_set_ext_vcpucontext */ -/* XEN_DOMCTL_get_ext_vcpucontext */ -struct xen_domctl_ext_vcpucontext { - /* IN: VCPU that this call applies to. */ - uint32_t vcpu; - /* - * SET: Size of struct (IN) - * GET: Size of struct (OUT, up to 128 bytes) - */ - uint32_t size; -#if defined(__i386__) || defined(__x86_64__) - /* SYSCALL from 32-bit mode and SYSENTER callback information. */ - /* NB. SYSCALL from 64-bit mode is contained in vcpu_guest_context_t */ - uint64_aligned_t syscall32_callback_eip; - uint64_aligned_t sysenter_callback_eip; - uint16_t syscall32_callback_cs; - uint16_t sysenter_callback_cs; - uint8_t syscall32_disables_events; - uint8_t sysenter_disables_events; -#if defined(__GNUC__) - union { - uint64_aligned_t mcg_cap; - struct hvm_vmce_vcpu vmce; - }; -#else - struct hvm_vmce_vcpu vmce; -#endif -#endif -}; - -/* - * Set the target domain for a domain - */ -/* XEN_DOMCTL_set_target */ -struct xen_domctl_set_target { - domid_t target; -}; - -#if defined(__i386__) || defined(__x86_64__) -# define XEN_CPUID_INPUT_UNUSED 0xFFFFFFFF - -/* - * XEN_DOMCTL_{get,set}_cpu_policy (x86 specific) - * - * Query or set the CPUID and MSR policies for a specific domain. - */ -struct xen_domctl_cpu_policy { - uint32_t nr_leaves; /* IN/OUT: Number of leaves in/written to - * 'cpuid_policy'. */ - uint32_t nr_msrs; /* IN/OUT: Number of MSRs in/written to - * 'msr_policy' */ - XEN_GUEST_HANDLE_64(xen_cpuid_leaf_t) cpuid_policy; /* IN/OUT */ - XEN_GUEST_HANDLE_64(xen_msr_entry_t) msr_policy; /* IN/OUT */ - - /* - * OUT, set_policy only. Written in some (but not all) error cases to - * identify the CPUID leaf/subleaf and/or MSR which auditing objects to. - */ - uint32_t err_leaf, err_subleaf, err_msr; -}; -typedef struct xen_domctl_cpu_policy xen_domctl_cpu_policy_t; -DEFINE_XEN_GUEST_HANDLE(xen_domctl_cpu_policy_t); -#endif - -/* - * Arranges that if the domain suspends (specifically, if it shuts - * down with code SHUTDOWN_suspend), this event channel will be - * notified. - * - * This is _instead of_ the usual notification to the global - * VIRQ_DOM_EXC. (In most systems that pirq is owned by xenstored.) - * - * Only one subscription per domain is possible. Last subscriber - * wins; others are silently displaced. - * - * NB that contrary to the rather general name, it only applies to - * domain shutdown with code suspend. Shutdown for other reasons - * (including crash), and domain death, are notified to VIRQ_DOM_EXC - * regardless. - */ -/* XEN_DOMCTL_subscribe */ -struct xen_domctl_subscribe { - uint32_t port; /* IN */ -}; - -/* XEN_DOMCTL_debug_op */ -#define XEN_DOMCTL_DEBUG_OP_SINGLE_STEP_OFF 0 -#define XEN_DOMCTL_DEBUG_OP_SINGLE_STEP_ON 1 -struct xen_domctl_debug_op { - uint32_t op; /* IN */ - uint32_t vcpu; /* IN */ -}; - -/* - * Request a particular record from the HVM context - */ -/* XEN_DOMCTL_gethvmcontext_partial */ -struct xen_domctl_hvmcontext_partial { - uint32_t type; /* IN: Type of record required */ - uint32_t instance; /* IN: Instance of that type */ - uint64_aligned_t bufsz; /* IN: size of buffer */ - XEN_GUEST_HANDLE_64(uint8) buffer; /* OUT: buffer to write record into */ -}; - -/* XEN_DOMCTL_disable_migrate */ -struct xen_domctl_disable_migrate { - uint32_t disable; /* IN: 1: disable migration and restore */ -}; - - -/* XEN_DOMCTL_gettscinfo */ -/* XEN_DOMCTL_settscinfo */ -struct xen_domctl_tsc_info { - /* IN/OUT */ - uint32_t tsc_mode; - uint32_t gtsc_khz; - uint32_t incarnation; - uint32_t pad; - uint64_aligned_t elapsed_nsec; -}; - -/* XEN_DOMCTL_gdbsx_guestmemio guest mem io */ -struct xen_domctl_gdbsx_memio { - /* IN */ - uint64_aligned_t pgd3val;/* optional: init_mm.pgd[3] value */ - uint64_aligned_t gva; /* guest virtual address */ - uint64_aligned_t uva; /* user buffer virtual address */ - uint32_t len; /* number of bytes to read/write */ - uint8_t gwr; /* 0 = read from guest. 1 = write to guest */ - /* OUT */ - uint32_t remain; /* bytes remaining to be copied */ -}; - -/* XEN_DOMCTL_gdbsx_pausevcpu */ -/* XEN_DOMCTL_gdbsx_unpausevcpu */ -struct xen_domctl_gdbsx_pauseunp_vcpu { /* pause/unpause a vcpu */ - uint32_t vcpu; /* which vcpu */ -}; - -/* XEN_DOMCTL_gdbsx_domstatus */ -struct xen_domctl_gdbsx_domstatus { - /* OUT */ - uint8_t paused; /* is the domain paused */ - uint32_t vcpu_id; /* any vcpu in an event? */ - uint32_t vcpu_ev; /* if yes, what event? */ -}; - -/* - * VM event operations - */ - -/* XEN_DOMCTL_vm_event_op */ - -/* - * There are currently three rings available for VM events: - * sharing, monitor and paging. This hypercall allows one to - * control these rings (enable/disable), as well as to signal - * to the hypervisor to pull responses (resume) from the given - * ring. - */ -#define XEN_VM_EVENT_ENABLE 0 -#define XEN_VM_EVENT_DISABLE 1 -#define XEN_VM_EVENT_RESUME 2 -#define XEN_VM_EVENT_GET_VERSION 3 - -/* - * Domain memory paging - * Page memory in and out. - * Domctl interface to set up and tear down the - * pager<->hypervisor interface. Use XENMEM_paging_op* - * to perform per-page operations. - * - * The XEN_VM_EVENT_PAGING_ENABLE domctl returns several - * non-standard error codes to indicate why paging could not be enabled: - * ENODEV - host lacks HAP support (EPT/NPT) or HAP is disabled in guest - * EMLINK - guest has iommu passthrough enabled - * EXDEV - guest has PoD enabled - * EBUSY - guest has or had paging enabled, ring buffer still active - */ -#define XEN_DOMCTL_VM_EVENT_OP_PAGING 1 - -/* - * Monitor helper. - * - * As with paging, use the domctl for teardown/setup of the - * helper<->hypervisor interface. - * - * The monitor interface can be used to register for various VM events. For - * example, there are HVM hypercalls to set the per-page access permissions - * of every page in a domain. When one of these permissions--independent, - * read, write, and execute--is violated, the VCPU is paused and a memory event - * is sent with what happened. The memory event handler can then resume the - * VCPU and redo the access with a XEN_VM_EVENT_RESUME option. - * - * See public/vm_event.h for the list of available events that can be - * subscribed to via the monitor interface. - * - * The XEN_VM_EVENT_MONITOR_* domctls returns - * non-standard error codes to indicate why access could not be enabled: - * ENODEV - host lacks HAP support (EPT/NPT) or HAP is disabled in guest - * EBUSY - guest has or had access enabled, ring buffer still active - * - */ -#define XEN_DOMCTL_VM_EVENT_OP_MONITOR 2 - -/* - * Sharing ENOMEM helper. - * - * As with paging, use the domctl for teardown/setup of the - * helper<->hypervisor interface. - * - * If setup, this ring is used to communicate failed allocations - * in the unshare path. XENMEM_sharing_op_resume is used to wake up - * vcpus that could not unshare. - * - * Note that sharing can be turned on (as per the domctl below) - * *without* this ring being setup. - */ -#define XEN_DOMCTL_VM_EVENT_OP_SHARING 3 - -/* Use for teardown/setup of helper<->hypervisor interface for paging, - * access and sharing.*/ -struct xen_domctl_vm_event_op { - uint32_t op; /* XEN_VM_EVENT_* */ - uint32_t mode; /* XEN_DOMCTL_VM_EVENT_OP_* */ - - union { - struct { - uint32_t port; /* OUT: event channel for ring */ - } enable; - - uint32_t version; - } u; -}; - -/* - * Memory sharing operations - */ -/* XEN_DOMCTL_mem_sharing_op. - * The CONTROL sub-domctl is used for bringup/teardown. */ -#define XEN_DOMCTL_MEM_SHARING_CONTROL 0 - -struct xen_domctl_mem_sharing_op { - uint8_t op; /* XEN_DOMCTL_MEM_SHARING_* */ - - union { - uint8_t enable; /* CONTROL */ - } u; -}; - -struct xen_domctl_audit_p2m { - /* OUT error counts */ - uint64_t orphans; - uint64_t m2p_bad; - uint64_t p2m_bad; -}; - -struct xen_domctl_set_virq_handler { - uint32_t virq; /* IN */ -}; - -#if defined(__i386__) || defined(__x86_64__) -/* XEN_DOMCTL_setvcpuextstate */ -/* XEN_DOMCTL_getvcpuextstate */ -struct xen_domctl_vcpuextstate { - /* IN: VCPU that this call applies to. */ - uint32_t vcpu; - /* - * SET: Ignored. - * GET: xfeature support mask of struct (IN/OUT) - * xfeature mask is served as identifications of the saving format - * so that compatible CPUs can have a check on format to decide - * whether it can restore. - */ - uint64_aligned_t xfeature_mask; - /* - * SET: Size of struct (IN) - * GET: Size of struct (IN/OUT) - */ - uint64_aligned_t size; - XEN_GUEST_HANDLE_64(uint64) buffer; -}; -#endif - -/* XEN_DOMCTL_set_access_required: sets whether a memory event listener - * must be present to handle page access events: if false, the page - * access will revert to full permissions if no one is listening; - * */ -struct xen_domctl_set_access_required { - uint8_t access_required; -}; - -struct xen_domctl_set_broken_page_p2m { - uint64_aligned_t pfn; -}; - -/* - * ARM: Clean and invalidate caches associated with given region of - * guest memory. - */ -struct xen_domctl_cacheflush { - /* IN: page range to flush. */ - xen_pfn_t start_pfn, nr_pfns; -}; - -#if defined(__i386__) || defined(__x86_64__) -struct xen_domctl_vcpu_msr { - uint32_t index; - uint32_t reserved; - uint64_aligned_t value; -}; -typedef struct xen_domctl_vcpu_msr xen_domctl_vcpu_msr_t; -DEFINE_XEN_GUEST_HANDLE(xen_domctl_vcpu_msr_t); - -/* - * XEN_DOMCTL_set_vcpu_msrs / XEN_DOMCTL_get_vcpu_msrs. - * - * Input: - * - A NULL 'msrs' guest handle is a request for the maximum 'msr_count'. - * - Otherwise, 'msr_count' is the number of entries in 'msrs'. - * - * Output for get: - * - If 'msr_count' is less than the number Xen needs to write, -ENOBUFS shall - * be returned and 'msr_count' updated to reflect the intended number. - * - On success, 'msr_count' shall indicate the number of MSRs written, which - * may be less than the maximum if some are not currently used by the vcpu. - * - * Output for set: - * - If Xen encounters an error with a specific MSR, -EINVAL shall be returned - * and 'msr_count' shall be set to the offending index, to aid debugging. - */ -struct xen_domctl_vcpu_msrs { - uint32_t vcpu; /* IN */ - uint32_t msr_count; /* IN/OUT */ - XEN_GUEST_HANDLE_64(xen_domctl_vcpu_msr_t) msrs; /* IN/OUT */ -}; -#endif - -/* XEN_DOMCTL_setvnumainfo: specifies a virtual NUMA topology for the guest */ -struct xen_domctl_vnuma { - /* IN: number of vNUMA nodes to setup. Shall be greater than 0 */ - uint32_t nr_vnodes; - /* IN: number of memory ranges to setup */ - uint32_t nr_vmemranges; - /* - * IN: number of vCPUs of the domain (used as size of the vcpu_to_vnode - * array declared below). Shall be equal to the domain's max_vcpus. - */ - uint32_t nr_vcpus; - uint32_t pad; /* must be zero */ - - /* - * IN: array for specifying the distances of the vNUMA nodes - * between each others. Shall have nr_vnodes*nr_vnodes elements. - */ - XEN_GUEST_HANDLE_64(uint) vdistance; - /* - * IN: array for specifying to what vNUMA node each vCPU belongs. - * Shall have nr_vcpus elements. - */ - XEN_GUEST_HANDLE_64(uint) vcpu_to_vnode; - /* - * IN: array for specifying on what physical NUMA node each vNUMA - * node is placed. Shall have nr_vnodes elements. - */ - XEN_GUEST_HANDLE_64(uint) vnode_to_pnode; - /* - * IN: array for specifying the memory ranges. Shall have - * nr_vmemranges elements. - */ - XEN_GUEST_HANDLE_64(xen_vmemrange_t) vmemrange; -}; - -struct xen_domctl_psr_cmt_op { -#define XEN_DOMCTL_PSR_CMT_OP_DETACH 0 -#define XEN_DOMCTL_PSR_CMT_OP_ATTACH 1 -#define XEN_DOMCTL_PSR_CMT_OP_QUERY_RMID 2 - uint32_t cmd; - uint32_t data; -}; - -/* XEN_DOMCTL_MONITOR_* - * - * Enable/disable monitoring various VM events. - * This domctl configures what events will be reported to helper apps - * via the ring buffer "MONITOR". The ring has to be first enabled - * with the domctl XEN_DOMCTL_VM_EVENT_OP_MONITOR. - * - * GET_CAPABILITIES can be used to determine which of these features is - * available on a given platform. - * - * NOTICE: mem_access events are also delivered via the "MONITOR" ring buffer; - * however, enabling/disabling those events is performed with the use of - * memory_op hypercalls! - */ -#define XEN_DOMCTL_MONITOR_OP_ENABLE 0 -#define XEN_DOMCTL_MONITOR_OP_DISABLE 1 -#define XEN_DOMCTL_MONITOR_OP_GET_CAPABILITIES 2 -#define XEN_DOMCTL_MONITOR_OP_EMULATE_EACH_REP 3 -/* - * Control register feature can result in guest-crashes when the monitor - * subsystem is being turned off. User has to take special precautions - * to ensure all vCPUs have resumed before it is safe to turn it off. - */ -#define XEN_DOMCTL_MONITOR_OP_CONTROL_REGISTERS 4 - -#define XEN_DOMCTL_MONITOR_EVENT_WRITE_CTRLREG 0 -#define XEN_DOMCTL_MONITOR_EVENT_MOV_TO_MSR 1 -#define XEN_DOMCTL_MONITOR_EVENT_SINGLESTEP 2 -#define XEN_DOMCTL_MONITOR_EVENT_SOFTWARE_BREAKPOINT 3 -#define XEN_DOMCTL_MONITOR_EVENT_GUEST_REQUEST 4 -#define XEN_DOMCTL_MONITOR_EVENT_DEBUG_EXCEPTION 5 -#define XEN_DOMCTL_MONITOR_EVENT_CPUID 6 -#define XEN_DOMCTL_MONITOR_EVENT_PRIVILEGED_CALL 7 -#define XEN_DOMCTL_MONITOR_EVENT_INTERRUPT 8 -#define XEN_DOMCTL_MONITOR_EVENT_DESC_ACCESS 9 -#define XEN_DOMCTL_MONITOR_EVENT_EMUL_UNIMPLEMENTED 10 -/* Enabled by default */ -#define XEN_DOMCTL_MONITOR_EVENT_INGUEST_PAGEFAULT 11 - -struct xen_domctl_monitor_op { - uint32_t op; /* XEN_DOMCTL_MONITOR_OP_* */ - - /* - * When used with ENABLE/DISABLE this has to be set to - * the requested XEN_DOMCTL_MONITOR_EVENT_* value. - * With GET_CAPABILITIES this field returns a bitmap of - * events supported by the platform, in the format - * (1 << XEN_DOMCTL_MONITOR_EVENT_*). - */ - uint32_t event; - - /* - * Further options when issuing XEN_DOMCTL_MONITOR_OP_ENABLE. - */ - union { - struct { - /* Which control register */ - uint8_t index; - /* Pause vCPU until response */ - uint8_t sync; - /* Send event only on a change of value */ - uint8_t onchangeonly; - /* Allignment padding */ - uint8_t pad1; - uint32_t pad2; - /* - * Send event only if the changed bit in the control register - * is not masked. - */ - uint64_aligned_t bitmask; - } mov_to_cr; - - struct { - uint32_t msr; - /* Send event only on a change of value */ - uint8_t onchangeonly; - } mov_to_msr; - - struct { - /* Pause vCPU until response */ - uint8_t sync; - uint8_t allow_userspace; - } guest_request; - - struct { - /* Pause vCPU until response */ - uint8_t sync; - } debug_exception; - } u; -}; - -struct xen_domctl_psr_alloc { -#define XEN_DOMCTL_PSR_SET_L3_CBM 0 -#define XEN_DOMCTL_PSR_GET_L3_CBM 1 -#define XEN_DOMCTL_PSR_SET_L3_CODE 2 -#define XEN_DOMCTL_PSR_SET_L3_DATA 3 -#define XEN_DOMCTL_PSR_GET_L3_CODE 4 -#define XEN_DOMCTL_PSR_GET_L3_DATA 5 -#define XEN_DOMCTL_PSR_SET_L2_CBM 6 -#define XEN_DOMCTL_PSR_GET_L2_CBM 7 -#define XEN_DOMCTL_PSR_SET_MBA_THRTL 8 -#define XEN_DOMCTL_PSR_GET_MBA_THRTL 9 - uint32_t cmd; /* IN: XEN_DOMCTL_PSR_* */ - uint32_t target; /* IN */ - uint64_t data; /* IN/OUT */ -}; - -/* XEN_DOMCTL_vuart_op */ -struct xen_domctl_vuart_op { -#define XEN_DOMCTL_VUART_OP_INIT 0 - uint32_t cmd; /* XEN_DOMCTL_VUART_OP_* */ -#define XEN_DOMCTL_VUART_TYPE_VPL011 0 - uint32_t type; /* IN - type of vuart. - * Currently only vpl011 supported. - */ - uint64_aligned_t gfn; /* IN - guest gfn to be used as a - * ring buffer. - */ - domid_t console_domid; /* IN - domid of domain running the - * backend console. - */ - uint8_t pad[2]; - evtchn_port_t evtchn; /* OUT - remote port of the event - * channel used for sending - * ring buffer events. - */ -}; - -struct xen_domctl { - uint32_t cmd; -#define XEN_DOMCTL_createdomain 1 -#define XEN_DOMCTL_destroydomain 2 -#define XEN_DOMCTL_pausedomain 3 -#define XEN_DOMCTL_unpausedomain 4 -#define XEN_DOMCTL_getdomaininfo 5 -/* #define XEN_DOMCTL_getmemlist 6 Removed */ -/* #define XEN_DOMCTL_getpageframeinfo 7 Obsolete - use getpageframeinfo3 */ -/* #define XEN_DOMCTL_getpageframeinfo2 8 Obsolete - use getpageframeinfo3 */ -#define XEN_DOMCTL_setvcpuaffinity 9 -#define XEN_DOMCTL_shadow_op 10 -#define XEN_DOMCTL_max_mem 11 -#define XEN_DOMCTL_setvcpucontext 12 -#define XEN_DOMCTL_getvcpucontext 13 -#define XEN_DOMCTL_getvcpuinfo 14 -#define XEN_DOMCTL_max_vcpus 15 -#define XEN_DOMCTL_scheduler_op 16 -#define XEN_DOMCTL_setdomainhandle 17 -#define XEN_DOMCTL_setdebugging 18 -#define XEN_DOMCTL_irq_permission 19 -#define XEN_DOMCTL_iomem_permission 20 -#define XEN_DOMCTL_ioport_permission 21 -#define XEN_DOMCTL_hypercall_init 22 -#ifdef __XEN__ -/* #define XEN_DOMCTL_arch_setup 23 Obsolete IA64 only */ -#define XEN_DOMCTL_soft_reset_cont 23 -#endif -#define XEN_DOMCTL_settimeoffset 24 -#define XEN_DOMCTL_getvcpuaffinity 25 -#define XEN_DOMCTL_real_mode_area 26 /* Obsolete PPC only */ -#define XEN_DOMCTL_resumedomain 27 -#define XEN_DOMCTL_sendtrigger 28 -#define XEN_DOMCTL_subscribe 29 -#define XEN_DOMCTL_gethvmcontext 33 -#define XEN_DOMCTL_sethvmcontext 34 -#define XEN_DOMCTL_set_address_size 35 -#define XEN_DOMCTL_get_address_size 36 -#define XEN_DOMCTL_assign_device 37 -#define XEN_DOMCTL_bind_pt_irq 38 -#define XEN_DOMCTL_memory_mapping 39 -#define XEN_DOMCTL_ioport_mapping 40 -/* #define XEN_DOMCTL_pin_mem_cacheattr 41 Removed - use dmop */ -#define XEN_DOMCTL_set_ext_vcpucontext 42 -#define XEN_DOMCTL_get_ext_vcpucontext 43 -#define XEN_DOMCTL_set_opt_feature 44 /* Obsolete IA64 only */ -#define XEN_DOMCTL_test_assign_device 45 -#define XEN_DOMCTL_set_target 46 -#define XEN_DOMCTL_deassign_device 47 -#define XEN_DOMCTL_unbind_pt_irq 48 -/* #define XEN_DOMCTL_set_cpuid 49 - Obsolete - use set_cpu_policy */ -#define XEN_DOMCTL_get_device_group 50 -/* #define XEN_DOMCTL_set_machine_address_size 51 - Obsolete */ -/* #define XEN_DOMCTL_get_machine_address_size 52 - Obsolete */ -/* #define XEN_DOMCTL_suppress_spurious_page_faults 53 - Obsolete */ -#define XEN_DOMCTL_debug_op 54 -#define XEN_DOMCTL_gethvmcontext_partial 55 -#define XEN_DOMCTL_vm_event_op 56 -#define XEN_DOMCTL_mem_sharing_op 57 -#define XEN_DOMCTL_disable_migrate 58 -#define XEN_DOMCTL_gettscinfo 59 -#define XEN_DOMCTL_settscinfo 60 -#define XEN_DOMCTL_getpageframeinfo3 61 -#define XEN_DOMCTL_setvcpuextstate 62 -#define XEN_DOMCTL_getvcpuextstate 63 -#define XEN_DOMCTL_set_access_required 64 -#define XEN_DOMCTL_audit_p2m 65 -#define XEN_DOMCTL_set_virq_handler 66 -#define XEN_DOMCTL_set_broken_page_p2m 67 -#define XEN_DOMCTL_setnodeaffinity 68 -#define XEN_DOMCTL_getnodeaffinity 69 -/* #define XEN_DOMCTL_set_max_evtchn 70 - Moved into XEN_DOMCTL_createdomain */ -#define XEN_DOMCTL_cacheflush 71 -#define XEN_DOMCTL_get_vcpu_msrs 72 -#define XEN_DOMCTL_set_vcpu_msrs 73 -#define XEN_DOMCTL_setvnumainfo 74 -#define XEN_DOMCTL_psr_cmt_op 75 -#define XEN_DOMCTL_monitor_op 77 -#define XEN_DOMCTL_psr_alloc 78 -#define XEN_DOMCTL_soft_reset 79 -/* #define XEN_DOMCTL_set_gnttab_limits 80 - Moved into XEN_DOMCTL_createdomain */ -#define XEN_DOMCTL_vuart_op 81 -#define XEN_DOMCTL_get_cpu_policy 82 -#define XEN_DOMCTL_set_cpu_policy 83 -#define XEN_DOMCTL_gdbsx_guestmemio 1000 -#define XEN_DOMCTL_gdbsx_pausevcpu 1001 -#define XEN_DOMCTL_gdbsx_unpausevcpu 1002 -#define XEN_DOMCTL_gdbsx_domstatus 1003 - uint32_t interface_version; /* XEN_DOMCTL_INTERFACE_VERSION */ - domid_t domain; - union { - struct xen_domctl_createdomain createdomain; - struct xen_domctl_getdomaininfo getdomaininfo; - struct xen_domctl_getpageframeinfo3 getpageframeinfo3; - struct xen_domctl_nodeaffinity nodeaffinity; - struct xen_domctl_vcpuaffinity vcpuaffinity; - struct xen_domctl_shadow_op shadow_op; - struct xen_domctl_max_mem max_mem; - struct xen_domctl_vcpucontext vcpucontext; - struct xen_domctl_getvcpuinfo getvcpuinfo; - struct xen_domctl_max_vcpus max_vcpus; - struct xen_domctl_scheduler_op scheduler_op; - struct xen_domctl_setdomainhandle setdomainhandle; - struct xen_domctl_setdebugging setdebugging; - struct xen_domctl_irq_permission irq_permission; - struct xen_domctl_iomem_permission iomem_permission; - struct xen_domctl_ioport_permission ioport_permission; - struct xen_domctl_hypercall_init hypercall_init; - struct xen_domctl_settimeoffset settimeoffset; - struct xen_domctl_disable_migrate disable_migrate; - struct xen_domctl_tsc_info tsc_info; - struct xen_domctl_hvmcontext hvmcontext; - struct xen_domctl_hvmcontext_partial hvmcontext_partial; - struct xen_domctl_address_size address_size; - struct xen_domctl_sendtrigger sendtrigger; - struct xen_domctl_get_device_group get_device_group; - struct xen_domctl_assign_device assign_device; - struct xen_domctl_bind_pt_irq bind_pt_irq; - struct xen_domctl_memory_mapping memory_mapping; - struct xen_domctl_ioport_mapping ioport_mapping; - struct xen_domctl_ext_vcpucontext ext_vcpucontext; - struct xen_domctl_set_target set_target; - struct xen_domctl_subscribe subscribe; - struct xen_domctl_debug_op debug_op; - struct xen_domctl_vm_event_op vm_event_op; - struct xen_domctl_mem_sharing_op mem_sharing_op; -#if defined(__i386__) || defined(__x86_64__) - struct xen_domctl_cpu_policy cpu_policy; - struct xen_domctl_vcpuextstate vcpuextstate; - struct xen_domctl_vcpu_msrs vcpu_msrs; -#endif - struct xen_domctl_set_access_required access_required; - struct xen_domctl_audit_p2m audit_p2m; - struct xen_domctl_set_virq_handler set_virq_handler; - struct xen_domctl_gdbsx_memio gdbsx_guest_memio; - struct xen_domctl_set_broken_page_p2m set_broken_page_p2m; - struct xen_domctl_cacheflush cacheflush; - struct xen_domctl_gdbsx_pauseunp_vcpu gdbsx_pauseunp_vcpu; - struct xen_domctl_gdbsx_domstatus gdbsx_domstatus; - struct xen_domctl_vnuma vnuma; - struct xen_domctl_psr_cmt_op psr_cmt_op; - struct xen_domctl_monitor_op monitor_op; - struct xen_domctl_psr_alloc psr_alloc; - struct xen_domctl_vuart_op vuart_op; - uint8_t pad[128]; - } u; -}; -typedef struct xen_domctl xen_domctl_t; -DEFINE_XEN_GUEST_HANDLE(xen_domctl_t); - -#endif /* __XEN_PUBLIC_DOMCTL_H__ */ - -/* - * Local variables: - * mode: C - * c-file-style: "BSD" - * c-basic-offset: 4 - * tab-width: 4 - * indent-tabs-mode: nil - * End: - */ diff --git a/sys/xen/interface/elfnote.h b/sys/xen/interface/elfnote.h deleted file mode 100644 index 181cbc4ec71c..000000000000 --- a/sys/xen/interface/elfnote.h +++ /dev/null @@ -1,283 +0,0 @@ -/****************************************************************************** - * elfnote.h - * - * Definitions used for the Xen ELF notes. - * - * 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, Ian Campbell, XenSource Ltd. - */ - -#ifndef __XEN_PUBLIC_ELFNOTE_H__ -#define __XEN_PUBLIC_ELFNOTE_H__ - -/* - * `incontents 200 elfnotes ELF notes - * - * The notes should live in a PT_NOTE segment and have "Xen" in the - * name field. - * - * Numeric types are either 4 or 8 bytes depending on the content of - * the desc field. - * - * LEGACY indicated the fields in the legacy __xen_guest string which - * this a note type replaces. - * - * String values (for non-legacy) are NULL terminated ASCII, also known - * as ASCIZ type. - */ - -/* - * NAME=VALUE pair (string). - */ -#define XEN_ELFNOTE_INFO 0 - -/* - * The virtual address of the entry point (numeric). - * - * LEGACY: VIRT_ENTRY - */ -#define XEN_ELFNOTE_ENTRY 1 - -/* The virtual address of the hypercall transfer page (numeric). - * - * LEGACY: HYPERCALL_PAGE. (n.b. legacy value is a physical page - * number not a virtual address) - */ -#define XEN_ELFNOTE_HYPERCALL_PAGE 2 - -/* The virtual address where the kernel image should be mapped (numeric). - * - * Defaults to 0. - * - * LEGACY: VIRT_BASE - */ -#define XEN_ELFNOTE_VIRT_BASE 3 - -/* - * The offset of the ELF paddr field from the actual required - * pseudo-physical address (numeric). - * - * This is used to maintain backwards compatibility with older kernels - * which wrote __PAGE_OFFSET into that field. This field defaults to 0 - * if not present. - * - * LEGACY: ELF_PADDR_OFFSET. (n.b. legacy default is VIRT_BASE) - */ -#define XEN_ELFNOTE_PADDR_OFFSET 4 - -/* - * The version of Xen that we work with (string). - * - * LEGACY: XEN_VER - */ -#define XEN_ELFNOTE_XEN_VERSION 5 - -/* - * The name of the guest operating system (string). - * - * LEGACY: GUEST_OS - */ -#define XEN_ELFNOTE_GUEST_OS 6 - -/* - * The version of the guest operating system (string). - * - * LEGACY: GUEST_VER - */ -#define XEN_ELFNOTE_GUEST_VERSION 7 - -/* - * The loader type (string). - * - * LEGACY: LOADER - */ -#define XEN_ELFNOTE_LOADER 8 - -/* - * The kernel supports PAE (x86/32 only, string = "yes", "no" or - * "bimodal"). - * - * For compatibility with Xen 3.0.3 and earlier the "bimodal" setting - * may be given as "yes,bimodal" which will cause older Xen to treat - * this kernel as PAE. - * - * LEGACY: PAE (n.b. The legacy interface included a provision to - * indicate 'extended-cr3' support allowing L3 page tables to be - * placed above 4G. It is assumed that any kernel new enough to use - * these ELF notes will include this and therefore "yes" here is - * equivalent to "yes[entended-cr3]" in the __xen_guest interface. - */ -#define XEN_ELFNOTE_PAE_MODE 9 - -/* - * The features supported/required by this kernel (string). - * - * The string must consist of a list of feature names (as given in - * features.h, without the "XENFEAT_" prefix) separated by '|' - * characters. If a feature is required for the kernel to function - * then the feature name must be preceded by a '!' character. - * - * LEGACY: FEATURES - */ -#define XEN_ELFNOTE_FEATURES 10 - -/* - * The kernel requires the symbol table to be loaded (string = "yes" or "no") - * LEGACY: BSD_SYMTAB (n.b. The legacy treated the presence or absence - * of this string as a boolean flag rather than requiring "yes" or - * "no". - */ -#define XEN_ELFNOTE_BSD_SYMTAB 11 - -/* - * The lowest address the hypervisor hole can begin at (numeric). - * - * This must not be set higher than HYPERVISOR_VIRT_START. Its presence - * also indicates to the hypervisor that the kernel can deal with the - * hole starting at a higher address. - */ -#define XEN_ELFNOTE_HV_START_LOW 12 - -/* - * List of maddr_t-sized mask/value pairs describing how to recognize - * (non-present) L1 page table entries carrying valid MFNs (numeric). - */ -#define XEN_ELFNOTE_L1_MFN_VALID 13 - -/* - * Whether or not the guest supports cooperative suspend cancellation. - * This is a numeric value. - * - * Default is 0 - */ -#define XEN_ELFNOTE_SUSPEND_CANCEL 14 - -/* - * The (non-default) location the initial phys-to-machine map should be - * placed at by the hypervisor (Dom0) or the tools (DomU). - * The kernel must be prepared for this mapping to be established using - * large pages, despite such otherwise not being available to guests. Note - * that these large pages may be misaligned in PFN space (they'll obviously - * be aligned in MFN and virtual address spaces). - * The kernel must also be able to handle the page table pages used for - * this mapping not being accessible through the initial mapping. - * (Only x86-64 supports this at present.) - */ -#define XEN_ELFNOTE_INIT_P2M 15 - -/* - * Whether or not the guest can deal with being passed an initrd not - * mapped through its initial page tables. - */ -#define XEN_ELFNOTE_MOD_START_PFN 16 - -/* - * The features supported by this kernel (numeric). - * - * Other than XEN_ELFNOTE_FEATURES on pre-4.2 Xen, this note allows a - * kernel to specify support for features that older hypervisors don't - * know about. The set of features 4.2 and newer hypervisors will - * consider supported by the kernel is the combination of the sets - * specified through this and the string note. - * - * LEGACY: FEATURES - */ -#define XEN_ELFNOTE_SUPPORTED_FEATURES 17 - -/* - * Physical entry point into the kernel. - * - * 32bit entry point into the kernel. When requested to launch the - * guest kernel in a HVM container, Xen will use this entry point to - * launch the guest in 32bit protected mode with paging disabled. - * Ignored otherwise. - */ -#define XEN_ELFNOTE_PHYS32_ENTRY 18 - -/* - * The number of the highest elfnote defined. - */ -#define XEN_ELFNOTE_MAX XEN_ELFNOTE_PHYS32_ENTRY - -/* - * System information exported through crash notes. - * - * The kexec / kdump code will create one XEN_ELFNOTE_CRASH_INFO - * note in case of a system crash. This note will contain various - * information about the system, see xen/include/xen/elfcore.h. - */ -#define XEN_ELFNOTE_CRASH_INFO 0x1000001 - -/* - * System registers exported through crash notes. - * - * The kexec / kdump code will create one XEN_ELFNOTE_CRASH_REGS - * note per cpu in case of a system crash. This note is architecture - * specific and will contain registers not saved in the "CORE" note. - * See xen/include/xen/elfcore.h for more information. - */ -#define XEN_ELFNOTE_CRASH_REGS 0x1000002 - - -/* - * xen dump-core none note. - * xm dump-core code will create one XEN_ELFNOTE_DUMPCORE_NONE - * in its dump file to indicate that the file is xen dump-core - * file. This note doesn't have any other information. - * See tools/libxc/xc_core.h for more information. - */ -#define XEN_ELFNOTE_DUMPCORE_NONE 0x2000000 - -/* - * xen dump-core header note. - * xm dump-core code will create one XEN_ELFNOTE_DUMPCORE_HEADER - * in its dump file. - * See tools/libxc/xc_core.h for more information. - */ -#define XEN_ELFNOTE_DUMPCORE_HEADER 0x2000001 - -/* - * xen dump-core xen version note. - * xm dump-core code will create one XEN_ELFNOTE_DUMPCORE_XEN_VERSION - * in its dump file. It contains the xen version obtained via the - * XENVER hypercall. - * See tools/libxc/xc_core.h for more information. - */ -#define XEN_ELFNOTE_DUMPCORE_XEN_VERSION 0x2000002 - -/* - * xen dump-core format version note. - * xm dump-core code will create one XEN_ELFNOTE_DUMPCORE_FORMAT_VERSION - * in its dump file. It contains a format version identifier. - * See tools/libxc/xc_core.h for more information. - */ -#define XEN_ELFNOTE_DUMPCORE_FORMAT_VERSION 0x2000003 - -#endif /* __XEN_PUBLIC_ELFNOTE_H__ */ - -/* - * Local variables: - * mode: C - * c-file-style: "BSD" - * c-basic-offset: 4 - * tab-width: 4 - * indent-tabs-mode: nil - * End: - */ diff --git a/sys/xen/interface/errno.h b/sys/xen/interface/errno.h deleted file mode 100644 index e1d02fcddf39..000000000000 --- a/sys/xen/interface/errno.h +++ /dev/null @@ -1,126 +0,0 @@ -/* - * There are two expected ways of including this header. - * - * 1) The "default" case (expected from tools etc). - * - * Simply #include - * - * In this circumstance, normal header guards apply and the includer shall get - * an enumeration in the XEN_xxx namespace, appropriate for C or assembly. - * - * 2) The special case where the includer provides a XEN_ERRNO() in scope. - * - * In this case, no inclusion guards apply and the caller is responsible for - * their XEN_ERRNO() being appropriate in the included context. The header - * will unilaterally #undef XEN_ERRNO(). - */ - -#ifndef XEN_ERRNO - -/* - * Includer has not provided a custom XEN_ERRNO(). Arrange for normal header - * guards, an automatic enum (for C code) and constants in the XEN_xxx - * namespace. - */ -#ifndef __XEN_PUBLIC_ERRNO_H__ -#define __XEN_PUBLIC_ERRNO_H__ - -#define XEN_ERRNO_DEFAULT_INCLUDE - -#ifndef __ASSEMBLY__ - -#define XEN_ERRNO(name, value) XEN_##name = value, -enum xen_errno { - -#elif __XEN_INTERFACE_VERSION__ < 0x00040700 - -#define XEN_ERRNO(name, value) .equ XEN_##name, value - -#endif /* __ASSEMBLY__ */ - -#endif /* __XEN_PUBLIC_ERRNO_H__ */ -#endif /* !XEN_ERRNO */ - -/* ` enum neg_errnoval { [ -Efoo for each Efoo in the list below ] } */ -/* ` enum errnoval { */ - -#ifdef XEN_ERRNO - -/* - * Values originating from x86 Linux. Please consider using respective - * values when adding new definitions here. - * - * The set of identifiers to be added here shouldn't extend beyond what - * POSIX mandates (see e.g. - * http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/errno.h.html) - * with the exception that we support some optional (XSR) values - * specified there (but no new ones should be added). - */ - -XEN_ERRNO(EPERM, 1) /* Operation not permitted */ -XEN_ERRNO(ENOENT, 2) /* No such file or directory */ -XEN_ERRNO(ESRCH, 3) /* No such process */ -#ifdef __XEN__ /* Internal only, should never be exposed to the guest. */ -XEN_ERRNO(EINTR, 4) /* Interrupted system call */ -#endif -XEN_ERRNO(EIO, 5) /* I/O error */ -XEN_ERRNO(ENXIO, 6) /* No such device or address */ -XEN_ERRNO(E2BIG, 7) /* Arg list too long */ -XEN_ERRNO(ENOEXEC, 8) /* Exec format error */ -XEN_ERRNO(EBADF, 9) /* Bad file number */ -XEN_ERRNO(ECHILD, 10) /* No child processes */ -XEN_ERRNO(EAGAIN, 11) /* Try again */ -XEN_ERRNO(EWOULDBLOCK, 11) /* Operation would block. Aliases EAGAIN */ -XEN_ERRNO(ENOMEM, 12) /* Out of memory */ -XEN_ERRNO(EACCES, 13) /* Permission denied */ -XEN_ERRNO(EFAULT, 14) /* Bad address */ -XEN_ERRNO(EBUSY, 16) /* Device or resource busy */ -XEN_ERRNO(EEXIST, 17) /* File exists */ -XEN_ERRNO(EXDEV, 18) /* Cross-device link */ -XEN_ERRNO(ENODEV, 19) /* No such device */ -XEN_ERRNO(EISDIR, 21) /* Is a directory */ -XEN_ERRNO(EINVAL, 22) /* Invalid argument */ -XEN_ERRNO(ENFILE, 23) /* File table overflow */ -XEN_ERRNO(EMFILE, 24) /* Too many open files */ -XEN_ERRNO(ENOSPC, 28) /* No space left on device */ -XEN_ERRNO(EROFS, 30) /* Read-only file system */ -XEN_ERRNO(EMLINK, 31) /* Too many links */ -XEN_ERRNO(EDOM, 33) /* Math argument out of domain of func */ -XEN_ERRNO(ERANGE, 34) /* Math result not representable */ -XEN_ERRNO(EDEADLK, 35) /* Resource deadlock would occur */ -XEN_ERRNO(EDEADLOCK, 35) /* Resource deadlock would occur. Aliases EDEADLK */ -XEN_ERRNO(ENAMETOOLONG, 36) /* File name too long */ -XEN_ERRNO(ENOLCK, 37) /* No record locks available */ -XEN_ERRNO(ENOSYS, 38) /* Function not implemented */ -XEN_ERRNO(ENOTEMPTY, 39) /* Directory not empty */ -XEN_ERRNO(ENODATA, 61) /* No data available */ -XEN_ERRNO(ETIME, 62) /* Timer expired */ -XEN_ERRNO(EBADMSG, 74) /* Not a data message */ -XEN_ERRNO(EOVERFLOW, 75) /* Value too large for defined data type */ -XEN_ERRNO(EILSEQ, 84) /* Illegal byte sequence */ -#ifdef __XEN__ /* Internal only, should never be exposed to the guest. */ -XEN_ERRNO(ERESTART, 85) /* Interrupted system call should be restarted */ -#endif -XEN_ERRNO(ENOTSOCK, 88) /* Socket operation on non-socket */ -XEN_ERRNO(EMSGSIZE, 90) /* Message too large. */ -XEN_ERRNO(EOPNOTSUPP, 95) /* Operation not supported on transport endpoint */ -XEN_ERRNO(EADDRINUSE, 98) /* Address already in use */ -XEN_ERRNO(EADDRNOTAVAIL, 99) /* Cannot assign requested address */ -XEN_ERRNO(ENOBUFS, 105) /* No buffer space available */ -XEN_ERRNO(EISCONN, 106) /* Transport endpoint is already connected */ -XEN_ERRNO(ENOTCONN, 107) /* Transport endpoint is not connected */ -XEN_ERRNO(ETIMEDOUT, 110) /* Connection timed out */ -XEN_ERRNO(ECONNREFUSED, 111) /* Connection refused */ - -#undef XEN_ERRNO -#endif /* XEN_ERRNO */ -/* ` } */ - -/* Clean up from a default include. Close the enum (for C). */ -#ifdef XEN_ERRNO_DEFAULT_INCLUDE -#undef XEN_ERRNO_DEFAULT_INCLUDE -#ifndef __ASSEMBLY__ -}; -#endif - -#endif /* XEN_ERRNO_DEFAULT_INCLUDE */ diff --git a/sys/xen/interface/event_channel.h b/sys/xen/interface/event_channel.h deleted file mode 100644 index b896d8da2afb..000000000000 --- a/sys/xen/interface/event_channel.h +++ /dev/null @@ -1,388 +0,0 @@ -/****************************************************************************** - * event_channel.h - * - * Event channels between domains. - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to - * deal in the Software without restriction, including without limitation the - * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or - * sell copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - * - * Copyright (c) 2003-2004, K A Fraser. - */ - -#ifndef __XEN_PUBLIC_EVENT_CHANNEL_H__ -#define __XEN_PUBLIC_EVENT_CHANNEL_H__ - -#include "xen.h" - -/* - * `incontents 150 evtchn Event Channels - * - * Event channels are the basic primitive provided by Xen for event - * notifications. An event is the Xen equivalent of a hardware - * interrupt. They essentially store one bit of information, the event - * of interest is signalled by transitioning this bit from 0 to 1. - * - * Notifications are received by a guest via an upcall from Xen, - * indicating when an event arrives (setting the bit). Further - * notifications are masked until the bit is cleared again (therefore, - * guests must check the value of the bit after re-enabling event - * delivery to ensure no missed notifications). - * - * Event notifications can be masked by setting a flag; this is - * equivalent to disabling interrupts and can be used to ensure - * atomicity of certain operations in the guest kernel. - * - * Event channels are represented by the evtchn_* fields in - * struct shared_info and struct vcpu_info. - */ - -/* - * ` enum neg_errnoval - * ` HYPERVISOR_event_channel_op(enum event_channel_op cmd, void *args) - * ` - * @cmd == EVTCHNOP_* (event-channel operation). - * @args == struct evtchn_* Operation-specific extra arguments (NULL if none). - */ - -/* ` enum event_channel_op { // EVTCHNOP_* => struct evtchn_* */ -#define EVTCHNOP_bind_interdomain 0 -#define EVTCHNOP_bind_virq 1 -#define EVTCHNOP_bind_pirq 2 -#define EVTCHNOP_close 3 -#define EVTCHNOP_send 4 -#define EVTCHNOP_status 5 -#define EVTCHNOP_alloc_unbound 6 -#define EVTCHNOP_bind_ipi 7 -#define EVTCHNOP_bind_vcpu 8 -#define EVTCHNOP_unmask 9 -#define EVTCHNOP_reset 10 -#define EVTCHNOP_init_control 11 -#define EVTCHNOP_expand_array 12 -#define EVTCHNOP_set_priority 13 -#ifdef __XEN__ -#define EVTCHNOP_reset_cont 14 -#endif -/* ` } */ - -typedef uint32_t evtchn_port_t; -DEFINE_XEN_GUEST_HANDLE(evtchn_port_t); - -/* - * EVTCHNOP_alloc_unbound: Allocate a port in domain and mark as - * accepting interdomain bindings from domain . A fresh port - * is allocated in and returned as . - * NOTES: - * 1. If the caller is unprivileged then must be DOMID_SELF. - * 2. may be DOMID_SELF, allowing loopback connections. - */ -struct evtchn_alloc_unbound { - /* IN parameters */ - domid_t dom, remote_dom; - /* OUT parameters */ - evtchn_port_t port; -}; -typedef struct evtchn_alloc_unbound evtchn_alloc_unbound_t; - -/* - * EVTCHNOP_bind_interdomain: Construct an interdomain event channel between - * the calling domain and . must identify - * a port that is unbound and marked as accepting bindings from the calling - * domain. A fresh port is allocated in the calling domain and returned as - * . - * - * In case the peer domain has already tried to set our event channel - * pending, before it was bound, EVTCHNOP_bind_interdomain always sets - * the local event channel pending. - * - * The usual pattern of use, in the guest's upcall (or subsequent - * handler) is as follows: (Re-enable the event channel for subsequent - * signalling and then) check for the existence of whatever condition - * is being waited for by other means, and take whatever action is - * needed (if any). - * - * NOTES: - * 1. may be DOMID_SELF, allowing loopback connections. - */ -struct evtchn_bind_interdomain { - /* IN parameters. */ - domid_t remote_dom; - evtchn_port_t remote_port; - /* OUT parameters. */ - evtchn_port_t local_port; -}; -typedef struct evtchn_bind_interdomain evtchn_bind_interdomain_t; - -/* - * EVTCHNOP_bind_virq: Bind a local event channel to VIRQ on specified - * vcpu. - * NOTES: - * 1. Virtual IRQs are classified as per-vcpu or global. See the VIRQ list - * in xen.h for the classification of each VIRQ. - * 2. Global VIRQs must be allocated on VCPU0 but can subsequently be - * re-bound via EVTCHNOP_bind_vcpu. - * 3. Per-vcpu VIRQs may be bound to at most one event channel per vcpu. - * The allocated event channel is bound to the specified vcpu and the - * binding cannot be changed. - */ -struct evtchn_bind_virq { - /* IN parameters. */ - uint32_t virq; /* enum virq */ - uint32_t vcpu; - /* OUT parameters. */ - evtchn_port_t port; -}; -typedef struct evtchn_bind_virq evtchn_bind_virq_t; - -/* - * EVTCHNOP_bind_pirq: Bind a local event channel to a real IRQ (PIRQ ). - * NOTES: - * 1. A physical IRQ may be bound to at most one event channel per domain. - * 2. Only a sufficiently-privileged domain may bind to a physical IRQ. - */ -struct evtchn_bind_pirq { - /* IN parameters. */ - uint32_t pirq; -#define BIND_PIRQ__WILL_SHARE 1 - uint32_t flags; /* BIND_PIRQ__* */ - /* OUT parameters. */ - evtchn_port_t port; -}; -typedef struct evtchn_bind_pirq evtchn_bind_pirq_t; - -/* - * EVTCHNOP_bind_ipi: Bind a local event channel to receive events. - * NOTES: - * 1. The allocated event channel is bound to the specified vcpu. The binding - * may not be changed. - */ -struct evtchn_bind_ipi { - uint32_t vcpu; - /* OUT parameters. */ - evtchn_port_t port; -}; -typedef struct evtchn_bind_ipi evtchn_bind_ipi_t; - -/* - * EVTCHNOP_close: Close a local event channel . If the channel is - * interdomain then the remote end is placed in the unbound state - * (EVTCHNSTAT_unbound), awaiting a new connection. - */ -struct evtchn_close { - /* IN parameters. */ - evtchn_port_t port; -}; -typedef struct evtchn_close evtchn_close_t; - -/* - * EVTCHNOP_send: Send an event to the remote end of the channel whose local - * endpoint is . - */ -struct evtchn_send { - /* IN parameters. */ - evtchn_port_t port; -}; -typedef struct evtchn_send evtchn_send_t; - -/* - * EVTCHNOP_status: Get the current status of the communication channel which - * has an endpoint at . - * NOTES: - * 1. may be specified as DOMID_SELF. - * 2. Only a sufficiently-privileged domain may obtain the status of an event - * channel for which is not DOMID_SELF. - */ -struct evtchn_status { - /* IN parameters */ - domid_t dom; - evtchn_port_t port; - /* OUT parameters */ -#define EVTCHNSTAT_closed 0 /* Channel is not in use. */ -#define EVTCHNSTAT_unbound 1 /* Channel is waiting interdom connection.*/ -#define EVTCHNSTAT_interdomain 2 /* Channel is connected to remote domain. */ -#define EVTCHNSTAT_pirq 3 /* Channel is bound to a phys IRQ line. */ -#define EVTCHNSTAT_virq 4 /* Channel is bound to a virtual IRQ line */ -#define EVTCHNSTAT_ipi 5 /* Channel is bound to a virtual IPI line */ - uint32_t status; - uint32_t vcpu; /* VCPU to which this channel is bound. */ - union { - struct { - domid_t dom; - } unbound; /* EVTCHNSTAT_unbound */ - struct { - domid_t dom; - evtchn_port_t port; - } interdomain; /* EVTCHNSTAT_interdomain */ - uint32_t pirq; /* EVTCHNSTAT_pirq */ - uint32_t virq; /* EVTCHNSTAT_virq */ - } u; -}; -typedef struct evtchn_status evtchn_status_t; - -/* - * EVTCHNOP_bind_vcpu: Specify which vcpu a channel should notify when an - * event is pending. - * NOTES: - * 1. IPI-bound channels always notify the vcpu specified at bind time. - * This binding cannot be changed. - * 2. Per-VCPU VIRQ channels always notify the vcpu specified at bind time. - * This binding cannot be changed. - * 3. All other channels notify vcpu0 by default. This default is set when - * the channel is allocated (a port that is freed and subsequently reused - * has its binding reset to vcpu0). - */ -struct evtchn_bind_vcpu { - /* IN parameters. */ - evtchn_port_t port; - uint32_t vcpu; -}; -typedef struct evtchn_bind_vcpu evtchn_bind_vcpu_t; - -/* - * EVTCHNOP_unmask: Unmask the specified local event-channel port and deliver - * a notification to the appropriate VCPU if an event is pending. - */ -struct evtchn_unmask { - /* IN parameters. */ - evtchn_port_t port; -}; -typedef struct evtchn_unmask evtchn_unmask_t; - -/* - * EVTCHNOP_reset: Close all event channels associated with specified domain. - * NOTES: - * 1. may be specified as DOMID_SELF. - * 2. Only a sufficiently-privileged domain may specify other than DOMID_SELF. - * 3. Destroys all control blocks and event array, resets event channel - * operations to 2-level ABI if called with == DOMID_SELF and FIFO - * ABI was used. Guests should not bind events during EVTCHNOP_reset call - * as these events are likely to be lost. - */ -struct evtchn_reset { - /* IN parameters. */ - domid_t dom; -}; -typedef struct evtchn_reset evtchn_reset_t; - -/* - * EVTCHNOP_init_control: initialize the control block for the FIFO ABI. - * - * Note: any events that are currently pending will not be resent and - * will be lost. Guests should call this before binding any event to - * avoid losing any events. - */ -struct evtchn_init_control { - /* IN parameters. */ - uint64_t control_gfn; - uint32_t offset; - uint32_t vcpu; - /* OUT parameters. */ - uint8_t link_bits; - uint8_t _pad[7]; -}; -typedef struct evtchn_init_control evtchn_init_control_t; - -/* - * EVTCHNOP_expand_array: add an additional page to the event array. - */ -struct evtchn_expand_array { - /* IN parameters. */ - uint64_t array_gfn; -}; -typedef struct evtchn_expand_array evtchn_expand_array_t; - -/* - * EVTCHNOP_set_priority: set the priority for an event channel. - */ -struct evtchn_set_priority { - /* IN parameters. */ - evtchn_port_t port; - uint32_t priority; -}; -typedef struct evtchn_set_priority evtchn_set_priority_t; - -/* - * ` enum neg_errnoval - * ` HYPERVISOR_event_channel_op_compat(struct evtchn_op *op) - * ` - * Superceded by new event_channel_op() hypercall since 0x00030202. - */ -struct evtchn_op { - uint32_t cmd; /* enum event_channel_op */ - union { - struct evtchn_alloc_unbound alloc_unbound; - struct evtchn_bind_interdomain bind_interdomain; - struct evtchn_bind_virq bind_virq; - struct evtchn_bind_pirq bind_pirq; - struct evtchn_bind_ipi bind_ipi; - struct evtchn_close close; - struct evtchn_send send; - struct evtchn_status status; - struct evtchn_bind_vcpu bind_vcpu; - struct evtchn_unmask unmask; - } u; -}; -typedef struct evtchn_op evtchn_op_t; -DEFINE_XEN_GUEST_HANDLE(evtchn_op_t); - -/* - * 2-level ABI - */ - -#define EVTCHN_2L_NR_CHANNELS (sizeof(xen_ulong_t) * sizeof(xen_ulong_t) * 64) - -/* - * FIFO ABI - */ - -/* Events may have priorities from 0 (highest) to 15 (lowest). */ -#define EVTCHN_FIFO_PRIORITY_MAX 0 -#define EVTCHN_FIFO_PRIORITY_DEFAULT 7 -#define EVTCHN_FIFO_PRIORITY_MIN 15 - -#define EVTCHN_FIFO_MAX_QUEUES (EVTCHN_FIFO_PRIORITY_MIN + 1) - -typedef uint32_t event_word_t; - -#define EVTCHN_FIFO_PENDING 31 -#define EVTCHN_FIFO_MASKED 30 -#define EVTCHN_FIFO_LINKED 29 -#define EVTCHN_FIFO_BUSY 28 - -#define EVTCHN_FIFO_LINK_BITS 17 -#define EVTCHN_FIFO_LINK_MASK ((1 << EVTCHN_FIFO_LINK_BITS) - 1) - -#define EVTCHN_FIFO_NR_CHANNELS (1 << EVTCHN_FIFO_LINK_BITS) - -struct evtchn_fifo_control_block { - uint32_t ready; - uint32_t _rsvd; - uint32_t head[EVTCHN_FIFO_MAX_QUEUES]; -}; -typedef struct evtchn_fifo_control_block evtchn_fifo_control_block_t; - -#endif /* __XEN_PUBLIC_EVENT_CHANNEL_H__ */ - -/* - * Local variables: - * mode: C - * c-file-style: "BSD" - * c-basic-offset: 4 - * tab-width: 4 - * indent-tabs-mode: nil - * End: - */ diff --git a/sys/xen/interface/features.h b/sys/xen/interface/features.h deleted file mode 100644 index 1613b2aab8c6..000000000000 --- a/sys/xen/interface/features.h +++ /dev/null @@ -1,129 +0,0 @@ -/****************************************************************************** - * features.h - * - * Feature flags, reported by XENVER_get_features. - * - * 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_FEATURES_H__ -#define __XEN_PUBLIC_FEATURES_H__ - -/* - * `incontents 200 elfnotes_features XEN_ELFNOTE_FEATURES - * - * The list of all the features the guest supports. They are set by - * parsing the XEN_ELFNOTE_FEATURES and XEN_ELFNOTE_SUPPORTED_FEATURES - * string. The format is the feature names (as given here without the - * "XENFEAT_" prefix) separated by '|' characters. - * If a feature is required for the kernel to function then the feature name - * must be preceded by a '!' character. - * - * Note that if XEN_ELFNOTE_SUPPORTED_FEATURES is used, then in the - * XENFEAT_dom0 MUST be set if the guest is to be booted as dom0, - */ - -/* - * If set, the guest does not need to write-protect its pagetables, and can - * update them via direct writes. - */ -#define XENFEAT_writable_page_tables 0 - -/* - * If set, the guest does not need to write-protect its segment descriptor - * tables, and can update them via direct writes. - */ -#define XENFEAT_writable_descriptor_tables 1 - -/* - * If set, translation between the guest's 'pseudo-physical' address space - * and the host's machine address space are handled by the hypervisor. In this - * mode the guest does not need to perform phys-to/from-machine translations - * when performing page table operations. - */ -#define XENFEAT_auto_translated_physmap 2 - -/* If set, the guest is running in supervisor mode (e.g., x86 ring 0). */ -#define XENFEAT_supervisor_mode_kernel 3 - -/* - * If set, the guest does not need to allocate x86 PAE page directories - * below 4GB. This flag is usually implied by auto_translated_physmap. - */ -#define XENFEAT_pae_pgdir_above_4gb 4 - -/* x86: Does this Xen host support the MMU_PT_UPDATE_PRESERVE_AD hypercall? */ -#define XENFEAT_mmu_pt_update_preserve_ad 5 - -/* x86: Does this Xen host support the MMU_{CLEAR,COPY}_PAGE hypercall? */ -#define XENFEAT_highmem_assist 6 - -/* - * If set, GNTTABOP_map_grant_ref honors flags to be placed into guest kernel - * available pte bits. - */ -#define XENFEAT_gnttab_map_avail_bits 7 - -/* x86: Does this Xen host support the HVM callback vector type? */ -#define XENFEAT_hvm_callback_vector 8 - -/* x86: pvclock algorithm is safe to use on HVM */ -#define XENFEAT_hvm_safe_pvclock 9 - -/* x86: pirq can be used by HVM guests */ -#define XENFEAT_hvm_pirqs 10 - -/* operation as Dom0 is supported */ -#define XENFEAT_dom0 11 - -/* Xen also maps grant references at pfn = mfn. - * This feature flag is deprecated and should not be used. -#define XENFEAT_grant_map_identity 12 - */ - -/* Guest can use XENMEMF_vnode to specify virtual node for memory op. */ -#define XENFEAT_memory_op_vnode_supported 13 - -/* arm: Hypervisor supports ARM SMC calling convention. */ -#define XENFEAT_ARM_SMCCC_supported 14 - -/* - * x86/PVH: If set, ACPI RSDP can be placed at any address. Otherwise RSDP - * must be located in lower 1MB, as required by ACPI Specification for IA-PC - * systems. - * This feature flag is only consulted if XEN_ELFNOTE_GUEST_OS contains - * the "linux" string. - */ -#define XENFEAT_linux_rsdp_unrestricted 15 - -#define XENFEAT_NR_SUBMAPS 1 - -#endif /* __XEN_PUBLIC_FEATURES_H__ */ - -/* - * Local variables: - * mode: C - * c-file-style: "BSD" - * c-basic-offset: 4 - * tab-width: 4 - * indent-tabs-mode: nil - * End: - */ diff --git a/sys/xen/interface/gcov.h b/sys/xen/interface/gcov.h deleted file mode 100644 index f53a1627c34a..000000000000 --- a/sys/xen/interface/gcov.h +++ /dev/null @@ -1,113 +0,0 @@ -/****************************************************************************** - * gcov.h - * - * Coverage structures exported by Xen. - * Structure is different from Gcc one. - * - * 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) 2013, Citrix Systems R&D Ltd. - */ - -#ifndef __XEN_PUBLIC_GCOV_H__ -#define __XEN_PUBLIC_GCOV_H__ __XEN_PUBLIC_GCOV_H__ - -#define XENCOV_COUNTERS 5 -#define XENCOV_TAG_BASE 0x58544300u -#define XENCOV_TAG_FILE (XENCOV_TAG_BASE+0x46u) -#define XENCOV_TAG_FUNC (XENCOV_TAG_BASE+0x66u) -#define XENCOV_TAG_COUNTER(n) (XENCOV_TAG_BASE+0x30u+((n)&0xfu)) -#define XENCOV_TAG_END (XENCOV_TAG_BASE+0x2eu) -#define XENCOV_IS_TAG_COUNTER(n) \ - ((n) >= XENCOV_TAG_COUNTER(0) && (n) < XENCOV_TAG_COUNTER(XENCOV_COUNTERS)) -#define XENCOV_COUNTER_NUM(n) ((n)-XENCOV_TAG_COUNTER(0)) - -/* - * The main structure for the blob is - * BLOB := FILE.. END - * FILE := TAG_FILE VERSION STAMP FILENAME COUNTERS FUNCTIONS - * FILENAME := LEN characters - * characters are padded to 32 bit - * LEN := 32 bit value - * COUNTERS := TAG_COUNTER(n) NUM COUNTER.. - * NUM := 32 bit valie - * COUNTER := 64 bit value - * FUNCTIONS := TAG_FUNC NUM FUNCTION.. - * FUNCTION := IDENT CHECKSUM NUM_COUNTERS - * - * All tagged structures are aligned to 8 bytes - */ - -/** - * File information - * Prefixed with XENCOV_TAG_FILE and a string with filename - * Aligned to 8 bytes - */ -struct xencov_file -{ - uint32_t tag; /* XENCOV_TAG_FILE */ - uint32_t version; - uint32_t stamp; - uint32_t fn_len; - char filename[1]; -}; - -/** - * Counters information - * Prefixed with XENCOV_TAG_COUNTER(n) where n is 0..(XENCOV_COUNTERS-1) - * Aligned to 8 bytes - */ -struct xencov_counter -{ - uint32_t tag; /* XENCOV_TAG_COUNTER(n) */ - uint32_t num; - uint64_t values[1]; -}; - -/** - * Information for each function - * Number of counter is equal to the number of counter structures got before - */ -struct xencov_function -{ - uint32_t ident; - uint32_t checksum; - uint32_t num_counters[1]; -}; - -/** - * Information for all functions - * Aligned to 8 bytes - */ -struct xencov_functions -{ - uint32_t tag; /* XENCOV_TAG_FUNC */ - uint32_t num; - struct xencov_function xencov_function[1]; -}; - -/** - * Terminator - */ -struct xencov_end -{ - uint32_t tag; /* XENCOV_TAG_END */ -}; - -#endif /* __XEN_PUBLIC_GCOV_H__ */ diff --git a/sys/xen/interface/grant_table.h b/sys/xen/interface/grant_table.h deleted file mode 100644 index 3b7bf93d7435..000000000000 --- a/sys/xen/interface/grant_table.h +++ /dev/null @@ -1,684 +0,0 @@ -/****************************************************************************** - * grant_table.h - * - * Interface for granting foreign access to page frames, and receiving - * page-ownership transfers. - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to - * deal in the Software without restriction, including without limitation the - * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or - * sell copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - * - * Copyright (c) 2004, K A Fraser - */ - -#ifndef __XEN_PUBLIC_GRANT_TABLE_H__ -#define __XEN_PUBLIC_GRANT_TABLE_H__ - -#include "xen.h" - -/* - * `incontents 150 gnttab Grant Tables - * - * Xen's grant tables provide a generic mechanism to memory sharing - * between domains. This shared memory interface underpins the split - * device drivers for block and network IO. - * - * Each domain has its own grant table. This is a data structure that - * is shared with Xen; it allows the domain to tell Xen what kind of - * permissions other domains have on its pages. Entries in the grant - * table are identified by grant references. A grant reference is an - * integer, which indexes into the grant table. It acts as a - * capability which the grantee can use to perform operations on the - * granter's memory. - * - * This capability-based system allows shared-memory communications - * between unprivileged domains. A grant reference also encapsulates - * the details of a shared page, removing the need for a domain to - * know the real machine address of a page it is sharing. This makes - * it possible to share memory correctly with domains running in - * fully virtualised memory. - */ - -/*********************************** - * GRANT TABLE REPRESENTATION - */ - -/* Some rough guidelines on accessing and updating grant-table entries - * in a concurrency-safe manner. For more information, Linux contains a - * reference implementation for guest OSes (drivers/xen/grant_table.c, see - * http://git.kernel.org/?p=linux/kernel/git/torvalds/linux.git;a=blob;f=drivers/xen/grant-table.c;hb=HEAD - * - * NB. WMB is a no-op on current-generation x86 processors. However, a - * compiler barrier will still be required. - * - * Introducing a valid entry into the grant table: - * 1. Write ent->domid. - * 2. Write ent->frame: - * GTF_permit_access: Frame to which access is permitted. - * GTF_accept_transfer: Pseudo-phys frame slot being filled by new - * frame, or zero if none. - * 3. Write memory barrier (WMB). - * 4. Write ent->flags, inc. valid type. - * - * Invalidating an unused GTF_permit_access entry: - * 1. flags = ent->flags. - * 2. Observe that !(flags & (GTF_reading|GTF_writing)). - * 3. Check result of SMP-safe CMPXCHG(&ent->flags, flags, 0). - * NB. No need for WMB as reuse of entry is control-dependent on success of - * step 3, and all architectures guarantee ordering of ctrl-dep writes. - * - * Invalidating an in-use GTF_permit_access entry: - * This cannot be done directly. Request assistance from the domain controller - * which can set a timeout on the use of a grant entry and take necessary - * action. (NB. This is not yet implemented!). - * - * Invalidating an unused GTF_accept_transfer entry: - * 1. flags = ent->flags. - * 2. Observe that !(flags & GTF_transfer_committed). [*] - * 3. Check result of SMP-safe CMPXCHG(&ent->flags, flags, 0). - * NB. No need for WMB as reuse of entry is control-dependent on success of - * step 3, and all architectures guarantee ordering of ctrl-dep writes. - * [*] If GTF_transfer_committed is set then the grant entry is 'committed'. - * The guest must /not/ modify the grant entry until the address of the - * transferred frame is written. It is safe for the guest to spin waiting - * for this to occur (detect by observing GTF_transfer_completed in - * ent->flags). - * - * Invalidating a committed GTF_accept_transfer entry: - * 1. Wait for (ent->flags & GTF_transfer_completed). - * - * Changing a GTF_permit_access from writable to read-only: - * Use SMP-safe CMPXCHG to set GTF_readonly, while checking !GTF_writing. - * - * Changing a GTF_permit_access from read-only to writable: - * Use SMP-safe bit-setting instruction. - */ - -/* - * Reference to a grant entry in a specified domain's grant table. - */ -typedef uint32_t grant_ref_t; - -/* - * A grant table comprises a packed array of grant entries in one or more - * page frames shared between Xen and a guest. - * [XEN]: This field is written by Xen and read by the sharing guest. - * [GST]: This field is written by the guest and read by Xen. - */ - -/* - * Version 1 of the grant table entry structure is maintained purely - * for backwards compatibility. New guests should use version 2. - */ -#if __XEN_INTERFACE_VERSION__ < 0x0003020a -#define grant_entry_v1 grant_entry -#define grant_entry_v1_t grant_entry_t -#endif -struct grant_entry_v1 { - /* GTF_xxx: various type and flag information. [XEN,GST] */ - uint16_t flags; - /* The domain being granted foreign privileges. [GST] */ - domid_t domid; - /* - * GTF_permit_access: GFN that @domid is allowed to map and access. [GST] - * GTF_accept_transfer: GFN that @domid is allowed to transfer into. [GST] - * GTF_transfer_completed: MFN whose ownership transferred by @domid - * (non-translated guests only). [XEN] - */ - uint32_t frame; -}; -typedef struct grant_entry_v1 grant_entry_v1_t; - -/* The first few grant table entries will be preserved across grant table - * version changes and may be pre-populated at domain creation by tools. - */ -#define GNTTAB_NR_RESERVED_ENTRIES 8 -#define GNTTAB_RESERVED_CONSOLE 0 -#define GNTTAB_RESERVED_XENSTORE 1 - -/* - * Type of grant entry. - * GTF_invalid: This grant entry grants no privileges. - * GTF_permit_access: Allow @domid to map/access @frame. - * GTF_accept_transfer: Allow @domid to transfer ownership of one page frame - * to this guest. Xen writes the page number to @frame. - * GTF_transitive: Allow @domid to transitively access a subrange of - * @trans_grant in @trans_domid. No mappings are allowed. - */ -#define GTF_invalid (0U<<0) -#define GTF_permit_access (1U<<0) -#define GTF_accept_transfer (2U<<0) -#define GTF_transitive (3U<<0) -#define GTF_type_mask (3U<<0) - -/* - * Subflags for GTF_permit_access. - * GTF_readonly: Restrict @domid to read-only mappings and accesses. [GST] - * GTF_reading: Grant entry is currently mapped for reading by @domid. [XEN] - * GTF_writing: Grant entry is currently mapped for writing by @domid. [XEN] - * GTF_PAT, GTF_PWT, GTF_PCD: (x86) cache attribute flags for the grant [GST] - * GTF_sub_page: Grant access to only a subrange of the page. @domid - * will only be allowed to copy from the grant, and not - * map it. [GST] - */ -#define _GTF_readonly (2) -#define GTF_readonly (1U<<_GTF_readonly) -#define _GTF_reading (3) -#define GTF_reading (1U<<_GTF_reading) -#define _GTF_writing (4) -#define GTF_writing (1U<<_GTF_writing) -#define _GTF_PWT (5) -#define GTF_PWT (1U<<_GTF_PWT) -#define _GTF_PCD (6) -#define GTF_PCD (1U<<_GTF_PCD) -#define _GTF_PAT (7) -#define GTF_PAT (1U<<_GTF_PAT) -#define _GTF_sub_page (8) -#define GTF_sub_page (1U<<_GTF_sub_page) - -/* - * Subflags for GTF_accept_transfer: - * GTF_transfer_committed: Xen sets this flag to indicate that it is committed - * to transferring ownership of a page frame. When a guest sees this flag - * it must /not/ modify the grant entry until GTF_transfer_completed is - * set by Xen. - * GTF_transfer_completed: It is safe for the guest to spin-wait on this flag - * after reading GTF_transfer_committed. Xen will always write the frame - * address, followed by ORing this flag, in a timely manner. - */ -#define _GTF_transfer_committed (2) -#define GTF_transfer_committed (1U<<_GTF_transfer_committed) -#define _GTF_transfer_completed (3) -#define GTF_transfer_completed (1U<<_GTF_transfer_completed) - -/* - * Version 2 grant table entries. These fulfil the same role as - * version 1 entries, but can represent more complicated operations. - * Any given domain will have either a version 1 or a version 2 table, - * and every entry in the table will be the same version. - * - * The interface by which domains use grant references does not depend - * on the grant table version in use by the other domain. - */ -#if __XEN_INTERFACE_VERSION__ >= 0x0003020a -/* - * Version 1 and version 2 grant entries share a common prefix. The - * fields of the prefix are documented as part of struct - * grant_entry_v1. - */ -struct grant_entry_header { - uint16_t flags; - domid_t domid; -}; -typedef struct grant_entry_header grant_entry_header_t; - -/* - * Version 2 of the grant entry structure. - */ -union grant_entry_v2 { - grant_entry_header_t hdr; - - /* - * This member is used for V1-style full page grants, where either: - * - * -- hdr.type is GTF_accept_transfer, or - * -- hdr.type is GTF_permit_access and GTF_sub_page is not set. - * - * In that case, the frame field has the same semantics as the - * field of the same name in the V1 entry structure. - */ - struct { - grant_entry_header_t hdr; - uint32_t pad0; - uint64_t frame; - } full_page; - - /* - * If the grant type is GTF_grant_access and GTF_sub_page is set, - * @domid is allowed to access bytes [@page_off,@page_off+@length) - * in frame @frame. - */ - struct { - grant_entry_header_t hdr; - uint16_t page_off; - uint16_t length; - uint64_t frame; - } sub_page; - - /* - * If the grant is GTF_transitive, @domid is allowed to use the - * grant @gref in domain @trans_domid, as if it was the local - * domain. Obviously, the transitive access must be compatible - * with the original grant. - * - * The current version of Xen does not allow transitive grants - * to be mapped. - */ - struct { - grant_entry_header_t hdr; - domid_t trans_domid; - uint16_t pad0; - grant_ref_t gref; - } transitive; - - uint32_t __spacer[4]; /* Pad to a power of two */ -}; -typedef union grant_entry_v2 grant_entry_v2_t; - -typedef uint16_t grant_status_t; - -#endif /* __XEN_INTERFACE_VERSION__ */ - -/*********************************** - * GRANT TABLE QUERIES AND USES - */ - -/* ` enum neg_errnoval - * ` HYPERVISOR_grant_table_op(enum grant_table_op cmd, - * ` void *args, - * ` unsigned int count) - * ` - * - * @args points to an array of a per-command data structure. The array - * has @count members - */ - -/* ` enum grant_table_op { // GNTTABOP_* => struct gnttab_* */ -#define GNTTABOP_map_grant_ref 0 -#define GNTTABOP_unmap_grant_ref 1 -#define GNTTABOP_setup_table 2 -#define GNTTABOP_dump_table 3 -#define GNTTABOP_transfer 4 -#define GNTTABOP_copy 5 -#define GNTTABOP_query_size 6 -#define GNTTABOP_unmap_and_replace 7 -#if __XEN_INTERFACE_VERSION__ >= 0x0003020a -#define GNTTABOP_set_version 8 -#define GNTTABOP_get_status_frames 9 -#define GNTTABOP_get_version 10 -#define GNTTABOP_swap_grant_ref 11 -#define GNTTABOP_cache_flush 12 -#endif /* __XEN_INTERFACE_VERSION__ */ -/* ` } */ - -/* - * Handle to track a mapping created via a grant reference. - */ -typedef uint32_t grant_handle_t; - -/* - * GNTTABOP_map_grant_ref: Map the grant entry (,) for access - * by devices and/or host CPUs. If successful, is a tracking number - * that must be presented later to destroy the mapping(s). On error, - * is a negative status code. - * NOTES: - * 1. If GNTMAP_device_map is specified then is the address - * via which I/O devices may access the granted frame. - * 2. If GNTMAP_host_map is specified then a mapping will be added at - * either a host virtual address in the current address space, or at - * a PTE at the specified machine address. The type of mapping to - * perform is selected through the GNTMAP_contains_pte flag, and the - * address is specified in . - * 3. Mappings should only be destroyed via GNTTABOP_unmap_grant_ref. If a - * host mapping is destroyed by other means then it is *NOT* guaranteed - * to be accounted to the correct grant reference! - */ -struct gnttab_map_grant_ref { - /* IN parameters. */ - uint64_t host_addr; - uint32_t flags; /* GNTMAP_* */ - grant_ref_t ref; - domid_t dom; - /* OUT parameters. */ - int16_t status; /* => enum grant_status */ - grant_handle_t handle; - uint64_t dev_bus_addr; -}; -typedef struct gnttab_map_grant_ref gnttab_map_grant_ref_t; -DEFINE_XEN_GUEST_HANDLE(gnttab_map_grant_ref_t); - -/* - * GNTTABOP_unmap_grant_ref: Destroy one or more grant-reference mappings - * tracked by . If or is zero, that - * field is ignored. If non-zero, they must refer to a device/host mapping - * that is tracked by - * NOTES: - * 1. The call may fail in an undefined manner if either mapping is not - * tracked by . - * 3. After executing a batch of unmaps, it is guaranteed that no stale - * mappings will remain in the device or host TLBs. - */ -struct gnttab_unmap_grant_ref { - /* IN parameters. */ - uint64_t host_addr; - uint64_t dev_bus_addr; - grant_handle_t handle; - /* OUT parameters. */ - int16_t status; /* => enum grant_status */ -}; -typedef struct gnttab_unmap_grant_ref gnttab_unmap_grant_ref_t; -DEFINE_XEN_GUEST_HANDLE(gnttab_unmap_grant_ref_t); - -/* - * GNTTABOP_setup_table: Set up a grant table for comprising at least - * pages. The frame addresses are written to the . - * Only addresses are written, even if the table is larger. - * NOTES: - * 1. may be specified as DOMID_SELF. - * 2. Only a sufficiently-privileged domain may specify != DOMID_SELF. - * 3. Xen may not support more than a single grant-table page per domain. - */ -struct gnttab_setup_table { - /* IN parameters. */ - domid_t dom; - uint32_t nr_frames; - /* OUT parameters. */ - int16_t status; /* => enum grant_status */ -#if __XEN_INTERFACE_VERSION__ < 0x00040300 - XEN_GUEST_HANDLE(ulong) frame_list; -#else - XEN_GUEST_HANDLE(xen_pfn_t) frame_list; -#endif -}; -typedef struct gnttab_setup_table gnttab_setup_table_t; -DEFINE_XEN_GUEST_HANDLE(gnttab_setup_table_t); - -/* - * GNTTABOP_dump_table: Dump the contents of the grant table to the - * xen console. Debugging use only. - */ -struct gnttab_dump_table { - /* IN parameters. */ - domid_t dom; - /* OUT parameters. */ - int16_t status; /* => enum grant_status */ -}; -typedef struct gnttab_dump_table gnttab_dump_table_t; -DEFINE_XEN_GUEST_HANDLE(gnttab_dump_table_t); - -/* - * GNTTABOP_transfer: Transfer to a foreign domain. The foreign domain - * has previously registered its interest in the transfer via . - * - * Note that, even if the transfer fails, the specified page no longer belongs - * to the calling domain *unless* the error is GNTST_bad_page. - * - * Note further that only PV guests can use this operation. - */ -struct gnttab_transfer { - /* IN parameters. */ - xen_pfn_t mfn; - domid_t domid; - grant_ref_t ref; - /* OUT parameters. */ - int16_t status; -}; -typedef struct gnttab_transfer gnttab_transfer_t; -DEFINE_XEN_GUEST_HANDLE(gnttab_transfer_t); - - -/* - * GNTTABOP_copy: Hypervisor based copy - * source and destinations can be eithers MFNs or, for foreign domains, - * grant references. the foreign domain has to grant read/write access - * in its grant table. - * - * The flags specify what type source and destinations are (either MFN - * or grant reference). - * - * Note that this can also be used to copy data between two domains - * via a third party if the source and destination domains had previously - * grant appropriate access to their pages to the third party. - * - * source_offset specifies an offset in the source frame, dest_offset - * the offset in the target frame and len specifies the number of - * bytes to be copied. - */ - -#define _GNTCOPY_source_gref (0) -#define GNTCOPY_source_gref (1<<_GNTCOPY_source_gref) -#define _GNTCOPY_dest_gref (1) -#define GNTCOPY_dest_gref (1<<_GNTCOPY_dest_gref) - -struct gnttab_copy { - /* IN parameters. */ - struct gnttab_copy_ptr { - union { - grant_ref_t ref; - xen_pfn_t gmfn; - } u; - domid_t domid; - uint16_t offset; - } source, dest; - uint16_t len; - uint16_t flags; /* GNTCOPY_* */ - /* OUT parameters. */ - int16_t status; -}; -typedef struct gnttab_copy gnttab_copy_t; -DEFINE_XEN_GUEST_HANDLE(gnttab_copy_t); - -/* - * GNTTABOP_query_size: Query the current and maximum sizes of the shared - * grant table. - * NOTES: - * 1. may be specified as DOMID_SELF. - * 2. Only a sufficiently-privileged domain may specify != DOMID_SELF. - */ -struct gnttab_query_size { - /* IN parameters. */ - domid_t dom; - /* OUT parameters. */ - uint32_t nr_frames; - uint32_t max_nr_frames; - int16_t status; /* => enum grant_status */ -}; -typedef struct gnttab_query_size gnttab_query_size_t; -DEFINE_XEN_GUEST_HANDLE(gnttab_query_size_t); - -/* - * GNTTABOP_unmap_and_replace: Destroy one or more grant-reference mappings - * tracked by but atomically replace the page table entry with one - * pointing to the machine address under . will be - * redirected to the null entry. - * NOTES: - * 1. The call may fail in an undefined manner if either mapping is not - * tracked by . - * 2. After executing a batch of unmaps, it is guaranteed that no stale - * mappings will remain in the device or host TLBs. - */ -struct gnttab_unmap_and_replace { - /* IN parameters. */ - uint64_t host_addr; - uint64_t new_addr; - grant_handle_t handle; - /* OUT parameters. */ - int16_t status; /* => enum grant_status */ -}; -typedef struct gnttab_unmap_and_replace gnttab_unmap_and_replace_t; -DEFINE_XEN_GUEST_HANDLE(gnttab_unmap_and_replace_t); - -#if __XEN_INTERFACE_VERSION__ >= 0x0003020a -/* - * GNTTABOP_set_version: Request a particular version of the grant - * table shared table structure. This operation may be used to toggle - * between different versions, but must be performed while no grants - * are active. The only defined versions are 1 and 2. - */ -struct gnttab_set_version { - /* IN/OUT parameters */ - uint32_t version; -}; -typedef struct gnttab_set_version gnttab_set_version_t; -DEFINE_XEN_GUEST_HANDLE(gnttab_set_version_t); - - -/* - * GNTTABOP_get_status_frames: Get the list of frames used to store grant - * status for . In grant format version 2, the status is separated - * from the other shared grant fields to allow more efficient synchronization - * using barriers instead of atomic cmpexch operations. - * specify the size of vector . - * The frame addresses are returned in the . - * Only addresses are returned, even if the table is larger. - * NOTES: - * 1. may be specified as DOMID_SELF. - * 2. Only a sufficiently-privileged domain may specify != DOMID_SELF. - */ -struct gnttab_get_status_frames { - /* IN parameters. */ - uint32_t nr_frames; - domid_t dom; - /* OUT parameters. */ - int16_t status; /* => enum grant_status */ - XEN_GUEST_HANDLE(uint64_t) frame_list; -}; -typedef struct gnttab_get_status_frames gnttab_get_status_frames_t; -DEFINE_XEN_GUEST_HANDLE(gnttab_get_status_frames_t); - -/* - * GNTTABOP_get_version: Get the grant table version which is in - * effect for domain . - */ -struct gnttab_get_version { - /* IN parameters */ - domid_t dom; - uint16_t pad; - /* OUT parameters */ - uint32_t version; -}; -typedef struct gnttab_get_version gnttab_get_version_t; -DEFINE_XEN_GUEST_HANDLE(gnttab_get_version_t); - -/* - * GNTTABOP_swap_grant_ref: Swap the contents of two grant entries. - */ -struct gnttab_swap_grant_ref { - /* IN parameters */ - grant_ref_t ref_a; - grant_ref_t ref_b; - /* OUT parameters */ - int16_t status; /* => enum grant_status */ -}; -typedef struct gnttab_swap_grant_ref gnttab_swap_grant_ref_t; -DEFINE_XEN_GUEST_HANDLE(gnttab_swap_grant_ref_t); - -/* - * Issue one or more cache maintenance operations on a portion of a - * page granted to the calling domain by a foreign domain. - */ -struct gnttab_cache_flush { - union { - uint64_t dev_bus_addr; - grant_ref_t ref; - } a; - uint16_t offset; /* offset from start of grant */ - uint16_t length; /* size within the grant */ -#define GNTTAB_CACHE_CLEAN (1u<<0) -#define GNTTAB_CACHE_INVAL (1u<<1) -#define GNTTAB_CACHE_SOURCE_GREF (1u<<31) - uint32_t op; -}; -typedef struct gnttab_cache_flush gnttab_cache_flush_t; -DEFINE_XEN_GUEST_HANDLE(gnttab_cache_flush_t); - -#endif /* __XEN_INTERFACE_VERSION__ */ - -/* - * Bitfield values for gnttab_map_grant_ref.flags. - */ - /* Map the grant entry for access by I/O devices. */ -#define _GNTMAP_device_map (0) -#define GNTMAP_device_map (1<<_GNTMAP_device_map) - /* Map the grant entry for access by host CPUs. */ -#define _GNTMAP_host_map (1) -#define GNTMAP_host_map (1<<_GNTMAP_host_map) - /* Accesses to the granted frame will be restricted to read-only access. */ -#define _GNTMAP_readonly (2) -#define GNTMAP_readonly (1<<_GNTMAP_readonly) - /* - * GNTMAP_host_map subflag: - * 0 => The host mapping is usable only by the guest OS. - * 1 => The host mapping is usable by guest OS + current application. - */ -#define _GNTMAP_application_map (3) -#define GNTMAP_application_map (1<<_GNTMAP_application_map) - - /* - * GNTMAP_contains_pte subflag: - * 0 => This map request contains a host virtual address. - * 1 => This map request contains the machine addess of the PTE to update. - */ -#define _GNTMAP_contains_pte (4) -#define GNTMAP_contains_pte (1<<_GNTMAP_contains_pte) - -#define _GNTMAP_can_fail (5) -#define GNTMAP_can_fail (1<<_GNTMAP_can_fail) - -/* - * Bits to be placed in guest kernel available PTE bits (architecture - * dependent; only supported when XENFEAT_gnttab_map_avail_bits is set). - */ -#define _GNTMAP_guest_avail0 (16) -#define GNTMAP_guest_avail_mask ((uint32_t)~0 << _GNTMAP_guest_avail0) - -/* - * Values for error status returns. All errors are -ve. - */ -/* ` enum grant_status { */ -#define GNTST_okay (0) /* Normal return. */ -#define GNTST_general_error (-1) /* General undefined error. */ -#define GNTST_bad_domain (-2) /* Unrecognsed domain id. */ -#define GNTST_bad_gntref (-3) /* Unrecognised or inappropriate gntref. */ -#define GNTST_bad_handle (-4) /* Unrecognised or inappropriate handle. */ -#define GNTST_bad_virt_addr (-5) /* Inappropriate virtual address to map. */ -#define GNTST_bad_dev_addr (-6) /* Inappropriate device address to unmap.*/ -#define GNTST_no_device_space (-7) /* Out of space in I/O MMU. */ -#define GNTST_permission_denied (-8) /* Not enough privilege for operation. */ -#define GNTST_bad_page (-9) /* Specified page was invalid for op. */ -#define GNTST_bad_copy_arg (-10) /* copy arguments cross page boundary. */ -#define GNTST_address_too_big (-11) /* transfer page address too large. */ -#define GNTST_eagain (-12) /* Operation not done; try again. */ -/* ` } */ - -#define GNTTABOP_error_msgs { \ - "okay", \ - "undefined error", \ - "unrecognised domain id", \ - "invalid grant reference", \ - "invalid mapping handle", \ - "invalid virtual address", \ - "invalid device address", \ - "no spare translation slot in the I/O MMU", \ - "permission denied", \ - "bad page", \ - "copy arguments cross page boundary", \ - "page address size too large", \ - "operation not done; try again" \ -} - -#endif /* __XEN_PUBLIC_GRANT_TABLE_H__ */ - -/* - * Local variables: - * mode: C - * c-file-style: "BSD" - * c-basic-offset: 4 - * tab-width: 4 - * indent-tabs-mode: nil - * End: - */ diff --git a/sys/xen/interface/hvm/dm_op.h b/sys/xen/interface/hvm/dm_op.h deleted file mode 100644 index fd00e9d761e1..000000000000 --- a/sys/xen/interface/hvm/dm_op.h +++ /dev/null @@ -1,480 +0,0 @@ -/* - * Copyright (c) 2016, Citrix Systems Inc - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to - * deal in the Software without restriction, including without limitation the - * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or - * sell copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - * - */ - -#ifndef __XEN_PUBLIC_HVM_DM_OP_H__ -#define __XEN_PUBLIC_HVM_DM_OP_H__ - -#include "../xen.h" - -#if defined(__XEN__) || defined(__XEN_TOOLS__) - -#include "../event_channel.h" - -#ifndef uint64_aligned_t -#define uint64_aligned_t uint64_t -#endif - -/* - * IOREQ Servers - * - * The interface between an I/O emulator an Xen is called an IOREQ Server. - * A domain supports a single 'legacy' IOREQ Server which is instantiated if - * parameter... - * - * HVM_PARAM_IOREQ_PFN is read (to get the gfn containing the synchronous - * ioreq structures), or... - * HVM_PARAM_BUFIOREQ_PFN is read (to get the gfn containing the buffered - * ioreq ring), or... - * HVM_PARAM_BUFIOREQ_EVTCHN is read (to get the event channel that Xen uses - * to request buffered I/O emulation). - * - * The following hypercalls facilitate the creation of IOREQ Servers for - * 'secondary' emulators which are invoked to implement port I/O, memory, or - * PCI config space ranges which they explicitly register. - */ - -typedef uint16_t ioservid_t; - -/* - * XEN_DMOP_create_ioreq_server: Instantiate a new IOREQ Server for a - * secondary emulator. - * - * The handed back is unique for target domain. The valur of - * should be one of HVM_IOREQSRV_BUFIOREQ_* defined in - * hvm_op.h. If the value is HVM_IOREQSRV_BUFIOREQ_OFF then the buffered - * ioreq ring will not be allocated and hence all emulation requests to - * this server will be synchronous. - */ -#define XEN_DMOP_create_ioreq_server 1 - -struct xen_dm_op_create_ioreq_server { - /* IN - should server handle buffered ioreqs */ - uint8_t handle_bufioreq; - uint8_t pad[3]; - /* OUT - server id */ - ioservid_t id; -}; - -/* - * XEN_DMOP_get_ioreq_server_info: Get all the information necessary to - * access IOREQ Server . - * - * If the IOREQ Server is handling buffered emulation requests, the - * emulator needs to bind to event channel to listen for - * them. (The event channels used for synchronous emulation requests are - * specified in the per-CPU ioreq structures). - * In addition, if the XENMEM_acquire_resource memory op cannot be used, - * the emulator will need to map the synchronous ioreq structures and - * buffered ioreq ring (if it exists) from guest memory. If does - * not contain XEN_DMOP_no_gfns then these pages will be made available and - * the frame numbers passed back in gfns and - * respectively. (If the IOREQ Server is not handling buffered emulation - * only will be valid). - * - * NOTE: To access the synchronous ioreq structures and buffered ioreq - * ring, it is preferable to use the XENMEM_acquire_resource memory - * op specifying resource type XENMEM_resource_ioreq_server. - */ -#define XEN_DMOP_get_ioreq_server_info 2 - -struct xen_dm_op_get_ioreq_server_info { - /* IN - server id */ - ioservid_t id; - /* IN - flags */ - uint16_t flags; - -#define _XEN_DMOP_no_gfns 0 -#define XEN_DMOP_no_gfns (1u << _XEN_DMOP_no_gfns) - - /* OUT - buffered ioreq port */ - evtchn_port_t bufioreq_port; - /* OUT - sync ioreq gfn (see block comment above) */ - uint64_aligned_t ioreq_gfn; - /* OUT - buffered ioreq gfn (see block comment above)*/ - uint64_aligned_t bufioreq_gfn; -}; - -/* - * XEN_DMOP_map_io_range_to_ioreq_server: Register an I/O range for - * emulation by the client of - * IOREQ Server . - * XEN_DMOP_unmap_io_range_from_ioreq_server: Deregister an I/O range - * previously registered for - * emulation by the client of - * IOREQ Server . - * - * There are three types of I/O that can be emulated: port I/O, memory - * accesses and PCI config space accesses. The field denotes which - * type of range* the and (inclusive) fields are specifying. - * PCI config space ranges are specified by segment/bus/device/function - * values which should be encoded using the DMOP_PCI_SBDF helper macro - * below. - * - * NOTE: unless an emulation request falls entirely within a range mapped - * by a secondary emulator, it will not be passed to that emulator. - */ -#define XEN_DMOP_map_io_range_to_ioreq_server 3 -#define XEN_DMOP_unmap_io_range_from_ioreq_server 4 - -struct xen_dm_op_ioreq_server_range { - /* IN - server id */ - ioservid_t id; - uint16_t pad; - /* IN - type of range */ - uint32_t type; -# define XEN_DMOP_IO_RANGE_PORT 0 /* I/O port range */ -# define XEN_DMOP_IO_RANGE_MEMORY 1 /* MMIO range */ -# define XEN_DMOP_IO_RANGE_PCI 2 /* PCI segment/bus/dev/func range */ - /* IN - inclusive start and end of range */ - uint64_aligned_t start, end; -}; - -#define XEN_DMOP_PCI_SBDF(s,b,d,f) \ - ((((s) & 0xffff) << 16) | \ - (((b) & 0xff) << 8) | \ - (((d) & 0x1f) << 3) | \ - ((f) & 0x07)) - -/* - * XEN_DMOP_set_ioreq_server_state: Enable or disable the IOREQ Server - * - * The IOREQ Server will not be passed any emulation requests until it is - * in the enabled state. - * Note that the contents of the ioreq_gfn and bufioreq_gfn (see - * XEN_DMOP_get_ioreq_server_info) are not meaningful until the IOREQ Server - * is in the enabled state. - */ -#define XEN_DMOP_set_ioreq_server_state 5 - -struct xen_dm_op_set_ioreq_server_state { - /* IN - server id */ - ioservid_t id; - /* IN - enabled? */ - uint8_t enabled; - uint8_t pad; -}; - -/* - * XEN_DMOP_destroy_ioreq_server: Destroy the IOREQ Server . - * - * Any registered I/O ranges will be automatically deregistered. - */ -#define XEN_DMOP_destroy_ioreq_server 6 - -struct xen_dm_op_destroy_ioreq_server { - /* IN - server id */ - ioservid_t id; - uint16_t pad; -}; - -/* - * XEN_DMOP_track_dirty_vram: Track modifications to the specified pfn - * range. - * - * NOTE: The bitmap passed back to the caller is passed in a - * secondary buffer. - */ -#define XEN_DMOP_track_dirty_vram 7 - -struct xen_dm_op_track_dirty_vram { - /* IN - number of pages to be tracked */ - uint32_t nr; - uint32_t pad; - /* IN - first pfn to track */ - uint64_aligned_t first_pfn; -}; - -/* - * XEN_DMOP_set_pci_intx_level: Set the logical level of one of a domain's - * PCI INTx pins. - */ -#define XEN_DMOP_set_pci_intx_level 8 - -struct xen_dm_op_set_pci_intx_level { - /* IN - PCI INTx identification (domain:bus:device:intx) */ - uint16_t domain; - uint8_t bus, device, intx; - /* IN - Level: 0 -> deasserted, 1 -> asserted */ - uint8_t level; -}; - -/* - * XEN_DMOP_set_isa_irq_level: Set the logical level of a one of a domain's - * ISA IRQ lines. - */ -#define XEN_DMOP_set_isa_irq_level 9 - -struct xen_dm_op_set_isa_irq_level { - /* IN - ISA IRQ (0-15) */ - uint8_t isa_irq; - /* IN - Level: 0 -> deasserted, 1 -> asserted */ - uint8_t level; -}; - -/* - * XEN_DMOP_set_pci_link_route: Map a PCI INTx line to an IRQ line. - */ -#define XEN_DMOP_set_pci_link_route 10 - -struct xen_dm_op_set_pci_link_route { - /* PCI INTx line (0-3) */ - uint8_t link; - /* ISA IRQ (1-15) or 0 -> disable link */ - uint8_t isa_irq; -}; - -/* - * XEN_DMOP_modified_memory: Notify that a set of pages were modified by - * an emulator. - * - * DMOP buf 1 contains an array of xen_dm_op_modified_memory_extent with - * @nr_extents entries. - * - * On error, @nr_extents will contain the index+1 of the extent that - * had the error. It is not defined if or which pages may have been - * marked as dirty, in this event. - */ -#define XEN_DMOP_modified_memory 11 - -struct xen_dm_op_modified_memory { - /* - * IN - Number of extents to be processed - * OUT -returns n+1 for failing extent - */ - uint32_t nr_extents; - /* IN/OUT - Must be set to 0 */ - uint32_t opaque; -}; - -struct xen_dm_op_modified_memory_extent { - /* IN - number of contiguous pages modified */ - uint32_t nr; - uint32_t pad; - /* IN - first pfn modified */ - uint64_aligned_t first_pfn; -}; - -/* - * XEN_DMOP_set_mem_type: Notify that a region of memory is to be treated - * in a specific way. (See definition of - * hvmmem_type_t). - * - * NOTE: In the event of a continuation (return code -ERESTART), the - * @first_pfn is set to the value of the pfn of the remaining - * region and @nr reduced to the size of the remaining region. - */ -#define XEN_DMOP_set_mem_type 12 - -struct xen_dm_op_set_mem_type { - /* IN - number of contiguous pages */ - uint32_t nr; - /* IN - new hvmmem_type_t of region */ - uint16_t mem_type; - uint16_t pad; - /* IN - first pfn in region */ - uint64_aligned_t first_pfn; -}; - -/* - * XEN_DMOP_inject_event: Inject an event into a VCPU, which will - * get taken up when it is next scheduled. - * - * Note that the caller should know enough of the state of the CPU before - * injecting, to know what the effect of injecting the event will be. - */ -#define XEN_DMOP_inject_event 13 - -struct xen_dm_op_inject_event { - /* IN - index of vCPU */ - uint32_t vcpuid; - /* IN - interrupt vector */ - uint8_t vector; - /* IN - event type (DMOP_EVENT_* ) */ - uint8_t type; -/* NB. This enumeration precisely matches hvm.h:X86_EVENTTYPE_* */ -# define XEN_DMOP_EVENT_ext_int 0 /* external interrupt */ -# define XEN_DMOP_EVENT_nmi 2 /* nmi */ -# define XEN_DMOP_EVENT_hw_exc 3 /* hardware exception */ -# define XEN_DMOP_EVENT_sw_int 4 /* software interrupt (CD nn) */ -# define XEN_DMOP_EVENT_pri_sw_exc 5 /* ICEBP (F1) */ -# define XEN_DMOP_EVENT_sw_exc 6 /* INT3 (CC), INTO (CE) */ - /* IN - instruction length */ - uint8_t insn_len; - uint8_t pad0; - /* IN - error code (or ~0 to skip) */ - uint32_t error_code; - uint32_t pad1; - /* IN - type-specific extra data (%cr2 for #PF, pending_dbg for #DB) */ - uint64_aligned_t cr2; -}; - -/* - * XEN_DMOP_inject_msi: Inject an MSI for an emulated device. - */ -#define XEN_DMOP_inject_msi 14 - -struct xen_dm_op_inject_msi { - /* IN - MSI data (lower 32 bits) */ - uint32_t data; - uint32_t pad; - /* IN - MSI address (0xfeexxxxx) */ - uint64_aligned_t addr; -}; - -/* - * XEN_DMOP_map_mem_type_to_ioreq_server : map or unmap the IOREQ Server - * to specific memory type - * for specific accesses - * - * For now, flags only accept the value of XEN_DMOP_IOREQ_MEM_ACCESS_WRITE, - * which means only write operations are to be forwarded to an ioreq server. - * Support for the emulation of read operations can be added when an ioreq - * server has such requirement in future. - */ -#define XEN_DMOP_map_mem_type_to_ioreq_server 15 - -struct xen_dm_op_map_mem_type_to_ioreq_server { - ioservid_t id; /* IN - ioreq server id */ - uint16_t type; /* IN - memory type */ - uint32_t flags; /* IN - types of accesses to be forwarded to the - ioreq server. flags with 0 means to unmap the - ioreq server */ - -#define XEN_DMOP_IOREQ_MEM_ACCESS_READ (1u << 0) -#define XEN_DMOP_IOREQ_MEM_ACCESS_WRITE (1u << 1) - - uint64_t opaque; /* IN/OUT - only used for hypercall continuation, - has to be set to zero by the caller */ -}; - -/* - * XEN_DMOP_remote_shutdown : Declare a shutdown for another domain - * Identical to SCHEDOP_remote_shutdown - */ -#define XEN_DMOP_remote_shutdown 16 - -struct xen_dm_op_remote_shutdown { - uint32_t reason; /* SHUTDOWN_* => enum sched_shutdown_reason */ - /* (Other reason values are not blocked) */ -}; - -/* - * XEN_DMOP_relocate_memory : Relocate GFNs for the specified guest. - * Identical to XENMEM_add_to_physmap with - * space == XENMAPSPACE_gmfn_range. - */ -#define XEN_DMOP_relocate_memory 17 - -struct xen_dm_op_relocate_memory { - /* All fields are IN/OUT, with their OUT state undefined. */ - /* Number of GFNs to process. */ - uint32_t size; - uint32_t pad; - /* Starting GFN to relocate. */ - uint64_aligned_t src_gfn; - /* Starting GFN where GFNs should be relocated. */ - uint64_aligned_t dst_gfn; -}; - -/* - * XEN_DMOP_pin_memory_cacheattr : Pin caching type of RAM space. - * Identical to XEN_DOMCTL_pin_mem_cacheattr. - */ -#define XEN_DMOP_pin_memory_cacheattr 18 - -struct xen_dm_op_pin_memory_cacheattr { - uint64_aligned_t start; /* Start gfn. */ - uint64_aligned_t end; /* End gfn. */ -/* Caching types: these happen to be the same as x86 MTRR/PAT type codes. */ -#define XEN_DMOP_MEM_CACHEATTR_UC 0 -#define XEN_DMOP_MEM_CACHEATTR_WC 1 -#define XEN_DMOP_MEM_CACHEATTR_WT 4 -#define XEN_DMOP_MEM_CACHEATTR_WP 5 -#define XEN_DMOP_MEM_CACHEATTR_WB 6 -#define XEN_DMOP_MEM_CACHEATTR_UCM 7 -#define XEN_DMOP_DELETE_MEM_CACHEATTR (~(uint32_t)0) - uint32_t type; /* XEN_DMOP_MEM_CACHEATTR_* */ - uint32_t pad; -}; - -struct xen_dm_op { - uint32_t op; - uint32_t pad; - union { - struct xen_dm_op_create_ioreq_server create_ioreq_server; - struct xen_dm_op_get_ioreq_server_info get_ioreq_server_info; - struct xen_dm_op_ioreq_server_range map_io_range_to_ioreq_server; - struct xen_dm_op_ioreq_server_range unmap_io_range_from_ioreq_server; - struct xen_dm_op_set_ioreq_server_state set_ioreq_server_state; - struct xen_dm_op_destroy_ioreq_server destroy_ioreq_server; - struct xen_dm_op_track_dirty_vram track_dirty_vram; - struct xen_dm_op_set_pci_intx_level set_pci_intx_level; - struct xen_dm_op_set_isa_irq_level set_isa_irq_level; - struct xen_dm_op_set_pci_link_route set_pci_link_route; - struct xen_dm_op_modified_memory modified_memory; - struct xen_dm_op_set_mem_type set_mem_type; - struct xen_dm_op_inject_event inject_event; - struct xen_dm_op_inject_msi inject_msi; - struct xen_dm_op_map_mem_type_to_ioreq_server - map_mem_type_to_ioreq_server; - struct xen_dm_op_remote_shutdown remote_shutdown; - struct xen_dm_op_relocate_memory relocate_memory; - struct xen_dm_op_pin_memory_cacheattr pin_memory_cacheattr; - } u; -}; - -#endif /* __XEN__ || __XEN_TOOLS__ */ - -struct xen_dm_op_buf { - XEN_GUEST_HANDLE(void) h; - xen_ulong_t size; -}; -typedef struct xen_dm_op_buf xen_dm_op_buf_t; -DEFINE_XEN_GUEST_HANDLE(xen_dm_op_buf_t); - -/* ` enum neg_errnoval - * ` HYPERVISOR_dm_op(domid_t domid, - * ` unsigned int nr_bufs, - * ` xen_dm_op_buf_t bufs[]) - * ` - * - * @domid is the domain the hypercall operates on. - * @nr_bufs is the number of buffers in the @bufs array. - * @bufs points to an array of buffers where @bufs[0] contains a struct - * xen_dm_op, describing the specific device model operation and its - * parameters. - * @bufs[1..] may be referenced in the parameters for the purposes of - * passing extra information to or from the domain. - */ - -#endif /* __XEN_PUBLIC_HVM_DM_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/sys/xen/interface/hvm/e820.h b/sys/xen/interface/hvm/e820.h deleted file mode 100644 index 4c42f3341e10..000000000000 --- a/sys/xen/interface/hvm/e820.h +++ /dev/null @@ -1,38 +0,0 @@ -/* - * 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_HVM_E820_H__ -#define __XEN_PUBLIC_HVM_E820_H__ - -#include "../xen.h" - -/* E820 location in HVM virtual address space. */ -#define HVM_E820_PAGE 0x00090000 -#define HVM_E820_NR_OFFSET 0x000001E8 -#define HVM_E820_OFFSET 0x000002D0 - -#define HVM_BELOW_4G_RAM_END 0xF0000000 -#define HVM_BELOW_4G_MMIO_START HVM_BELOW_4G_RAM_END -#define HVM_BELOW_4G_MMIO_LENGTH ((xen_mk_ullong(1) << 32) - \ - HVM_BELOW_4G_MMIO_START) - -#endif /* __XEN_PUBLIC_HVM_E820_H__ */ diff --git a/sys/xen/interface/hvm/hvm_info_table.h b/sys/xen/interface/hvm/hvm_info_table.h deleted file mode 100644 index c46e03ef17f9..000000000000 --- a/sys/xen/interface/hvm/hvm_info_table.h +++ /dev/null @@ -1,82 +0,0 @@ -/****************************************************************************** - * hvm/hvm_info_table.h - * - * HVM parameter and information table, written into guest memory map. - * - * 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_HVM_HVM_INFO_TABLE_H__ -#define __XEN_PUBLIC_HVM_HVM_INFO_TABLE_H__ - -#define HVM_INFO_PFN 0x09F -#define HVM_INFO_OFFSET 0x800 -#define HVM_INFO_PADDR ((HVM_INFO_PFN << 12) + HVM_INFO_OFFSET) - -/* Maximum we can support with current vLAPIC ID mapping. */ -#define HVM_MAX_VCPUS 128 - -/* - * In some cases SMP HVM guests may require knowledge of Xen's idea of vCPU ids - * for their vCPUs. For example, HYPERVISOR_vcpu_op and some EVTCHNOP_* - * hypercalls take vcpu id as a parameter. It is valid for HVM guests to assume - * that Xen's vCPU id always equals to ACPI (not APIC!) id in MADT table which - * is always present for SMP guests. - */ - -struct hvm_info_table { - char signature[8]; /* "HVM INFO" */ - uint32_t length; - uint8_t checksum; - - /* Should firmware build APIC descriptors (APIC MADT / MP BIOS)? */ - uint8_t apic_mode; - - /* How many CPUs does this domain have? */ - uint32_t nr_vcpus; - - /* - * MEMORY MAP provided by HVM domain builder. - * Notes: - * 1. page_to_phys(x) = x << 12 - * 2. If a field is zero, the corresponding range does not exist. - */ - /* - * 0x0 to page_to_phys(low_mem_pgend)-1: - * RAM below 4GB (except for VGA hole 0xA0000-0xBFFFF) - */ - uint32_t low_mem_pgend; - /* - * page_to_phys(reserved_mem_pgstart) to 0xFFFFFFFF: - * Reserved for special memory mappings - */ - uint32_t reserved_mem_pgstart; - /* - * 0x100000000 to page_to_phys(high_mem_pgend)-1: - * RAM above 4GB - */ - uint32_t high_mem_pgend; - - /* Bitmap of which CPUs are online at boot time. */ - uint8_t vcpu_online[(HVM_MAX_VCPUS + 7)/8]; -}; - -#endif /* __XEN_PUBLIC_HVM_HVM_INFO_TABLE_H__ */ diff --git a/sys/xen/interface/hvm/hvm_op.h b/sys/xen/interface/hvm/hvm_op.h deleted file mode 100644 index 870ec5206072..000000000000 --- a/sys/xen/interface/hvm/hvm_op.h +++ /dev/null @@ -1,395 +0,0 @@ -/* - * 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 */ - uint16_t pad; - 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); - -struct xen_hvm_altp2m_suppress_ve { - uint16_t view; - uint8_t suppress_ve; /* Boolean type. */ - uint8_t pad1; - uint32_t pad2; - uint64_t gfn; -}; - -struct xen_hvm_altp2m_suppress_ve_multi { - uint16_t view; - uint8_t suppress_ve; /* Boolean type. */ - uint8_t pad1; - int32_t first_error; /* Should be set to 0. */ - uint64_t first_gfn; /* Value may be updated. */ - uint64_t last_gfn; - uint64_t first_error_gfn; /* Gfn of the first error. */ -}; - -#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 - -/* - * hvmmem_type_t should not be defined when generating the corresponding - * compat header. This will ensure that the improperly named HVMMEM_(*) - * values are defined only once. - */ -#ifndef XEN_GENERATING_COMPAT_HEADERS - -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; - -#endif /* XEN_GENERATING_COMPAT_HEADERS */ - -/* 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 that should be used for event - * channel upcalls on the specified . 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_vcpu_disable_notify { - uint32_t vcpu_id; -}; -typedef struct xen_hvm_altp2m_vcpu_disable_notify xen_hvm_altp2m_vcpu_disable_notify_t; -DEFINE_XEN_GUEST_HANDLE(xen_hvm_altp2m_vcpu_disable_notify_t); - -struct xen_hvm_altp2m_view { - /* IN/OUT variable */ - uint16_t view; - 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); - -#if __XEN_INTERFACE_VERSION__ < 0x00040a00 -struct xen_hvm_altp2m_set_mem_access { - /* view */ - uint16_t view; - /* Memory type */ - uint16_t 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); -#endif /* __XEN_INTERFACE_VERSION__ < 0x00040a00 */ - -struct xen_hvm_altp2m_mem_access { - /* view */ - uint16_t view; - /* Memory type */ - uint16_t access; /* xenmem_access_t */ - uint32_t pad; - /* gfn */ - uint64_t gfn; -}; -typedef struct xen_hvm_altp2m_mem_access xen_hvm_altp2m_mem_access_t; -DEFINE_XEN_GUEST_HANDLE(xen_hvm_altp2m_mem_access_t); - -struct xen_hvm_altp2m_set_mem_access_multi { - /* view */ - uint16_t view; - uint16_t pad; - /* Number of pages */ - uint32_t nr; - /* - * Used for continuation purposes. - * Must be set to zero upon initial invocation. - */ - uint64_t opaque; - /* List of pfns to set access for */ - XEN_GUEST_HANDLE(const_uint64) pfn_list; - /* Corresponding list of access settings for pfn_list */ - XEN_GUEST_HANDLE(const_uint8) access_list; -}; - -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_get_vcpu_p2m_idx { - uint32_t vcpu_id; - uint16_t altp2m_idx; -}; - -struct xen_hvm_altp2m_set_visibility { - uint16_t altp2m_idx; - uint8_t visible; - uint8_t pad; -}; - -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 a given 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 -/* Set access for an array of pages */ -#define HVMOP_altp2m_set_mem_access_multi 9 -/* Set the "Suppress #VE" bit on a page */ -#define HVMOP_altp2m_set_suppress_ve 10 -/* Get the "Suppress #VE" bit of a page */ -#define HVMOP_altp2m_get_suppress_ve 11 -/* Get the access of a page of memory from a certain view */ -#define HVMOP_altp2m_get_mem_access 12 -/* Disable altp2m event notifications for a given VCPU */ -#define HVMOP_altp2m_vcpu_disable_notify 13 -/* Get the active vcpu p2m index */ -#define HVMOP_altp2m_get_p2m_idx 14 -/* Set the "Supress #VE" bit for a range of pages */ -#define HVMOP_altp2m_set_suppress_ve_multi 15 -/* Set visibility for a given altp2m view */ -#define HVMOP_altp2m_set_visibility 16 - 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; -#if __XEN_INTERFACE_VERSION__ < 0x00040a00 - struct xen_hvm_altp2m_set_mem_access set_mem_access; -#endif /* __XEN_INTERFACE_VERSION__ < 0x00040a00 */ - struct xen_hvm_altp2m_mem_access mem_access; - struct xen_hvm_altp2m_change_gfn change_gfn; - struct xen_hvm_altp2m_set_mem_access_multi set_mem_access_multi; - struct xen_hvm_altp2m_suppress_ve suppress_ve; - struct xen_hvm_altp2m_suppress_ve_multi suppress_ve_multi; - struct xen_hvm_altp2m_vcpu_disable_notify disable_notify; - struct xen_hvm_altp2m_get_vcpu_p2m_idx get_vcpu_p2m_idx; - struct xen_hvm_altp2m_set_visibility set_visibility; - 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/sys/xen/interface/hvm/hvm_vcpu.h b/sys/xen/interface/hvm/hvm_vcpu.h deleted file mode 100644 index d21abf1885df..000000000000 --- a/sys/xen/interface/hvm/hvm_vcpu.h +++ /dev/null @@ -1,144 +0,0 @@ -/* - * 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) 2015, Roger Pau Monne - */ - -#ifndef __XEN_PUBLIC_HVM_HVM_VCPU_H__ -#define __XEN_PUBLIC_HVM_HVM_VCPU_H__ - -#include "../xen.h" - -struct vcpu_hvm_x86_32 { - uint32_t eax; - uint32_t ecx; - uint32_t edx; - uint32_t ebx; - uint32_t esp; - uint32_t ebp; - uint32_t esi; - uint32_t edi; - uint32_t eip; - uint32_t eflags; - - uint32_t cr0; - uint32_t cr3; - uint32_t cr4; - - uint32_t pad1; - - /* - * EFER should only be used to set the NXE bit (if required) - * when starting a vCPU in 32bit mode with paging enabled or - * to set the LME/LMA bits in order to start the vCPU in - * compatibility mode. - */ - uint64_t efer; - - uint32_t cs_base; - uint32_t ds_base; - uint32_t ss_base; - uint32_t es_base; - uint32_t tr_base; - uint32_t cs_limit; - uint32_t ds_limit; - uint32_t ss_limit; - uint32_t es_limit; - uint32_t tr_limit; - uint16_t cs_ar; - uint16_t ds_ar; - uint16_t ss_ar; - uint16_t es_ar; - uint16_t tr_ar; - - uint16_t pad2[3]; -}; - -/* - * The layout of the _ar fields of the segment registers is the - * following: - * - * Bits [0,3]: type (bits 40-43). - * Bit 4: s (descriptor type, bit 44). - * Bit [5,6]: dpl (descriptor privilege level, bits 45-46). - * Bit 7: p (segment-present, bit 47). - * Bit 8: avl (available for system software, bit 52). - * Bit 9: l (64-bit code segment, bit 53). - * Bit 10: db (meaning depends on the segment, bit 54). - * Bit 11: g (granularity, bit 55) - * Bits [12,15]: unused, must be blank. - * - * A more complete description of the meaning of this fields can be - * obtained from the Intel SDM, Volume 3, section 3.4.5. - */ - -struct vcpu_hvm_x86_64 { - uint64_t rax; - uint64_t rcx; - uint64_t rdx; - uint64_t rbx; - uint64_t rsp; - uint64_t rbp; - uint64_t rsi; - uint64_t rdi; - uint64_t rip; - uint64_t rflags; - - uint64_t cr0; - uint64_t cr3; - uint64_t cr4; - uint64_t efer; - - /* - * Using VCPU_HVM_MODE_64B implies that the vCPU is launched - * directly in long mode, so the cached parts of the segment - * registers get set to match that environment. - * - * If the user wants to launch the vCPU in compatibility mode - * the 32-bit structure should be used instead. - */ -}; - -struct vcpu_hvm_context { -#define VCPU_HVM_MODE_32B 0 /* 32bit fields of the structure will be used. */ -#define VCPU_HVM_MODE_64B 1 /* 64bit fields of the structure will be used. */ - uint32_t mode; - - uint32_t pad; - - /* CPU registers. */ - union { - struct vcpu_hvm_x86_32 x86_32; - struct vcpu_hvm_x86_64 x86_64; - } cpu_regs; -}; -typedef struct vcpu_hvm_context vcpu_hvm_context_t; -DEFINE_XEN_GUEST_HANDLE(vcpu_hvm_context_t); - -#endif /* __XEN_PUBLIC_HVM_HVM_VCPU_H__ */ - -/* - * Local variables: - * mode: C - * c-file-style: "BSD" - * c-basic-offset: 4 - * tab-width: 4 - * indent-tabs-mode: nil - * End: - */ diff --git a/sys/xen/interface/hvm/hvm_xs_strings.h b/sys/xen/interface/hvm/hvm_xs_strings.h deleted file mode 100644 index fba2546424f0..000000000000 --- a/sys/xen/interface/hvm/hvm_xs_strings.h +++ /dev/null @@ -1,89 +0,0 @@ -/****************************************************************************** - * hvm/hvm_xs_strings.h - * - * HVM xenstore strings used in HVMLOADER. - * - * 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) 2013, Citrix Systems - */ - -#ifndef __XEN_PUBLIC_HVM_HVM_XS_STRINGS_H__ -#define __XEN_PUBLIC_HVM_HVM_XS_STRINGS_H__ - -#define HVM_XS_HVMLOADER "hvmloader" -#define HVM_XS_BIOS "hvmloader/bios" -#define HVM_XS_GENERATION_ID_ADDRESS "hvmloader/generation-id-address" -#define HVM_XS_ALLOW_MEMORY_RELOCATE "hvmloader/allow-memory-relocate" - -/* The following values allow additional ACPI tables to be added to the - * virtual ACPI BIOS that hvmloader constructs. The values specify the guest - * physical address and length of a block of ACPI tables to add. The format of - * the block is simply concatenated raw tables (which specify their own length - * in the ACPI header). - */ -#define HVM_XS_ACPI_PT_ADDRESS "hvmloader/acpi/address" -#define HVM_XS_ACPI_PT_LENGTH "hvmloader/acpi/length" - -/* Any number of SMBIOS types can be passed through to an HVM guest using - * the following xenstore values. The values specify the guest physical - * address and length of a block of SMBIOS structures for hvmloader to use. - * The block is formatted in the following way: - * - * ... - * - * Each length separator is a 32b integer indicating the length of the next - * SMBIOS structure. For DMTF defined types (0 - 121), the passed in struct - * will replace the default structure in hvmloader. In addition, any - * OEM/vendortypes (128 - 255) will all be added. - */ -#define HVM_XS_SMBIOS_PT_ADDRESS "hvmloader/smbios/address" -#define HVM_XS_SMBIOS_PT_LENGTH "hvmloader/smbios/length" - -/* Set to 1 to enable SMBIOS default portable battery (type 22) values. */ -#define HVM_XS_SMBIOS_DEFAULT_BATTERY "hvmloader/smbios/default_battery" - -/* The following xenstore values are used to override some of the default - * string values in the SMBIOS table constructed in hvmloader. - */ -#define HVM_XS_BIOS_STRINGS "bios-strings" -#define HVM_XS_BIOS_VENDOR "bios-strings/bios-vendor" -#define HVM_XS_BIOS_VERSION "bios-strings/bios-version" -#define HVM_XS_SYSTEM_MANUFACTURER "bios-strings/system-manufacturer" -#define HVM_XS_SYSTEM_PRODUCT_NAME "bios-strings/system-product-name" -#define HVM_XS_SYSTEM_VERSION "bios-strings/system-version" -#define HVM_XS_SYSTEM_SERIAL_NUMBER "bios-strings/system-serial-number" -#define HVM_XS_BASEBOARD_MANUFACTURER "bios-strings/baseboard-manufacturer" -#define HVM_XS_BASEBOARD_PRODUCT_NAME "bios-strings/baseboard-product-name" -#define HVM_XS_BASEBOARD_VERSION "bios-strings/baseboard-version" -#define HVM_XS_BASEBOARD_SERIAL_NUMBER "bios-strings/baseboard-serial-number" -#define HVM_XS_BASEBOARD_ASSET_TAG "bios-strings/baseboard-asset-tag" -#define HVM_XS_BASEBOARD_LOCATION_IN_CHASSIS "bios-strings/baseboard-location-in-chassis" -#define HVM_XS_ENCLOSURE_MANUFACTURER "bios-strings/enclosure-manufacturer" -#define HVM_XS_ENCLOSURE_SERIAL_NUMBER "bios-strings/enclosure-serial-number" -#define HVM_XS_ENCLOSURE_ASSET_TAG "bios-strings/enclosure-asset-tag" -#define HVM_XS_BATTERY_MANUFACTURER "bios-strings/battery-manufacturer" -#define HVM_XS_BATTERY_DEVICE_NAME "bios-strings/battery-device-name" - -/* 1 to 99 OEM strings can be set in xenstore using values of the form - * below. These strings will be loaded into the SMBIOS type 11 structure. - */ -#define HVM_XS_OEM_STRINGS "bios-strings/oem-%d" - -#endif /* __XEN_PUBLIC_HVM_HVM_XS_STRINGS_H__ */ diff --git a/sys/xen/interface/hvm/ioreq.h b/sys/xen/interface/hvm/ioreq.h deleted file mode 100644 index c511fae8e793..000000000000 --- a/sys/xen/interface/hvm/ioreq.h +++ /dev/null @@ -1,143 +0,0 @@ -/* - * ioreq.h: I/O request definitions for device models - * Copyright (c) 2004, Intel Corporation. - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to - * deal in the Software without restriction, including without limitation the - * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or - * sell copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ - -#ifndef _IOREQ_H_ -#define _IOREQ_H_ - -#define IOREQ_READ 1 -#define IOREQ_WRITE 0 - -#define STATE_IOREQ_NONE 0 -#define STATE_IOREQ_READY 1 -#define STATE_IOREQ_INPROCESS 2 -#define STATE_IORESP_READY 3 - -#define IOREQ_TYPE_PIO 0 /* pio */ -#define IOREQ_TYPE_COPY 1 /* mmio ops */ -#define IOREQ_TYPE_PCI_CONFIG 2 -#define IOREQ_TYPE_TIMEOFFSET 7 -#define IOREQ_TYPE_INVALIDATE 8 /* mapcache */ - -/* - * VMExit dispatcher should cooperate with instruction decoder to - * prepare this structure and notify service OS and DM by sending - * virq. - * - * For I/O type IOREQ_TYPE_PCI_CONFIG, the physical address is formatted - * as follows: - * - * 63....48|47..40|39..35|34..32|31........0 - * SEGMENT |BUS |DEV |FN |OFFSET - */ -struct ioreq { - uint64_t addr; /* physical address */ - uint64_t data; /* data (or paddr of data) */ - uint32_t count; /* for rep prefixes */ - uint32_t size; /* size in bytes */ - uint32_t vp_eport; /* evtchn for notifications to/from device model */ - uint16_t _pad0; - uint8_t state:4; - uint8_t data_is_ptr:1; /* if 1, data above is the guest paddr - * of the real data to use. */ - uint8_t dir:1; /* 1=read, 0=write */ - uint8_t df:1; - uint8_t _pad1:1; - uint8_t type; /* I/O type */ -}; -typedef struct ioreq ioreq_t; - -struct shared_iopage { - struct ioreq vcpu_ioreq[1]; -}; -typedef struct shared_iopage shared_iopage_t; - -struct buf_ioreq { - uint8_t type; /* I/O type */ - uint8_t pad:1; - uint8_t dir:1; /* 1=read, 0=write */ - uint8_t size:2; /* 0=>1, 1=>2, 2=>4, 3=>8. If 8, use two buf_ioreqs */ - uint32_t addr:20;/* physical address */ - uint32_t data; /* data */ -}; -typedef struct buf_ioreq buf_ioreq_t; - -#define IOREQ_BUFFER_SLOT_NUM 511 /* 8 bytes each, plus 2 4-byte indexes */ -struct buffered_iopage { -#ifdef __XEN__ - union bufioreq_pointers { - struct { -#endif - uint32_t read_pointer; - uint32_t write_pointer; -#ifdef __XEN__ - }; - uint64_t full; - } ptrs; -#endif - buf_ioreq_t buf_ioreq[IOREQ_BUFFER_SLOT_NUM]; -}; /* NB. Size of this structure must be no greater than one page. */ -typedef struct buffered_iopage buffered_iopage_t; - -/* - * ACPI Control/Event register locations. Location is controlled by a - * version number in HVM_PARAM_ACPI_IOPORTS_LOCATION. - */ - -/* - * Version 0 (default): Traditional (obsolete) Xen locations. - * - * These are now only used for compatibility with VMs migrated - * from older Xen versions. - */ -#define ACPI_PM1A_EVT_BLK_ADDRESS_V0 0x1f40 -#define ACPI_PM1A_CNT_BLK_ADDRESS_V0 (ACPI_PM1A_EVT_BLK_ADDRESS_V0 + 0x04) -#define ACPI_PM_TMR_BLK_ADDRESS_V0 (ACPI_PM1A_EVT_BLK_ADDRESS_V0 + 0x08) -#define ACPI_GPE0_BLK_ADDRESS_V0 (ACPI_PM_TMR_BLK_ADDRESS_V0 + 0x20) -#define ACPI_GPE0_BLK_LEN_V0 0x08 - -/* Version 1: Locations preferred by modern Qemu (including Qemu-trad). */ -#define ACPI_PM1A_EVT_BLK_ADDRESS_V1 0xb000 -#define ACPI_PM1A_CNT_BLK_ADDRESS_V1 (ACPI_PM1A_EVT_BLK_ADDRESS_V1 + 0x04) -#define ACPI_PM_TMR_BLK_ADDRESS_V1 (ACPI_PM1A_EVT_BLK_ADDRESS_V1 + 0x08) -#define ACPI_GPE0_BLK_ADDRESS_V1 0xafe0 -#define ACPI_GPE0_BLK_LEN_V1 0x04 - -/* Compatibility definitions for the default location (version 0). */ -#define ACPI_PM1A_EVT_BLK_ADDRESS ACPI_PM1A_EVT_BLK_ADDRESS_V0 -#define ACPI_PM1A_CNT_BLK_ADDRESS ACPI_PM1A_CNT_BLK_ADDRESS_V0 -#define ACPI_PM_TMR_BLK_ADDRESS ACPI_PM_TMR_BLK_ADDRESS_V0 -#define ACPI_GPE0_BLK_ADDRESS ACPI_GPE0_BLK_ADDRESS_V0 -#define ACPI_GPE0_BLK_LEN ACPI_GPE0_BLK_LEN_V0 - - -#endif /* _IOREQ_H_ */ - -/* - * Local variables: - * mode: C - * c-file-style: "BSD" - * c-basic-offset: 4 - * tab-width: 4 - * indent-tabs-mode: nil - * End: - */ diff --git a/sys/xen/interface/hvm/params.h b/sys/xen/interface/hvm/params.h deleted file mode 100644 index 0a91bfa749b4..000000000000 --- a/sys/xen/interface/hvm/params.h +++ /dev/null @@ -1,305 +0,0 @@ -/* - * 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" - -/* These parameters are deprecated and their meaning is undefined. */ -#if defined(__XEN__) || defined(__XEN_TOOLS__) - -#define HVM_PARAM_PAE_ENABLED 4 -#define HVM_PARAM_DM_DOMAIN 13 -#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_BUFIOREQ_EVTCHN 26 -#define HVM_PARAM_MEMORY_EVENT_MSR 30 - -#endif /* defined(__XEN__) || defined(__XEN_TOOLS__) */ - -/* - * 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_IOREQ_PFN 5 - -#define HVM_PARAM_BUFIOREQ_PFN 6 - -#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) - -/* Enable SYNIC MSRs */ -#define _HVMPV_synic 7 -#define HVMPV_synic (1 << _HVMPV_synic) - -/* Enable STIMER MSRs */ -#define _HVMPV_stimer 8 -#define HVMPV_stimer (1 << _HVMPV_stimer) - -/* Use Synthetic Cluster IPI Hypercall */ -#define _HVMPV_hcall_ipi 9 -#define HVMPV_hcall_ipi (1 << _HVMPV_hcall_ipi) - -#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 | \ - HVMPV_synic | \ - HVMPV_stimer | \ - HVMPV_hcall_ipi) - -#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 - -/* 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 - */ -#define HVM_PARAM_ACPI_IOPORTS_LOCATION 19 - -/* 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) - * - * Note that 'mixed' mode has not been evaluated for safety from a - * security perspective. Before using this mode in a - * security-critical environment, each subop should be evaluated for - * safety, with unsafe subops blacklisted in XSM. - */ -#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/sys/xen/interface/hvm/pvdrivers.h b/sys/xen/interface/hvm/pvdrivers.h deleted file mode 100644 index 3241f94eb915..000000000000 --- a/sys/xen/interface/hvm/pvdrivers.h +++ /dev/null @@ -1,49 +0,0 @@ -/* - * pvdrivers.h: Register of PV drivers product numbers. - * Copyright (c) 2012, Citrix Systems Inc. - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to - * deal in the Software without restriction, including without limitation the - * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or - * sell copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ - -#ifndef _XEN_PUBLIC_PVDRIVERS_H_ -#define _XEN_PUBLIC_PVDRIVERS_H_ - -/* - * This is the master registry of product numbers for - * PV drivers. - * If you need a new product number allocating, please - * post to xen-devel@lists.xenproject.org. You should NOT use - * a product number without allocating one. - * If you maintain a separate versioning and distribution path - * for PV drivers you should have a separate product number so - * that your drivers can be separated from others. - * - * During development, you may use the product ID to - * indicate a driver which is yet to be released. - */ - -#define PVDRIVERS_PRODUCT_LIST(EACH) \ - EACH("xensource-windows", 0x0001) /* Citrix */ \ - EACH("gplpv-windows", 0x0002) /* James Harper */ \ - EACH("linux", 0x0003) \ - EACH("xenserver-windows-v7.0+", 0x0004) /* Citrix */ \ - EACH("xenserver-windows-v7.2+", 0x0005) /* Citrix */ \ - EACH("experimental", 0xffff) - -#endif /* _XEN_PUBLIC_PVDRIVERS_H_ */ diff --git a/sys/xen/interface/hvm/save.h b/sys/xen/interface/hvm/save.h deleted file mode 100644 index f72e3a9bc48c..000000000000 --- a/sys/xen/interface/hvm/save.h +++ /dev/null @@ -1,113 +0,0 @@ -/* - * hvm/save.h - * - * Structure definitions for HVM state that is held by Xen and must - * be saved along with the domain's memory and device-model state. - * - * Copyright (c) 2007 XenSource Ltd. - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to - * deal in the Software without restriction, including without limitation the - * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or - * sell copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ - -#ifndef __XEN_PUBLIC_HVM_SAVE_H__ -#define __XEN_PUBLIC_HVM_SAVE_H__ - -/* - * Structures in this header *must* have the same layout in 32bit - * and 64bit environments: this means that all fields must be explicitly - * sized types and aligned to their sizes, and the structs must be - * a multiple of eight bytes long. - * - * Only the state necessary for saving and restoring (i.e. fields - * that are analogous to actual hardware state) should go in this file. - * Internal mechanisms should be kept in Xen-private headers. - */ - -#if !defined(__GNUC__) || defined(__STRICT_ANSI__) -#error "Anonymous structs/unions are a GNU extension." -#endif - -/* - * Each entry is preceded by a descriptor giving its type and length - */ -struct hvm_save_descriptor { - uint16_t typecode; /* Used to demux the various types below */ - uint16_t instance; /* Further demux within a type */ - uint32_t length; /* In bytes, *not* including this descriptor */ -}; - - -/* - * Each entry has a datatype associated with it: for example, the CPU state - * is saved as a HVM_SAVE_TYPE(CPU), which has HVM_SAVE_LENGTH(CPU), - * and is identified by a descriptor with typecode HVM_SAVE_CODE(CPU). - * DECLARE_HVM_SAVE_TYPE binds these things together with some type-system - * ugliness. - */ - -#ifdef __XEN__ -# define DECLARE_HVM_SAVE_TYPE_COMPAT(_x, _code, _type, _ctype, _fix) \ - static inline int __HVM_SAVE_FIX_COMPAT_##_x(void *h, uint32_t size) \ - { return _fix(h, size); } \ - struct __HVM_SAVE_TYPE_##_x { _type t; char c[_code]; char cpt[2];}; \ - struct __HVM_SAVE_TYPE_COMPAT_##_x { _ctype t; } - -# include /* BUG() */ -# define DECLARE_HVM_SAVE_TYPE(_x, _code, _type) \ - static inline int __HVM_SAVE_FIX_COMPAT_##_x(void *h, uint32_t size) \ - { BUG(); return -1; } \ - struct __HVM_SAVE_TYPE_##_x { _type t; char c[_code]; char cpt[1];}; \ - struct __HVM_SAVE_TYPE_COMPAT_##_x { _type t; } -#else -# define DECLARE_HVM_SAVE_TYPE_COMPAT(_x, _code, _type, _ctype, _fix) \ - struct __HVM_SAVE_TYPE_##_x { _type t; char c[_code]; char cpt[2];} - -# define DECLARE_HVM_SAVE_TYPE(_x, _code, _type) \ - struct __HVM_SAVE_TYPE_##_x { _type t; char c[_code]; char cpt[1];} -#endif - -#define HVM_SAVE_TYPE(_x) typeof (((struct __HVM_SAVE_TYPE_##_x *)(0))->t) -#define HVM_SAVE_LENGTH(_x) (sizeof (HVM_SAVE_TYPE(_x))) -#define HVM_SAVE_CODE(_x) (sizeof (((struct __HVM_SAVE_TYPE_##_x *)(0))->c)) - -#ifdef __XEN__ -# define HVM_SAVE_TYPE_COMPAT(_x) typeof (((struct __HVM_SAVE_TYPE_COMPAT_##_x *)(0))->t) -# define HVM_SAVE_LENGTH_COMPAT(_x) (sizeof (HVM_SAVE_TYPE_COMPAT(_x))) - -# define HVM_SAVE_HAS_COMPAT(_x) (sizeof (((struct __HVM_SAVE_TYPE_##_x *)(0))->cpt)-1) -# define HVM_SAVE_FIX_COMPAT(_x, _dst, _size) __HVM_SAVE_FIX_COMPAT_##_x(_dst, _size) -#endif - -/* - * The series of save records is teminated by a zero-type, zero-length - * descriptor. - */ - -struct hvm_save_end {}; -DECLARE_HVM_SAVE_TYPE(END, 0, struct hvm_save_end); - -#if defined(__i386__) || defined(__x86_64__) -#include "../arch-x86/hvm/save.h" -#elif defined(__arm__) || defined(__aarch64__) -#include "../arch-arm/hvm/save.h" -#else -#error "unsupported architecture" -#endif - -#endif /* __XEN_PUBLIC_HVM_SAVE_H__ */ diff --git a/sys/xen/interface/hypfs.h b/sys/xen/interface/hypfs.h deleted file mode 100644 index 63a5df1629e6..000000000000 --- a/sys/xen/interface/hypfs.h +++ /dev/null @@ -1,129 +0,0 @@ -/****************************************************************************** - * Xen Hypervisor Filesystem - * - * Copyright (c) 2019, SUSE Software Solutions Germany GmbH - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to - * deal in the Software without restriction, including without limitation the - * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or - * sell copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - * - */ - -#ifndef __XEN_PUBLIC_HYPFS_H__ -#define __XEN_PUBLIC_HYPFS_H__ - -#include "xen.h" - -/* - * Definitions for the __HYPERVISOR_hypfs_op hypercall. - */ - -/* Highest version number of the hypfs interface currently defined. */ -#define XEN_HYPFS_VERSION 1 - -/* Maximum length of a path in the filesystem. */ -#define XEN_HYPFS_MAX_PATHLEN 1024 - -struct xen_hypfs_direntry { - uint8_t type; -#define XEN_HYPFS_TYPE_DIR 0 -#define XEN_HYPFS_TYPE_BLOB 1 -#define XEN_HYPFS_TYPE_STRING 2 -#define XEN_HYPFS_TYPE_UINT 3 -#define XEN_HYPFS_TYPE_INT 4 -#define XEN_HYPFS_TYPE_BOOL 5 - uint8_t encoding; -#define XEN_HYPFS_ENC_PLAIN 0 -#define XEN_HYPFS_ENC_GZIP 1 - uint16_t pad; /* Returned as 0. */ - uint32_t content_len; /* Current length of data. */ - uint32_t max_write_len; /* Max. length for writes (0 if read-only). */ -}; - -struct xen_hypfs_dirlistentry { - struct xen_hypfs_direntry e; - /* Offset in bytes to next entry (0 == this is the last entry). */ - uint16_t off_next; - /* Zero terminated entry name, possibly with some padding for alignment. */ - char name[XEN_FLEX_ARRAY_DIM]; -}; - -/* - * Hypercall operations. - */ - -/* - * XEN_HYPFS_OP_get_version - * - * Read highest interface version supported by the hypervisor. - * - * arg1 - arg4: all 0/NULL - * - * Possible return values: - * >0: highest supported interface version - * <0: negative Xen errno value - */ -#define XEN_HYPFS_OP_get_version 0 - -/* - * XEN_HYPFS_OP_read - * - * Read a filesystem entry. - * - * Returns the direntry and contents of an entry in the buffer supplied by the - * caller (struct xen_hypfs_direntry with the contents following directly - * after it). - * The data buffer must be at least the size of the direntry returned. If the - * data buffer was not large enough for all the data -ENOBUFS and no entry - * data is returned, but the direntry will contain the needed size for the - * returned data. - * The format of the contents is according to its entry type and encoding. - * The contents of a directory are multiple struct xen_hypfs_dirlistentry - * items. - * - * arg1: XEN_GUEST_HANDLE(path name) - * arg2: length of path name (including trailing zero byte) - * arg3: XEN_GUEST_HANDLE(data buffer written by hypervisor) - * arg4: data buffer size - * - * Possible return values: - * 0: success - * <0 : negative Xen errno value - */ -#define XEN_HYPFS_OP_read 1 - -/* - * XEN_HYPFS_OP_write_contents - * - * Write contents of a filesystem entry. - * - * Writes an entry with the contents of a buffer supplied by the caller. - * The data type and encoding can't be changed. The size can be changed only - * for blobs and strings. - * - * arg1: XEN_GUEST_HANDLE(path name) - * arg2: length of path name (including trailing zero byte) - * arg3: XEN_GUEST_HANDLE(content buffer read by hypervisor) - * arg4: content buffer size - * - * Possible return values: - * 0: success - * <0 : negative Xen errno value - */ -#define XEN_HYPFS_OP_write_contents 2 - -#endif /* __XEN_PUBLIC_HYPFS_H__ */ diff --git a/sys/xen/interface/io/9pfs.h b/sys/xen/interface/io/9pfs.h deleted file mode 100644 index 4bfd5d48b1ea..000000000000 --- a/sys/xen/interface/io/9pfs.h +++ /dev/null @@ -1,49 +0,0 @@ -/* - * 9pfs.h -- Xen 9PFS transport - * - * Refer to docs/misc/9pfs.markdown for the specification - * - * 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) 2017 Stefano Stabellini - */ - -#ifndef __XEN_PUBLIC_IO_9PFS_H__ -#define __XEN_PUBLIC_IO_9PFS_H__ - -#include "../grant_table.h" -#include "ring.h" - -/* - * See docs/misc/9pfs.markdown in xen.git for the full specification: - * https://xenbits.xen.org/docs/unstable/misc/9pfs.html - */ -DEFINE_XEN_FLEX_RING_AND_INTF(xen_9pfs); - -#endif - -/* - * Local variables: - * mode: C - * c-file-style: "BSD" - * c-basic-offset: 4 - * tab-width: 4 - * indent-tabs-mode: nil - * End: - */ diff --git a/sys/xen/interface/io/blkif.h b/sys/xen/interface/io/blkif.h deleted file mode 100644 index 4cdba79abaeb..000000000000 --- a/sys/xen/interface/io/blkif.h +++ /dev/null @@ -1,722 +0,0 @@ -/****************************************************************************** - * blkif.h - * - * Unified block-device I/O interface for Xen guest OSes. - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to - * deal in the Software without restriction, including without limitation the - * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or - * sell copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - * - * Copyright (c) 2003-2004, Keir Fraser - * Copyright (c) 2012, Spectra Logic Corporation - */ - -#ifndef __XEN_PUBLIC_IO_BLKIF_H__ -#define __XEN_PUBLIC_IO_BLKIF_H__ - -#include "ring.h" -#include "../grant_table.h" - -/* - * Front->back notifications: When enqueuing a new request, sending a - * notification can be made conditional on req_event (i.e., the generic - * hold-off mechanism provided by the ring macros). Backends must set - * req_event appropriately (e.g., using RING_FINAL_CHECK_FOR_REQUESTS()). - * - * Back->front notifications: When enqueuing a new response, sending a - * notification can be made conditional on rsp_event (i.e., the generic - * hold-off mechanism provided by the ring macros). Frontends must set - * rsp_event appropriately (e.g., using RING_FINAL_CHECK_FOR_RESPONSES()). - */ - -#ifndef blkif_vdev_t -#define blkif_vdev_t uint16_t -#endif -#define blkif_sector_t uint64_t - -/* - * Feature and Parameter Negotiation - * ================================= - * The two halves of a Xen block driver utilize nodes within the XenStore to - * communicate capabilities and to negotiate operating parameters. This - * section enumerates these nodes which reside in the respective front and - * backend portions of the XenStore, following the XenBus convention. - * - * All data in the XenStore is stored as strings. Nodes specifying numeric - * values are encoded in decimal. Integer value ranges listed below are - * expressed as fixed sized integer types capable of storing the conversion - * of a properly formated node string, without loss of information. - * - * Any specified default value is in effect if the corresponding XenBus node - * is not present in the XenStore. - * - * XenStore nodes in sections marked "PRIVATE" are solely for use by the - * driver side whose XenBus tree contains them. - * - * XenStore nodes marked "DEPRECATED" in their notes section should only be - * used to provide interoperability with legacy implementations. - * - * See the XenBus state transition diagram below for details on when XenBus - * nodes must be published and when they can be queried. - * - ***************************************************************************** - * Backend XenBus Nodes - ***************************************************************************** - * - *------------------ Backend Device Identification (PRIVATE) ------------------ - * - * mode - * Values: "r" (read only), "w" (writable) - * - * The read or write access permissions to the backing store to be - * granted to the frontend. - * - * params - * Values: string - * - * A free formatted string providing sufficient information for the - * hotplug script to attach the device and provide a suitable - * handler (ie: a block device) for blkback to use. - * - * physical-device - * Values: "MAJOR:MINOR" - * Notes: 11 - * - * MAJOR and MINOR are the major number and minor number of the - * backing device respectively. - * - * physical-device-path - * Values: path string - * - * A string that contains the absolute path to the disk image. On - * NetBSD and Linux this is always a block device, while on FreeBSD - * it can be either a block device or a regular file. - * - * type - * Values: "file", "phy", "tap" - * - * The type of the backing device/object. - * - * - * direct-io-safe - * Values: 0/1 (boolean) - * Default Value: 0 - * - * The underlying storage is not affected by the direct IO memory - * lifetime bug. See: - * https://lists.xen.org/archives/html/xen-devel/2012-12/msg01154.html - * - * Therefore this option gives the backend permission to use - * O_DIRECT, notwithstanding that bug. - * - * That is, if this option is enabled, use of O_DIRECT is safe, - * in circumstances where we would normally have avoided it as a - * workaround for that bug. This option is not relevant for all - * backends, and even not necessarily supported for those for - * which it is relevant. A backend which knows that it is not - * affected by the bug can ignore this option. - * - * This option doesn't require a backend to use O_DIRECT, so it - * should not be used to try to control the caching behaviour. - * - *--------------------------------- Features --------------------------------- - * - * feature-barrier - * Values: 0/1 (boolean) - * Default Value: 0 - * - * A value of "1" indicates that the backend can process requests - * containing the BLKIF_OP_WRITE_BARRIER request opcode. Requests - * of this type may still be returned at any time with the - * BLKIF_RSP_EOPNOTSUPP result code. - * - * feature-flush-cache - * Values: 0/1 (boolean) - * Default Value: 0 - * - * A value of "1" indicates that the backend can process requests - * containing the BLKIF_OP_FLUSH_DISKCACHE request opcode. Requests - * of this type may still be returned at any time with the - * BLKIF_RSP_EOPNOTSUPP result code. - * - * feature-discard - * Values: 0/1 (boolean) - * Default Value: 0 - * - * A value of "1" indicates that the backend can process requests - * containing the BLKIF_OP_DISCARD request opcode. Requests - * of this type may still be returned at any time with the - * BLKIF_RSP_EOPNOTSUPP result code. - * - * feature-persistent - * Values: 0/1 (boolean) - * Default Value: 0 - * Notes: 7 - * - * A value of "1" indicates that the backend can keep the grants used - * by the frontend driver mapped, so the same set of grants should be - * used in all transactions. The maximum number of grants the backend - * can map persistently depends on the implementation, but ideally it - * should be RING_SIZE * BLKIF_MAX_SEGMENTS_PER_REQUEST. Using this - * feature the backend doesn't need to unmap each grant, preventing - * costly TLB flushes. The backend driver should only map grants - * persistently if the frontend supports it. If a backend driver chooses - * to use the persistent protocol when the frontend doesn't support it, - * it will probably hit the maximum number of persistently mapped grants - * (due to the fact that the frontend won't be reusing the same grants), - * and fall back to non-persistent mode. Backend implementations may - * shrink or expand the number of persistently mapped grants without - * notifying the frontend depending on memory constraints (this might - * cause a performance degradation). - * - * If a backend driver wants to limit the maximum number of persistently - * mapped grants to a value less than RING_SIZE * - * BLKIF_MAX_SEGMENTS_PER_REQUEST a LRU strategy should be used to - * discard the grants that are less commonly used. Using a LRU in the - * backend driver paired with a LIFO queue in the frontend will - * allow us to have better performance in this scenario. - * - *----------------------- Request Transport Parameters ------------------------ - * - * max-ring-page-order - * Values: - * Default Value: 0 - * Notes: 1, 3 - * - * The maximum supported size of the request ring buffer in units of - * lb(machine pages). (e.g. 0 == 1 page, 1 = 2 pages, 2 == 4 pages, - * etc.). - * - * max-ring-pages - * Values: - * Default Value: 1 - * Notes: DEPRECATED, 2, 3 - * - * The maximum supported size of the request ring buffer in units of - * machine pages. The value must be a power of 2. - * - *------------------------- Backend Device Properties ------------------------- - * - * discard-enable - * Values: 0/1 (boolean) - * Default Value: 1 - * - * This optional property, set by the toolstack, instructs the backend - * to offer (or not to offer) discard to the frontend. If the property - * is missing the backend should offer discard if the backing storage - * actually supports it. - * - * discard-alignment - * Values: - * Default Value: 0 - * Notes: 4, 5 - * - * The offset, in bytes from the beginning of the virtual block device, - * to the first, addressable, discard extent on the underlying device. - * - * discard-granularity - * Values: - * Default Value: <"sector-size"> - * Notes: 4 - * - * The size, in bytes, of the individually addressable discard extents - * of the underlying device. - * - * discard-secure - * Values: 0/1 (boolean) - * Default Value: 0 - * Notes: 10 - * - * A value of "1" indicates that the backend can process BLKIF_OP_DISCARD - * requests with the BLKIF_DISCARD_SECURE flag set. - * - * info - * Values: (bitmap) - * - * A collection of bit flags describing attributes of the backing - * device. The VDISK_* macros define the meaning of each bit - * location. - * - * sector-size - * Values: - * - * The logical block size, in bytes, of the underlying storage. This - * must be a power of two with a minimum value of 512. - * - * NOTE: Because of implementation bugs in some frontends this must be - * set to 512, unless the frontend advertizes a non-zero value - * in its "feature-large-sector-size" xenbus node. (See below). - * - * physical-sector-size - * Values: - * Default Value: <"sector-size"> - * - * The physical block size, in bytes, of the backend storage. This - * must be an integer multiple of "sector-size". - * - * sectors - * Values: - * - * The size of the backend device, expressed in units of "sector-size". - * The product of "sector-size" and "sectors" must also be an integer - * multiple of "physical-sector-size", if that node is present. - * - ***************************************************************************** - * Frontend XenBus Nodes - ***************************************************************************** - * - *----------------------- Request Transport Parameters ----------------------- - * - * event-channel - * Values: - * - * The identifier of the Xen event channel used to signal activity - * in the ring buffer. - * - * ring-ref - * Values: - * Notes: 6 - * - * The Xen grant reference granting permission for the backend to map - * the sole page in a single page sized ring buffer. - * - * ring-ref%u - * Values: - * Notes: 6 - * - * For a frontend providing a multi-page ring, a "number of ring pages" - * sized list of nodes, each containing a Xen grant reference granting - * permission for the backend to map the page of the ring located - * at page index "%u". Page indexes are zero based. - * - * protocol - * Values: string (XEN_IO_PROTO_ABI_*) - * Default Value: XEN_IO_PROTO_ABI_NATIVE - * - * The machine ABI rules governing the format of all ring request and - * response structures. - * - * ring-page-order - * Values: - * Default Value: 0 - * Maximum Value: MAX(ffs(max-ring-pages) - 1, max-ring-page-order) - * Notes: 1, 3 - * - * The size of the frontend allocated request ring buffer in units - * of lb(machine pages). (e.g. 0 == 1 page, 1 = 2 pages, 2 == 4 pages, - * etc.). - * - * num-ring-pages - * Values: - * Default Value: 1 - * Maximum Value: MAX(max-ring-pages,(0x1 << max-ring-page-order)) - * Notes: DEPRECATED, 2, 3 - * - * The size of the frontend allocated request ring buffer in units of - * machine pages. The value must be a power of 2. - * - *--------------------------------- Features --------------------------------- - * - * feature-persistent - * Values: 0/1 (boolean) - * Default Value: 0 - * Notes: 7, 8, 9 - * - * A value of "1" indicates that the frontend will reuse the same grants - * for all transactions, allowing the backend to map them with write - * access (even when it should be read-only). If the frontend hits the - * maximum number of allowed persistently mapped grants, it can fallback - * to non persistent mode. This will cause a performance degradation, - * since the the backend driver will still try to map those grants - * persistently. Since the persistent grants protocol is compatible with - * the previous protocol, a frontend driver can choose to work in - * persistent mode even when the backend doesn't support it. - * - * It is recommended that the frontend driver stores the persistently - * mapped grants in a LIFO queue, so a subset of all persistently mapped - * grants gets used commonly. This is done in case the backend driver - * decides to limit the maximum number of persistently mapped grants - * to a value less than RING_SIZE * BLKIF_MAX_SEGMENTS_PER_REQUEST. - * - * feature-large-sector-size - * Values: 0/1 (boolean) - * Default Value: 0 - * - * A value of "1" indicates that the frontend will correctly supply and - * interpret all sector-based quantities in terms of the "sector-size" - * value supplied in the backend info, whatever that may be set to. - * If this node is not present or its value is "0" then it is assumed - * that the frontend requires that the logical block size is 512 as it - * is hardcoded (which is the case in some frontend implementations). - * - *------------------------- Virtual Device Properties ------------------------- - * - * device-type - * Values: "disk", "cdrom", "floppy", etc. - * - * virtual-device - * Values: - * - * A value indicating the physical device to virtualize within the - * frontend's domain. (e.g. "The first ATA disk", "The third SCSI - * disk", etc.) - * - * See docs/misc/vbd-interface.txt for details on the format of this - * value. - * - * Notes - * ----- - * (1) Multi-page ring buffer scheme first developed in the Citrix XenServer - * PV drivers. - * (2) Multi-page ring buffer scheme first used in some RedHat distributions - * including a distribution deployed on certain nodes of the Amazon - * EC2 cluster. - * (3) Support for multi-page ring buffers was implemented independently, - * in slightly different forms, by both Citrix and RedHat/Amazon. - * For full interoperability, block front and backends should publish - * identical ring parameters, adjusted for unit differences, to the - * XenStore nodes used in both schemes. - * (4) Devices that support discard functionality may internally allocate space - * (discardable extents) in units that are larger than the exported logical - * block size. If the backing device has such discardable extents the - * backend should provide both discard-granularity and discard-alignment. - * Providing just one of the two may be considered an error by the frontend. - * Backends supporting discard should include discard-granularity and - * discard-alignment even if it supports discarding individual sectors. - * Frontends should assume discard-alignment == 0 and discard-granularity - * == sector size if these keys are missing. - * (5) The discard-alignment parameter allows a physical device to be - * partitioned into virtual devices that do not necessarily begin or - * end on a discardable extent boundary. - * (6) When there is only a single page allocated to the request ring, - * 'ring-ref' is used to communicate the grant reference for this - * page to the backend. When using a multi-page ring, the 'ring-ref' - * node is not created. Instead 'ring-ref0' - 'ring-refN' are used. - * (7) When using persistent grants data has to be copied from/to the page - * where the grant is currently mapped. The overhead of doing this copy - * however doesn't suppress the speed improvement of not having to unmap - * the grants. - * (8) The frontend driver has to allow the backend driver to map all grants - * with write access, even when they should be mapped read-only, since - * further requests may reuse these grants and require write permissions. - * (9) Linux implementation doesn't have a limit on the maximum number of - * grants that can be persistently mapped in the frontend driver, but - * due to the frontent driver implementation it should never be bigger - * than RING_SIZE * BLKIF_MAX_SEGMENTS_PER_REQUEST. - *(10) The discard-secure property may be present and will be set to 1 if the - * backing device supports secure discard. - *(11) Only used by Linux and NetBSD. - */ - -/* - * Multiple hardware queues/rings: - * If supported, the backend will write the key "multi-queue-max-queues" to - * the directory for that vbd, and set its value to the maximum supported - * number of queues. - * Frontends that are aware of this feature and wish to use it can write the - * key "multi-queue-num-queues" with the number they wish to use, which must be - * greater than zero, and no more than the value reported by the backend in - * "multi-queue-max-queues". - * - * For frontends requesting just one queue, the usual event-channel and - * ring-ref keys are written as before, simplifying the backend processing - * to avoid distinguishing between a frontend that doesn't understand the - * multi-queue feature, and one that does, but requested only one queue. - * - * Frontends requesting two or more queues must not write the toplevel - * event-channel and ring-ref keys, instead writing those keys under sub-keys - * having the name "queue-N" where N is the integer ID of the queue/ring for - * which those keys belong. Queues are indexed from zero. - * For example, a frontend with two queues must write the following set of - * queue-related keys: - * - * /local/domain/1/device/vbd/0/multi-queue-num-queues = "2" - * /local/domain/1/device/vbd/0/queue-0 = "" - * /local/domain/1/device/vbd/0/queue-0/ring-ref = "" - * /local/domain/1/device/vbd/0/queue-0/event-channel = "" - * /local/domain/1/device/vbd/0/queue-1 = "" - * /local/domain/1/device/vbd/0/queue-1/ring-ref = "" - * /local/domain/1/device/vbd/0/queue-1/event-channel = "" - * - * It is also possible to use multiple queues/rings together with - * feature multi-page ring buffer. - * For example, a frontend requests two queues/rings and the size of each ring - * buffer is two pages must write the following set of related keys: - * - * /local/domain/1/device/vbd/0/multi-queue-num-queues = "2" - * /local/domain/1/device/vbd/0/ring-page-order = "1" - * /local/domain/1/device/vbd/0/queue-0 = "" - * /local/domain/1/device/vbd/0/queue-0/ring-ref0 = "" - * /local/domain/1/device/vbd/0/queue-0/ring-ref1 = "" - * /local/domain/1/device/vbd/0/queue-0/event-channel = "" - * /local/domain/1/device/vbd/0/queue-1 = "" - * /local/domain/1/device/vbd/0/queue-1/ring-ref0 = "" - * /local/domain/1/device/vbd/0/queue-1/ring-ref1 = "" - * /local/domain/1/device/vbd/0/queue-1/event-channel = "" - * - */ - -/* - * STATE DIAGRAMS - * - ***************************************************************************** - * Startup * - ***************************************************************************** - * - * Tool stack creates front and back nodes with state XenbusStateInitialising. - * - * Front Back - * ================================= ===================================== - * XenbusStateInitialising XenbusStateInitialising - * o Query virtual device o Query backend device identification - * properties. data. - * o Setup OS device instance. o Open and validate backend device. - * o Publish backend features and - * transport parameters. - * | - * | - * V - * XenbusStateInitWait - * - * o Query backend features and - * transport parameters. - * o Allocate and initialize the - * request ring. - * o Publish transport parameters - * that will be in effect during - * this connection. - * | - * | - * V - * XenbusStateInitialised - * - * o Query frontend transport parameters. - * o Connect to the request ring and - * event channel. - * o Publish backend device properties. - * | - * | - * V - * XenbusStateConnected - * - * o Query backend device properties. - * o Finalize OS virtual device - * instance. - * | - * | - * V - * XenbusStateConnected - * - * Note: Drivers that do not support any optional features, or the negotiation - * of transport parameters, can skip certain states in the state machine: - * - * o A frontend may transition to XenbusStateInitialised without - * waiting for the backend to enter XenbusStateInitWait. In this - * case, default transport parameters are in effect and any - * transport parameters published by the frontend must contain - * their default values. - * - * o A backend may transition to XenbusStateInitialised, bypassing - * XenbusStateInitWait, without waiting for the frontend to first - * enter the XenbusStateInitialised state. In this case, default - * transport parameters are in effect and any transport parameters - * published by the backend must contain their default values. - * - * Drivers that support optional features and/or transport parameter - * negotiation must tolerate these additional state transition paths. - * In general this means performing the work of any skipped state - * transition, if it has not already been performed, in addition to the - * work associated with entry into the current state. - */ - -/* - * REQUEST CODES. - */ -#define BLKIF_OP_READ 0 -#define BLKIF_OP_WRITE 1 -/* - * All writes issued prior to a request with the BLKIF_OP_WRITE_BARRIER - * operation code ("barrier request") must be completed prior to the - * execution of the barrier request. All writes issued after the barrier - * request must not execute until after the completion of the barrier request. - * - * Optional. See "feature-barrier" XenBus node documentation above. - */ -#define BLKIF_OP_WRITE_BARRIER 2 -/* - * Commit any uncommitted contents of the backing device's volatile cache - * to stable storage. - * - * Optional. See "feature-flush-cache" XenBus node documentation above. - */ -#define BLKIF_OP_FLUSH_DISKCACHE 3 -/* - * Used in SLES sources for device specific command packet - * contained within the request. Reserved for that purpose. - */ -#define BLKIF_OP_RESERVED_1 4 -/* - * Indicate to the backend device that a region of storage is no longer in - * use, and may be discarded at any time without impact to the client. If - * the BLKIF_DISCARD_SECURE flag is set on the request, all copies of the - * discarded region on the device must be rendered unrecoverable before the - * command returns. - * - * This operation is analogous to performing a trim (ATA) or unamp (SCSI), - * command on a native device. - * - * More information about trim/unmap operations can be found at: - * http://t13.org/Documents/UploadedDocuments/docs2008/ - * e07154r6-Data_Set_Management_Proposal_for_ATA-ACS2.doc - * http://www.seagate.com/staticfiles/support/disc/manuals/ - * Interface%20manuals/100293068c.pdf - * - * Optional. See "feature-discard", "discard-alignment", - * "discard-granularity", and "discard-secure" in the XenBus node - * documentation above. - */ -#define BLKIF_OP_DISCARD 5 - -/* - * Recognized if "feature-max-indirect-segments" in present in the backend - * xenbus info. The "feature-max-indirect-segments" node contains the maximum - * number of segments allowed by the backend per request. If the node is - * present, the frontend might use blkif_request_indirect structs in order to - * issue requests with more than BLKIF_MAX_SEGMENTS_PER_REQUEST (11). The - * maximum number of indirect segments is fixed by the backend, but the - * frontend can issue requests with any number of indirect segments as long as - * it's less than the number provided by the backend. The indirect_grefs field - * in blkif_request_indirect should be filled by the frontend with the - * grant references of the pages that are holding the indirect segments. - * These pages are filled with an array of blkif_request_segment that hold the - * information about the segments. The number of indirect pages to use is - * determined by the number of segments an indirect request contains. Every - * indirect page can contain a maximum of - * (PAGE_SIZE / sizeof(struct blkif_request_segment)) segments, so to - * calculate the number of indirect pages to use we have to do - * ceil(indirect_segments / (PAGE_SIZE / sizeof(struct blkif_request_segment))). - * - * If a backend does not recognize BLKIF_OP_INDIRECT, it should *not* - * create the "feature-max-indirect-segments" node! - */ -#define BLKIF_OP_INDIRECT 6 - -/* - * Maximum scatter/gather segments per request. - * This is carefully chosen so that sizeof(blkif_ring_t) <= PAGE_SIZE. - * NB. This could be 12 if the ring indexes weren't stored in the same page. - */ -#define BLKIF_MAX_SEGMENTS_PER_REQUEST 11 - -/* - * Maximum number of indirect pages to use per request. - */ -#define BLKIF_MAX_INDIRECT_PAGES_PER_REQUEST 8 - -/* - * NB. 'first_sect' and 'last_sect' in blkif_request_segment, as well as - * 'sector_number' in blkif_request, blkif_request_discard and - * blkif_request_indirect are sector-based quantities. See the description - * of the "feature-large-sector-size" frontend xenbus node above for - * more information. - */ -struct blkif_request_segment { - grant_ref_t gref; /* reference to I/O buffer frame */ - /* @first_sect: first sector in frame to transfer (inclusive). */ - /* @last_sect: last sector in frame to transfer (inclusive). */ - uint8_t first_sect, last_sect; -}; - -/* - * Starting ring element for any I/O request. - */ -struct blkif_request { - uint8_t operation; /* BLKIF_OP_??? */ - uint8_t nr_segments; /* number of segments */ - blkif_vdev_t handle; /* only for read/write requests */ - uint64_t id; /* private guest value, echoed in resp */ - blkif_sector_t sector_number;/* start sector idx on disk (r/w only) */ - struct blkif_request_segment seg[BLKIF_MAX_SEGMENTS_PER_REQUEST]; -}; -typedef struct blkif_request blkif_request_t; - -/* - * Cast to this structure when blkif_request.operation == BLKIF_OP_DISCARD - * sizeof(struct blkif_request_discard) <= sizeof(struct blkif_request) - */ -struct blkif_request_discard { - uint8_t operation; /* BLKIF_OP_DISCARD */ - uint8_t flag; /* BLKIF_DISCARD_SECURE or zero */ -#define BLKIF_DISCARD_SECURE (1<<0) /* ignored if discard-secure=0 */ - blkif_vdev_t handle; /* same as for read/write requests */ - uint64_t id; /* private guest value, echoed in resp */ - blkif_sector_t sector_number;/* start sector idx on disk */ - uint64_t nr_sectors; /* number of contiguous sectors to discard*/ -}; -typedef struct blkif_request_discard blkif_request_discard_t; - -struct blkif_request_indirect { - uint8_t operation; /* BLKIF_OP_INDIRECT */ - uint8_t indirect_op; /* BLKIF_OP_{READ/WRITE} */ - uint16_t nr_segments; /* number of segments */ - uint64_t id; /* private guest value, echoed in resp */ - blkif_sector_t sector_number;/* start sector idx on disk (r/w only) */ - blkif_vdev_t handle; /* same as for read/write requests */ - grant_ref_t indirect_grefs[BLKIF_MAX_INDIRECT_PAGES_PER_REQUEST]; -#ifdef __i386__ - uint64_t pad; /* Make it 64 byte aligned on i386 */ -#endif -}; -typedef struct blkif_request_indirect blkif_request_indirect_t; - -struct blkif_response { - uint64_t id; /* copied from request */ - uint8_t operation; /* copied from request */ - int16_t status; /* BLKIF_RSP_??? */ -}; -typedef struct blkif_response blkif_response_t; - -/* - * STATUS RETURN CODES. - */ - /* Operation not supported (only happens on barrier writes). */ -#define BLKIF_RSP_EOPNOTSUPP -2 - /* Operation failed for some unspecified reason (-EIO). */ -#define BLKIF_RSP_ERROR -1 - /* Operation completed successfully. */ -#define BLKIF_RSP_OKAY 0 - -/* - * Generate blkif ring structures and types. - */ -DEFINE_RING_TYPES(blkif, struct blkif_request, struct blkif_response); - -#define VDISK_CDROM 0x1 -#define VDISK_REMOVABLE 0x2 -#define VDISK_READONLY 0x4 - -#endif /* __XEN_PUBLIC_IO_BLKIF_H__ */ - -/* - * Local variables: - * mode: C - * c-file-style: "BSD" - * c-basic-offset: 4 - * tab-width: 4 - * indent-tabs-mode: nil - * End: - */ diff --git a/sys/xen/interface/io/cameraif.h b/sys/xen/interface/io/cameraif.h deleted file mode 100644 index acbcbf3bd411..000000000000 --- a/sys/xen/interface/io/cameraif.h +++ /dev/null @@ -1,1374 +0,0 @@ -/****************************************************************************** - * cameraif.h - * - * Unified camera device I/O interface for Xen guest OSes. - * - * 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) 2018-2019 EPAM Systems Inc. - * - * Author: Oleksandr Andrushchenko - */ - -#ifndef __XEN_PUBLIC_IO_CAMERAIF_H__ -#define __XEN_PUBLIC_IO_CAMERAIF_H__ - -#include "ring.h" -#include "../grant_table.h" - -/* - ****************************************************************************** - * Protocol version - ****************************************************************************** - */ -#define XENCAMERA_PROTOCOL_VERSION "1" - -/* - ****************************************************************************** - * Feature and Parameter Negotiation - ****************************************************************************** - * - * Front->back notifications: when enqueuing a new request, sending a - * notification can be made conditional on xencamera_req (i.e., the generic - * hold-off mechanism provided by the ring macros). Backends must set - * xencamera_req appropriately (e.g., using RING_FINAL_CHECK_FOR_REQUESTS()). - * - * Back->front notifications: when enqueuing a new response, sending a - * notification can be made conditional on xencamera_resp (i.e., the generic - * hold-off mechanism provided by the ring macros). Frontends must set - * xencamera_resp appropriately (e.g., using RING_FINAL_CHECK_FOR_RESPONSES()). - * - * The two halves of a para-virtual camera driver utilize nodes within - * XenStore to communicate capabilities and to negotiate operating parameters. - * This section enumerates these nodes which reside in the respective front and - * backend portions of XenStore, following the XenBus convention. - * - * All data in XenStore is stored as strings. Nodes specifying numeric - * values are encoded in decimal. Integer value ranges listed below are - * expressed as fixed sized integer types capable of storing the conversion - * of a properly formatted node string, without loss of information. - * - ****************************************************************************** - * Example configuration - ****************************************************************************** - * - * This is an example of backend and frontend configuration: - * - *--------------------------------- Backend ----------------------------------- - * - * /local/domain/0/backend/vcamera/1/0/frontend-id = "1" - * /local/domain/0/backend/vcamera/1/0/frontend = "/local/domain/1/device/vcamera/0" - * /local/domain/0/backend/vcamera/1/0/state = "4" - * /local/domain/0/backend/vcamera/1/0/versions = "1,2" - * - *--------------------------------- Frontend ---------------------------------- - * - * /local/domain/1/device/vcamera/0/backend-id = "0" - * /local/domain/1/device/vcamera/0/backend = "/local/domain/0/backend/vcamera/1" - * /local/domain/1/device/vcamera/0/state = "4" - * /local/domain/1/device/vcamera/0/version = "1" - * /local/domain/1/device/vcamera/0/be-alloc = "1" - * - *---------------------------- Device 0 configuration ------------------------- - * - * /local/domain/1/device/vcamera/0/max-buffers = "3" - * /local/domain/1/device/vcamera/0/controls = "contrast,hue" - * /local/domain/1/device/vcamera/0/formats/YUYV/640x480/frame-rates = "30/1,15/1" - * /local/domain/1/device/vcamera/0/formats/YUYV/1920x1080/frame-rates = "15/2" - * /local/domain/1/device/vcamera/0/formats/BGRA/640x480/frame-rates = "15/1,15/2" - * /local/domain/1/device/vcamera/0/formats/BGRA/1200x720/frame-rates = "15/2" - * /local/domain/1/device/vcamera/0/unique-id = "0" - * /local/domain/1/device/vcamera/0/req-ring-ref = "2832" - * /local/domain/1/device/vcamera/0/req-event-channel = "15" - * /local/domain/1/device/vcamera/0/evt-ring-ref = "387" - * /local/domain/1/device/vcamera/0/evt-event-channel = "16" - * - *---------------------------- Device 1 configuration ------------------------- - * - * /local/domain/1/device/vcamera/1/max-buffers = "8" - * /local/domain/1/device/vcamera/1/controls = "brightness,saturation,hue" - * /local/domain/1/device/vcamera/1/formats/YUYV/640x480/frame-rates = "30/1,15/2" - * /local/domain/1/device/vcamera/1/formats/YUYV/1920x1080/frame-rates = "15/2" - * /local/domain/1/device/vcamera/1/unique-id = "1" - * /local/domain/1/device/vcamera/1/req-ring-ref = "2833" - * /local/domain/1/device/vcamera/1/req-event-channel = "17" - * /local/domain/1/device/vcamera/1/evt-ring-ref = "388" - * /local/domain/1/device/vcamera/1/evt-event-channel = "18" - * - ****************************************************************************** - * Backend XenBus Nodes - ****************************************************************************** - * - *----------------------------- Protocol version ------------------------------ - * - * versions - * Values: - * - * List of XENCAMERA_LIST_SEPARATOR separated protocol versions supported - * by the backend. For example "1,2,3". - * - ****************************************************************************** - * Frontend XenBus Nodes - ****************************************************************************** - * - *-------------------------------- Addressing --------------------------------- - * - * dom-id - * Values: - * - * Domain identifier. - * - * dev-id - * Values: - * - * Device identifier. - * - * /local/domain//device/vcamera//... - * - *----------------------------- Protocol version ------------------------------ - * - * version - * Values: - * - * Protocol version, chosen among the ones supported by the backend. - * - *------------------------- Backend buffer allocation ------------------------- - * - * be-alloc - * Values: "0", "1" - * - * If value is set to "1", then backend will be the buffer - * provider/allocator for this domain during XENCAMERA_OP_BUF_CREATE - * operation. - * If value is not "1" or omitted frontend must allocate buffers itself. - * - *------------------------------- Camera settings ----------------------------- - * - * unique-id - * Values: - * - * After device instance initialization each camera is assigned a - * unique ID, so it can be identified by the backend by this ID. - * This can be UUID or such. - * - * max-buffers - * Values: - * - * Maximum number of camera buffers this frontend may use. - * - * controls - * Values: - * - * List of supported camera controls separated by XENCAMERA_LIST_SEPARATOR. - * Camera controls are expressed as a list of string values w/o any - * ordering requirement. - * - * formats - * Values: - * - * Formats are organized as a set of directories one per each - * supported pixel format. The name of the directory is the - * corresponding FOURCC string label. The next level of - * the directory under represents supported resolutions. - * If the format represents a big-endian variant of a little - * endian format, then the "-BE" suffix must be added. E.g. 'AR15' vs - * 'AR15-BE'. - * If FOURCC string label has spaces then those are only allowed to - * be at the end of the label and must be trimmed, for example - * 'Y16' and 'Y16-BE' will be trimmed. - * - * resolution - * Values: x - * - * Resolutions are organized as a set of directories one per each - * supported resolution under corresponding directory. - * The name of the directory is the supported width and height - * of the camera resolution in pixels. - * - * frame-rates - * Values: / - * - * List of XENCAMERA_FRAME_RATE_SEPARATOR separated supported frame rates - * of the camera expressed as numerator and denominator of the - * corresponding frame rate. - * - *------------------- Camera Request Transport Parameters --------------------- - * - * This communication path is used to deliver requests from frontend to backend - * and get the corresponding responses from backend to frontend, - * set up per virtual camera device. - * - * req-event-channel - * Values: - * - * The identifier of the Xen camera's control event channel - * used to signal activity in the ring buffer. - * - * req-ring-ref - * Values: - * - * The Xen grant reference granting permission for the backend to map - * a sole page of camera's control ring buffer. - * - *-------------------- Camera Event Transport Parameters ---------------------- - * - * This communication path is used to deliver asynchronous events from backend - * to frontend, set up per virtual camera device. - * - * evt-event-channel - * Values: - * - * The identifier of the Xen camera's event channel - * used to signal activity in the ring buffer. - * - * evt-ring-ref - * Values: - * - * The Xen grant reference granting permission for the backend to map - * a sole page of camera's event ring buffer. - */ - -/* - ****************************************************************************** - * STATE DIAGRAMS - ****************************************************************************** - * - * Tool stack creates front and back state nodes with initial state - * XenbusStateInitialising. - * Tool stack creates and sets up frontend camera configuration - * nodes per domain. - * - *-------------------------------- Normal flow -------------------------------- - * - * Front Back - * ================================= ===================================== - * XenbusStateInitialising XenbusStateInitialising - * o Query backend device identification - * data. - * o Open and validate backend device. - * | - * | - * V - * XenbusStateInitWait - * - * o Query frontend configuration - * o Allocate and initialize - * event channels per configured - * camera. - * o Publish transport parameters - * that will be in effect during - * this connection. - * | - * | - * V - * XenbusStateInitialised - * - * o Query frontend transport parameters. - * o Connect to the event channels. - * | - * | - * V - * XenbusStateConnected - * - * o Create and initialize OS - * virtual camera as per - * configuration. - * | - * | - * V - * XenbusStateConnected - * - * XenbusStateUnknown - * XenbusStateClosed - * XenbusStateClosing - * o Remove virtual camera device - * o Remove event channels - * | - * | - * V - * XenbusStateClosed - * - *------------------------------- Recovery flow ------------------------------- - * - * In case of frontend unrecoverable errors backend handles that as - * if frontend goes into the XenbusStateClosed state. - * - * In case of backend unrecoverable errors frontend tries removing - * the virtualized device. If this is possible at the moment of error, - * then frontend goes into the XenbusStateInitialising state and is ready for - * new connection with backend. If the virtualized device is still in use and - * cannot be removed, then frontend goes into the XenbusStateReconfiguring state - * until either the virtualized device is removed or backend initiates a new - * connection. On the virtualized device removal frontend goes into the - * XenbusStateInitialising state. - * - * Note on XenbusStateReconfiguring state of the frontend: if backend has - * unrecoverable errors then frontend cannot send requests to the backend - * and thus cannot provide functionality of the virtualized device anymore. - * After backend is back to normal the virtualized device may still hold some - * state: configuration in use, allocated buffers, client application state etc. - * In most cases, this will require frontend to implement complex recovery - * reconnect logic. Instead, by going into XenbusStateReconfiguring state, - * frontend will make sure no new clients of the virtualized device are - * accepted, allow existing client(s) to exit gracefully by signaling error - * state etc. - * Once all the clients are gone frontend can reinitialize the virtualized - * device and get into XenbusStateInitialising state again signaling the - * backend that a new connection can be made. - * - * There are multiple conditions possible under which frontend will go from - * XenbusStateReconfiguring into XenbusStateInitialising, some of them are OS - * specific. For example: - * 1. The underlying OS framework may provide callbacks to signal that the last - * client of the virtualized device has gone and the device can be removed - * 2. Frontend can schedule a deferred work (timer/tasklet/workqueue) - * to periodically check if this is the right time to re-try removal of - * the virtualized device. - * 3. By any other means. - * - ****************************************************************************** - * REQUEST CODES - ****************************************************************************** - */ -#define XENCAMERA_OP_CONFIG_SET 0x00 -#define XENCAMERA_OP_CONFIG_GET 0x01 -#define XENCAMERA_OP_CONFIG_VALIDATE 0x02 -#define XENCAMERA_OP_FRAME_RATE_SET 0x03 -#define XENCAMERA_OP_BUF_GET_LAYOUT 0x04 -#define XENCAMERA_OP_BUF_REQUEST 0x05 -#define XENCAMERA_OP_BUF_CREATE 0x06 -#define XENCAMERA_OP_BUF_DESTROY 0x07 -#define XENCAMERA_OP_BUF_QUEUE 0x08 -#define XENCAMERA_OP_BUF_DEQUEUE 0x09 -#define XENCAMERA_OP_CTRL_ENUM 0x0a -#define XENCAMERA_OP_CTRL_SET 0x0b -#define XENCAMERA_OP_CTRL_GET 0x0c -#define XENCAMERA_OP_STREAM_START 0x0d -#define XENCAMERA_OP_STREAM_STOP 0x0e - -#define XENCAMERA_CTRL_BRIGHTNESS 0 -#define XENCAMERA_CTRL_CONTRAST 1 -#define XENCAMERA_CTRL_SATURATION 2 -#define XENCAMERA_CTRL_HUE 3 - -/* Number of supported controls. */ -#define XENCAMERA_MAX_CTRL 4 - -/* Control is read-only. */ -#define XENCAMERA_CTRL_FLG_RO (1 << 0) -/* Control is write-only. */ -#define XENCAMERA_CTRL_FLG_WO (1 << 1) -/* Control's value is volatile. */ -#define XENCAMERA_CTRL_FLG_VOLATILE (1 << 2) - -/* Supported color spaces. */ -#define XENCAMERA_COLORSPACE_DEFAULT 0 -#define XENCAMERA_COLORSPACE_SMPTE170M 1 -#define XENCAMERA_COLORSPACE_REC709 2 -#define XENCAMERA_COLORSPACE_SRGB 3 -#define XENCAMERA_COLORSPACE_OPRGB 4 -#define XENCAMERA_COLORSPACE_BT2020 5 -#define XENCAMERA_COLORSPACE_DCI_P3 6 - -/* Color space transfer function. */ -#define XENCAMERA_XFER_FUNC_DEFAULT 0 -#define XENCAMERA_XFER_FUNC_709 1 -#define XENCAMERA_XFER_FUNC_SRGB 2 -#define XENCAMERA_XFER_FUNC_OPRGB 3 -#define XENCAMERA_XFER_FUNC_NONE 4 -#define XENCAMERA_XFER_FUNC_DCI_P3 5 -#define XENCAMERA_XFER_FUNC_SMPTE2084 6 - -/* Color space Y’CbCr encoding. */ -#define XENCAMERA_YCBCR_ENC_IGNORE 0 -#define XENCAMERA_YCBCR_ENC_601 1 -#define XENCAMERA_YCBCR_ENC_709 2 -#define XENCAMERA_YCBCR_ENC_XV601 3 -#define XENCAMERA_YCBCR_ENC_XV709 4 -#define XENCAMERA_YCBCR_ENC_BT2020 5 -#define XENCAMERA_YCBCR_ENC_BT2020_CONST_LUM 6 - -/* Quantization range. */ -#define XENCAMERA_QUANTIZATION_DEFAULT 0 -#define XENCAMERA_QUANTIZATION_FULL_RANGE 1 -#define XENCAMERA_QUANTIZATION_LIM_RANGE 2 - -/* - ****************************************************************************** - * EVENT CODES - ****************************************************************************** - */ -#define XENCAMERA_EVT_FRAME_AVAIL 0x00 -#define XENCAMERA_EVT_CTRL_CHANGE 0x01 - -/* - ****************************************************************************** - * XENSTORE FIELD AND PATH NAME STRINGS, HELPERS - ****************************************************************************** - */ -#define XENCAMERA_DRIVER_NAME "vcamera" - -#define XENCAMERA_LIST_SEPARATOR "," -#define XENCAMERA_RESOLUTION_SEPARATOR "x" -#define XENCAMERA_FRACTION_SEPARATOR "/" - -#define XENCAMERA_FIELD_BE_VERSIONS "versions" -#define XENCAMERA_FIELD_FE_VERSION "version" -#define XENCAMERA_FIELD_REQ_RING_REF "req-ring-ref" -#define XENCAMERA_FIELD_REQ_CHANNEL "req-event-channel" -#define XENCAMERA_FIELD_EVT_RING_REF "evt-ring-ref" -#define XENCAMERA_FIELD_EVT_CHANNEL "evt-event-channel" -#define XENCAMERA_FIELD_MAX_BUFFERS "max-buffers" -#define XENCAMERA_FIELD_CONTROLS "controls" -#define XENCAMERA_FIELD_FORMATS "formats" -#define XENCAMERA_FIELD_FRAME_RATES "frame-rates" -#define XENCAMERA_FIELD_BE_ALLOC "be-alloc" -#define XENCAMERA_FIELD_UNIQUE_ID "unique-id" - -#define XENCAMERA_CTRL_BRIGHTNESS_STR "brightness" -#define XENCAMERA_CTRL_CONTRAST_STR "contrast" -#define XENCAMERA_CTRL_SATURATION_STR "saturation" -#define XENCAMERA_CTRL_HUE_STR "hue" - -#define XENCAMERA_FOURCC_BIGENDIAN_STR "-BE" - -/* Maximum number of buffer planes supported. */ -#define XENCAMERA_MAX_PLANE 4 - -/* - ****************************************************************************** - * STATUS RETURN CODES - ****************************************************************************** - * - * Status return code is zero on success and -XEN_EXX on failure. - * - ****************************************************************************** - * Assumptions - ****************************************************************************** - * - * - usage of grant reference 0 as invalid grant reference: - * grant reference 0 is valid, but never exposed to a PV driver, - * because of the fact it is already in use/reserved by the PV console. - * - all references in this document to page sizes must be treated - * as pages of size XEN_PAGE_SIZE unless otherwise noted. - * - all FOURCC mappings used for configuration and messaging are - * Linux V4L2 ones: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/include/uapi/linux/videodev2.h - * with the following exceptions: - * - characters are allowed in [0x20; 0x7f] range - * - when used for XenStore configuration entries the following - * are not allowed: - * - '/', '\', ' ' (space), '<', '>', ':', '"', '|', '?', '*' - * - if trailing spaces are part of the FOURCC code then those must be - * trimmed - * - * - ****************************************************************************** - * Description of the protocol between frontend and backend driver - ****************************************************************************** - * - * The two halves of a Para-virtual camera driver communicate with - * each other using shared pages and event channels. - * Shared page contains a ring with request/response packets. - * - * All reserved fields in the structures below must be 0. - * - * For all request/response/event packets: - * - frame rate parameter is represented as a pair of 4 octet long - * numerator and denominator: - * - frame_rate_numer - uint32_t, numerator of the frame rate - * - frame_rate_denom - uint32_t, denominator of the frame rate - * The corresponding frame rate (Hz) is calculated as: - * frame_rate = frame_rate_numer / frame_rate_denom - * - buffer index is a zero based index of the buffer. Must be less than - * the value of XENCAMERA_OP_CONFIG_SET.num_bufs response: - * - index - uint8_t, index of the buffer. - * - * - *---------------------------------- Requests --------------------------------- - * - * All request packets have the same length (64 octets). - * All request packets have common header: - * 0 1 2 3 octet - * +----------------+----------------+----------------+----------------+ - * | id | operation | reserved | 4 - * +----------------+----------------+----------------+----------------+ - * | reserved | 8 - * +----------------+----------------+----------------+----------------+ - * id - uint16_t, private guest value, echoed in response. - * operation - uint8_t, operation code, XENCAMERA_OP_XXX. - * - * - * Request to set/validate the configuration - request to set the - * configuration/mode of the camera (XENCAMERA_OP_CONFIG_SET) or to - * check if the configuration is valid and can be used - * (XENCAMERA_OP_CONFIG_VALIDATE): - * 0 1 2 3 octet - * +----------------+----------------+----------------+----------------+ - * | id | _OP_CONFIG_XXX | reserved | 4 - * +----------------+----------------+----------------+----------------+ - * | reserved | 8 - * +----------------+----------------+----------------+----------------+ - * | pixel format | 12 - * +----------------+----------------+----------------+----------------+ - * | width | 16 - * +----------------+----------------+----------------+----------------+ - * | height | 20 - * +----------------+----------------+----------------+----------------+ - * | reserved | 24 - * +----------------+----------------+----------------+----------------+ - * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| - * +----------------+----------------+----------------+----------------+ - * | reserved | 64 - * +----------------+----------------+----------------+----------------+ - * - * pixel_format - uint32_t, pixel format to be used, FOURCC code. - * width - uint32_t, width in pixels. - * height - uint32_t, height in pixels. - * - * See response format for this request. - * - * Notes: - * - the only difference between XENCAMERA_OP_CONFIG_VALIDATE and - * XENCAMERA_OP_CONFIG_SET is that the former doesn't actually change - * camera configuration, but queries if the configuration is valid. - * This can be used while stream is active and/or buffers allocated. - * - frontend must check the corresponding response in order to see - * if the values reported back by the backend do match the desired ones - * and can be accepted. - * - frontend may send multiple XENCAMERA_OP_CONFIG_SET requests before - * sending XENCAMERA_OP_STREAM_START request to update or tune the - * final stream configuration. - * - configuration cannot be changed during active streaming, e.g. - * after XENCAMERA_OP_STREAM_START and before XENCAMERA_OP_STREAM_STOP - * requests. - */ -struct xencamera_config_req { - uint32_t pixel_format; - uint32_t width; - uint32_t height; -}; - -/* - * Request current configuration of the camera: - * 0 1 2 3 octet - * +----------------+----------------+----------------+----------------+ - * | id | _OP_CONFIG_GET | reserved | 4 - * +----------------+----------------+----------------+----------------+ - * | reserved | 8 - * +----------------+----------------+----------------+----------------+ - * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| - * +----------------+----------------+----------------+----------------+ - * | reserved | 64 - * +----------------+----------------+----------------+----------------+ - * - * See response format for this request. - * - * - * Request to set the frame rate of the stream: - * 0 1 2 3 octet - * +----------------+----------------+----------------+----------------+ - * | id | _FRAME_RATE_SET| reserved | 4 - * +----------------+----------------+----------------+----------------+ - * | reserved | 8 - * +----------------+----------------+----------------+----------------+ - * | frame_rate_numer | 12 - * +----------------+----------------+----------------+----------------+ - * | frame_rate_denom | 16 - * +----------------+----------------+----------------+----------------+ - * | reserved | 20 - * +----------------+----------------+----------------+----------------+ - * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| - * +----------------+----------------+----------------+----------------+ - * | reserved | 64 - * +----------------+----------------+----------------+----------------+ - * - * frame_rate_numer - uint32_t, numerator of the frame rate. - * frame_rate_denom - uint32_t, denominator of the frame rate. - * - * Notes: - * - to query the current (actual) frame rate use XENCAMERA_OP_CONFIG_GET - * request. - * - this request can be used with camera buffers allocated, but stream - * stopped, e.g. frontend is allowed to stop the stream with - * XENCAMERA_OP_STREAM_STOP, hold the buffers allocated (e.g. keep the - * configuration set with XENCAMERA_OP_CONFIG_SET), change the - * frame rate of the stream and (re)start the stream again with - * XENCAMERA_OP_STREAM_START. - * - frame rate cannot be changed during active streaming, e.g. - * after XENCAMERA_OP_STREAM_START and before XENCAMERA_OP_STREAM_STOP - * commands. - */ -struct xencamera_frame_rate_req { - uint32_t frame_rate_numer; - uint32_t frame_rate_denom; -}; - -/* - * Request camera buffer's layout: - * 0 1 2 3 octet - * +----------------+----------------+----------------+----------------+ - * | id | _BUF_GET_LAYOUT| reserved | 4 - * +----------------+----------------+----------------+----------------+ - * | reserved | 8 - * +----------------+----------------+----------------+----------------+ - * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| - * +----------------+----------------+----------------+----------------+ - * | reserved | 64 - * +----------------+----------------+----------------+----------------+ - * - * See response format for this request. - * - * - * Request number of buffers to be used: - * 0 1 2 3 octet - * +----------------+----------------+----------------+----------------+ - * | id | _OP_BUF_REQUEST| reserved | 4 - * +----------------+----------------+----------------+----------------+ - * | reserved | 8 - * +----------------+----------------+----------------+----------------+ - * | num_bufs | reserved | 12 - * +----------------+----------------+----------------+----------------+ - * | reserved | 16 - * +----------------+----------------+----------------+----------------+ - * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| - * +----------------+----------------+----------------+----------------+ - * | reserved | 64 - * +----------------+----------------+----------------+----------------+ - * - * num_bufs - uint8_t, desired number of buffers to be used. - * - * If num_bufs is not zero then the backend validates the requested number of - * buffers and responds with the number of buffers allowed for this frontend. - * Frontend is responsible for checking the corresponding response in order to - * see if the values reported back by the backend do match the desired ones - * and can be accepted. - * Frontend is allowed to send multiple XENCAMERA_OP_BUF_REQUEST requests - * before sending XENCAMERA_OP_STREAM_START request to update or tune the - * final configuration. - * Frontend is not allowed to change the camera configuration after this call - * with a non-zero value of num_bufs. If camera reconfiguration is required - * then this request must be sent with num_bufs set to zero and any created - * buffers must be destroyed first. - * Frontend is not allowed to change the number of buffers after the - * streaming has started. - * - * If num_bufs is 0 and streaming has not started yet, then the backend will - * free all previously allocated buffers (if any). - * Trying to call this if streaming is in progress will result in an error. - * - * If camera reconfiguration is required then the streaming must be stopped - * and this request must be sent with num_bufs set to zero and any - * created buffers must be destroyed. - * - * Please note, that the number of buffers in this request must not exceed - * the value configured in XenStore.max-buffers. - * - * See response format for this request. - */ -struct xencamera_buf_request { - uint8_t num_bufs; -}; - -/* - * Request camera buffer creation: - * 0 1 2 3 octet - * +----------------+----------------+----------------+----------------+ - * | id | _OP_BUF_CREATE | reserved | 4 - * +----------------+----------------+----------------+----------------+ - * | reserved | 8 - * +----------------+----------------+----------------+----------------+ - * | index | reserved | 12 - * +----------------+----------------+----------------+----------------+ - * | plane_offset[0] | 16 - * +----------------+----------------+----------------+----------------+ - * | plane_offset[1] | 20 - * +----------------+----------------+----------------+----------------+ - * | plane_offset[2] | 24 - * +----------------+----------------+----------------+----------------+ - * | plane_offset[3] | 28 - * +----------------+----------------+----------------+----------------+ - * | gref_directory | 32 - * +----------------+----------------+----------------+----------------+ - * | reserved | 36 - * +----------------+----------------+----------------+----------------+ - * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| - * +----------------+----------------+----------------+----------------+ - * | reserved | 64 - * +----------------+----------------+----------------+----------------+ - * - * An attempt to create multiple buffers with the same index is an error. - * index can be re-used after destroying the corresponding camera buffer. - * - * index - uint8_t, index of the buffer to be created in the range - * from 0 to the num_bufs field returned in response for - * XENCAMERA_OP_BUF_REQUEST request - * plane_offset - array of uint32_t, offset of the corresponding plane - * in octets from the buffer start. Number of offsets returned is - * equal to the value returned in XENCAMERA_OP_BUF_GET_LAYOUT.num_planes. - * gref_directory - grant_ref_t, a reference to the first shared page - * describing shared buffer references. The size of the buffer is equal to - * XENCAMERA_OP_BUF_GET_LAYOUT.size response. At least one page exists. If - * shared buffer size exceeds what can be addressed by this single page, - * then reference to the next shared page must be supplied (see - * gref_dir_next_page below). - * - * If XENCAMERA_FIELD_BE_ALLOC configuration entry is set, then backend will - * allocate the buffer with the parameters provided in this request and page - * directory is handled as follows: - * Frontend on request: - * - allocates pages for the directory (gref_directory, - * gref_dir_next_page(s) - * - grants permissions for the pages of the directory to the backend - * - sets gref_dir_next_page fields - * Backend on response: - * - grants permissions for the pages of the buffer allocated to - * the frontend - * - fills in page directory with grant references - * (gref[] in struct xencamera_page_directory) - */ -struct xencamera_buf_create_req { - uint8_t index; - uint8_t reserved[3]; - uint32_t plane_offset[XENCAMERA_MAX_PLANE]; - grant_ref_t gref_directory; -}; - -/* - * Shared page for XENCAMERA_OP_BUF_CREATE buffer descriptor (gref_directory in - * the request) employs a list of pages, describing all pages of the shared - * data buffer: - * 0 1 2 3 octet - * +----------------+----------------+----------------+----------------+ - * | gref_dir_next_page | 4 - * +----------------+----------------+----------------+----------------+ - * | gref[0] | 8 - * +----------------+----------------+----------------+----------------+ - * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| - * +----------------+----------------+----------------+----------------+ - * | gref[i] | i*4+8 - * +----------------+----------------+----------------+----------------+ - * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| - * +----------------+----------------+----------------+----------------+ - * | gref[N - 1] | N*4+8 - * +----------------+----------------+----------------+----------------+ - * - * gref_dir_next_page - grant_ref_t, reference to the next page describing - * page directory. Must be 0 if there are no more pages in the list. - * gref[i] - grant_ref_t, reference to a shared page of the buffer - * allocated at XENCAMERA_OP_BUF_CREATE. - * - * Number of grant_ref_t entries in the whole page directory is not - * passed, but instead can be calculated as: - * num_grefs_total = (XENCAMERA_OP_BUF_REQUEST.size + XEN_PAGE_SIZE - 1) / - * XEN_PAGE_SIZE - */ -struct xencamera_page_directory { - grant_ref_t gref_dir_next_page; - grant_ref_t gref[1]; /* Variable length */ -}; - -/* - * Request buffer destruction - destroy a previously allocated camera buffer: - * 0 1 2 3 octet - * +----------------+----------------+----------------+----------------+ - * | id | _OP_BUF_DESTROY| reserved | 4 - * +----------------+----------------+----------------+----------------+ - * | reserved | 8 - * +----------------+----------------+----------------+----------------+ - * | index | reserved | 12 - * +----------------+----------------+----------------+----------------+ - * | reserved | 16 - * +----------------+----------------+----------------+----------------+ - * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| - * +----------------+----------------+----------------+----------------+ - * | reserved | 64 - * +----------------+----------------+----------------+----------------+ - * - * index - uint8_t, index of the buffer to be destroyed. - * - * - * Request queueing of the buffer for backend use: - * 0 1 2 3 octet - * +----------------+----------------+----------------+----------------+ - * | id | _OP_BUF_QUEUE | reserved | 4 - * +----------------+----------------+----------------+----------------+ - * | reserved | 8 - * +----------------+----------------+----------------+----------------+ - * | index | reserved | 12 - * +----------------+----------------+----------------+----------------+ - * | reserved | 16 - * +----------------+----------------+----------------+----------------+ - * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| - * +----------------+----------------+----------------+----------------+ - * | reserved | 64 - * +----------------+----------------+----------------+----------------+ - * - * Notes: - * - frontends must not access the buffer content after this request until - * response to XENCAMERA_OP_BUF_DEQUEUE has been received. - * - buffers must be queued to the backend before destroying them with - * XENCAMERA_OP_BUF_DESTROY. - * - * index - uint8_t, index of the buffer to be queued. - * - * - * Request dequeueing of the buffer for frontend use: - * 0 1 2 3 octet - * +----------------+----------------+----------------+----------------+ - * | id |_OP_BUF_DEQUEUE | reserved | 4 - * +----------------+----------------+----------------+----------------+ - * | reserved | 8 - * +----------------+----------------+----------------+----------------+ - * | index | reserved | 12 - * +----------------+----------------+----------------+----------------+ - * | reserved | 16 - * +----------------+----------------+----------------+----------------+ - * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| - * +----------------+----------------+----------------+----------------+ - * | reserved | 64 - * +----------------+----------------+----------------+----------------+ - * - * Notes: - * - frontend is allowed to access the buffer content after the corresponding - * response to this request. - * - * index - uint8_t, index of the buffer to be queued. - * - * - * Request camera control details: - * 0 1 2 3 octet - * +----------------+----------------+----------------+----------------+ - * | id | _OP_CTRL_ENUM | reserved | 4 - * +----------------+----------------+----------------+----------------+ - * | index | reserved | 8 - * +----------------+----------------+----------------+----------------+ - * | reserved | 12 - * +----------------+----------------+----------------+----------------+ - * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| - * +----------------+----------------+----------------+----------------+ - * | reserved | 64 - * +----------------+----------------+----------------+----------------+ - * - * See response format for this request. - * - * index - uint8_t, index of the control to be queried. - */ -struct xencamera_index { - uint8_t index; -}; - -/* - * Request camera control change: - * 0 1 2 3 octet - * +----------------+----------------+----------------+----------------+ - * | id | _OP_SET_CTRL | reserved | 4 - * +----------------+----------------+----------------+----------------+ - * | type | reserved | 8 - * +----------------+----------------+----------------+----------------+ - * | reserved | 12 - * +----------------+----------------+----------------+----------------+ - * | reserved | 16 - * +----------------+----------------+----------------+----------------+ - * | value low 32-bit | 20 - * +----------------+----------------+----------------+----------------+ - * | value high 32-bit | 24 - * +----------------+----------------+----------------+----------------+ - * | reserved | 28 - * +----------------+----------------+----------------+----------------+ - * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| - * +----------------+----------------+----------------+----------------+ - * | reserved | 64 - * +----------------+----------------+----------------+----------------+ - * - * type - uint8_t, type of the control, one of the XENCAMERA_CTRL_XXX. - * value - int64_t, new value of the control. - */ -struct xencamera_ctrl_value { - uint8_t type; - uint8_t reserved[7]; - int64_t value; -}; - -/* - * Request camera control state: - * 0 1 2 3 octet - * +----------------+----------------+----------------+----------------+ - * | id | _OP_GET_CTRL | reserved | 4 - * +----------------+----------------+----------------+----------------+ - * | type | reserved | 8 - * +----------------+----------------+----------------+----------------+ - * | reserved | 12 - * +----------------+----------------+----------------+----------------+ - * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| - * +----------------+----------------+----------------+----------------+ - * | reserved | 64 - * +----------------+----------------+----------------+----------------+ - * - * See response format for this request. - * - * type - uint8_t, type of the control, one of the XENCAMERA_CTRL_XXX. - */ -struct xencamera_get_ctrl_req { - uint8_t type; -}; - -/* - * Request camera capture stream start: - * 0 1 2 3 octet - * +----------------+----------------+----------------+----------------+ - * | id |_OP_STREAM_START| reserved | 4 - * +----------------+----------------+----------------+----------------+ - * | reserved | 8 - * +----------------+----------------+----------------+----------------+ - * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| - * +----------------+----------------+----------------+----------------+ - * | reserved | 64 - * +----------------+----------------+----------------+----------------+ - * - * - * Request camera capture stream stop: - * 0 1 2 3 octet - * +----------------+----------------+----------------+----------------+ - * | id |_OP_STREAM_STOP | reserved | 4 - * +----------------+----------------+----------------+----------------+ - * | reserved | 8 - * +----------------+----------------+----------------+----------------+ - * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| - * +----------------+----------------+----------------+----------------+ - * | reserved | 64 - * +----------------+----------------+----------------+----------------+ - * - * - *---------------------------------- Responses -------------------------------- - * - * All response packets have the same length (64 octets). - * - * All response packets have common header: - * 0 1 2 3 octet - * +----------------+----------------+----------------+----------------+ - * | id | operation | reserved | 4 - * +----------------+----------------+----------------+----------------+ - * | status | 8 - * +----------------+----------------+----------------+----------------+ - * - * id - uint16_t, copied from the request. - * operation - uint8_t, XENCAMERA_OP_* - copied from request. - * status - int32_t, response status, zero on success and -XEN_EXX on failure. - * - * - * Configuration response - response for XENCAMERA_OP_CONFIG_SET, - * XENCAMERA_OP_CONFIG_GET and XENCAMERA_OP_CONFIG_VALIDATE requests: - * 0 1 2 3 octet - * +----------------+----------------+----------------+----------------+ - * | id | _OP_CONFIG_XXX | reserved | 4 - * +----------------+----------------+----------------+----------------+ - * | status | 8 - * +----------------+----------------+----------------+----------------+ - * | pixel format | 12 - * +----------------+----------------+----------------+----------------+ - * | width | 16 - * +----------------+----------------+----------------+----------------+ - * | height | 20 - * +----------------+----------------+----------------+----------------+ - * | colorspace | 24 - * +----------------+----------------+----------------+----------------+ - * | xfer_func | 28 - * +----------------+----------------+----------------+----------------+ - * | ycbcr_enc | 32 - * +----------------+----------------+----------------+----------------+ - * | quantization | 36 - * +----------------+----------------+----------------+----------------+ - * | displ_asp_ratio_numer | 40 - * +----------------+----------------+----------------+----------------+ - * | displ_asp_ratio_denom | 44 - * +----------------+----------------+----------------+----------------+ - * | frame_rate_numer | 48 - * +----------------+----------------+----------------+----------------+ - * | frame_rate_denom | 52 - * +----------------+----------------+----------------+----------------+ - * | reserved | 56 - * +----------------+----------------+----------------+----------------+ - * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| - * +----------------+----------------+----------------+----------------+ - * | reserved | 64 - * +----------------+----------------+----------------+----------------+ - * - * Meaning of the corresponding values in this response is the same as for - * XENCAMERA_OP_CONFIG_SET and XENCAMERA_OP_FRAME_RATE_SET requests. - * - * colorspace - uint32_t, this supplements pixel_format parameter, - * one of the XENCAMERA_COLORSPACE_XXX. - * xfer_func - uint32_t, this supplements colorspace parameter, - * one of the XENCAMERA_XFER_FUNC_XXX. - * ycbcr_enc - uint32_t, this supplements colorspace parameter, - * one of the XENCAMERA_YCBCR_ENC_XXX. Please note, that ycbcr_enc is only - * valid for YCbCr pixelformats and should be ignored otherwise. - * quantization - uint32_t, this supplements colorspace parameter, - * one of the XENCAMERA_QUANTIZATION_XXX. - * displ_asp_ratio_numer - uint32_t, numerator of the display aspect ratio. - * displ_asp_ratio_denom - uint32_t, denominator of the display aspect ratio. - */ -struct xencamera_config_resp { - uint32_t pixel_format; - uint32_t width; - uint32_t height; - uint32_t colorspace; - uint32_t xfer_func; - uint32_t ycbcr_enc; - uint32_t quantization; - uint32_t displ_asp_ratio_numer; - uint32_t displ_asp_ratio_denom; - uint32_t frame_rate_numer; - uint32_t frame_rate_denom; -}; - -/* - * Request buffer response - response for XENCAMERA_OP_BUF_GET_LAYOUT - * request: - * 0 1 2 3 octet - * +----------------+----------------+----------------+----------------+ - * | id |_BUF_GET_LAYOUT | reserved | 4 - * +----------------+----------------+----------------+----------------+ - * | status | 8 - * +----------------+----------------+----------------+----------------+ - * | num_planes | reserved | 12 - * +----------------+----------------+----------------+----------------+ - * | size | 16 - * +----------------+----------------+----------------+----------------+ - * | plane_size[0] | 20 - * +----------------+----------------+----------------+----------------+ - * | plane_size[1] | 24 - * +----------------+----------------+----------------+----------------+ - * | plane_size[2] | 28 - * +----------------+----------------+----------------+----------------+ - * | plane_size[3] | 32 - * +----------------+----------------+----------------+----------------+ - * | plane_stride[0] | 36 - * +----------------+----------------+----------------+----------------+ - * | plane_stride[1] | 40 - * +----------------+----------------+----------------+----------------+ - * | plane_stride[2] | 44 - * +----------------+----------------+----------------+----------------+ - * | plane_stride[3] | 48 - * +----------------+----------------+----------------+----------------+ - * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| - * +----------------+----------------+----------------+----------------+ - * | reserved | 64 - * +----------------+----------------+----------------+----------------+ - * - * num_planes - uint8_t, number of planes of the buffer. - * size - uint32_t, overall size of the buffer including sizes of the - * individual planes and padding if applicable. - * plane_size - array of uint32_t, size in octets of the corresponding plane - * including padding. - * plane_stride - array of uint32_t, size in octets occupied by the - * corresponding single image line including padding if applicable. - * - * Note! The sizes and strides in this response apply to all buffers created - * with XENCAMERA_OP_BUF_CREATE command, but individual buffers may have - * different plane offsets, see XENCAMERA_OP_BUF_REQUEST.plane_offset. - */ -struct xencamera_buf_get_layout_resp { - uint8_t num_planes; - uint8_t reserved[3]; - uint32_t size; - uint32_t plane_size[XENCAMERA_MAX_PLANE]; - uint32_t plane_stride[XENCAMERA_MAX_PLANE]; -}; - -/* - * Request buffer response - response for XENCAMERA_OP_BUF_REQUEST - * request: - * 0 1 2 3 octet - * +----------------+----------------+----------------+----------------+ - * | id |_OP_BUF_REQUEST | reserved | 4 - * +----------------+----------------+----------------+----------------+ - * | status | 8 - * +----------------+----------------+----------------+----------------+ - * | num_buffers | reserved | 12 - * +----------------+----------------+----------------+----------------+ - * | reserved | 16 - * +----------------+----------------+----------------+----------------+ - * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| - * +----------------+----------------+----------------+----------------+ - * | reserved | 64 - * +----------------+----------------+----------------+----------------+ - * - * num_buffers - uint8_t, number of buffers to be used. - * - * - * Control enumerate response - response for XENCAMERA_OP_CTRL_ENUM: - * 0 1 2 3 octet - * +----------------+----------------+----------------+----------------+ - * | id | _OP_CTRL_ENUM | reserved | 4 - * +----------------+----------------+----------------+----------------+ - * | status | 8 - * +----------------+----------------+----------------+----------------+ - * | index | type | reserved | 12 - * +----------------+----------------+----------------+----------------+ - * | flags | 16 - * +----------------+----------------+----------------+----------------+ - * | min low 32-bits | 20 - * +----------------+----------------+----------------+----------------+ - * | min high 32-bits | 24 - * +----------------+----------------+----------------+----------------+ - * | max low 32-bits | 28 - * +----------------+----------------+----------------+----------------+ - * | max high 32-bits | 32 - * +----------------+----------------+----------------+----------------+ - * | step low 32-bits | 36 - * +----------------+----------------+----------------+----------------+ - * | step high 32-bits | 40 - * +----------------+----------------+----------------+----------------+ - * | def_val low 32-bits | 44 - * +----------------+----------------+----------------+----------------+ - * | def_val high 32-bits | 48 - * +----------------+----------------+----------------+----------------+ - * | reserved | 52 - * +----------------+----------------+----------------+----------------+ - * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| - * +----------------+----------------+----------------+----------------+ - * | reserved | 64 - * +----------------+----------------+----------------+----------------+ - * - * index - uint8_t, index of the camera control in response. - * type - uint8_t, type of the control, one of the XENCAMERA_CTRL_XXX. - * flags - uint32_t, flags of the control, one of the XENCAMERA_CTRL_FLG_XXX. - * min - int64_t, minimum value of the control. - * max - int64_t, maximum value of the control. - * step - int64_t, minimum size in which control value can be changed. - * def_val - int64_t, default value of the control. - */ -struct xencamera_ctrl_enum_resp { - uint8_t index; - uint8_t type; - uint8_t reserved[2]; - uint32_t flags; - int64_t min; - int64_t max; - int64_t step; - int64_t def_val; -}; - -/* - * Get control response - response for XENCAMERA_OP_CTRL_GET: - * 0 1 2 3 octet - * +----------------+----------------+----------------+----------------+ - * | id | _OP_CTRL_GET | reserved | 4 - * +----------------+----------------+----------------+----------------+ - * | status | 8 - * +----------------+----------------+----------------+----------------+ - * | type | reserved | 12 - * +----------------+----------------+----------------+----------------+ - * | reserved | 16 - * +----------------+----------------+----------------+----------------+ - * | reserved | 20 - * +----------------+----------------+----------------+----------------+ - * | value low 32-bit | 24 - * +----------------+----------------+----------------+----------------+ - * | value high 32-bit | 28 - * +----------------+----------------+----------------+----------------+ - * | reserved | 32 - * +----------------+----------------+----------------+----------------+ - * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| - * +----------------+----------------+----------------+----------------+ - * | reserved | 64 - * +----------------+----------------+----------------+----------------+ - * - * type - uint8_t, type of the control, one of the XENCAMERA_CTRL_XXX. - * value - int64_t, new value of the control. - */ - -/* - *----------------------------------- Events ---------------------------------- - * - * Events are sent via a shared page allocated by the front and propagated by - * evt-event-channel/evt-ring-ref XenStore entries. - * - * All event packets have the same length (64 octets). - * All event packets have common header: - * 0 1 2 3 octet - * +----------------+----------------+----------------+----------------+ - * | id | type | reserved | 4 - * +----------------+----------------+----------------+----------------+ - * | reserved | 8 - * +----------------+----------------+----------------+----------------+ - * - * id - uint16_t, event id, may be used by front. - * type - uint8_t, type of the event. - * - * - * Frame captured event - event from back to front when a new captured - * frame is available: - * 0 1 2 3 octet - * +----------------+----------------+----------------+----------------+ - * | id |_EVT_FRAME_AVAIL| reserved | 4 - * +----------------+----------------+----------------+----------------+ - * | reserved | 8 - * +----------------+----------------+----------------+----------------+ - * | index | reserved | 12 - * +----------------+----------------+----------------+----------------+ - * | used_sz | 16 - * +----------------+----------------+----------------+----------------+ - * | seq_num | 20 - * +----------------+----------------+----------------+----------------+ - * | reserved | 24 - * +----------------+----------------+----------------+----------------+ - * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| - * +----------------+----------------+----------------+----------------+ - * | reserved | 64 - * +----------------+----------------+----------------+----------------+ - * - * index - uint8_t, index of the buffer that contains new captured frame, - * see XENCAMERA_OP_BUF_CREATE description on the range - * used_sz - uint32_t, number of octets this frame has. This can be less - * than the XENCAMERA_OP_BUF_REQUEST.size (response) for compressed formats. - * seq_num - uint32_t, sequential number of the frame. Must be - * monotonically increasing. If skips are detected in seq_num then that - * means that the frames in-between were dropped. Note however that not - * all video capture hardware is capable of detecting dropped frames. - * In that case there will be no skips in the sequence counter. - */ -struct xencamera_frame_avail_evt { - uint8_t index; - uint8_t reserved[3]; - uint32_t used_sz; - uint32_t seq_num; -}; - -/* - * Control change event- event from back to front when camera control - * has changed: - * 0 1 2 3 octet - * +----------------+----------------+----------------+----------------+ - * | id |_EVT_CTRL_CHANGE| reserved | 4 - * +----------------+----------------+----------------+----------------+ - * | type | reserved | 8 - * +----------------+----------------+----------------+----------------+ - * | reserved | 12 - * +----------------+----------------+----------------+----------------+ - * | reserved | 16 - * +----------------+----------------+----------------+----------------+ - * | value low 32-bit | 20 - * +----------------+----------------+----------------+----------------+ - * | value high 32-bit | 24 - * +----------------+----------------+----------------+----------------+ - * | reserved | 28 - * +----------------+----------------+----------------+----------------+ - * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| - * +----------------+----------------+----------------+----------------+ - * | reserved | 64 - * +----------------+----------------+----------------+----------------+ - * - * type - uint8_t, type of the control, one of the XENCAMERA_CTRL_XXX. - * value - int64_t, new value of the control. - * - * Notes: - * - this event is not sent for write-only controls - * - this event is not sent to the originator of the control change - * - this event is not sent when frontend first connects, e.g. initial - * control state must be explicitly queried - */ - -struct xencamera_req { - uint16_t id; - uint8_t operation; - uint8_t reserved[5]; - union { - struct xencamera_config_req config; - struct xencamera_frame_rate_req frame_rate; - struct xencamera_buf_request buf_request; - struct xencamera_buf_create_req buf_create; - struct xencamera_index index; - struct xencamera_ctrl_value ctrl_value; - struct xencamera_get_ctrl_req get_ctrl; - uint8_t reserved[56]; - } req; -}; - -struct xencamera_resp { - uint16_t id; - uint8_t operation; - uint8_t reserved; - int32_t status; - union { - struct xencamera_config_resp config; - struct xencamera_buf_get_layout_resp buf_layout; - struct xencamera_buf_request buf_request; - struct xencamera_ctrl_enum_resp ctrl_enum; - struct xencamera_ctrl_value ctrl_value; - uint8_t reserved1[56]; - } resp; -}; - -struct xencamera_evt { - uint16_t id; - uint8_t type; - uint8_t reserved[5]; - union { - struct xencamera_frame_avail_evt frame_avail; - struct xencamera_ctrl_value ctrl_value; - uint8_t reserved[56]; - } evt; -}; - -DEFINE_RING_TYPES(xen_cameraif, struct xencamera_req, struct xencamera_resp); - -/* - ****************************************************************************** - * Back to front events delivery - ****************************************************************************** - * In order to deliver asynchronous events from back to front a shared page is - * allocated by front and its granted reference propagated to back via - * XenStore entries (evt-ring-ref/evt-event-channel). - * This page has a common header used by both front and back to synchronize - * access and control event's ring buffer, while back being a producer of the - * events and front being a consumer. The rest of the page after the header - * is used for event packets. - * - * Upon reception of an event(s) front may confirm its reception - * for either each event, group of events or none. - */ - -struct xencamera_event_page { - uint32_t in_cons; - uint32_t in_prod; - uint8_t reserved[56]; -}; - -#define XENCAMERA_EVENT_PAGE_SIZE 4096 -#define XENCAMERA_IN_RING_OFFS (sizeof(struct xencamera_event_page)) -#define XENCAMERA_IN_RING_SIZE (XENCAMERA_EVENT_PAGE_SIZE - XENCAMERA_IN_RING_OFFS) -#define XENCAMERA_IN_RING_LEN (XENCAMERA_IN_RING_SIZE / sizeof(struct xencamera_evt)) -#define XENCAMERA_IN_RING(page) \ - ((struct xencamera_evt *)((char *)(page) + XENCAMERA_IN_RING_OFFS)) -#define XENCAMERA_IN_RING_REF(page, idx) \ - (XENCAMERA_IN_RING((page))[(idx) % XENCAMERA_IN_RING_LEN]) - -#endif /* __XEN_PUBLIC_IO_CAMERAIF_H__ */ - -/* - * Local variables: - * mode: C - * c-file-style: "BSD" - * c-basic-offset: 4 - * tab-width: 4 - * indent-tabs-mode: nil - * End: - */ diff --git a/sys/xen/interface/io/console.h b/sys/xen/interface/io/console.h deleted file mode 100644 index 4811f47220a9..000000000000 --- a/sys/xen/interface/io/console.h +++ /dev/null @@ -1,56 +0,0 @@ -/****************************************************************************** - * console.h - * - * Console I/O interface for Xen guest OSes. - * - * 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 - */ - -#ifndef __XEN_PUBLIC_IO_CONSOLE_H__ -#define __XEN_PUBLIC_IO_CONSOLE_H__ - -typedef uint32_t XENCONS_RING_IDX; - -#define MASK_XENCONS_IDX(idx, ring) ((idx) & (sizeof(ring)-1)) - -struct xencons_interface { - char in[1024]; - char out[2048]; - XENCONS_RING_IDX in_cons, in_prod; - XENCONS_RING_IDX out_cons, out_prod; -}; - -#ifdef XEN_WANT_FLEX_CONSOLE_RING -#include "ring.h" -DEFINE_XEN_FLEX_RING(xencons); -#endif - -#endif /* __XEN_PUBLIC_IO_CONSOLE_H__ */ - -/* - * Local variables: - * mode: C - * c-file-style: "BSD" - * c-basic-offset: 4 - * tab-width: 4 - * indent-tabs-mode: nil - * End: - */ diff --git a/sys/xen/interface/io/displif.h b/sys/xen/interface/io/displif.h deleted file mode 100644 index cc5de9cb1f35..000000000000 --- a/sys/xen/interface/io/displif.h +++ /dev/null @@ -1,872 +0,0 @@ -/****************************************************************************** - * displif.h - * - * Unified display device I/O interface for Xen guest OSes. - * - * 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-2017 EPAM Systems Inc. - * - * Authors: Oleksandr Andrushchenko - * Oleksandr Grytsov - */ - -#ifndef __XEN_PUBLIC_IO_DISPLIF_H__ -#define __XEN_PUBLIC_IO_DISPLIF_H__ - -#include "ring.h" -#include "../grant_table.h" - -/* - ****************************************************************************** - * Protocol version - ****************************************************************************** - */ -#define XENDISPL_PROTOCOL_VERSION "1" - -/* - ****************************************************************************** - * Main features provided by the protocol - ****************************************************************************** - * This protocol aims to provide a unified protocol which fits more - * sophisticated use-cases than a framebuffer device can handle. At the - * moment basic functionality is supported with the intention to be extended: - * o multiple dynamically allocated/destroyed framebuffers - * o buffers of arbitrary sizes - * o buffer allocation at either back or front end - * o better configuration options including multiple display support - * - * Note: existing fbif can be used together with displif running at the - * same time, e.g. on Linux one provides framebuffer and another DRM/KMS - * - * Note: display resolution (XenStore's "resolution" property) defines - * visible area of the virtual display. At the same time resolution of - * the display and frame buffers may differ: buffers can be smaller, equal - * or bigger than the visible area. This is to enable use-cases, where backend - * may do some post-processing of the display and frame buffers supplied, - * e.g. those buffers can be just a part of the final composition. - * - ****************************************************************************** - * Direction of improvements - ****************************************************************************** - * Future extensions to the existing protocol may include: - * o display/connector cloning - * o allocation of objects other than display buffers - * o plane/overlay support - * o scaling support - * o rotation support - * - ****************************************************************************** - * Feature and Parameter Negotiation - ****************************************************************************** - * - * Front->back notifications: when enqueuing a new request, sending a - * notification can be made conditional on xendispl_req (i.e., the generic - * hold-off mechanism provided by the ring macros). Backends must set - * xendispl_req appropriately (e.g., using RING_FINAL_CHECK_FOR_REQUESTS()). - * - * Back->front notifications: when enqueuing a new response, sending a - * notification can be made conditional on xendispl_resp (i.e., the generic - * hold-off mechanism provided by the ring macros). Frontends must set - * xendispl_resp appropriately (e.g., using RING_FINAL_CHECK_FOR_RESPONSES()). - * - * The two halves of a para-virtual display driver utilize nodes within - * XenStore to communicate capabilities and to negotiate operating parameters. - * This section enumerates these nodes which reside in the respective front and - * backend portions of XenStore, following the XenBus convention. - * - * All data in XenStore is stored as strings. Nodes specifying numeric - * values are encoded in decimal. Integer value ranges listed below are - * expressed as fixed sized integer types capable of storing the conversion - * of a properly formated node string, without loss of information. - * - ****************************************************************************** - * Example configuration - ****************************************************************************** - * - * Note: depending on the use-case backend can expose more display connectors - * than the underlying HW physically has by employing SW graphics compositors - * - * This is an example of backend and frontend configuration: - * - *--------------------------------- Backend ----------------------------------- - * - * /local/domain/0/backend/vdispl/1/0/frontend-id = "1" - * /local/domain/0/backend/vdispl/1/0/frontend = "/local/domain/1/device/vdispl/0" - * /local/domain/0/backend/vdispl/1/0/state = "4" - * /local/domain/0/backend/vdispl/1/0/versions = "1,2" - * - *--------------------------------- Frontend ---------------------------------- - * - * /local/domain/1/device/vdispl/0/backend-id = "0" - * /local/domain/1/device/vdispl/0/backend = "/local/domain/0/backend/vdispl/1/0" - * /local/domain/1/device/vdispl/0/state = "4" - * /local/domain/1/device/vdispl/0/version = "1" - * /local/domain/1/device/vdispl/0/be-alloc = "1" - * - *-------------------------- Connector 0 configuration ------------------------ - * - * /local/domain/1/device/vdispl/0/0/resolution = "1920x1080" - * /local/domain/1/device/vdispl/0/0/req-ring-ref = "2832" - * /local/domain/1/device/vdispl/0/0/req-event-channel = "15" - * /local/domain/1/device/vdispl/0/0/evt-ring-ref = "387" - * /local/domain/1/device/vdispl/0/0/evt-event-channel = "16" - * - *-------------------------- Connector 1 configuration ------------------------ - * - * /local/domain/1/device/vdispl/0/1/resolution = "800x600" - * /local/domain/1/device/vdispl/0/1/req-ring-ref = "2833" - * /local/domain/1/device/vdispl/0/1/req-event-channel = "17" - * /local/domain/1/device/vdispl/0/1/evt-ring-ref = "388" - * /local/domain/1/device/vdispl/0/1/evt-event-channel = "18" - * - ****************************************************************************** - * Backend XenBus Nodes - ****************************************************************************** - * - *----------------------------- Protocol version ------------------------------ - * - * versions - * Values: - * - * List of XENDISPL_LIST_SEPARATOR separated protocol versions supported - * by the backend. For example "1,2,3". - * - ****************************************************************************** - * Frontend XenBus Nodes - ****************************************************************************** - * - *-------------------------------- Addressing --------------------------------- - * - * dom-id - * Values: - * - * Domain identifier. - * - * dev-id - * Values: - * - * Device identifier. - * - * conn-idx - * Values: - * - * Zero based contigous index of the connector. - * /local/domain//device/vdispl///... - * - *----------------------------- Protocol version ------------------------------ - * - * version - * Values: - * - * Protocol version, chosen among the ones supported by the backend. - * - *------------------------- Backend buffer allocation ------------------------- - * - * be-alloc - * Values: "0", "1" - * - * If value is set to "1", then backend can be a buffer provider/allocator - * for this domain during XENDISPL_OP_DBUF_CREATE operation (see below - * for negotiation). - * If value is not "1" or omitted frontend must allocate buffers itself. - * - *----------------------------- Connector settings ---------------------------- - * - * unique-id - * Values: - * - * After device instance initialization each connector is assigned a - * unique ID, so it can be identified by the backend by this ID. - * This can be UUID or such. - * - * resolution - * Values: x - * - * Width and height of the connector in pixels separated by - * XENDISPL_RESOLUTION_SEPARATOR. This defines visible area of the - * display. - * - *------------------ Connector Request Transport Parameters ------------------- - * - * This communication path is used to deliver requests from frontend to backend - * and get the corresponding responses from backend to frontend, - * set up per connector. - * - * req-event-channel - * Values: - * - * The identifier of the Xen connector's control event channel - * used to signal activity in the ring buffer. - * - * req-ring-ref - * Values: - * - * The Xen grant reference granting permission for the backend to map - * a sole page of connector's control ring buffer. - * - *------------------- Connector Event Transport Parameters -------------------- - * - * This communication path is used to deliver asynchronous events from backend - * to frontend, set up per connector. - * - * evt-event-channel - * Values: - * - * The identifier of the Xen connector's event channel - * used to signal activity in the ring buffer. - * - * evt-ring-ref - * Values: - * - * The Xen grant reference granting permission for the backend to map - * a sole page of connector's event ring buffer. - */ - -/* - ****************************************************************************** - * STATE DIAGRAMS - ****************************************************************************** - * - * Tool stack creates front and back state nodes with initial state - * XenbusStateInitialising. - * Tool stack creates and sets up frontend display configuration - * nodes per domain. - * - *-------------------------------- Normal flow -------------------------------- - * - * Front Back - * ================================= ===================================== - * XenbusStateInitialising XenbusStateInitialising - * o Query backend device identification - * data. - * o Open and validate backend device. - * | - * | - * V - * XenbusStateInitWait - * - * o Query frontend configuration - * o Allocate and initialize - * event channels per configured - * connector. - * o Publish transport parameters - * that will be in effect during - * this connection. - * | - * | - * V - * XenbusStateInitialised - * - * o Query frontend transport parameters. - * o Connect to the event channels. - * | - * | - * V - * XenbusStateConnected - * - * o Create and initialize OS - * virtual display connectors - * as per configuration. - * | - * | - * V - * XenbusStateConnected - * - * XenbusStateUnknown - * XenbusStateClosed - * XenbusStateClosing - * o Remove virtual display device - * o Remove event channels - * | - * | - * V - * XenbusStateClosed - * - *------------------------------- Recovery flow ------------------------------- - * - * In case of frontend unrecoverable errors backend handles that as - * if frontend goes into the XenbusStateClosed state. - * - * In case of backend unrecoverable errors frontend tries removing - * the virtualized device. If this is possible at the moment of error, - * then frontend goes into the XenbusStateInitialising state and is ready for - * new connection with backend. If the virtualized device is still in use and - * cannot be removed, then frontend goes into the XenbusStateReconfiguring state - * until either the virtualized device is removed or backend initiates a new - * connection. On the virtualized device removal frontend goes into the - * XenbusStateInitialising state. - * - * Note on XenbusStateReconfiguring state of the frontend: if backend has - * unrecoverable errors then frontend cannot send requests to the backend - * and thus cannot provide functionality of the virtualized device anymore. - * After backend is back to normal the virtualized device may still hold some - * state: configuration in use, allocated buffers, client application state etc. - * In most cases, this will require frontend to implement complex recovery - * reconnect logic. Instead, by going into XenbusStateReconfiguring state, - * frontend will make sure no new clients of the virtualized device are - * accepted, allow existing client(s) to exit gracefully by signaling error - * state etc. - * Once all the clients are gone frontend can reinitialize the virtualized - * device and get into XenbusStateInitialising state again signaling the - * backend that a new connection can be made. - * - * There are multiple conditions possible under which frontend will go from - * XenbusStateReconfiguring into XenbusStateInitialising, some of them are OS - * specific. For example: - * 1. The underlying OS framework may provide callbacks to signal that the last - * client of the virtualized device has gone and the device can be removed - * 2. Frontend can schedule a deferred work (timer/tasklet/workqueue) - * to periodically check if this is the right time to re-try removal of - * the virtualized device. - * 3. By any other means. - * - ****************************************************************************** - * REQUEST CODES - ****************************************************************************** - * Request codes [0; 15] are reserved and must not be used - */ - -#define XENDISPL_OP_DBUF_CREATE 0x10 -#define XENDISPL_OP_DBUF_DESTROY 0x11 -#define XENDISPL_OP_FB_ATTACH 0x12 -#define XENDISPL_OP_FB_DETACH 0x13 -#define XENDISPL_OP_SET_CONFIG 0x14 -#define XENDISPL_OP_PG_FLIP 0x15 - -/* - ****************************************************************************** - * EVENT CODES - ****************************************************************************** - */ -#define XENDISPL_EVT_PG_FLIP 0x00 - -/* - ****************************************************************************** - * XENSTORE FIELD AND PATH NAME STRINGS, HELPERS - ****************************************************************************** - */ -#define XENDISPL_DRIVER_NAME "vdispl" - -#define XENDISPL_LIST_SEPARATOR "," -#define XENDISPL_RESOLUTION_SEPARATOR "x" - -#define XENDISPL_FIELD_BE_VERSIONS "versions" -#define XENDISPL_FIELD_FE_VERSION "version" -#define XENDISPL_FIELD_REQ_RING_REF "req-ring-ref" -#define XENDISPL_FIELD_REQ_CHANNEL "req-event-channel" -#define XENDISPL_FIELD_EVT_RING_REF "evt-ring-ref" -#define XENDISPL_FIELD_EVT_CHANNEL "evt-event-channel" -#define XENDISPL_FIELD_RESOLUTION "resolution" -#define XENDISPL_FIELD_BE_ALLOC "be-alloc" -#define XENDISPL_FIELD_UNIQUE_ID "unique-id" - -/* - ****************************************************************************** - * STATUS RETURN CODES - ****************************************************************************** - * - * Status return code is zero on success and -XEN_EXX on failure. - * - ****************************************************************************** - * Assumptions - ****************************************************************************** - * o usage of grant reference 0 as invalid grant reference: - * grant reference 0 is valid, but never exposed to a PV driver, - * because of the fact it is already in use/reserved by the PV console. - * o all references in this document to page sizes must be treated - * as pages of size XEN_PAGE_SIZE unless otherwise noted. - * - ****************************************************************************** - * Description of the protocol between frontend and backend driver - ****************************************************************************** - * - * The two halves of a Para-virtual display driver communicate with - * each other using shared pages and event channels. - * Shared page contains a ring with request/response packets. - * - * All reserved fields in the structures below must be 0. - * Display buffers's cookie of value 0 is treated as invalid. - * Framebuffer's cookie of value 0 is treated as invalid. - * - * For all request/response/event packets that use cookies: - * dbuf_cookie - uint64_t, unique to guest domain value used by the backend - * to map remote display buffer to its local one - * fb_cookie - uint64_t, unique to guest domain value used by the backend - * to map remote framebuffer to its local one - * - *---------------------------------- Requests --------------------------------- - * - * All requests/responses, which are not connector specific, must be sent over - * control ring of the connector which has the index value of 0: - * /local/domain//device/vdispl//0/req-ring-ref - * - * All request packets have the same length (64 octets) - * All request packets have common header: - * 0 1 2 3 octet - * +----------------+----------------+----------------+----------------+ - * | id | operation | reserved | 4 - * +----------------+----------------+----------------+----------------+ - * | reserved | 8 - * +----------------+----------------+----------------+----------------+ - * id - uint16_t, private guest value, echoed in response - * operation - uint8_t, operation code, XENDISPL_OP_??? - * - * Request dbuf creation - request creation of a display buffer. - * 0 1 2 3 octet - * +----------------+----------------+----------------+----------------+ - * | id |_OP_DBUF_CREATE | reserved | 4 - * +----------------+----------------+----------------+----------------+ - * | reserved | 8 - * +----------------+----------------+----------------+----------------+ - * | dbuf_cookie low 32-bit | 12 - * +----------------+----------------+----------------+----------------+ - * | dbuf_cookie high 32-bit | 16 - * +----------------+----------------+----------------+----------------+ - * | width | 20 - * +----------------+----------------+----------------+----------------+ - * | height | 24 - * +----------------+----------------+----------------+----------------+ - * | bpp | 28 - * +----------------+----------------+----------------+----------------+ - * | buffer_sz | 32 - * +----------------+----------------+----------------+----------------+ - * | flags | 36 - * +----------------+----------------+----------------+----------------+ - * | gref_directory | 40 - * +----------------+----------------+----------------+----------------+ - * | reserved | 44 - * +----------------+----------------+----------------+----------------+ - * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| - * +----------------+----------------+----------------+----------------+ - * | reserved | 64 - * +----------------+----------------+----------------+----------------+ - * - * Must be sent over control ring of the connector which has the index - * value of 0: - * /local/domain//device/vdispl//0/req-ring-ref - * All unused bits in flags field must be set to 0. - * - * An attempt to create multiple display buffers with the same dbuf_cookie is - * an error. dbuf_cookie can be re-used after destroying the corresponding - * display buffer. - * - * Width and height of the display buffers can be smaller, equal or bigger - * than the connector's resolution. Depth/pixel format of the individual - * buffers can differ as well. - * - * width - uint32_t, width in pixels - * height - uint32_t, height in pixels - * bpp - uint32_t, bits per pixel - * buffer_sz - uint32_t, buffer size to be allocated, octets - * flags - uint32_t, flags of the operation - * o XENDISPL_DBUF_FLG_REQ_ALLOC - if set, then backend is requested - * to allocate the buffer with the parameters provided in this request. - * Page directory is handled as follows: - * Frontend on request: - * o allocates pages for the directory (gref_directory, - * gref_dir_next_page(s) - * o grants permissions for the pages of the directory to the backend - * o sets gref_dir_next_page fields - * Backend on response: - * o grants permissions for the pages of the buffer allocated to - * the frontend - * o fills in page directory with grant references - * (gref[] in struct xendispl_page_directory) - * gref_directory - grant_ref_t, a reference to the first shared page - * describing shared buffer references. At least one page exists. If shared - * buffer size (buffer_sz) exceeds what can be addressed by this single page, - * then reference to the next page must be supplied (see gref_dir_next_page - * below) - */ - -#define XENDISPL_DBUF_FLG_REQ_ALLOC (1 << 0) - -struct xendispl_dbuf_create_req { - uint64_t dbuf_cookie; - uint32_t width; - uint32_t height; - uint32_t bpp; - uint32_t buffer_sz; - uint32_t flags; - grant_ref_t gref_directory; -}; - -/* - * Shared page for XENDISPL_OP_DBUF_CREATE buffer descriptor (gref_directory in - * the request) employs a list of pages, describing all pages of the shared - * data buffer: - * 0 1 2 3 octet - * +----------------+----------------+----------------+----------------+ - * | gref_dir_next_page | 4 - * +----------------+----------------+----------------+----------------+ - * | gref[0] | 8 - * +----------------+----------------+----------------+----------------+ - * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| - * +----------------+----------------+----------------+----------------+ - * | gref[i] | i*4+8 - * +----------------+----------------+----------------+----------------+ - * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| - * +----------------+----------------+----------------+----------------+ - * | gref[N - 1] | N*4+8 - * +----------------+----------------+----------------+----------------+ - * - * gref_dir_next_page - grant_ref_t, reference to the next page describing - * page directory. Must be 0 if there are no more pages in the list. - * gref[i] - grant_ref_t, reference to a shared page of the buffer - * allocated at XENDISPL_OP_DBUF_CREATE - * - * Number of grant_ref_t entries in the whole page directory is not - * passed, but instead can be calculated as: - * num_grefs_total = (XENDISPL_OP_DBUF_CREATE.buffer_sz + XEN_PAGE_SIZE - 1) / - * XEN_PAGE_SIZE - */ - -struct xendispl_page_directory { - grant_ref_t gref_dir_next_page; - grant_ref_t gref[1]; /* Variable length */ -}; - -/* - * Request dbuf destruction - destroy a previously allocated display buffer: - * 0 1 2 3 octet - * +----------------+----------------+----------------+----------------+ - * | id |_OP_DBUF_DESTROY| reserved | 4 - * +----------------+----------------+----------------+----------------+ - * | reserved | 8 - * +----------------+----------------+----------------+----------------+ - * | dbuf_cookie low 32-bit | 12 - * +----------------+----------------+----------------+----------------+ - * | dbuf_cookie high 32-bit | 16 - * +----------------+----------------+----------------+----------------+ - * | reserved | 20 - * +----------------+----------------+----------------+----------------+ - * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| - * +----------------+----------------+----------------+----------------+ - * | reserved | 64 - * +----------------+----------------+----------------+----------------+ - * - * Must be sent over control ring of the connector which has the index - * value of 0: - * /local/domain//device/vdispl//0/req-ring-ref - */ - -struct xendispl_dbuf_destroy_req { - uint64_t dbuf_cookie; -}; - -/* - * Request framebuffer attachment - request attachment of a framebuffer to - * previously created display buffer. - * 0 1 2 3 octet - * +----------------+----------------+----------------+----------------+ - * | id | _OP_FB_ATTACH | reserved | 4 - * +----------------+----------------+----------------+----------------+ - * | reserved | 8 - * +----------------+----------------+----------------+----------------+ - * | dbuf_cookie low 32-bit | 12 - * +----------------+----------------+----------------+----------------+ - * | dbuf_cookie high 32-bit | 16 - * +----------------+----------------+----------------+----------------+ - * | fb_cookie low 32-bit | 20 - * +----------------+----------------+----------------+----------------+ - * | fb_cookie high 32-bit | 24 - * +----------------+----------------+----------------+----------------+ - * | width | 28 - * +----------------+----------------+----------------+----------------+ - * | height | 32 - * +----------------+----------------+----------------+----------------+ - * | pixel_format | 36 - * +----------------+----------------+----------------+----------------+ - * | reserved | 40 - * +----------------+----------------+----------------+----------------+ - * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| - * +----------------+----------------+----------------+----------------+ - * | reserved | 64 - * +----------------+----------------+----------------+----------------+ - * - * Must be sent over control ring of the connector which has the index - * value of 0: - * /local/domain//device/vdispl//0/req-ring-ref - * Width and height can be smaller, equal or bigger than the connector's - * resolution. - * - * An attempt to create multiple frame buffers with the same fb_cookie is - * an error. fb_cookie can be re-used after destroying the corresponding - * frame buffer. - * - * width - uint32_t, width in pixels - * height - uint32_t, height in pixels - * pixel_format - uint32_t, pixel format of the framebuffer, FOURCC code - */ - -struct xendispl_fb_attach_req { - uint64_t dbuf_cookie; - uint64_t fb_cookie; - uint32_t width; - uint32_t height; - uint32_t pixel_format; -}; - -/* - * Request framebuffer detach - detach a previously - * attached framebuffer from the display buffer in request: - * 0 1 2 3 octet - * +----------------+----------------+----------------+----------------+ - * | id | _OP_FB_DETACH | reserved | 4 - * +----------------+----------------+----------------+----------------+ - * | reserved | 8 - * +----------------+----------------+----------------+----------------+ - * | fb_cookie low 32-bit | 12 - * +----------------+----------------+----------------+----------------+ - * | fb_cookie high 32-bit | 16 - * +----------------+----------------+----------------+----------------+ - * | reserved | 20 - * +----------------+----------------+----------------+----------------+ - * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| - * +----------------+----------------+----------------+----------------+ - * | reserved | 64 - * +----------------+----------------+----------------+----------------+ - * - * Must be sent over control ring of the connector which has the index - * value of 0: - * /local/domain//device/vdispl//0/req-ring-ref - */ - -struct xendispl_fb_detach_req { - uint64_t fb_cookie; -}; - -/* - * Request configuration set/reset - request to set or reset - * the configuration/mode of the display: - * 0 1 2 3 octet - * +----------------+----------------+----------------+----------------+ - * | id | _OP_SET_CONFIG | reserved | 4 - * +----------------+----------------+----------------+----------------+ - * | reserved | 8 - * +----------------+----------------+----------------+----------------+ - * | fb_cookie low 32-bit | 12 - * +----------------+----------------+----------------+----------------+ - * | fb_cookie high 32-bit | 16 - * +----------------+----------------+----------------+----------------+ - * | x | 20 - * +----------------+----------------+----------------+----------------+ - * | y | 24 - * +----------------+----------------+----------------+----------------+ - * | width | 28 - * +----------------+----------------+----------------+----------------+ - * | height | 32 - * +----------------+----------------+----------------+----------------+ - * | bpp | 40 - * +----------------+----------------+----------------+----------------+ - * | reserved | 44 - * +----------------+----------------+----------------+----------------+ - * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| - * +----------------+----------------+----------------+----------------+ - * | reserved | 64 - * +----------------+----------------+----------------+----------------+ - * - * Pass all zeros to reset, otherwise command is treated as - * configuration set. - * Framebuffer's cookie defines which framebuffer/dbuf must be - * displayed while enabling display (applying configuration). - * x, y, width and height are bound by the connector's resolution and must not - * exceed it. - * - * x - uint32_t, starting position in pixels by X axis - * y - uint32_t, starting position in pixels by Y axis - * width - uint32_t, width in pixels - * height - uint32_t, height in pixels - * bpp - uint32_t, bits per pixel - */ - -struct xendispl_set_config_req { - uint64_t fb_cookie; - uint32_t x; - uint32_t y; - uint32_t width; - uint32_t height; - uint32_t bpp; -}; - -/* - * Request page flip - request to flip a page identified by the framebuffer - * cookie: - * 0 1 2 3 octet - * +----------------+----------------+----------------+----------------+ - * | id | _OP_PG_FLIP | reserved | 4 - * +----------------+----------------+----------------+----------------+ - * | reserved | 8 - * +----------------+----------------+----------------+----------------+ - * | fb_cookie low 32-bit | 12 - * +----------------+----------------+----------------+----------------+ - * | fb_cookie high 32-bit | 16 - * +----------------+----------------+----------------+----------------+ - * | reserved | 20 - * +----------------+----------------+----------------+----------------+ - * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| - * +----------------+----------------+----------------+----------------+ - * | reserved | 64 - * +----------------+----------------+----------------+----------------+ - */ - -struct xendispl_page_flip_req { - uint64_t fb_cookie; -}; - -/* - *---------------------------------- Responses -------------------------------- - * - * All response packets have the same length (64 octets) - * - * All response packets have common header: - * 0 1 2 3 octet - * +----------------+----------------+----------------+----------------+ - * | id | reserved | 4 - * +----------------+----------------+----------------+----------------+ - * | status | 8 - * +----------------+----------------+----------------+----------------+ - * | reserved | 12 - * +----------------+----------------+----------------+----------------+ - * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| - * +----------------+----------------+----------------+----------------+ - * | reserved | 64 - * +----------------+----------------+----------------+----------------+ - * - * id - uint16_t, private guest value, echoed from request - * status - int32_t, response status, zero on success and -XEN_EXX on failure - * - *----------------------------------- Events ---------------------------------- - * - * Events are sent via a shared page allocated by the front and propagated by - * evt-event-channel/evt-ring-ref XenStore entries - * All event packets have the same length (64 octets) - * All event packets have common header: - * 0 1 2 3 octet - * +----------------+----------------+----------------+----------------+ - * | id | type | reserved | 4 - * +----------------+----------------+----------------+----------------+ - * | reserved | 8 - * +----------------+----------------+----------------+----------------+ - * - * id - uint16_t, event id, may be used by front - * type - uint8_t, type of the event - * - * - * Page flip complete event - event from back to front on page flip completed: - * 0 1 2 3 octet - * +----------------+----------------+----------------+----------------+ - * | id | _EVT_PG_FLIP | reserved | 4 - * +----------------+----------------+----------------+----------------+ - * | reserved | 8 - * +----------------+----------------+----------------+----------------+ - * | fb_cookie low 32-bit | 12 - * +----------------+----------------+----------------+----------------+ - * | fb_cookie high 32-bit | 16 - * +----------------+----------------+----------------+----------------+ - * | reserved | 20 - * +----------------+----------------+----------------+----------------+ - * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| - * +----------------+----------------+----------------+----------------+ - * | reserved | 64 - * +----------------+----------------+----------------+----------------+ - */ - -struct xendispl_pg_flip_evt { - uint64_t fb_cookie; -}; - -struct xendispl_req { - uint16_t id; - uint8_t operation; - uint8_t reserved[5]; - union { - struct xendispl_dbuf_create_req dbuf_create; - struct xendispl_dbuf_destroy_req dbuf_destroy; - struct xendispl_fb_attach_req fb_attach; - struct xendispl_fb_detach_req fb_detach; - struct xendispl_set_config_req set_config; - struct xendispl_page_flip_req pg_flip; - uint8_t reserved[56]; - } op; -}; - -struct xendispl_resp { - uint16_t id; - uint8_t operation; - uint8_t reserved; - int32_t status; - uint8_t reserved1[56]; -}; - -struct xendispl_evt { - uint16_t id; - uint8_t type; - uint8_t reserved[5]; - union { - struct xendispl_pg_flip_evt pg_flip; - uint8_t reserved[56]; - } op; -}; - -DEFINE_RING_TYPES(xen_displif, struct xendispl_req, struct xendispl_resp); - -/* - ****************************************************************************** - * Back to front events delivery - ****************************************************************************** - * In order to deliver asynchronous events from back to front a shared page is - * allocated by front and its granted reference propagated to back via - * XenStore entries (evt-ring-ref/evt-event-channel). - * This page has a common header used by both front and back to synchronize - * access and control event's ring buffer, while back being a producer of the - * events and front being a consumer. The rest of the page after the header - * is used for event packets. - * - * Upon reception of an event(s) front may confirm its reception - * for either each event, group of events or none. - */ - -struct xendispl_event_page { - uint32_t in_cons; - uint32_t in_prod; - uint8_t reserved[56]; -}; - -#define XENDISPL_EVENT_PAGE_SIZE 4096 -#define XENDISPL_IN_RING_OFFS (sizeof(struct xendispl_event_page)) -#define XENDISPL_IN_RING_SIZE (XENDISPL_EVENT_PAGE_SIZE - XENDISPL_IN_RING_OFFS) -#define XENDISPL_IN_RING_LEN (XENDISPL_IN_RING_SIZE / sizeof(struct xendispl_evt)) -#define XENDISPL_IN_RING(page) \ - ((struct xendispl_evt *)((char *)(page) + XENDISPL_IN_RING_OFFS)) -#define XENDISPL_IN_RING_REF(page, idx) \ - (XENDISPL_IN_RING((page))[(idx) % XENDISPL_IN_RING_LEN]) - -#endif /* __XEN_PUBLIC_IO_DISPLIF_H__ */ - -/* - * Local variables: - * mode: C - * c-file-style: "BSD" - * c-basic-offset: 4 - * tab-width: 4 - * indent-tabs-mode: nil - * End: - */ diff --git a/sys/xen/interface/io/fbif.h b/sys/xen/interface/io/fbif.h deleted file mode 100644 index cc25aab32ea6..000000000000 --- a/sys/xen/interface/io/fbif.h +++ /dev/null @@ -1,176 +0,0 @@ -/* - * fbif.h -- Xen virtual frame buffer device - * - * 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 Anthony Liguori - * Copyright (C) 2006 Red Hat, Inc., Markus Armbruster - */ - -#ifndef __XEN_PUBLIC_IO_FBIF_H__ -#define __XEN_PUBLIC_IO_FBIF_H__ - -/* Out events (frontend -> backend) */ - -/* - * Out events may be sent only when requested by backend, and receipt - * of an unknown out event is an error. - */ - -/* Event type 1 currently not used */ -/* - * Framebuffer update notification event - * Capable frontend sets feature-update in xenstore. - * Backend requests it by setting request-update in xenstore. - */ -#define XENFB_TYPE_UPDATE 2 - -struct xenfb_update -{ - uint8_t type; /* XENFB_TYPE_UPDATE */ - int32_t x; /* source x */ - int32_t y; /* source y */ - int32_t width; /* rect width */ - int32_t height; /* rect height */ -}; - -/* - * Framebuffer resize notification event - * Capable backend sets feature-resize in xenstore. - */ -#define XENFB_TYPE_RESIZE 3 - -struct xenfb_resize -{ - uint8_t type; /* XENFB_TYPE_RESIZE */ - int32_t width; /* width in pixels */ - int32_t height; /* height in pixels */ - int32_t stride; /* stride in bytes */ - int32_t depth; /* depth in bits */ - int32_t offset; /* offset of the framebuffer in bytes */ -}; - -#define XENFB_OUT_EVENT_SIZE 40 - -union xenfb_out_event -{ - uint8_t type; - struct xenfb_update update; - struct xenfb_resize resize; - char pad[XENFB_OUT_EVENT_SIZE]; -}; - -/* In events (backend -> frontend) */ - -/* - * Frontends should ignore unknown in events. - */ - -/* - * Framebuffer refresh period advice - * Backend sends it to advise the frontend their preferred period of - * refresh. Frontends that keep the framebuffer constantly up-to-date - * just ignore it. Frontends that use the advice should immediately - * refresh the framebuffer (and send an update notification event if - * those have been requested), then use the update frequency to guide - * their periodical refreshs. - */ -#define XENFB_TYPE_REFRESH_PERIOD 1 -#define XENFB_NO_REFRESH 0 - -struct xenfb_refresh_period -{ - uint8_t type; /* XENFB_TYPE_UPDATE_PERIOD */ - uint32_t period; /* period of refresh, in ms, - * XENFB_NO_REFRESH if no refresh is needed */ -}; - -#define XENFB_IN_EVENT_SIZE 40 - -union xenfb_in_event -{ - uint8_t type; - struct xenfb_refresh_period refresh_period; - char pad[XENFB_IN_EVENT_SIZE]; -}; - -/* shared page */ - -#define XENFB_IN_RING_SIZE 1024 -#define XENFB_IN_RING_LEN (XENFB_IN_RING_SIZE / XENFB_IN_EVENT_SIZE) -#define XENFB_IN_RING_OFFS 1024 -#define XENFB_IN_RING(page) \ - ((union xenfb_in_event *)((char *)(page) + XENFB_IN_RING_OFFS)) -#define XENFB_IN_RING_REF(page, idx) \ - (XENFB_IN_RING((page))[(idx) % XENFB_IN_RING_LEN]) - -#define XENFB_OUT_RING_SIZE 2048 -#define XENFB_OUT_RING_LEN (XENFB_OUT_RING_SIZE / XENFB_OUT_EVENT_SIZE) -#define XENFB_OUT_RING_OFFS (XENFB_IN_RING_OFFS + XENFB_IN_RING_SIZE) -#define XENFB_OUT_RING(page) \ - ((union xenfb_out_event *)((char *)(page) + XENFB_OUT_RING_OFFS)) -#define XENFB_OUT_RING_REF(page, idx) \ - (XENFB_OUT_RING((page))[(idx) % XENFB_OUT_RING_LEN]) - -struct xenfb_page -{ - uint32_t in_cons, in_prod; - uint32_t out_cons, out_prod; - - int32_t width; /* the width of the framebuffer (in pixels) */ - int32_t height; /* the height of the framebuffer (in pixels) */ - uint32_t line_length; /* the length of a row of pixels (in bytes) */ - uint32_t mem_length; /* the length of the framebuffer (in bytes) */ - uint8_t depth; /* the depth of a pixel (in bits) */ - - /* - * Framebuffer page directory - * - * Each directory page holds PAGE_SIZE / sizeof(*pd) - * framebuffer pages, and can thus map up to PAGE_SIZE * - * PAGE_SIZE / sizeof(*pd) bytes. With PAGE_SIZE == 4096 and - * sizeof(unsigned long) == 4/8, that's 4 Megs 32 bit and 2 Megs - * 64 bit. 256 directories give enough room for a 512 Meg - * framebuffer with a max resolution of 12,800x10,240. Should - * be enough for a while with room leftover for expansion. - */ - unsigned long pd[256]; -}; - -/* - * Wart: xenkbd needs to know default resolution. Put it here until a - * better solution is found, but don't leak it to the backend. - */ -#ifdef __KERNEL__ -#define XENFB_WIDTH 800 -#define XENFB_HEIGHT 600 -#define XENFB_DEPTH 32 -#endif - -#endif - -/* - * Local variables: - * mode: C - * c-file-style: "BSD" - * c-basic-offset: 4 - * tab-width: 4 - * indent-tabs-mode: nil - * End: - */ diff --git a/sys/xen/interface/io/fsif.h b/sys/xen/interface/io/fsif.h deleted file mode 100644 index a8bea193b5ad..000000000000 --- a/sys/xen/interface/io/fsif.h +++ /dev/null @@ -1,192 +0,0 @@ -/****************************************************************************** - * fsif.h - * - * Interface to FS level split device drivers. - * - * 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, Grzegorz Milos, . - */ - -#ifndef __XEN_PUBLIC_IO_FSIF_H__ -#define __XEN_PUBLIC_IO_FSIF_H__ - -#include "ring.h" -#include "../grant_table.h" - -#define REQ_FILE_OPEN 1 -#define REQ_FILE_CLOSE 2 -#define REQ_FILE_READ 3 -#define REQ_FILE_WRITE 4 -#define REQ_STAT 5 -#define REQ_FILE_TRUNCATE 6 -#define REQ_REMOVE 7 -#define REQ_RENAME 8 -#define REQ_CREATE 9 -#define REQ_DIR_LIST 10 -#define REQ_CHMOD 11 -#define REQ_FS_SPACE 12 -#define REQ_FILE_SYNC 13 - -struct fsif_open_request { - grant_ref_t gref; -}; - -struct fsif_close_request { - uint32_t fd; -}; - -struct fsif_read_request { - uint32_t fd; - int32_t pad; - uint64_t len; - uint64_t offset; - grant_ref_t grefs[1]; /* Variable length */ -}; - -struct fsif_write_request { - uint32_t fd; - int32_t pad; - uint64_t len; - uint64_t offset; - grant_ref_t grefs[1]; /* Variable length */ -}; - -struct fsif_stat_request { - uint32_t fd; -}; - -/* This structure is a copy of some fields from stat structure, returned - * via the ring. */ -struct fsif_stat_response { - int32_t stat_mode; - uint32_t stat_uid; - uint32_t stat_gid; - int32_t stat_ret; - int64_t stat_size; - int64_t stat_atime; - int64_t stat_mtime; - int64_t stat_ctime; -}; - -struct fsif_truncate_request { - uint32_t fd; - int32_t pad; - int64_t length; -}; - -struct fsif_remove_request { - grant_ref_t gref; -}; - -struct fsif_rename_request { - uint16_t old_name_offset; - uint16_t new_name_offset; - grant_ref_t gref; -}; - -struct fsif_create_request { - int8_t directory; - int8_t pad; - int16_t pad2; - int32_t mode; - grant_ref_t gref; -}; - -struct fsif_list_request { - uint32_t offset; - grant_ref_t gref; -}; - -#define NR_FILES_SHIFT 0 -#define NR_FILES_SIZE 16 /* 16 bits for the number of files mask */ -#define NR_FILES_MASK (((1ULL << NR_FILES_SIZE) - 1) << NR_FILES_SHIFT) -#define ERROR_SIZE 32 /* 32 bits for the error mask */ -#define ERROR_SHIFT (NR_FILES_SIZE + NR_FILES_SHIFT) -#define ERROR_MASK (((1ULL << ERROR_SIZE) - 1) << ERROR_SHIFT) -#define HAS_MORE_SHIFT (ERROR_SHIFT + ERROR_SIZE) -#define HAS_MORE_FLAG (1ULL << HAS_MORE_SHIFT) - -struct fsif_chmod_request { - uint32_t fd; - int32_t mode; -}; - -struct fsif_space_request { - grant_ref_t gref; -}; - -struct fsif_sync_request { - uint32_t fd; -}; - - -/* FS operation request */ -struct fsif_request { - uint8_t type; /* Type of the request */ - uint8_t pad; - uint16_t id; /* Request ID, copied to the response */ - uint32_t pad2; - union { - struct fsif_open_request fopen; - struct fsif_close_request fclose; - struct fsif_read_request fread; - struct fsif_write_request fwrite; - struct fsif_stat_request fstat; - struct fsif_truncate_request ftruncate; - struct fsif_remove_request fremove; - struct fsif_rename_request frename; - struct fsif_create_request fcreate; - struct fsif_list_request flist; - struct fsif_chmod_request fchmod; - struct fsif_space_request fspace; - struct fsif_sync_request fsync; - } u; -}; -typedef struct fsif_request fsif_request_t; - -/* FS operation response */ -struct fsif_response { - uint16_t id; - uint16_t pad1; - uint32_t pad2; - union { - uint64_t ret_val; - struct fsif_stat_response fstat; - } u; -}; - -typedef struct fsif_response fsif_response_t; - -#define FSIF_RING_ENTRY_SIZE 64 - -#define FSIF_NR_READ_GNTS ((FSIF_RING_ENTRY_SIZE - sizeof(struct fsif_read_request)) / \ - sizeof(grant_ref_t) + 1) -#define FSIF_NR_WRITE_GNTS ((FSIF_RING_ENTRY_SIZE - sizeof(struct fsif_write_request)) / \ - sizeof(grant_ref_t) + 1) - -DEFINE_RING_TYPES(fsif, struct fsif_request, struct fsif_response); - -#define STATE_INITIALISED "init" -#define STATE_READY "ready" -#define STATE_CLOSING "closing" -#define STATE_CLOSED "closed" - - -#endif diff --git a/sys/xen/interface/io/kbdif.h b/sys/xen/interface/io/kbdif.h deleted file mode 100644 index a6b01c52c79f..000000000000 --- a/sys/xen/interface/io/kbdif.h +++ /dev/null @@ -1,576 +0,0 @@ -/* - * kbdif.h -- Xen virtual keyboard/mouse - * - * 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 Anthony Liguori - * Copyright (C) 2006 Red Hat, Inc., Markus Armbruster - */ - -#ifndef __XEN_PUBLIC_IO_KBDIF_H__ -#define __XEN_PUBLIC_IO_KBDIF_H__ - -/* - ***************************************************************************** - * Feature and Parameter Negotiation - ***************************************************************************** - * - * The two halves of a para-virtual driver utilize nodes within - * XenStore to communicate capabilities and to negotiate operating parameters. - * This section enumerates these nodes which reside in the respective front and - * backend portions of XenStore, following XenBus convention. - * - * All data in XenStore is stored as strings. Nodes specifying numeric - * values are encoded in decimal. Integer value ranges listed below are - * expressed as fixed sized integer types capable of storing the conversion - * of a properly formated node string, without loss of information. - * - ***************************************************************************** - * Backend XenBus Nodes - ***************************************************************************** - * - *---------------------------- Features supported ---------------------------- - * - * Capable backend advertises supported features by publishing - * corresponding entries in XenStore and puts 1 as the value of the entry. - * If a feature is not supported then 0 must be set or feature entry omitted. - * - * feature-disable-keyboard - * Values: - * - * If there is no need to expose a virtual keyboard device by the - * frontend then this must be set to 1. - * - * feature-disable-pointer - * Values: - * - * If there is no need to expose a virtual pointer device by the - * frontend then this must be set to 1. - * - * feature-abs-pointer - * Values: - * - * Backends, which support reporting of absolute coordinates for pointer - * device should set this to 1. - * - * feature-multi-touch - * Values: - * - * Backends, which support reporting of multi-touch events - * should set this to 1. - * - * feature-raw-pointer - * Values: - * - * Backends, which support reporting raw (unscaled) absolute coordinates - * for pointer devices should set this to 1. Raw (unscaled) values have - * a range of [0, 0x7fff]. - * - *----------------------- Device Instance Parameters ------------------------ - * - * unique-id - * Values: - * - * After device instance initialization it is assigned a unique ID, - * so every instance of the frontend can be identified by the backend - * by this ID. This can be UUID or such. - * - *------------------------- Pointer Device Parameters ------------------------ - * - * width - * Values: - * - * Maximum X coordinate (width) to be used by the frontend - * while reporting input events, pixels, [0; UINT32_MAX]. - * - * height - * Values: - * - * Maximum Y coordinate (height) to be used by the frontend - * while reporting input events, pixels, [0; UINT32_MAX]. - * - *----------------------- Multi-touch Device Parameters ---------------------- - * - * multi-touch-num-contacts - * Values: - * - * Number of simultaneous touches reported. - * - * multi-touch-width - * Values: - * - * Width of the touch area to be used by the frontend - * while reporting input events, pixels, [0; UINT32_MAX]. - * - * multi-touch-height - * Values: - * - * Height of the touch area to be used by the frontend - * while reporting input events, pixels, [0; UINT32_MAX]. - * - ***************************************************************************** - * Frontend XenBus Nodes - ***************************************************************************** - * - *------------------------------ Feature request ----------------------------- - * - * Capable frontend requests features from backend via setting corresponding - * entries to 1 in XenStore. Requests for features not advertised as supported - * by the backend have no effect. - * - * request-abs-pointer - * Values: - * - * Request backend to report absolute pointer coordinates - * (XENKBD_TYPE_POS) instead of relative ones (XENKBD_TYPE_MOTION). - * - * request-multi-touch - * Values: - * - * Request backend to report multi-touch events. - * - * request-raw-pointer - * Values: - * - * Request backend to report raw unscaled absolute pointer coordinates. - * This option is only valid if request-abs-pointer is also set. - * Raw unscaled coordinates have the range [0, 0x7fff] - * - *----------------------- Request Transport Parameters ----------------------- - * - * event-channel - * Values: - * - * The identifier of the Xen event channel used to signal activity - * in the ring buffer. - * - * page-gref - * Values: - * - * The Xen grant reference granting permission for the backend to map - * a sole page in a single page sized event ring buffer. - * - * page-ref - * Values: - * - * OBSOLETE, not recommended for use. - * PFN of the shared page. - */ - -/* - * EVENT CODES. - */ - -#define XENKBD_TYPE_MOTION 1 -#define XENKBD_TYPE_RESERVED 2 -#define XENKBD_TYPE_KEY 3 -#define XENKBD_TYPE_POS 4 -#define XENKBD_TYPE_MTOUCH 5 - -/* Multi-touch event sub-codes */ - -#define XENKBD_MT_EV_DOWN 0 -#define XENKBD_MT_EV_UP 1 -#define XENKBD_MT_EV_MOTION 2 -#define XENKBD_MT_EV_SYN 3 -#define XENKBD_MT_EV_SHAPE 4 -#define XENKBD_MT_EV_ORIENT 5 - -/* - * CONSTANTS, XENSTORE FIELD AND PATH NAME STRINGS, HELPERS. - */ - -#define XENKBD_DRIVER_NAME "vkbd" - -#define XENKBD_FIELD_FEAT_DSBL_KEYBRD "feature-disable-keyboard" -#define XENKBD_FIELD_FEAT_DSBL_POINTER "feature-disable-pointer" -#define XENKBD_FIELD_FEAT_ABS_POINTER "feature-abs-pointer" -#define XENKBD_FIELD_FEAT_RAW_POINTER "feature-raw-pointer" -#define XENKBD_FIELD_FEAT_MTOUCH "feature-multi-touch" -#define XENKBD_FIELD_REQ_ABS_POINTER "request-abs-pointer" -#define XENKBD_FIELD_REQ_RAW_POINTER "request-raw-pointer" -#define XENKBD_FIELD_REQ_MTOUCH "request-multi-touch" -#define XENKBD_FIELD_RING_GREF "page-gref" -#define XENKBD_FIELD_EVT_CHANNEL "event-channel" -#define XENKBD_FIELD_WIDTH "width" -#define XENKBD_FIELD_HEIGHT "height" -#define XENKBD_FIELD_MT_WIDTH "multi-touch-width" -#define XENKBD_FIELD_MT_HEIGHT "multi-touch-height" -#define XENKBD_FIELD_MT_NUM_CONTACTS "multi-touch-num-contacts" -#define XENKBD_FIELD_UNIQUE_ID "unique-id" - -/* OBSOLETE, not recommended for use */ -#define XENKBD_FIELD_RING_REF "page-ref" - -/* - ***************************************************************************** - * Description of the protocol between frontend and backend driver. - ***************************************************************************** - * - * The two halves of a Para-virtual driver communicate with - * each other using a shared page and an event channel. - * Shared page contains a ring with event structures. - * - * All reserved fields in the structures below must be 0. - * - ***************************************************************************** - * Backend to frontend events - ***************************************************************************** - * - * Frontends should ignore unknown in events. - * All event packets have the same length (40 octets) - * All event packets have common header: - * - * 0 octet - * +-----------------+ - * | type | - * +-----------------+ - * type - uint8_t, event code, XENKBD_TYPE_??? - * - * - * Pointer relative movement event - * 0 1 2 3 octet - * +----------------+----------------+----------------+----------------+ - * | _TYPE_MOTION | reserved | 4 - * +----------------+----------------+----------------+----------------+ - * | rel_x | 8 - * +----------------+----------------+----------------+----------------+ - * | rel_y | 12 - * +----------------+----------------+----------------+----------------+ - * | rel_z | 16 - * +----------------+----------------+----------------+----------------+ - * | reserved | 20 - * +----------------+----------------+----------------+----------------+ - * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| - * +----------------+----------------+----------------+----------------+ - * | reserved | 40 - * +----------------+----------------+----------------+----------------+ - * - * rel_x - int32_t, relative X motion - * rel_y - int32_t, relative Y motion - * rel_z - int32_t, relative Z motion (wheel) - */ - -struct xenkbd_motion -{ - uint8_t type; - int32_t rel_x; - int32_t rel_y; - int32_t rel_z; -}; - -/* - * Key event (includes pointer buttons) - * 0 1 2 3 octet - * +----------------+----------------+----------------+----------------+ - * | _TYPE_KEY | pressed | reserved | 4 - * +----------------+----------------+----------------+----------------+ - * | keycode | 8 - * +----------------+----------------+----------------+----------------+ - * | reserved | 12 - * +----------------+----------------+----------------+----------------+ - * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| - * +----------------+----------------+----------------+----------------+ - * | reserved | 40 - * +----------------+----------------+----------------+----------------+ - * - * pressed - uint8_t, 1 if pressed; 0 otherwise - * keycode - uint32_t, KEY_* from linux/input.h - */ - -struct xenkbd_key -{ - uint8_t type; - uint8_t pressed; - uint32_t keycode; -}; - -/* - * Pointer absolute position event - * 0 1 2 3 octet - * +----------------+----------------+----------------+----------------+ - * | _TYPE_POS | reserved | 4 - * +----------------+----------------+----------------+----------------+ - * | abs_x | 8 - * +----------------+----------------+----------------+----------------+ - * | abs_y | 12 - * +----------------+----------------+----------------+----------------+ - * | rel_z | 16 - * +----------------+----------------+----------------+----------------+ - * | reserved | 20 - * +----------------+----------------+----------------+----------------+ - * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| - * +----------------+----------------+----------------+----------------+ - * | reserved | 40 - * +----------------+----------------+----------------+----------------+ - * - * abs_x - int32_t, absolute X position (in FB pixels) - * abs_y - int32_t, absolute Y position (in FB pixels) - * rel_z - int32_t, relative Z motion (wheel) - */ - -struct xenkbd_position -{ - uint8_t type; - int32_t abs_x; - int32_t abs_y; - int32_t rel_z; -}; - -/* - * Multi-touch event and its sub-types - * - * All multi-touch event packets have common header: - * - * 0 1 2 3 octet - * +----------------+----------------+----------------+----------------+ - * | _TYPE_MTOUCH | event_type | contact_id | reserved | 4 - * +----------------+----------------+----------------+----------------+ - * | reserved | 8 - * +----------------+----------------+----------------+----------------+ - * - * event_type - unt8_t, multi-touch event sub-type, XENKBD_MT_EV_??? - * contact_id - unt8_t, ID of the contact - * - * Touch interactions can consist of one or more contacts. - * For each contact, a series of events is generated, starting - * with a down event, followed by zero or more motion events, - * and ending with an up event. Events relating to the same - * contact point can be identified by the ID of the sequence: contact ID. - * Contact ID may be reused after XENKBD_MT_EV_UP event and - * is in the [0; XENKBD_FIELD_NUM_CONTACTS - 1] range. - * - * For further information please refer to documentation on Wayland [1], - * Linux [2] and Windows [3] multi-touch support. - * - * [1] https://cgit.freedesktop.org/wayland/wayland/tree/protocol/wayland.xml - * [2] https://www.kernel.org/doc/Documentation/input/multi-touch-protocol.txt - * [3] https://msdn.microsoft.com/en-us/library/jj151564(v=vs.85).aspx - * - * - * Multi-touch down event - sent when a new touch is made: touch is assigned - * a unique contact ID, sent with this and consequent events related - * to this touch. - * 0 1 2 3 octet - * +----------------+----------------+----------------+----------------+ - * | _TYPE_MTOUCH | _MT_EV_DOWN | contact_id | reserved | 4 - * +----------------+----------------+----------------+----------------+ - * | reserved | 8 - * +----------------+----------------+----------------+----------------+ - * | abs_x | 12 - * +----------------+----------------+----------------+----------------+ - * | abs_y | 16 - * +----------------+----------------+----------------+----------------+ - * | reserved | 20 - * +----------------+----------------+----------------+----------------+ - * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| - * +----------------+----------------+----------------+----------------+ - * | reserved | 40 - * +----------------+----------------+----------------+----------------+ - * - * abs_x - int32_t, absolute X position, in pixels - * abs_y - int32_t, absolute Y position, in pixels - * - * Multi-touch contact release event - * 0 1 2 3 octet - * +----------------+----------------+----------------+----------------+ - * | _TYPE_MTOUCH | _MT_EV_UP | contact_id | reserved | 4 - * +----------------+----------------+----------------+----------------+ - * | reserved | 8 - * +----------------+----------------+----------------+----------------+ - * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| - * +----------------+----------------+----------------+----------------+ - * | reserved | 40 - * +----------------+----------------+----------------+----------------+ - * - * Multi-touch motion event - * 0 1 2 3 octet - * +----------------+----------------+----------------+----------------+ - * | _TYPE_MTOUCH | _MT_EV_MOTION | contact_id | reserved | 4 - * +----------------+----------------+----------------+----------------+ - * | reserved | 8 - * +----------------+----------------+----------------+----------------+ - * | abs_x | 12 - * +----------------+----------------+----------------+----------------+ - * | abs_y | 16 - * +----------------+----------------+----------------+----------------+ - * | reserved | 20 - * +----------------+----------------+----------------+----------------+ - * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| - * +----------------+----------------+----------------+----------------+ - * | reserved | 40 - * +----------------+----------------+----------------+----------------+ - * - * abs_x - int32_t, absolute X position, in pixels, - * abs_y - int32_t, absolute Y position, in pixels, - * - * Multi-touch input synchronization event - shows end of a set of events - * which logically belong together. - * 0 1 2 3 octet - * +----------------+----------------+----------------+----------------+ - * | _TYPE_MTOUCH | _MT_EV_SYN | contact_id | reserved | 4 - * +----------------+----------------+----------------+----------------+ - * | reserved | 8 - * +----------------+----------------+----------------+----------------+ - * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| - * +----------------+----------------+----------------+----------------+ - * | reserved | 40 - * +----------------+----------------+----------------+----------------+ - * - * Multi-touch shape event - touch point's shape has changed its shape. - * Shape is approximated by an ellipse through the major and minor axis - * lengths: major is the longer diameter of the ellipse and minor is the - * shorter one. Center of the ellipse is reported via - * XENKBD_MT_EV_DOWN/XENKBD_MT_EV_MOTION events. - * 0 1 2 3 octet - * +----------------+----------------+----------------+----------------+ - * | _TYPE_MTOUCH | _MT_EV_SHAPE | contact_id | reserved | 4 - * +----------------+----------------+----------------+----------------+ - * | reserved | 8 - * +----------------+----------------+----------------+----------------+ - * | major | 12 - * +----------------+----------------+----------------+----------------+ - * | minor | 16 - * +----------------+----------------+----------------+----------------+ - * | reserved | 20 - * +----------------+----------------+----------------+----------------+ - * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| - * +----------------+----------------+----------------+----------------+ - * | reserved | 40 - * +----------------+----------------+----------------+----------------+ - * - * major - unt32_t, length of the major axis, pixels - * minor - unt32_t, length of the minor axis, pixels - * - * Multi-touch orientation event - touch point's shape has changed - * its orientation: calculated as a clockwise angle between the major axis - * of the ellipse and positive Y axis in degrees, [-180; +180]. - * 0 1 2 3 octet - * +----------------+----------------+----------------+----------------+ - * | _TYPE_MTOUCH | _MT_EV_ORIENT | contact_id | reserved | 4 - * +----------------+----------------+----------------+----------------+ - * | reserved | 8 - * +----------------+----------------+----------------+----------------+ - * | orientation | reserved | 12 - * +----------------+----------------+----------------+----------------+ - * | reserved | 16 - * +----------------+----------------+----------------+----------------+ - * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| - * +----------------+----------------+----------------+----------------+ - * | reserved | 40 - * +----------------+----------------+----------------+----------------+ - * - * orientation - int16_t, clockwise angle of the major axis - */ - -struct xenkbd_mtouch { - uint8_t type; /* XENKBD_TYPE_MTOUCH */ - uint8_t event_type; /* XENKBD_MT_EV_??? */ - uint8_t contact_id; - uint8_t reserved[5]; /* reserved for the future use */ - union { - struct { - int32_t abs_x; /* absolute X position, pixels */ - int32_t abs_y; /* absolute Y position, pixels */ - } pos; - struct { - uint32_t major; /* length of the major axis, pixels */ - uint32_t minor; /* length of the minor axis, pixels */ - } shape; - int16_t orientation; /* clockwise angle of the major axis */ - } u; -}; - -#define XENKBD_IN_EVENT_SIZE 40 - -union xenkbd_in_event -{ - uint8_t type; - struct xenkbd_motion motion; - struct xenkbd_key key; - struct xenkbd_position pos; - struct xenkbd_mtouch mtouch; - char pad[XENKBD_IN_EVENT_SIZE]; -}; - -/* - ***************************************************************************** - * Frontend to backend events - ***************************************************************************** - * - * Out events may be sent only when requested by backend, and receipt - * of an unknown out event is an error. - * No out events currently defined. - - * All event packets have the same length (40 octets) - * All event packets have common header: - * 0 octet - * +-----------------+ - * | type | - * +-----------------+ - * type - uint8_t, event code - */ - -#define XENKBD_OUT_EVENT_SIZE 40 - -union xenkbd_out_event -{ - uint8_t type; - char pad[XENKBD_OUT_EVENT_SIZE]; -}; - -/* - ***************************************************************************** - * Shared page - ***************************************************************************** - */ - -#define XENKBD_IN_RING_SIZE 2048 -#define XENKBD_IN_RING_LEN (XENKBD_IN_RING_SIZE / XENKBD_IN_EVENT_SIZE) -#define XENKBD_IN_RING_OFFS 1024 -#define XENKBD_IN_RING(page) \ - ((union xenkbd_in_event *)((char *)(page) + XENKBD_IN_RING_OFFS)) -#define XENKBD_IN_RING_REF(page, idx) \ - (XENKBD_IN_RING((page))[(idx) % XENKBD_IN_RING_LEN]) - -#define XENKBD_OUT_RING_SIZE 1024 -#define XENKBD_OUT_RING_LEN (XENKBD_OUT_RING_SIZE / XENKBD_OUT_EVENT_SIZE) -#define XENKBD_OUT_RING_OFFS (XENKBD_IN_RING_OFFS + XENKBD_IN_RING_SIZE) -#define XENKBD_OUT_RING(page) \ - ((union xenkbd_out_event *)((char *)(page) + XENKBD_OUT_RING_OFFS)) -#define XENKBD_OUT_RING_REF(page, idx) \ - (XENKBD_OUT_RING((page))[(idx) % XENKBD_OUT_RING_LEN]) - -struct xenkbd_page -{ - uint32_t in_cons, in_prod; - uint32_t out_cons, out_prod; -}; - -#endif /* __XEN_PUBLIC_IO_KBDIF_H__ */ - -/* - * Local variables: - * mode: C - * c-file-style: "BSD" - * c-basic-offset: 4 - * tab-width: 4 - * indent-tabs-mode: nil - * End: - */ diff --git a/sys/xen/interface/io/libxenvchan.h b/sys/xen/interface/io/libxenvchan.h deleted file mode 100644 index 44284f437ab3..000000000000 --- a/sys/xen/interface/io/libxenvchan.h +++ /dev/null @@ -1,101 +0,0 @@ -/** - * @file - * @section AUTHORS - * - * Copyright (C) 2010 Rafal Wojtczuk - * - * Authors: - * Rafal Wojtczuk - * Daniel De Graaf - * - * @section LICENSE - * - * 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. - * - * @section DESCRIPTION - * - * Originally borrowed from the Qubes OS Project, http://www.qubes-os.org, - * this code has been substantially rewritten to use the gntdev and gntalloc - * devices instead of raw MFNs and map_foreign_range. - * - * This is a library for inter-domain communication. A standard Xen ring - * buffer is used, with a datagram-based interface built on top. The grant - * reference and event channels are shared in XenStore under a user-specified - * path. - * - * The ring.h macros define an asymmetric interface to a shared data structure - * that assumes all rings reside in a single contiguous memory space. This is - * not suitable for vchan because the interface to the ring is symmetric except - * for the setup. Unlike the producer-consumer rings defined in ring.h, the - * size of the rings used in vchan are determined at execution time instead of - * compile time, so the macros in ring.h cannot be used to access the rings. - */ - -#include -#include - -struct ring_shared { - uint32_t cons, prod; -}; - -#define VCHAN_NOTIFY_WRITE 0x1 -#define VCHAN_NOTIFY_READ 0x2 - -/** - * vchan_interface: primary shared data structure - */ -struct vchan_interface { - /** - * Standard consumer/producer interface, one pair per buffer - * left is client write, server read - * right is client read, server write - */ - struct ring_shared left, right; - /** - * size of the rings, which determines their location - * 10 - at offset 1024 in ring's page - * 11 - at offset 2048 in ring's page - * 12+ - uses 2^(N-12) grants to describe the multi-page ring - * These should remain constant once the page is shared. - * Only one of the two orders can be 10 (or 11). - */ - uint16_t left_order, right_order; - /** - * Shutdown detection: - * 0: client (or server) has exited - * 1: client (or server) is connected - * 2: client has not yet connected - */ - uint8_t cli_live, srv_live; - /** - * Notification bits: - * VCHAN_NOTIFY_WRITE: send notify when data is written - * VCHAN_NOTIFY_READ: send notify when data is read (consumed) - * cli_notify is used for the client to inform the server of its action - */ - uint8_t cli_notify, srv_notify; - /** - * Grant list: ordering is left, right. Must not extend into actual ring - * or grow beyond the end of the initial shared page. - * These should remain constant once the page is shared, to allow - * for possible remapping by a client that restarts. - */ - uint32_t grants[0]; -}; - diff --git a/sys/xen/interface/io/netif.h b/sys/xen/interface/io/netif.h deleted file mode 100644 index 9fcf91a2fe35..000000000000 --- a/sys/xen/interface/io/netif.h +++ /dev/null @@ -1,1090 +0,0 @@ -/****************************************************************************** - * netif.h - * - * Unified network-device I/O interface for Xen guest OSes. - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to - * deal in the Software without restriction, including without limitation the - * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or - * sell copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - * - * Copyright (c) 2003-2004, Keir Fraser - */ - -#ifndef __XEN_PUBLIC_IO_NETIF_H__ -#define __XEN_PUBLIC_IO_NETIF_H__ - -#include "ring.h" -#include "../grant_table.h" - -/* - * Older implementation of Xen network frontend / backend has an - * implicit dependency on the MAX_SKB_FRAGS as the maximum number of - * ring slots a skb can use. Netfront / netback may not work as - * expected when frontend and backend have different MAX_SKB_FRAGS. - * - * A better approach is to add mechanism for netfront / netback to - * negotiate this value. However we cannot fix all possible - * frontends, so we need to define a value which states the minimum - * slots backend must support. - * - * The minimum value derives from older Linux kernel's MAX_SKB_FRAGS - * (18), which is proved to work with most frontends. Any new backend - * which doesn't negotiate with frontend should expect frontend to - * send a valid packet using slots up to this value. - */ -#define XEN_NETIF_NR_SLOTS_MIN 18 - -/* - * Notifications after enqueuing any type of message should be conditional on - * the appropriate req_event or rsp_event field in the shared ring. - * If the client sends notification for rx requests then it should specify - * feature 'feature-rx-notify' via xenbus. Otherwise the backend will assume - * that it cannot safely queue packets (as it may not be kicked to send them). - */ - -/* - * "feature-split-event-channels" is introduced to separate guest TX - * and RX notification. Backend either doesn't support this feature or - * advertises it via xenstore as 0 (disabled) or 1 (enabled). - * - * To make use of this feature, frontend should allocate two event - * channels for TX and RX, advertise them to backend as - * "event-channel-tx" and "event-channel-rx" respectively. If frontend - * doesn't want to use this feature, it just writes "event-channel" - * node as before. - */ - -/* - * Multiple transmit and receive queues: - * If supported, the backend will write the key "multi-queue-max-queues" to - * the directory for that vif, and set its value to the maximum supported - * number of queues. - * Frontends that are aware of this feature and wish to use it can write the - * key "multi-queue-num-queues", set to the number they wish to use, which - * must be greater than zero, and no more than the value reported by the backend - * in "multi-queue-max-queues". - * - * Queues replicate the shared rings and event channels. - * "feature-split-event-channels" may optionally be used when using - * multiple queues, but is not mandatory. - * - * Each queue consists of one shared ring pair, i.e. there must be the same - * number of tx and rx rings. - * - * For frontends requesting just one queue, the usual event-channel and - * ring-ref keys are written as before, simplifying the backend processing - * to avoid distinguishing between a frontend that doesn't understand the - * multi-queue feature, and one that does, but requested only one queue. - * - * Frontends requesting two or more queues must not write the toplevel - * event-channel (or event-channel-{tx,rx}) and {tx,rx}-ring-ref keys, - * instead writing those keys under sub-keys having the name "queue-N" where - * N is the integer ID of the queue for which those keys belong. Queues - * are indexed from zero. For example, a frontend with two queues and split - * event channels must write the following set of queue-related keys: - * - * /local/domain/1/device/vif/0/multi-queue-num-queues = "2" - * /local/domain/1/device/vif/0/queue-0 = "" - * /local/domain/1/device/vif/0/queue-0/tx-ring-ref = "" - * /local/domain/1/device/vif/0/queue-0/rx-ring-ref = "" - * /local/domain/1/device/vif/0/queue-0/event-channel-tx = "" - * /local/domain/1/device/vif/0/queue-0/event-channel-rx = "" - * /local/domain/1/device/vif/0/queue-1 = "" - * /local/domain/1/device/vif/0/queue-1/tx-ring-ref = "" - * /local/domain/1/device/vif/0/queue-1/rx-ring-ref = "//feature-ctrl-ring = "1" - * - * The frontend provides a control ring to the backend by setting: - * - * /local/domain//device/vif//ctrl-ring-ref = - * /local/domain//device/vif//event-channel-ctrl = - * - * where is the grant reference of the shared page used to - * implement the control ring and is an event channel to be used - * as a mailbox interrupt. These keys must be set before the frontend - * moves into the connected state. - * - * The control ring uses a fixed request/response message size and is - * balanced (i.e. one request to one response), so operationally it is much - * the same as a transmit or receive ring. - * Note that there is no requirement that responses are issued in the same - * order as requests. - */ - -/* - * Link state - * ========== - * - * The backend can advertise its current link (carrier) state to the - * frontend using the /local/domain/X/backend/vif///carrier - * node. If this node is not present, then the frontend should assume that - * the link is up (for compatibility with backends that do not implement - * this feature). If this node is present, then a value of "0" should be - * interpreted by the frontend as the link being down (no carrier) and a - * value of "1" should be interpreted as the link being up (carrier - * present). - */ - -/* - * Hash types - * ========== - * - * For the purposes of the definitions below, 'Packet[]' is an array of - * octets containing an IP packet without options, 'Array[X..Y]' means a - * sub-array of 'Array' containing bytes X thru Y inclusive, and '+' is - * used to indicate concatenation of arrays. - */ - -/* - * A hash calculated over an IP version 4 header as follows: - * - * Buffer[0..8] = Packet[12..15] (source address) + - * Packet[16..19] (destination address) - * - * Result = Hash(Buffer, 8) - */ -#define _XEN_NETIF_CTRL_HASH_TYPE_IPV4 0 -#define XEN_NETIF_CTRL_HASH_TYPE_IPV4 \ - (1 << _XEN_NETIF_CTRL_HASH_TYPE_IPV4) - -/* - * A hash calculated over an IP version 4 header and TCP header as - * follows: - * - * Buffer[0..12] = Packet[12..15] (source address) + - * Packet[16..19] (destination address) + - * Packet[20..21] (source port) + - * Packet[22..23] (destination port) - * - * Result = Hash(Buffer, 12) - */ -#define _XEN_NETIF_CTRL_HASH_TYPE_IPV4_TCP 1 -#define XEN_NETIF_CTRL_HASH_TYPE_IPV4_TCP \ - (1 << _XEN_NETIF_CTRL_HASH_TYPE_IPV4_TCP) - -/* - * A hash calculated over an IP version 6 header as follows: - * - * Buffer[0..32] = Packet[8..23] (source address ) + - * Packet[24..39] (destination address) - * - * Result = Hash(Buffer, 32) - */ -#define _XEN_NETIF_CTRL_HASH_TYPE_IPV6 2 -#define XEN_NETIF_CTRL_HASH_TYPE_IPV6 \ - (1 << _XEN_NETIF_CTRL_HASH_TYPE_IPV6) - -/* - * A hash calculated over an IP version 6 header and TCP header as - * follows: - * - * Buffer[0..36] = Packet[8..23] (source address) + - * Packet[24..39] (destination address) + - * Packet[40..41] (source port) + - * Packet[42..43] (destination port) - * - * Result = Hash(Buffer, 36) - */ -#define _XEN_NETIF_CTRL_HASH_TYPE_IPV6_TCP 3 -#define XEN_NETIF_CTRL_HASH_TYPE_IPV6_TCP \ - (1 << _XEN_NETIF_CTRL_HASH_TYPE_IPV6_TCP) - -/* - * Hash algorithms - * =============== - */ - -#define XEN_NETIF_CTRL_HASH_ALGORITHM_NONE 0 - -/* - * Toeplitz hash: - */ - -#define XEN_NETIF_CTRL_HASH_ALGORITHM_TOEPLITZ 1 - -/* - * This algorithm uses a 'key' as well as the data buffer itself. - * (Buffer[] and Key[] are treated as shift-registers where the MSB of - * Buffer/Key[0] is considered 'left-most' and the LSB of Buffer/Key[N-1] - * is the 'right-most'). - * - * Value = 0 - * For number of bits in Buffer[] - * If (left-most bit of Buffer[] is 1) - * Value ^= left-most 32 bits of Key[] - * Key[] << 1 - * Buffer[] << 1 - * - * The code below is provided for convenience where an operating system - * does not already provide an implementation. - */ -#ifdef XEN_NETIF_DEFINE_TOEPLITZ -static uint32_t xen_netif_toeplitz_hash(const uint8_t *key, - unsigned int keylen, - const uint8_t *buf, - unsigned int buflen) -{ - unsigned int keyi, bufi; - uint64_t prefix = 0; - uint64_t hash = 0; - - /* Pre-load prefix with the first 8 bytes of the key */ - for (keyi = 0; keyi < 8; keyi++) { - prefix <<= 8; - prefix |= (keyi < keylen) ? key[keyi] : 0; - } - - for (bufi = 0; bufi < buflen; bufi++) { - uint8_t byte = buf[bufi]; - unsigned int bit; - - for (bit = 0; bit < 8; bit++) { - if (byte & 0x80) - hash ^= prefix; - prefix <<= 1; - byte <<=1; - } - - /* - * 'prefix' has now been left-shifted by 8, so - * OR in the next byte. - */ - prefix |= (keyi < keylen) ? key[keyi] : 0; - keyi++; - } - - /* The valid part of the hash is in the upper 32 bits. */ - return hash >> 32; -} -#endif /* XEN_NETIF_DEFINE_TOEPLITZ */ - -/* - * Control requests (struct xen_netif_ctrl_request) - * ================================================ - * - * All requests have the following format: - * - * 0 1 2 3 4 5 6 7 octet - * +-----+-----+-----+-----+-----+-----+-----+-----+ - * | id | type | data[0] | - * +-----+-----+-----+-----+-----+-----+-----+-----+ - * | data[1] | data[2] | - * +-----+-----+-----+-----+-----------------------+ - * - * id: the request identifier, echoed in response. - * type: the type of request (see below) - * data[]: any data associated with the request (determined by type) - */ - -struct xen_netif_ctrl_request { - uint16_t id; - uint16_t type; - -#define XEN_NETIF_CTRL_TYPE_INVALID 0 -#define XEN_NETIF_CTRL_TYPE_GET_HASH_FLAGS 1 -#define XEN_NETIF_CTRL_TYPE_SET_HASH_FLAGS 2 -#define XEN_NETIF_CTRL_TYPE_SET_HASH_KEY 3 -#define XEN_NETIF_CTRL_TYPE_GET_HASH_MAPPING_SIZE 4 -#define XEN_NETIF_CTRL_TYPE_SET_HASH_MAPPING_SIZE 5 -#define XEN_NETIF_CTRL_TYPE_SET_HASH_MAPPING 6 -#define XEN_NETIF_CTRL_TYPE_SET_HASH_ALGORITHM 7 -#define XEN_NETIF_CTRL_TYPE_GET_GREF_MAPPING_SIZE 8 -#define XEN_NETIF_CTRL_TYPE_ADD_GREF_MAPPING 9 -#define XEN_NETIF_CTRL_TYPE_DEL_GREF_MAPPING 10 - - uint32_t data[3]; -}; - -/* - * Control responses (struct xen_netif_ctrl_response) - * ================================================== - * - * All responses have the following format: - * - * 0 1 2 3 4 5 6 7 octet - * +-----+-----+-----+-----+-----+-----+-----+-----+ - * | id | type | status | - * +-----+-----+-----+-----+-----+-----+-----+-----+ - * | data | - * +-----+-----+-----+-----+ - * - * id: the corresponding request identifier - * type: the type of the corresponding request - * status: the status of request processing - * data: any data associated with the response (determined by type and - * status) - */ - -struct xen_netif_ctrl_response { - uint16_t id; - uint16_t type; - uint32_t status; - -#define XEN_NETIF_CTRL_STATUS_SUCCESS 0 -#define XEN_NETIF_CTRL_STATUS_NOT_SUPPORTED 1 -#define XEN_NETIF_CTRL_STATUS_INVALID_PARAMETER 2 -#define XEN_NETIF_CTRL_STATUS_BUFFER_OVERFLOW 3 - - uint32_t data; -}; - -/* - * Static Grants (struct xen_netif_gref) - * ===================================== - * - * A frontend may provide a fixed set of grant references to be mapped on - * the backend. The message of type XEN_NETIF_CTRL_TYPE_ADD_GREF_MAPPING - * prior its usage in the command ring allows for creation of these mappings. - * The backend will maintain a fixed amount of these mappings. - * - * XEN_NETIF_CTRL_TYPE_GET_GREF_MAPPING_SIZE lets a frontend query how many - * of these mappings can be kept. - * - * Each entry in the XEN_NETIF_CTRL_TYPE_{ADD,DEL}_GREF_MAPPING input table has - * the following format: - * - * 0 1 2 3 4 5 6 7 octet - * +-----+-----+-----+-----+-----+-----+-----+-----+ - * | grant ref | flags | status | - * +-----+-----+-----+-----+-----+-----+-----+-----+ - * - * grant ref: grant reference (IN) - * flags: flags describing the control operation (IN) - * status: XEN_NETIF_CTRL_STATUS_* (OUT) - * - * 'status' is an output parameter which does not require to be set to zero - * prior to its usage in the corresponding control messages. - */ - -struct xen_netif_gref { - grant_ref_t ref; - uint16_t flags; - -#define _XEN_NETIF_CTRLF_GREF_readonly 0 -#define XEN_NETIF_CTRLF_GREF_readonly (1U<<_XEN_NETIF_CTRLF_GREF_readonly) - - uint16_t status; -}; - -/* - * Control messages - * ================ - * - * XEN_NETIF_CTRL_TYPE_SET_HASH_ALGORITHM - * -------------------------------------- - * - * This is sent by the frontend to set the desired hash algorithm. - * - * Request: - * - * type = XEN_NETIF_CTRL_TYPE_SET_HASH_ALGORITHM - * data[0] = a XEN_NETIF_CTRL_HASH_ALGORITHM_* value - * data[1] = 0 - * data[2] = 0 - * - * Response: - * - * status = XEN_NETIF_CTRL_STATUS_NOT_SUPPORTED - Operation not - * supported - * XEN_NETIF_CTRL_STATUS_INVALID_PARAMETER - The algorithm is not - * supported - * XEN_NETIF_CTRL_STATUS_SUCCESS - Operation successful - * - * NOTE: Setting data[0] to XEN_NETIF_CTRL_HASH_ALGORITHM_NONE disables - * hashing and the backend is free to choose how it steers packets - * to queues (which is the default behaviour). - * - * XEN_NETIF_CTRL_TYPE_GET_HASH_FLAGS - * ---------------------------------- - * - * This is sent by the frontend to query the types of hash supported by - * the backend. - * - * Request: - * - * type = XEN_NETIF_CTRL_TYPE_GET_HASH_FLAGS - * data[0] = 0 - * data[1] = 0 - * data[2] = 0 - * - * Response: - * - * status = XEN_NETIF_CTRL_STATUS_NOT_SUPPORTED - Operation not supported - * XEN_NETIF_CTRL_STATUS_SUCCESS - Operation successful - * data = supported hash types (if operation was successful) - * - * NOTE: A valid hash algorithm must be selected before this operation can - * succeed. - * - * XEN_NETIF_CTRL_TYPE_SET_HASH_FLAGS - * ---------------------------------- - * - * This is sent by the frontend to set the types of hash that the backend - * should calculate. (See above for hash type definitions). - * Note that the 'maximal' type of hash should always be chosen. For - * example, if the frontend sets both IPV4 and IPV4_TCP hash types then - * the latter hash type should be calculated for any TCP packet and the - * former only calculated for non-TCP packets. - * - * Request: - * - * type = XEN_NETIF_CTRL_TYPE_SET_HASH_FLAGS - * data[0] = bitwise OR of XEN_NETIF_CTRL_HASH_TYPE_* values - * data[1] = 0 - * data[2] = 0 - * - * Response: - * - * status = XEN_NETIF_CTRL_STATUS_NOT_SUPPORTED - Operation not - * supported - * XEN_NETIF_CTRL_STATUS_INVALID_PARAMETER - One or more flag - * value is invalid or - * unsupported - * XEN_NETIF_CTRL_STATUS_SUCCESS - Operation successful - * data = 0 - * - * NOTE: A valid hash algorithm must be selected before this operation can - * succeed. - * Also, setting data[0] to zero disables hashing and the backend - * is free to choose how it steers packets to queues. - * - * XEN_NETIF_CTRL_TYPE_SET_HASH_KEY - * -------------------------------- - * - * This is sent by the frontend to set the key of the hash if the algorithm - * requires it. (See hash algorithms above). - * - * Request: - * - * type = XEN_NETIF_CTRL_TYPE_SET_HASH_KEY - * data[0] = grant reference of page containing the key (assumed to - * start at beginning of grant) - * data[1] = size of key in octets - * data[2] = 0 - * - * Response: - * - * status = XEN_NETIF_CTRL_STATUS_NOT_SUPPORTED - Operation not - * supported - * XEN_NETIF_CTRL_STATUS_INVALID_PARAMETER - Key size is invalid - * XEN_NETIF_CTRL_STATUS_BUFFER_OVERFLOW - Key size is larger - * than the backend - * supports - * XEN_NETIF_CTRL_STATUS_SUCCESS - Operation successful - * data = 0 - * - * NOTE: Any key octets not specified are assumed to be zero (the key - * is assumed to be empty by default) and specifying a new key - * invalidates any previous key, hence specifying a key size of - * zero will clear the key (which ensures that the calculated hash - * will always be zero). - * The maximum size of key is algorithm and backend specific, but - * is also limited by the single grant reference. - * The grant reference may be read-only and must remain valid until - * the response has been processed. - * - * XEN_NETIF_CTRL_TYPE_GET_HASH_MAPPING_SIZE - * ----------------------------------------- - * - * This is sent by the frontend to query the maximum size of mapping - * table supported by the backend. The size is specified in terms of - * table entries. - * - * Request: - * - * type = XEN_NETIF_CTRL_TYPE_GET_HASH_MAPPING_SIZE - * data[0] = 0 - * data[1] = 0 - * data[2] = 0 - * - * Response: - * - * status = XEN_NETIF_CTRL_STATUS_NOT_SUPPORTED - Operation not supported - * XEN_NETIF_CTRL_STATUS_SUCCESS - Operation successful - * data = maximum number of entries allowed in the mapping table - * (if operation was successful) or zero if a mapping table is - * not supported (i.e. hash mapping is done only by modular - * arithmetic). - * - * XEN_NETIF_CTRL_TYPE_SET_HASH_MAPPING_SIZE - * ------------------------------------- - * - * This is sent by the frontend to set the actual size of the mapping - * table to be used by the backend. The size is specified in terms of - * table entries. - * Any previous table is invalidated by this message and any new table - * is assumed to be zero filled. - * - * Request: - * - * type = XEN_NETIF_CTRL_TYPE_SET_HASH_MAPPING_SIZE - * data[0] = number of entries in mapping table - * data[1] = 0 - * data[2] = 0 - * - * Response: - * - * status = XEN_NETIF_CTRL_STATUS_NOT_SUPPORTED - Operation not - * supported - * XEN_NETIF_CTRL_STATUS_INVALID_PARAMETER - Table size is invalid - * XEN_NETIF_CTRL_STATUS_SUCCESS - Operation successful - * data = 0 - * - * NOTE: Setting data[0] to 0 means that hash mapping should be done - * using modular arithmetic. - * - * XEN_NETIF_CTRL_TYPE_SET_HASH_MAPPING - * ------------------------------------ - * - * This is sent by the frontend to set the content of the table mapping - * hash value to queue number. The backend should calculate the hash from - * the packet header, use it as an index into the table (modulo the size - * of the table) and then steer the packet to the queue number found at - * that index. - * - * Request: - * - * type = XEN_NETIF_CTRL_TYPE_SET_HASH_MAPPING - * data[0] = grant reference of page containing the mapping (sub-)table - * (assumed to start at beginning of grant) - * data[1] = size of (sub-)table in entries - * data[2] = offset, in entries, of sub-table within overall table - * - * Response: - * - * status = XEN_NETIF_CTRL_STATUS_NOT_SUPPORTED - Operation not - * supported - * XEN_NETIF_CTRL_STATUS_INVALID_PARAMETER - Table size or content - * is invalid - * XEN_NETIF_CTRL_STATUS_BUFFER_OVERFLOW - Table size is larger - * than the backend - * supports - * XEN_NETIF_CTRL_STATUS_SUCCESS - Operation successful - * data = 0 - * - * NOTE: The overall table has the following format: - * - * 0 1 2 3 4 5 6 7 octet - * +-----+-----+-----+-----+-----+-----+-----+-----+ - * | mapping[0] | mapping[1] | - * +-----+-----+-----+-----+-----+-----+-----+-----+ - * | . | - * | . | - * | . | - * +-----+-----+-----+-----+-----+-----+-----+-----+ - * | mapping[N-2] | mapping[N-1] | - * +-----+-----+-----+-----+-----+-----+-----+-----+ - * - * where N is specified by a XEN_NETIF_CTRL_TYPE_SET_HASH_MAPPING_SIZE - * message and each mapping must specifies a queue between 0 and - * "multi-queue-num-queues" (see above). - * The backend may support a mapping table larger than can be - * mapped by a single grant reference. Thus sub-tables within a - * larger table can be individually set by sending multiple messages - * with differing offset values. Specifying a new sub-table does not - * invalidate any table data outside that range. - * The grant reference may be read-only and must remain valid until - * the response has been processed. - * - * XEN_NETIF_CTRL_TYPE_GET_GREF_MAPPING_SIZE - * ----------------------------------------- - * - * This is sent by the frontend to fetch the number of grefs that can be kept - * mapped in the backend. - * - * Request: - * - * type = XEN_NETIF_CTRL_TYPE_GET_GREF_MAPPING_SIZE - * data[0] = queue index (assumed 0 for single queue) - * data[1] = 0 - * data[2] = 0 - * - * Response: - * - * status = XEN_NETIF_CTRL_STATUS_NOT_SUPPORTED - Operation not - * supported - * XEN_NETIF_CTRL_STATUS_INVALID_PARAMETER - The queue index is - * out of range - * XEN_NETIF_CTRL_STATUS_SUCCESS - Operation successful - * data = maximum number of entries allowed in the gref mapping table - * (if operation was successful) or zero if it is not supported. - * - * XEN_NETIF_CTRL_TYPE_ADD_GREF_MAPPING - * ------------------------------------ - * - * This is sent by the frontend for backend to map a list of grant - * references. - * - * Request: - * - * type = XEN_NETIF_CTRL_TYPE_ADD_GREF_MAPPING - * data[0] = queue index - * data[1] = grant reference of page containing the mapping list - * (r/w and assumed to start at beginning of page) - * data[2] = size of list in entries - * - * Response: - * - * status = XEN_NETIF_CTRL_STATUS_NOT_SUPPORTED - Operation not - * supported - * XEN_NETIF_CTRL_STATUS_INVALID_PARAMETER - Operation failed - * XEN_NETIF_CTRL_STATUS_SUCCESS - Operation successful - * - * NOTE: Each entry in the input table has the format outlined - * in struct xen_netif_gref. - * Contrary to XEN_NETIF_CTRL_TYPE_DEL_GREF_MAPPING, the struct - * xen_netif_gref 'status' field is not used and therefore the response - * 'status' determines the success of this operation. In case of - * failure none of grants mappings get added in the backend. - * - * XEN_NETIF_CTRL_TYPE_DEL_GREF_MAPPING - * ------------------------------------ - * - * This is sent by the frontend for backend to unmap a list of grant - * references. - * - * Request: - * - * type = XEN_NETIF_CTRL_TYPE_DEL_GREF_MAPPING - * data[0] = queue index - * data[1] = grant reference of page containing the mapping list - * (r/w and assumed to start at beginning of page) - * data[2] = size of list in entries - * - * Response: - * - * status = XEN_NETIF_CTRL_STATUS_NOT_SUPPORTED - Operation not - * supported - * XEN_NETIF_CTRL_STATUS_INVALID_PARAMETER - Operation failed - * XEN_NETIF_CTRL_STATUS_SUCCESS - Operation successful - * data = number of entries that were unmapped - * - * NOTE: Each entry in the input table has the format outlined in struct - * xen_netif_gref. - * The struct xen_netif_gref 'status' field determines if the entry - * was successfully removed. - * The entries used are only the ones representing grant references that - * were previously the subject of a XEN_NETIF_CTRL_TYPE_ADD_GREF_MAPPING - * operation. Any other entries will have their status set to - * XEN_NETIF_CTRL_STATUS_INVALID_PARAMETER upon completion. - */ - -DEFINE_RING_TYPES(xen_netif_ctrl, - struct xen_netif_ctrl_request, - struct xen_netif_ctrl_response); - -/* - * Guest transmit - * ============== - * - * This is the 'wire' format for transmit (frontend -> backend) packets: - * - * Fragment 1: netif_tx_request_t - flags = NETTXF_* - * size = total packet size - * [Extra 1: netif_extra_info_t] - (only if fragment 1 flags include - * NETTXF_extra_info) - * ... - * [Extra N: netif_extra_info_t] - (only if extra N-1 flags include - * XEN_NETIF_EXTRA_MORE) - * ... - * Fragment N: netif_tx_request_t - (only if fragment N-1 flags include - * NETTXF_more_data - flags on preceding - * extras are not relevant here) - * flags = 0 - * size = fragment size - * - * NOTE: - * - * This format slightly is different from that used for receive - * (backend -> frontend) packets. Specifically, in a multi-fragment - * packet the actual size of fragment 1 can only be determined by - * subtracting the sizes of fragments 2..N from the total packet size. - * - * Ring slot size is 12 octets, however not all request/response - * structs use the full size. - * - * tx request data (netif_tx_request_t) - * ------------------------------------ - * - * 0 1 2 3 4 5 6 7 octet - * +-----+-----+-----+-----+-----+-----+-----+-----+ - * | grant ref | offset | flags | - * +-----+-----+-----+-----+-----+-----+-----+-----+ - * | id | size | - * +-----+-----+-----+-----+ - * - * grant ref: Reference to buffer page. - * offset: Offset within buffer page. - * flags: NETTXF_*. - * id: request identifier, echoed in response. - * size: packet size in bytes. - * - * tx response (netif_tx_response_t) - * --------------------------------- - * - * 0 1 2 3 4 5 6 7 octet - * +-----+-----+-----+-----+-----+-----+-----+-----+ - * | id | status | unused | - * +-----+-----+-----+-----+-----+-----+-----+-----+ - * | unused | - * +-----+-----+-----+-----+ - * - * id: reflects id in transmit request - * status: NETIF_RSP_* - * - * Guest receive - * ============= - * - * This is the 'wire' format for receive (backend -> frontend) packets: - * - * Fragment 1: netif_rx_request_t - flags = NETRXF_* - * size = fragment size - * [Extra 1: netif_extra_info_t] - (only if fragment 1 flags include - * NETRXF_extra_info) - * ... - * [Extra N: netif_extra_info_t] - (only if extra N-1 flags include - * XEN_NETIF_EXTRA_MORE) - * ... - * Fragment N: netif_rx_request_t - (only if fragment N-1 flags include - * NETRXF_more_data - flags on preceding - * extras are not relevant here) - * flags = 0 - * size = fragment size - * - * NOTE: - * - * This format slightly is different from that used for transmit - * (frontend -> backend) packets. Specifically, in a multi-fragment - * packet the size of the packet can only be determined by summing the - * sizes of fragments 1..N. - * - * Ring slot size is 8 octets. - * - * rx request (netif_rx_request_t) - * ------------------------------- - * - * 0 1 2 3 4 5 6 7 octet - * +-----+-----+-----+-----+-----+-----+-----+-----+ - * | id | pad | gref | - * +-----+-----+-----+-----+-----+-----+-----+-----+ - * - * id: request identifier, echoed in response. - * gref: reference to incoming granted frame. - * - * rx response (netif_rx_response_t) - * --------------------------------- - * - * 0 1 2 3 4 5 6 7 octet - * +-----+-----+-----+-----+-----+-----+-----+-----+ - * | id | offset | flags | status | - * +-----+-----+-----+-----+-----+-----+-----+-----+ - * - * id: reflects id in receive request - * offset: offset in page of start of received packet - * flags: NETRXF_* - * status: -ve: NETIF_RSP_*; +ve: Rx'ed pkt size. - * - * NOTE: Historically, to support GSO on the frontend receive side, Linux - * netfront does not make use of the rx response id (because, as - * described below, extra info structures overlay the id field). - * Instead it assumes that responses always appear in the same ring - * slot as their corresponding request. Thus, to maintain - * compatibility, backends must make sure this is the case. - * - * Extra Info - * ========== - * - * Can be present if initial request or response has NET{T,R}XF_extra_info, - * or previous extra request has XEN_NETIF_EXTRA_MORE. - * - * The struct therefore needs to fit into either a tx or rx slot and - * is therefore limited to 8 octets. - * - * NOTE: Because extra info data overlays the usual request/response - * structures, there is no id information in the opposite direction. - * So, if an extra info overlays an rx response the frontend can - * assume that it is in the same ring slot as the request that was - * consumed to make the slot available, and the backend must ensure - * this assumption is true. - * - * extra info (netif_extra_info_t) - * ------------------------------- - * - * General format: - * - * 0 1 2 3 4 5 6 7 octet - * +-----+-----+-----+-----+-----+-----+-----+-----+ - * |type |flags| type specific data | - * +-----+-----+-----+-----+-----+-----+-----+-----+ - * | padding for tx | - * +-----+-----+-----+-----+ - * - * type: XEN_NETIF_EXTRA_TYPE_* - * flags: XEN_NETIF_EXTRA_FLAG_* - * padding for tx: present only in the tx case due to 8 octet limit - * from rx case. Not shown in type specific entries - * below. - * - * XEN_NETIF_EXTRA_TYPE_GSO: - * - * 0 1 2 3 4 5 6 7 octet - * +-----+-----+-----+-----+-----+-----+-----+-----+ - * |type |flags| size |type | pad | features | - * +-----+-----+-----+-----+-----+-----+-----+-----+ - * - * type: Must be XEN_NETIF_EXTRA_TYPE_GSO - * flags: XEN_NETIF_EXTRA_FLAG_* - * size: Maximum payload size of each segment. For example, - * for TCP this is just the path MSS. - * type: XEN_NETIF_GSO_TYPE_*: This determines the protocol of - * the packet and any extra features required to segment the - * packet properly. - * features: EN_NETIF_GSO_FEAT_*: This specifies any extra GSO - * features required to process this packet, such as ECN - * support for TCPv4. - * - * XEN_NETIF_EXTRA_TYPE_MCAST_{ADD,DEL}: - * - * 0 1 2 3 4 5 6 7 octet - * +-----+-----+-----+-----+-----+-----+-----+-----+ - * |type |flags| addr | - * +-----+-----+-----+-----+-----+-----+-----+-----+ - * - * type: Must be XEN_NETIF_EXTRA_TYPE_MCAST_{ADD,DEL} - * flags: XEN_NETIF_EXTRA_FLAG_* - * addr: address to add/remove - * - * XEN_NETIF_EXTRA_TYPE_HASH: - * - * A backend that supports teoplitz hashing is assumed to accept - * this type of extra info in transmit packets. - * A frontend that enables hashing is assumed to accept - * this type of extra info in receive packets. - * - * 0 1 2 3 4 5 6 7 octet - * +-----+-----+-----+-----+-----+-----+-----+-----+ - * |type |flags|htype| alg |LSB ---- value ---- MSB| - * +-----+-----+-----+-----+-----+-----+-----+-----+ - * - * type: Must be XEN_NETIF_EXTRA_TYPE_HASH - * flags: XEN_NETIF_EXTRA_FLAG_* - * htype: Hash type (one of _XEN_NETIF_CTRL_HASH_TYPE_* - see above) - * alg: The algorithm used to calculate the hash (one of - * XEN_NETIF_CTRL_HASH_TYPE_ALGORITHM_* - see above) - * value: Hash value - */ - -/* Protocol checksum field is blank in the packet (hardware offload)? */ -#define _NETTXF_csum_blank (0) -#define NETTXF_csum_blank (1U<<_NETTXF_csum_blank) - -/* Packet data has been validated against protocol checksum. */ -#define _NETTXF_data_validated (1) -#define NETTXF_data_validated (1U<<_NETTXF_data_validated) - -/* Packet continues in the next request descriptor. */ -#define _NETTXF_more_data (2) -#define NETTXF_more_data (1U<<_NETTXF_more_data) - -/* Packet to be followed by extra descriptor(s). */ -#define _NETTXF_extra_info (3) -#define NETTXF_extra_info (1U<<_NETTXF_extra_info) - -#define XEN_NETIF_MAX_TX_SIZE 0xFFFF -struct netif_tx_request { - grant_ref_t gref; - uint16_t offset; - uint16_t flags; - uint16_t id; - uint16_t size; -}; -typedef struct netif_tx_request netif_tx_request_t; - -/* Types of netif_extra_info descriptors. */ -#define XEN_NETIF_EXTRA_TYPE_NONE (0) /* Never used - invalid */ -#define XEN_NETIF_EXTRA_TYPE_GSO (1) /* u.gso */ -#define XEN_NETIF_EXTRA_TYPE_MCAST_ADD (2) /* u.mcast */ -#define XEN_NETIF_EXTRA_TYPE_MCAST_DEL (3) /* u.mcast */ -#define XEN_NETIF_EXTRA_TYPE_HASH (4) /* u.hash */ -#define XEN_NETIF_EXTRA_TYPE_MAX (5) - -/* netif_extra_info_t flags. */ -#define _XEN_NETIF_EXTRA_FLAG_MORE (0) -#define XEN_NETIF_EXTRA_FLAG_MORE (1U<<_XEN_NETIF_EXTRA_FLAG_MORE) - -/* GSO types */ -#define XEN_NETIF_GSO_TYPE_NONE (0) -#define XEN_NETIF_GSO_TYPE_TCPV4 (1) -#define XEN_NETIF_GSO_TYPE_TCPV6 (2) - -/* - * This structure needs to fit within both netif_tx_request_t and - * netif_rx_response_t for compatibility. - */ -struct netif_extra_info { - uint8_t type; - uint8_t flags; - union { - struct { - uint16_t size; - uint8_t type; - uint8_t pad; - uint16_t features; - } gso; - struct { - uint8_t addr[6]; - } mcast; - struct { - uint8_t type; - uint8_t algorithm; - uint8_t value[4]; - } hash; - uint16_t pad[3]; - } u; -}; -typedef struct netif_extra_info netif_extra_info_t; - -struct netif_tx_response { - uint16_t id; - int16_t status; -}; -typedef struct netif_tx_response netif_tx_response_t; - -struct netif_rx_request { - uint16_t id; /* Echoed in response message. */ - uint16_t pad; - grant_ref_t gref; -}; -typedef struct netif_rx_request netif_rx_request_t; - -/* Packet data has been validated against protocol checksum. */ -#define _NETRXF_data_validated (0) -#define NETRXF_data_validated (1U<<_NETRXF_data_validated) - -/* Protocol checksum field is blank in the packet (hardware offload)? */ -#define _NETRXF_csum_blank (1) -#define NETRXF_csum_blank (1U<<_NETRXF_csum_blank) - -/* Packet continues in the next request descriptor. */ -#define _NETRXF_more_data (2) -#define NETRXF_more_data (1U<<_NETRXF_more_data) - -/* Packet to be followed by extra descriptor(s). */ -#define _NETRXF_extra_info (3) -#define NETRXF_extra_info (1U<<_NETRXF_extra_info) - -/* Packet has GSO prefix. Deprecated but included for compatibility */ -#define _NETRXF_gso_prefix (4) -#define NETRXF_gso_prefix (1U<<_NETRXF_gso_prefix) - -struct netif_rx_response { - uint16_t id; - uint16_t offset; - uint16_t flags; - int16_t status; -}; -typedef struct netif_rx_response netif_rx_response_t; - -/* - * Generate netif ring structures and types. - */ - -DEFINE_RING_TYPES(netif_tx, struct netif_tx_request, struct netif_tx_response); -DEFINE_RING_TYPES(netif_rx, struct netif_rx_request, struct netif_rx_response); - -#define NETIF_RSP_DROPPED -2 -#define NETIF_RSP_ERROR -1 -#define NETIF_RSP_OKAY 0 -/* No response: used for auxiliary requests (e.g., netif_extra_info_t). */ -#define NETIF_RSP_NULL 1 - -#endif - -/* - * Local variables: - * mode: C - * c-file-style: "BSD" - * c-basic-offset: 4 - * tab-width: 4 - * indent-tabs-mode: nil - * End: - */ diff --git a/sys/xen/interface/io/pciif.h b/sys/xen/interface/io/pciif.h deleted file mode 100644 index a4ba13cc13c0..000000000000 --- a/sys/xen/interface/io/pciif.h +++ /dev/null @@ -1,125 +0,0 @@ -/* - * PCI Backend/Frontend Common Data Structures & Macros - * - * 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. - * - * Author: Ryan Wilson - */ -#ifndef __XEN_PCI_COMMON_H__ -#define __XEN_PCI_COMMON_H__ - -/* Be sure to bump this number if you change this file */ -#define XEN_PCI_MAGIC "7" - -/* xen_pci_sharedinfo flags */ -#define _XEN_PCIF_active (0) -#define XEN_PCIF_active (1<<_XEN_PCIF_active) -#define _XEN_PCIB_AERHANDLER (1) -#define XEN_PCIB_AERHANDLER (1<<_XEN_PCIB_AERHANDLER) -#define _XEN_PCIB_active (2) -#define XEN_PCIB_active (1<<_XEN_PCIB_active) - -/* xen_pci_op commands */ -#define XEN_PCI_OP_conf_read (0) -#define XEN_PCI_OP_conf_write (1) -#define XEN_PCI_OP_enable_msi (2) -#define XEN_PCI_OP_disable_msi (3) -#define XEN_PCI_OP_enable_msix (4) -#define XEN_PCI_OP_disable_msix (5) -#define XEN_PCI_OP_aer_detected (6) -#define XEN_PCI_OP_aer_resume (7) -#define XEN_PCI_OP_aer_mmio (8) -#define XEN_PCI_OP_aer_slotreset (9) -#define XEN_PCI_OP_enable_multi_msi (10) - -/* xen_pci_op error numbers */ -#define XEN_PCI_ERR_success (0) -#define XEN_PCI_ERR_dev_not_found (-1) -#define XEN_PCI_ERR_invalid_offset (-2) -#define XEN_PCI_ERR_access_denied (-3) -#define XEN_PCI_ERR_not_implemented (-4) -/* XEN_PCI_ERR_op_failed - backend failed to complete the operation */ -#define XEN_PCI_ERR_op_failed (-5) - -/* - * it should be PAGE_SIZE-sizeof(struct xen_pci_op))/sizeof(struct msix_entry)) - * Should not exceed 128 - */ -#define SH_INFO_MAX_VEC 128 - -struct xen_msix_entry { - uint16_t vector; - uint16_t entry; -}; -struct xen_pci_op { - /* IN: what action to perform: XEN_PCI_OP_* */ - uint32_t cmd; - - /* OUT: will contain an error number (if any) from errno.h */ - int32_t err; - - /* IN: which device to touch */ - uint32_t domain; /* PCI Domain/Segment */ - uint32_t bus; - uint32_t devfn; - - /* IN: which configuration registers to touch */ - int32_t offset; - int32_t size; - - /* IN/OUT: Contains the result after a READ or the value to WRITE */ - uint32_t value; - /* IN: Contains extra infor for this operation */ - uint32_t info; - /*IN: param for msi-x */ - struct xen_msix_entry msix_entries[SH_INFO_MAX_VEC]; -}; - -/*used for pcie aer handling*/ -struct xen_pcie_aer_op -{ - - /* IN: what action to perform: XEN_PCI_OP_* */ - uint32_t cmd; - /*IN/OUT: return aer_op result or carry error_detected state as input*/ - int32_t err; - - /* IN: which device to touch */ - uint32_t domain; /* PCI Domain/Segment*/ - uint32_t bus; - uint32_t devfn; -}; -struct xen_pci_sharedinfo { - /* flags - XEN_PCIF_* */ - uint32_t flags; - struct xen_pci_op op; - struct xen_pcie_aer_op aer_op; -}; - -#endif /* __XEN_PCI_COMMON_H__ */ - -/* - * Local variables: - * mode: C - * c-file-style: "BSD" - * c-basic-offset: 4 - * tab-width: 4 - * indent-tabs-mode: nil - * End: - */ diff --git a/sys/xen/interface/io/protocols.h b/sys/xen/interface/io/protocols.h deleted file mode 100644 index 52b4de0f8184..000000000000 --- a/sys/xen/interface/io/protocols.h +++ /dev/null @@ -1,42 +0,0 @@ -/****************************************************************************** - * protocols.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. - * - * Copyright (c) 2008, Keir Fraser - */ - -#ifndef __XEN_PROTOCOLS_H__ -#define __XEN_PROTOCOLS_H__ - -#define XEN_IO_PROTO_ABI_X86_32 "x86_32-abi" -#define XEN_IO_PROTO_ABI_X86_64 "x86_64-abi" -#define XEN_IO_PROTO_ABI_ARM "arm-abi" - -#if defined(__i386__) -# define XEN_IO_PROTO_ABI_NATIVE XEN_IO_PROTO_ABI_X86_32 -#elif defined(__x86_64__) -# define XEN_IO_PROTO_ABI_NATIVE XEN_IO_PROTO_ABI_X86_64 -#elif defined(__arm__) || defined(__aarch64__) -# define XEN_IO_PROTO_ABI_NATIVE XEN_IO_PROTO_ABI_ARM -#else -# error arch fixup needed here -#endif - -#endif diff --git a/sys/xen/interface/io/pvcalls.h b/sys/xen/interface/io/pvcalls.h deleted file mode 100644 index 6da6b5533a10..000000000000 --- a/sys/xen/interface/io/pvcalls.h +++ /dev/null @@ -1,160 +0,0 @@ -/* - * pvcalls.h -- Xen PV Calls Protocol - * - * Refer to docs/misc/pvcalls.markdown for the specification - * - * The header is provided as a C reference for the specification. In - * case of conflict, the specification is authoritative. - * - * 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) 2017 Stefano Stabellini - */ - -#ifndef __XEN_PUBLIC_IO_PVCALLS_H__ -#define __XEN_PUBLIC_IO_PVCALLS_H__ - -#include "../grant_table.h" -#include "ring.h" - -/* - * See docs/misc/pvcalls.markdown in xen.git for the full specification: - * https://xenbits.xen.org/docs/unstable/misc/pvcalls.html - */ -struct pvcalls_data_intf { - RING_IDX in_cons, in_prod, in_error; - - uint8_t pad1[52]; - - RING_IDX out_cons, out_prod, out_error; - - uint8_t pad2[52]; - - RING_IDX ring_order; - grant_ref_t ref[]; -}; -DEFINE_XEN_FLEX_RING(pvcalls); - -#define PVCALLS_SOCKET 0 -#define PVCALLS_CONNECT 1 -#define PVCALLS_RELEASE 2 -#define PVCALLS_BIND 3 -#define PVCALLS_LISTEN 4 -#define PVCALLS_ACCEPT 5 -#define PVCALLS_POLL 6 - -struct xen_pvcalls_request { - uint32_t req_id; /* private to guest, echoed in response */ - uint32_t cmd; /* command to execute */ - union { - struct xen_pvcalls_socket { - uint64_t id; - uint32_t domain; - uint32_t type; - uint32_t protocol; - uint8_t pad[4]; - } socket; - struct xen_pvcalls_connect { - uint64_t id; - uint8_t addr[28]; - uint32_t len; - uint32_t flags; - grant_ref_t ref; - uint32_t evtchn; - uint8_t pad[4]; - } connect; - struct xen_pvcalls_release { - uint64_t id; - uint8_t reuse; - uint8_t pad[7]; - } release; - struct xen_pvcalls_bind { - uint64_t id; - uint8_t addr[28]; - uint32_t len; - } bind; - struct xen_pvcalls_listen { - uint64_t id; - uint32_t backlog; - uint8_t pad[4]; - } listen; - struct xen_pvcalls_accept { - uint64_t id; - uint64_t id_new; - grant_ref_t ref; - uint32_t evtchn; - } accept; - struct xen_pvcalls_poll { - uint64_t id; - } poll; - /* dummy member to force sizeof(struct xen_pvcalls_request) - * to match across archs */ - struct xen_pvcalls_dummy { - uint8_t dummy[56]; - } dummy; - } u; -}; - -struct xen_pvcalls_response { - uint32_t req_id; - uint32_t cmd; - int32_t ret; - uint32_t pad; - union { - struct _xen_pvcalls_socket { - uint64_t id; - } socket; - struct _xen_pvcalls_connect { - uint64_t id; - } connect; - struct _xen_pvcalls_release { - uint64_t id; - } release; - struct _xen_pvcalls_bind { - uint64_t id; - } bind; - struct _xen_pvcalls_listen { - uint64_t id; - } listen; - struct _xen_pvcalls_accept { - uint64_t id; - } accept; - struct _xen_pvcalls_poll { - uint64_t id; - } poll; - struct _xen_pvcalls_dummy { - uint8_t dummy[8]; - } dummy; - } u; -}; - -DEFINE_RING_TYPES(xen_pvcalls, struct xen_pvcalls_request, - struct xen_pvcalls_response); - -#endif - -/* - * Local variables: - * mode: C - * c-file-style: "BSD" - * c-basic-offset: 4 - * tab-width: 4 - * indent-tabs-mode: nil - * End: - */ diff --git a/sys/xen/interface/io/ring.h b/sys/xen/interface/io/ring.h deleted file mode 100644 index d68615ae2f67..000000000000 --- a/sys/xen/interface/io/ring.h +++ /dev/null @@ -1,488 +0,0 @@ -/****************************************************************************** - * ring.h - * - * Shared producer-consumer ring macros. - * - * 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. - * - * Tim Deegan and Andrew Warfield November 2004. - */ - -#ifndef __XEN_PUBLIC_IO_RING_H__ -#define __XEN_PUBLIC_IO_RING_H__ - -/* - * When #include'ing this header, you need to provide the following - * declaration upfront: - * - standard integers types (uint8_t, uint16_t, etc) - * They are provided by stdint.h of the standard headers. - * - * In addition, if you intend to use the FLEX macros, you also need to - * provide the following, before invoking the FLEX macros: - * - size_t - * - memcpy - * - grant_ref_t - * These declarations are provided by string.h of the standard headers, - * and grant_table.h from the Xen public headers. - */ - -#include "../xen-compat.h" - -#if __XEN_INTERFACE_VERSION__ < 0x00030208 -#define xen_mb() mb() -#define xen_rmb() rmb() -#define xen_wmb() wmb() -#endif - -typedef unsigned int RING_IDX; - -/* Round a 32-bit unsigned constant down to the nearest power of two. */ -#define __RD2(_x) (((_x) & 0x00000002) ? 0x2 : ((_x) & 0x1)) -#define __RD4(_x) (((_x) & 0x0000000c) ? __RD2((_x)>>2)<<2 : __RD2(_x)) -#define __RD8(_x) (((_x) & 0x000000f0) ? __RD4((_x)>>4)<<4 : __RD4(_x)) -#define __RD16(_x) (((_x) & 0x0000ff00) ? __RD8((_x)>>8)<<8 : __RD8(_x)) -#define __RD32(_x) (((_x) & 0xffff0000) ? __RD16((_x)>>16)<<16 : __RD16(_x)) - -/* - * Calculate size of a shared ring, given the total available space for the - * ring and indexes (_sz), and the name tag of the request/response structure. - * A ring contains as many entries as will fit, rounded down to the nearest - * power of two (so we can mask with (size-1) to loop around). - */ -#define __CONST_RING_SIZE(_s, _sz) \ - (__RD32(((_sz) - offsetof(struct _s##_sring, ring)) / \ - sizeof(((struct _s##_sring *)0)->ring[0]))) -/* - * The same for passing in an actual pointer instead of a name tag. - */ -#define __RING_SIZE(_s, _sz) \ - (__RD32(((_sz) - (long)(_s)->ring + (long)(_s)) / sizeof((_s)->ring[0]))) - -/* - * Macros to make the correct C datatypes for a new kind of ring. - * - * To make a new ring datatype, you need to have two message structures, - * let's say request_t, and response_t already defined. - * - * In a header where you want the ring datatype declared, you then do: - * - * DEFINE_RING_TYPES(mytag, request_t, response_t); - * - * These expand out to give you a set of types, as you can see below. - * The most important of these are: - * - * mytag_sring_t - The shared ring. - * mytag_front_ring_t - The 'front' half of the ring. - * mytag_back_ring_t - The 'back' half of the ring. - * - * To initialize a ring in your code you need to know the location and size - * of the shared memory area (PAGE_SIZE, for instance). To initialise - * the front half: - * - * mytag_front_ring_t front_ring; - * SHARED_RING_INIT((mytag_sring_t *)shared_page); - * FRONT_RING_INIT(&front_ring, (mytag_sring_t *)shared_page, PAGE_SIZE); - * - * Initializing the back follows similarly (note that only the front - * initializes the shared ring): - * - * mytag_back_ring_t back_ring; - * BACK_RING_INIT(&back_ring, (mytag_sring_t *)shared_page, PAGE_SIZE); - */ - -#define DEFINE_RING_TYPES(__name, __req_t, __rsp_t) \ - \ -/* Shared ring entry */ \ -union __name##_sring_entry { \ - __req_t req; \ - __rsp_t rsp; \ -}; \ - \ -/* Shared ring page */ \ -struct __name##_sring { \ - RING_IDX req_prod, req_event; \ - RING_IDX rsp_prod, rsp_event; \ - union { \ - struct { \ - uint8_t smartpoll_active; \ - } netif; \ - struct { \ - uint8_t msg; \ - } tapif_user; \ - uint8_t pvt_pad[4]; \ - } pvt; \ - uint8_t __pad[44]; \ - union __name##_sring_entry ring[1]; /* variable-length */ \ -}; \ - \ -/* "Front" end's private variables */ \ -struct __name##_front_ring { \ - RING_IDX req_prod_pvt; \ - RING_IDX rsp_cons; \ - unsigned int nr_ents; \ - struct __name##_sring *sring; \ -}; \ - \ -/* "Back" end's private variables */ \ -struct __name##_back_ring { \ - RING_IDX rsp_prod_pvt; \ - RING_IDX req_cons; \ - unsigned int nr_ents; \ - struct __name##_sring *sring; \ -}; \ - \ -/* Syntactic sugar */ \ -typedef struct __name##_sring __name##_sring_t; \ -typedef struct __name##_front_ring __name##_front_ring_t; \ -typedef struct __name##_back_ring __name##_back_ring_t - -/* - * Macros for manipulating rings. - * - * FRONT_RING_whatever works on the "front end" of a ring: here - * requests are pushed on to the ring and responses taken off it. - * - * BACK_RING_whatever works on the "back end" of a ring: here - * requests are taken off the ring and responses put on. - * - * N.B. these macros do NO INTERLOCKS OR FLOW CONTROL. - * This is OK in 1-for-1 request-response situations where the - * requestor (front end) never has more than RING_SIZE()-1 - * outstanding requests. - */ - -/* Initialising empty rings */ -#define SHARED_RING_INIT(_s) do { \ - (_s)->req_prod = (_s)->rsp_prod = 0; \ - (_s)->req_event = (_s)->rsp_event = 1; \ - (void)memset((_s)->pvt.pvt_pad, 0, sizeof((_s)->pvt.pvt_pad)); \ - (void)memset((_s)->__pad, 0, sizeof((_s)->__pad)); \ -} while(0) - -#define FRONT_RING_ATTACH(_r, _s, _i, __size) do { \ - (_r)->req_prod_pvt = (_i); \ - (_r)->rsp_cons = (_i); \ - (_r)->nr_ents = __RING_SIZE(_s, __size); \ - (_r)->sring = (_s); \ -} while (0) - -#define FRONT_RING_INIT(_r, _s, __size) FRONT_RING_ATTACH(_r, _s, 0, __size) - -#define BACK_RING_ATTACH(_r, _s, _i, __size) do { \ - (_r)->rsp_prod_pvt = (_i); \ - (_r)->req_cons = (_i); \ - (_r)->nr_ents = __RING_SIZE(_s, __size); \ - (_r)->sring = (_s); \ -} while (0) - -#define BACK_RING_INIT(_r, _s, __size) BACK_RING_ATTACH(_r, _s, 0, __size) - -/* How big is this ring? */ -#define RING_SIZE(_r) \ - ((_r)->nr_ents) - -/* Number of free requests (for use on front side only). */ -#define RING_FREE_REQUESTS(_r) \ - (RING_SIZE(_r) - ((_r)->req_prod_pvt - (_r)->rsp_cons)) - -/* Test if there is an empty slot available on the front ring. - * (This is only meaningful from the front. ) - */ -#define RING_FULL(_r) \ - (RING_FREE_REQUESTS(_r) == 0) - -/* Test if there are outstanding messages to be processed on a ring. */ -#define RING_HAS_UNCONSUMED_RESPONSES(_r) \ - ((_r)->sring->rsp_prod - (_r)->rsp_cons) - -#ifdef __GNUC__ -#define RING_HAS_UNCONSUMED_REQUESTS(_r) ({ \ - unsigned int req = (_r)->sring->req_prod - (_r)->req_cons; \ - unsigned int rsp = RING_SIZE(_r) - \ - ((_r)->req_cons - (_r)->rsp_prod_pvt); \ - req < rsp ? req : rsp; \ -}) -#else -/* Same as above, but without the nice GCC ({ ... }) syntax. */ -#define RING_HAS_UNCONSUMED_REQUESTS(_r) \ - ((((_r)->sring->req_prod - (_r)->req_cons) < \ - (RING_SIZE(_r) - ((_r)->req_cons - (_r)->rsp_prod_pvt))) ? \ - ((_r)->sring->req_prod - (_r)->req_cons) : \ - (RING_SIZE(_r) - ((_r)->req_cons - (_r)->rsp_prod_pvt))) -#endif - -/* Direct access to individual ring elements, by index. */ -#define RING_GET_REQUEST(_r, _idx) \ - (&((_r)->sring->ring[((_idx) & (RING_SIZE(_r) - 1))].req)) - -/* - * Get a local copy of a request. - * - * Use this in preference to RING_GET_REQUEST() so all processing is - * done on a local copy that cannot be modified by the other end. - * - * Note that https://gcc.gnu.org/bugzilla/show_bug.cgi?id=58145 may cause this - * to be ineffective where _req is a struct which consists of only bitfields. - */ -#define RING_COPY_REQUEST(_r, _idx, _req) do { \ - /* Use volatile to force the copy into _req. */ \ - *(_req) = *(volatile typeof(_req))RING_GET_REQUEST(_r, _idx); \ -} while (0) - -#define RING_GET_RESPONSE(_r, _idx) \ - (&((_r)->sring->ring[((_idx) & (RING_SIZE(_r) - 1))].rsp)) - -/* Loop termination condition: Would the specified index overflow the ring? */ -#define RING_REQUEST_CONS_OVERFLOW(_r, _cons) \ - (((_cons) - (_r)->rsp_prod_pvt) >= RING_SIZE(_r)) - -/* Ill-behaved frontend determination: Can there be this many requests? */ -#define RING_REQUEST_PROD_OVERFLOW(_r, _prod) \ - (((_prod) - (_r)->rsp_prod_pvt) > RING_SIZE(_r)) - -#define RING_PUSH_REQUESTS(_r) do { \ - xen_wmb(); /* back sees requests /before/ updated producer index */ \ - (_r)->sring->req_prod = (_r)->req_prod_pvt; \ -} while (0) - -#define RING_PUSH_RESPONSES(_r) do { \ - xen_wmb(); /* front sees resps /before/ updated producer index */ \ - (_r)->sring->rsp_prod = (_r)->rsp_prod_pvt; \ -} while (0) - -/* - * Notification hold-off (req_event and rsp_event): - * - * When queueing requests or responses on a shared ring, it may not always be - * necessary to notify the remote end. For example, if requests are in flight - * in a backend, the front may be able to queue further requests without - * notifying the back (if the back checks for new requests when it queues - * responses). - * - * When enqueuing requests or responses: - * - * Use RING_PUSH_{REQUESTS,RESPONSES}_AND_CHECK_NOTIFY(). The second argument - * is a boolean return value. True indicates that the receiver requires an - * asynchronous notification. - * - * After dequeuing requests or responses (before sleeping the connection): - * - * Use RING_FINAL_CHECK_FOR_REQUESTS() or RING_FINAL_CHECK_FOR_RESPONSES(). - * The second argument is a boolean return value. True indicates that there - * are pending messages on the ring (i.e., the connection should not be put - * to sleep). - * - * These macros will set the req_event/rsp_event field to trigger a - * notification on the very next message that is enqueued. If you want to - * create batches of work (i.e., only receive a notification after several - * messages have been enqueued) then you will need to create a customised - * version of the FINAL_CHECK macro in your own code, which sets the event - * field appropriately. - */ - -#define RING_PUSH_REQUESTS_AND_CHECK_NOTIFY(_r, _notify) do { \ - RING_IDX __old = (_r)->sring->req_prod; \ - RING_IDX __new = (_r)->req_prod_pvt; \ - xen_wmb(); /* back sees requests /before/ updated producer index */ \ - (_r)->sring->req_prod = __new; \ - xen_mb(); /* back sees new requests /before/ we check req_event */ \ - (_notify) = ((RING_IDX)(__new - (_r)->sring->req_event) < \ - (RING_IDX)(__new - __old)); \ -} while (0) - -#define RING_PUSH_RESPONSES_AND_CHECK_NOTIFY(_r, _notify) do { \ - RING_IDX __old = (_r)->sring->rsp_prod; \ - RING_IDX __new = (_r)->rsp_prod_pvt; \ - xen_wmb(); /* front sees resps /before/ updated producer index */ \ - (_r)->sring->rsp_prod = __new; \ - xen_mb(); /* front sees new resps /before/ we check rsp_event */ \ - (_notify) = ((RING_IDX)(__new - (_r)->sring->rsp_event) < \ - (RING_IDX)(__new - __old)); \ -} while (0) - -#define RING_FINAL_CHECK_FOR_REQUESTS(_r, _work_to_do) do { \ - (_work_to_do) = RING_HAS_UNCONSUMED_REQUESTS(_r); \ - if (_work_to_do) break; \ - (_r)->sring->req_event = (_r)->req_cons + 1; \ - xen_mb(); \ - (_work_to_do) = RING_HAS_UNCONSUMED_REQUESTS(_r); \ -} while (0) - -#define RING_FINAL_CHECK_FOR_RESPONSES(_r, _work_to_do) do { \ - (_work_to_do) = RING_HAS_UNCONSUMED_RESPONSES(_r); \ - if (_work_to_do) break; \ - (_r)->sring->rsp_event = (_r)->rsp_cons + 1; \ - xen_mb(); \ - (_work_to_do) = RING_HAS_UNCONSUMED_RESPONSES(_r); \ -} while (0) - - -/* - * DEFINE_XEN_FLEX_RING_AND_INTF defines two monodirectional rings and - * functions to check if there is data on the ring, and to read and - * write to them. - * - * DEFINE_XEN_FLEX_RING is similar to DEFINE_XEN_FLEX_RING_AND_INTF, but - * does not define the indexes page. As different protocols can have - * extensions to the basic format, this macro allow them to define their - * own struct. - * - * XEN_FLEX_RING_SIZE - * Convenience macro to calculate the size of one of the two rings - * from the overall order. - * - * $NAME_mask - * Function to apply the size mask to an index, to reduce the index - * within the range [0-size]. - * - * $NAME_read_packet - * Function to read data from the ring. The amount of data to read is - * specified by the "size" argument. - * - * $NAME_write_packet - * Function to write data to the ring. The amount of data to write is - * specified by the "size" argument. - * - * $NAME_get_ring_ptr - * Convenience function that returns a pointer to read/write to the - * ring at the right location. - * - * $NAME_data_intf - * Indexes page, shared between frontend and backend. It also - * contains the array of grant refs. - * - * $NAME_queued - * Function to calculate how many bytes are currently on the ring, - * ready to be read. It can also be used to calculate how much free - * space is currently on the ring (XEN_FLEX_RING_SIZE() - - * $NAME_queued()). - */ - -#ifndef XEN_PAGE_SHIFT -/* The PAGE_SIZE for ring protocols and hypercall interfaces is always - * 4K, regardless of the architecture, and page granularity chosen by - * operating systems. - */ -#define XEN_PAGE_SHIFT 12 -#endif -#define XEN_FLEX_RING_SIZE(order) \ - (1UL << ((order) + XEN_PAGE_SHIFT - 1)) - -#define DEFINE_XEN_FLEX_RING(name) \ -static inline RING_IDX name##_mask(RING_IDX idx, RING_IDX ring_size) \ -{ \ - return idx & (ring_size - 1); \ -} \ - \ -static inline unsigned char *name##_get_ring_ptr(unsigned char *buf, \ - RING_IDX idx, \ - RING_IDX ring_size) \ -{ \ - return buf + name##_mask(idx, ring_size); \ -} \ - \ -static inline void name##_read_packet(void *opaque, \ - const unsigned char *buf, \ - size_t size, \ - RING_IDX masked_prod, \ - RING_IDX *masked_cons, \ - RING_IDX ring_size) \ -{ \ - if (*masked_cons < masked_prod || \ - size <= ring_size - *masked_cons) { \ - memcpy(opaque, buf + *masked_cons, size); \ - } else { \ - memcpy(opaque, buf + *masked_cons, ring_size - *masked_cons); \ - memcpy((unsigned char *)opaque + ring_size - *masked_cons, buf, \ - size - (ring_size - *masked_cons)); \ - } \ - *masked_cons = name##_mask(*masked_cons + size, ring_size); \ -} \ - \ -static inline void name##_write_packet(unsigned char *buf, \ - const void *opaque, \ - size_t size, \ - RING_IDX *masked_prod, \ - RING_IDX masked_cons, \ - RING_IDX ring_size) \ -{ \ - if (*masked_prod < masked_cons || \ - size <= ring_size - *masked_prod) { \ - memcpy(buf + *masked_prod, opaque, size); \ - } else { \ - memcpy(buf + *masked_prod, opaque, ring_size - *masked_prod); \ - memcpy(buf, (unsigned char *)opaque + (ring_size - *masked_prod), \ - size - (ring_size - *masked_prod)); \ - } \ - *masked_prod = name##_mask(*masked_prod + size, ring_size); \ -} \ - \ -static inline RING_IDX name##_queued(RING_IDX prod, \ - RING_IDX cons, \ - RING_IDX ring_size) \ -{ \ - RING_IDX size; \ - \ - if (prod == cons) \ - return 0; \ - \ - prod = name##_mask(prod, ring_size); \ - cons = name##_mask(cons, ring_size); \ - \ - if (prod == cons) \ - return ring_size; \ - \ - if (prod > cons) \ - size = prod - cons; \ - else \ - size = ring_size - (cons - prod); \ - return size; \ -} \ - \ -struct name##_data { \ - unsigned char *in; /* half of the allocation */ \ - unsigned char *out; /* half of the allocation */ \ -} - -#define DEFINE_XEN_FLEX_RING_AND_INTF(name) \ -struct name##_data_intf { \ - RING_IDX in_cons, in_prod; \ - \ - uint8_t pad1[56]; \ - \ - RING_IDX out_cons, out_prod; \ - \ - uint8_t pad2[56]; \ - \ - RING_IDX ring_order; \ - grant_ref_t ref[]; \ -}; \ -DEFINE_XEN_FLEX_RING(name) - -#endif /* __XEN_PUBLIC_IO_RING_H__ */ - -/* - * Local variables: - * mode: C - * c-file-style: "BSD" - * c-basic-offset: 4 - * tab-width: 4 - * indent-tabs-mode: nil - * End: - */ diff --git a/sys/xen/interface/io/sndif.h b/sys/xen/interface/io/sndif.h deleted file mode 100644 index 402033cf4946..000000000000 --- a/sys/xen/interface/io/sndif.h +++ /dev/null @@ -1,1091 +0,0 @@ -/****************************************************************************** - * sndif.h - * - * Unified sound-device I/O interface for Xen guest OSes. - * - * 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) 2013-2015 GlobalLogic Inc. - * Copyright (C) 2016-2017 EPAM Systems Inc. - * - * Authors: Oleksandr Andrushchenko - * Oleksandr Grytsov - * Oleksandr Dmytryshyn - * Iurii Konovalenko - */ - -#ifndef __XEN_PUBLIC_IO_SNDIF_H__ -#define __XEN_PUBLIC_IO_SNDIF_H__ - -#include "ring.h" -#include "../grant_table.h" - -/* - ****************************************************************************** - * Protocol version - ****************************************************************************** - */ -#define XENSND_PROTOCOL_VERSION 2 - -/* - ****************************************************************************** - * Feature and Parameter Negotiation - ****************************************************************************** - * - * Front->back notifications: when enqueuing a new request, sending a - * notification can be made conditional on xensnd_req (i.e., the generic - * hold-off mechanism provided by the ring macros). Backends must set - * xensnd_req appropriately (e.g., using RING_FINAL_CHECK_FOR_REQUESTS()). - * - * Back->front notifications: when enqueuing a new response, sending a - * notification can be made conditional on xensnd_resp (i.e., the generic - * hold-off mechanism provided by the ring macros). Frontends must set - * xensnd_resp appropriately (e.g., using RING_FINAL_CHECK_FOR_RESPONSES()). - * - * The two halves of a para-virtual sound card driver utilize nodes within - * XenStore to communicate capabilities and to negotiate operating parameters. - * This section enumerates these nodes which reside in the respective front and - * backend portions of XenStore, following the XenBus convention. - * - * All data in XenStore is stored as strings. Nodes specifying numeric - * values are encoded in decimal. Integer value ranges listed below are - * expressed as fixed sized integer types capable of storing the conversion - * of a properly formated node string, without loss of information. - * - ****************************************************************************** - * Example configuration - ****************************************************************************** - * - * Note: depending on the use-case backend can expose more sound cards and - * PCM devices/streams than the underlying HW physically has by employing - * SW mixers, configuring virtual sound streams, channels etc. - * - * This is an example of backend and frontend configuration: - * - *--------------------------------- Backend ----------------------------------- - * - * /local/domain/0/backend/vsnd/1/0/frontend-id = "1" - * /local/domain/0/backend/vsnd/1/0/frontend = "/local/domain/1/device/vsnd/0" - * /local/domain/0/backend/vsnd/1/0/state = "4" - * /local/domain/0/backend/vsnd/1/0/versions = "1,2" - * - *--------------------------------- Frontend ---------------------------------- - * - * /local/domain/1/device/vsnd/0/backend-id = "0" - * /local/domain/1/device/vsnd/0/backend = "/local/domain/0/backend/vsnd/1/0" - * /local/domain/1/device/vsnd/0/state = "4" - * /local/domain/1/device/vsnd/0/version = "1" - * - *----------------------------- Card configuration ---------------------------- - * - * /local/domain/1/device/vsnd/0/short-name = "Card short name" - * /local/domain/1/device/vsnd/0/long-name = "Card long name" - * /local/domain/1/device/vsnd/0/sample-rates = "8000,32000,44100,48000,96000" - * /local/domain/1/device/vsnd/0/sample-formats = "s8,u8,s16_le,s16_be" - * /local/domain/1/device/vsnd/0/buffer-size = "262144" - * - *------------------------------- PCM device 0 -------------------------------- - * - * /local/domain/1/device/vsnd/0/0/name = "General analog" - * /local/domain/1/device/vsnd/0/0/channels-max = "5" - * - *----------------------------- Stream 0, playback ---------------------------- - * - * /local/domain/1/device/vsnd/0/0/0/type = "p" - * /local/domain/1/device/vsnd/0/0/0/sample-formats = "s8,u8" - * /local/domain/1/device/vsnd/0/0/0/unique-id = "0" - * - * /local/domain/1/device/vsnd/0/0/0/ring-ref = "386" - * /local/domain/1/device/vsnd/0/0/0/event-channel = "15" - * /local/domain/1/device/vsnd/0/0/0/evt-ring-ref = "1386" - * /local/domain/1/device/vsnd/0/0/0/evt-event-channel = "215" - * - *------------------------------ Stream 1, capture ---------------------------- - * - * /local/domain/1/device/vsnd/0/0/1/type = "c" - * /local/domain/1/device/vsnd/0/0/1/channels-max = "2" - * /local/domain/1/device/vsnd/0/0/1/unique-id = "1" - * - * /local/domain/1/device/vsnd/0/0/1/ring-ref = "384" - * /local/domain/1/device/vsnd/0/0/1/event-channel = "13" - * /local/domain/1/device/vsnd/0/0/1/evt-ring-ref = "1384" - * /local/domain/1/device/vsnd/0/0/1/evt-event-channel = "213" - * - *------------------------------- PCM device 1 -------------------------------- - * - * /local/domain/1/device/vsnd/0/1/name = "HDMI-0" - * /local/domain/1/device/vsnd/0/1/sample-rates = "8000,32000,44100" - * - *------------------------------ Stream 0, capture ---------------------------- - * - * /local/domain/1/device/vsnd/0/1/0/type = "c" - * /local/domain/1/device/vsnd/0/1/0/unique-id = "2" - * - * /local/domain/1/device/vsnd/0/1/0/ring-ref = "387" - * /local/domain/1/device/vsnd/0/1/0/event-channel = "151" - * /local/domain/1/device/vsnd/0/1/0/evt-ring-ref = "1387" - * /local/domain/1/device/vsnd/0/1/0/evt-event-channel = "351" - * - *------------------------------- PCM device 2 -------------------------------- - * - * /local/domain/1/device/vsnd/0/2/name = "SPDIF" - * - *----------------------------- Stream 0, playback ---------------------------- - * - * /local/domain/1/device/vsnd/0/2/0/type = "p" - * /local/domain/1/device/vsnd/0/2/0/unique-id = "3" - * - * /local/domain/1/device/vsnd/0/2/0/ring-ref = "389" - * /local/domain/1/device/vsnd/0/2/0/event-channel = "152" - * /local/domain/1/device/vsnd/0/2/0/evt-ring-ref = "1389" - * /local/domain/1/device/vsnd/0/2/0/evt-event-channel = "452" - * - ****************************************************************************** - * Backend XenBus Nodes - ****************************************************************************** - * - *----------------------------- Protocol version ------------------------------ - * - * versions - * Values: - * - * List of XENSND_LIST_SEPARATOR separated protocol versions supported - * by the backend. For example "1,2,3". - * - ****************************************************************************** - * Frontend XenBus Nodes - ****************************************************************************** - * - *-------------------------------- Addressing --------------------------------- - * - * dom-id - * Values: - * - * Domain identifier. - * - * dev-id - * Values: - * - * Device identifier. - * - * pcm-dev-idx - * Values: - * - * Zero based contigous index of the PCM device. - * - * stream-idx - * Values: - * - * Zero based contigous index of the stream of the PCM device. - * - * The following pattern is used for addressing: - * /local/domain//device/vsnd////... - * - *----------------------------- Protocol version ------------------------------ - * - * version - * Values: - * - * Protocol version, chosen among the ones supported by the backend. - * - *------------------------------- PCM settings -------------------------------- - * - * Every virtualized sound frontend has a set of PCM devices and streams, each - * could be individually configured. Part of the PCM configuration can be - * defined at higher level of the hierarchy and be fully or partially re-used - * by the underlying layers. These configuration values are: - * o number of channels (min/max) - * o supported sample rates - * o supported sample formats. - * E.g. one can define these values for the whole card, device or stream. - * Every underlying layer in turn can re-define some or all of them to better - * fit its needs. For example, card may define number of channels to be - * in [1; 8] range, and some particular stream may be limited to [1; 2] only. - * The rule is that the underlying layer must be a subset of the upper layer - * range. - * - * channels-min - * Values: - * - * The minimum amount of channels that is supported, [1; channels-max]. - * Optional, if not set or omitted a value of 1 is used. - * - * channels-max - * Values: - * - * The maximum amount of channels that is supported. - * Must be at least . - * - * sample-rates - * Values: - * - * List of supported sample rates separated by XENSND_LIST_SEPARATOR. - * Sample rates are expressed as a list of decimal values w/o any - * ordering requirement. - * - * sample-formats - * Values: - * - * List of supported sample formats separated by XENSND_LIST_SEPARATOR. - * Items must not exceed XENSND_SAMPLE_FORMAT_MAX_LEN length. - * - * buffer-size - * Values: - * - * The maximum size in octets of the buffer to allocate per stream. - * - *----------------------- Virtual sound card settings ------------------------- - * short-name - * Values: - * - * Short name of the virtual sound card. Optional. - * - * long-name - * Values: - * - * Long name of the virtual sound card. Optional. - * - *----------------------------- Device settings ------------------------------- - * name - * Values: - * - * Name of the sound device within the virtual sound card. Optional. - * - *----------------------------- Stream settings ------------------------------- - * - * type - * Values: "p", "c" - * - * Stream type: "p" - playback stream, "c" - capture stream - * - * If both capture and playback are needed then two streams need to be - * defined under the same device. - * - * unique-id - * Values: - * - * After stream initialization it is assigned a unique ID, so every - * stream of the frontend can be identified by the backend by this ID. - * This can be UUID or such. - * - *-------------------- Stream Request Transport Parameters -------------------- - * - * event-channel - * Values: - * - * The identifier of the Xen event channel used to signal activity - * in the ring buffer. - * - * ring-ref - * Values: - * - * The Xen grant reference granting permission for the backend to map - * a sole page in a single page sized ring buffer. - * - *--------------------- Stream Event Transport Parameters --------------------- - * - * This communication path is used to deliver asynchronous events from backend - * to frontend, set up per stream. - * - * evt-event-channel - * Values: - * - * The identifier of the Xen event channel used to signal activity - * in the ring buffer. - * - * evt-ring-ref - * Values: - * - * The Xen grant reference granting permission for the backend to map - * a sole page in a single page sized ring buffer. - * - ****************************************************************************** - * STATE DIAGRAMS - ****************************************************************************** - * - * Tool stack creates front and back state nodes with initial state - * XenbusStateInitialising. - * Tool stack creates and sets up frontend sound configuration nodes per domain. - * - * Front Back - * ================================= ===================================== - * XenbusStateInitialising XenbusStateInitialising - * o Query backend device identification - * data. - * o Open and validate backend device. - * | - * | - * V - * XenbusStateInitWait - * - * o Query frontend configuration - * o Allocate and initialize - * event channels per configured - * playback/capture stream. - * o Publish transport parameters - * that will be in effect during - * this connection. - * | - * | - * V - * XenbusStateInitialised - * - * o Query frontend transport parameters. - * o Connect to the event channels. - * | - * | - * V - * XenbusStateConnected - * - * o Create and initialize OS - * virtual sound device instances - * as per configuration. - * | - * | - * V - * XenbusStateConnected - * - * XenbusStateUnknown - * XenbusStateClosed - * XenbusStateClosing - * o Remove virtual sound device - * o Remove event channels - * | - * | - * V - * XenbusStateClosed - * - *------------------------------- Recovery flow ------------------------------- - * - * In case of frontend unrecoverable errors backend handles that as - * if frontend goes into the XenbusStateClosed state. - * - * In case of backend unrecoverable errors frontend tries removing - * the virtualized device. If this is possible at the moment of error, - * then frontend goes into the XenbusStateInitialising state and is ready for - * new connection with backend. If the virtualized device is still in use and - * cannot be removed, then frontend goes into the XenbusStateReconfiguring state - * until either the virtualized device removed or backend initiates a new - * connection. On the virtualized device removal frontend goes into the - * XenbusStateInitialising state. - * - * Note on XenbusStateReconfiguring state of the frontend: if backend has - * unrecoverable errors then frontend cannot send requests to the backend - * and thus cannot provide functionality of the virtualized device anymore. - * After backend is back to normal the virtualized device may still hold some - * state: configuration in use, allocated buffers, client application state etc. - * So, in most cases, this will require frontend to implement complex recovery - * reconnect logic. Instead, by going into XenbusStateReconfiguring state, - * frontend will make sure no new clients of the virtualized device are - * accepted, allow existing client(s) to exit gracefully by signaling error - * state etc. - * Once all the clients are gone frontend can reinitialize the virtualized - * device and get into XenbusStateInitialising state again signaling the - * backend that a new connection can be made. - * - * There are multiple conditions possible under which frontend will go from - * XenbusStateReconfiguring into XenbusStateInitialising, some of them are OS - * specific. For example: - * 1. The underlying OS framework may provide callbacks to signal that the last - * client of the virtualized device has gone and the device can be removed - * 2. Frontend can schedule a deferred work (timer/tasklet/workqueue) - * to periodically check if this is the right time to re-try removal of - * the virtualized device. - * 3. By any other means. - * - ****************************************************************************** - * PCM FORMATS - ****************************************************************************** - * - * XENSND_PCM_FORMAT_[_] - * - * format: or - * S - signed, U - unsigned, F - float - * bits - 8, 16, 24, 32 - * name - MU_LAW, GSM, etc. - * - * endian: , may be absent - * LE - Little endian, BE - Big endian - */ -#define XENSND_PCM_FORMAT_S8 0 -#define XENSND_PCM_FORMAT_U8 1 -#define XENSND_PCM_FORMAT_S16_LE 2 -#define XENSND_PCM_FORMAT_S16_BE 3 -#define XENSND_PCM_FORMAT_U16_LE 4 -#define XENSND_PCM_FORMAT_U16_BE 5 -#define XENSND_PCM_FORMAT_S24_LE 6 -#define XENSND_PCM_FORMAT_S24_BE 7 -#define XENSND_PCM_FORMAT_U24_LE 8 -#define XENSND_PCM_FORMAT_U24_BE 9 -#define XENSND_PCM_FORMAT_S32_LE 10 -#define XENSND_PCM_FORMAT_S32_BE 11 -#define XENSND_PCM_FORMAT_U32_LE 12 -#define XENSND_PCM_FORMAT_U32_BE 13 -#define XENSND_PCM_FORMAT_F32_LE 14 /* 4-byte float, IEEE-754 32-bit, */ -#define XENSND_PCM_FORMAT_F32_BE 15 /* range -1.0 to 1.0 */ -#define XENSND_PCM_FORMAT_F64_LE 16 /* 8-byte float, IEEE-754 64-bit, */ -#define XENSND_PCM_FORMAT_F64_BE 17 /* range -1.0 to 1.0 */ -#define XENSND_PCM_FORMAT_IEC958_SUBFRAME_LE 18 -#define XENSND_PCM_FORMAT_IEC958_SUBFRAME_BE 19 -#define XENSND_PCM_FORMAT_MU_LAW 20 -#define XENSND_PCM_FORMAT_A_LAW 21 -#define XENSND_PCM_FORMAT_IMA_ADPCM 22 -#define XENSND_PCM_FORMAT_MPEG 23 -#define XENSND_PCM_FORMAT_GSM 24 - -/* - ****************************************************************************** - * REQUEST CODES - ****************************************************************************** - */ -#define XENSND_OP_OPEN 0 -#define XENSND_OP_CLOSE 1 -#define XENSND_OP_READ 2 -#define XENSND_OP_WRITE 3 -#define XENSND_OP_SET_VOLUME 4 -#define XENSND_OP_GET_VOLUME 5 -#define XENSND_OP_MUTE 6 -#define XENSND_OP_UNMUTE 7 -#define XENSND_OP_TRIGGER 8 -#define XENSND_OP_HW_PARAM_QUERY 9 - -#define XENSND_OP_TRIGGER_START 0 -#define XENSND_OP_TRIGGER_PAUSE 1 -#define XENSND_OP_TRIGGER_STOP 2 -#define XENSND_OP_TRIGGER_RESUME 3 - -/* - ****************************************************************************** - * EVENT CODES - ****************************************************************************** - */ -#define XENSND_EVT_CUR_POS 0 - -/* - ****************************************************************************** - * XENSTORE FIELD AND PATH NAME STRINGS, HELPERS - ****************************************************************************** - */ -#define XENSND_DRIVER_NAME "vsnd" - -#define XENSND_LIST_SEPARATOR "," -/* Field names */ -#define XENSND_FIELD_BE_VERSIONS "versions" -#define XENSND_FIELD_FE_VERSION "version" -#define XENSND_FIELD_VCARD_SHORT_NAME "short-name" -#define XENSND_FIELD_VCARD_LONG_NAME "long-name" -#define XENSND_FIELD_RING_REF "ring-ref" -#define XENSND_FIELD_EVT_CHNL "event-channel" -#define XENSND_FIELD_EVT_RING_REF "evt-ring-ref" -#define XENSND_FIELD_EVT_EVT_CHNL "evt-event-channel" -#define XENSND_FIELD_DEVICE_NAME "name" -#define XENSND_FIELD_TYPE "type" -#define XENSND_FIELD_STREAM_UNIQUE_ID "unique-id" -#define XENSND_FIELD_CHANNELS_MIN "channels-min" -#define XENSND_FIELD_CHANNELS_MAX "channels-max" -#define XENSND_FIELD_SAMPLE_RATES "sample-rates" -#define XENSND_FIELD_SAMPLE_FORMATS "sample-formats" -#define XENSND_FIELD_BUFFER_SIZE "buffer-size" - -/* Stream type field values. */ -#define XENSND_STREAM_TYPE_PLAYBACK "p" -#define XENSND_STREAM_TYPE_CAPTURE "c" -/* Sample rate max string length */ -#define XENSND_SAMPLE_RATE_MAX_LEN 11 -/* Sample format field values */ -#define XENSND_SAMPLE_FORMAT_MAX_LEN 24 - -#define XENSND_PCM_FORMAT_S8_STR "s8" -#define XENSND_PCM_FORMAT_U8_STR "u8" -#define XENSND_PCM_FORMAT_S16_LE_STR "s16_le" -#define XENSND_PCM_FORMAT_S16_BE_STR "s16_be" -#define XENSND_PCM_FORMAT_U16_LE_STR "u16_le" -#define XENSND_PCM_FORMAT_U16_BE_STR "u16_be" -#define XENSND_PCM_FORMAT_S24_LE_STR "s24_le" -#define XENSND_PCM_FORMAT_S24_BE_STR "s24_be" -#define XENSND_PCM_FORMAT_U24_LE_STR "u24_le" -#define XENSND_PCM_FORMAT_U24_BE_STR "u24_be" -#define XENSND_PCM_FORMAT_S32_LE_STR "s32_le" -#define XENSND_PCM_FORMAT_S32_BE_STR "s32_be" -#define XENSND_PCM_FORMAT_U32_LE_STR "u32_le" -#define XENSND_PCM_FORMAT_U32_BE_STR "u32_be" -#define XENSND_PCM_FORMAT_F32_LE_STR "float_le" -#define XENSND_PCM_FORMAT_F32_BE_STR "float_be" -#define XENSND_PCM_FORMAT_F64_LE_STR "float64_le" -#define XENSND_PCM_FORMAT_F64_BE_STR "float64_be" -#define XENSND_PCM_FORMAT_IEC958_SUBFRAME_LE_STR "iec958_subframe_le" -#define XENSND_PCM_FORMAT_IEC958_SUBFRAME_BE_STR "iec958_subframe_be" -#define XENSND_PCM_FORMAT_MU_LAW_STR "mu_law" -#define XENSND_PCM_FORMAT_A_LAW_STR "a_law" -#define XENSND_PCM_FORMAT_IMA_ADPCM_STR "ima_adpcm" -#define XENSND_PCM_FORMAT_MPEG_STR "mpeg" -#define XENSND_PCM_FORMAT_GSM_STR "gsm" - - -/* - ****************************************************************************** - * STATUS RETURN CODES - ****************************************************************************** - * - * Status return code is zero on success and -XEN_EXX on failure. - * - ****************************************************************************** - * Assumptions - ****************************************************************************** - * o usage of grant reference 0 as invalid grant reference: - * grant reference 0 is valid, but never exposed to a PV driver, - * because of the fact it is already in use/reserved by the PV console. - * o all references in this document to page sizes must be treated - * as pages of size XEN_PAGE_SIZE unless otherwise noted. - * - ****************************************************************************** - * Description of the protocol between frontend and backend driver - ****************************************************************************** - * - * The two halves of a Para-virtual sound driver communicate with - * each other using shared pages and event channels. - * Shared page contains a ring with request/response packets. - * - * Packets, used for input/output operations, e.g. read/write, set/get volume, - * etc., provide offset/length fields in order to allow asynchronous protocol - * operation with buffer space sharing: part of the buffer allocated at - * XENSND_OP_OPEN can be used for audio samples and part, for example, - * for volume control. - * - * All reserved fields in the structures below must be 0. - * - *---------------------------------- Requests --------------------------------- - * - * All request packets have the same length (64 octets) - * All request packets have common header: - * 0 1 2 3 octet - * +----------------+----------------+----------------+----------------+ - * | id | operation | reserved | 4 - * +----------------+----------------+----------------+----------------+ - * | reserved | 8 - * +----------------+----------------+----------------+----------------+ - * id - uint16_t, private guest value, echoed in response - * operation - uint8_t, operation code, XENSND_OP_??? - * - * For all packets which use offset and length: - * offset - uint32_t, read or write data offset within the shared buffer, - * passed with XENSND_OP_OPEN request, octets, - * [0; XENSND_OP_OPEN.buffer_sz - 1]. - * length - uint32_t, read or write data length, octets - * - * Request open - open a PCM stream for playback or capture: - * - * 0 1 2 3 octet - * +----------------+----------------+----------------+----------------+ - * | id | XENSND_OP_OPEN | reserved | 4 - * +----------------+----------------+----------------+----------------+ - * | reserved | 8 - * +----------------+----------------+----------------+----------------+ - * | pcm_rate | 12 - * +----------------+----------------+----------------+----------------+ - * | pcm_format | pcm_channels | reserved | 16 - * +----------------+----------------+----------------+----------------+ - * | buffer_sz | 20 - * +----------------+----------------+----------------+----------------+ - * | gref_directory | 24 - * +----------------+----------------+----------------+----------------+ - * | period_sz | 28 - * +----------------+----------------+----------------+----------------+ - * | reserved | 32 - * +----------------+----------------+----------------+----------------+ - * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| - * +----------------+----------------+----------------+----------------+ - * | reserved | 64 - * +----------------+----------------+----------------+----------------+ - * - * pcm_rate - uint32_t, stream data rate, Hz - * pcm_format - uint8_t, XENSND_PCM_FORMAT_XXX value - * pcm_channels - uint8_t, number of channels of this stream, - * [channels-min; channels-max] - * buffer_sz - uint32_t, buffer size to be allocated, octets - * period_sz - uint32_t, event period size, octets - * This is the requested value of the period at which frontend would - * like to receive XENSND_EVT_CUR_POS notifications from the backend when - * stream position advances during playback/capture. - * It shows how many octets are expected to be played/captured before - * sending such an event. - * If set to 0 no XENSND_EVT_CUR_POS events are sent by the backend. - * - * gref_directory - grant_ref_t, a reference to the first shared page - * describing shared buffer references. At least one page exists. If shared - * buffer size (buffer_sz) exceeds what can be addressed by this single page, - * then reference to the next page must be supplied (see gref_dir_next_page - * below) - */ - -struct xensnd_open_req { - uint32_t pcm_rate; - uint8_t pcm_format; - uint8_t pcm_channels; - uint16_t reserved; - uint32_t buffer_sz; - grant_ref_t gref_directory; - uint32_t period_sz; -}; - -/* - * Shared page for XENSND_OP_OPEN buffer descriptor (gref_directory in the - * request) employs a list of pages, describing all pages of the shared data - * buffer: - * 0 1 2 3 octet - * +----------------+----------------+----------------+----------------+ - * | gref_dir_next_page | 4 - * +----------------+----------------+----------------+----------------+ - * | gref[0] | 8 - * +----------------+----------------+----------------+----------------+ - * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| - * +----------------+----------------+----------------+----------------+ - * | gref[i] | i*4+8 - * +----------------+----------------+----------------+----------------+ - * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| - * +----------------+----------------+----------------+----------------+ - * | gref[N - 1] | N*4+8 - * +----------------+----------------+----------------+----------------+ - * - * gref_dir_next_page - grant_ref_t, reference to the next page describing - * page directory. Must be 0 if there are no more pages in the list. - * gref[i] - grant_ref_t, reference to a shared page of the buffer - * allocated at XENSND_OP_OPEN - * - * Number of grant_ref_t entries in the whole page directory is not - * passed, but instead can be calculated as: - * num_grefs_total = (XENSND_OP_OPEN.buffer_sz + XEN_PAGE_SIZE - 1) / - * XEN_PAGE_SIZE - */ - -struct xensnd_page_directory { - grant_ref_t gref_dir_next_page; - grant_ref_t gref[1]; /* Variable length */ -}; - -/* - * Request close - close an opened pcm stream: - * 0 1 2 3 octet - * +----------------+----------------+----------------+----------------+ - * | id | XENSND_OP_CLOSE| reserved | 4 - * +----------------+----------------+----------------+----------------+ - * | reserved | 8 - * +----------------+----------------+----------------+----------------+ - * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| - * +----------------+----------------+----------------+----------------+ - * | reserved | 64 - * +----------------+----------------+----------------+----------------+ - * - * Request read/write - used for read (for capture) or write (for playback): - * 0 1 2 3 octet - * +----------------+----------------+----------------+----------------+ - * | id | operation | reserved | 4 - * +----------------+----------------+----------------+----------------+ - * | reserved | 8 - * +----------------+----------------+----------------+----------------+ - * | offset | 12 - * +----------------+----------------+----------------+----------------+ - * | length | 16 - * +----------------+----------------+----------------+----------------+ - * | reserved | 20 - * +----------------+----------------+----------------+----------------+ - * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| - * +----------------+----------------+----------------+----------------+ - * | reserved | 64 - * +----------------+----------------+----------------+----------------+ - * - * operation - XENSND_OP_READ for read or XENSND_OP_WRITE for write - */ - -struct xensnd_rw_req { - uint32_t offset; - uint32_t length; -}; - -/* - * Request set/get volume - set/get channels' volume of the stream given: - * 0 1 2 3 octet - * +----------------+----------------+----------------+----------------+ - * | id | operation | reserved | 4 - * +----------------+----------------+----------------+----------------+ - * | reserved | 8 - * +----------------+----------------+----------------+----------------+ - * | offset | 12 - * +----------------+----------------+----------------+----------------+ - * | length | 16 - * +----------------+----------------+----------------+----------------+ - * | reserved | 20 - * +----------------+----------------+----------------+----------------+ - * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| - * +----------------+----------------+----------------+----------------+ - * | reserved | 64 - * +----------------+----------------+----------------+----------------+ - * - * operation - XENSND_OP_SET_VOLUME for volume set - * or XENSND_OP_GET_VOLUME for volume get - * Buffer passed with XENSND_OP_OPEN is used to exchange volume - * values: - * - * 0 1 2 3 octet - * +----------------+----------------+----------------+----------------+ - * | channel[0] | 4 - * +----------------+----------------+----------------+----------------+ - * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| - * +----------------+----------------+----------------+----------------+ - * | channel[i] | i*4 - * +----------------+----------------+----------------+----------------+ - * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| - * +----------------+----------------+----------------+----------------+ - * | channel[N - 1] | (N-1)*4 - * +----------------+----------------+----------------+----------------+ - * - * N = XENSND_OP_OPEN.pcm_channels - * i - uint8_t, index of a channel - * channel[i] - sint32_t, volume of i-th channel - * Volume is expressed as a signed value in steps of 0.001 dB, - * while 0 being 0 dB. - * - * Request mute/unmute - mute/unmute stream: - * 0 1 2 3 octet - * +----------------+----------------+----------------+----------------+ - * | id | operation | reserved | 4 - * +----------------+----------------+----------------+----------------+ - * | reserved | 8 - * +----------------+----------------+----------------+----------------+ - * | offset | 12 - * +----------------+----------------+----------------+----------------+ - * | length | 16 - * +----------------+----------------+----------------+----------------+ - * | reserved | 20 - * +----------------+----------------+----------------+----------------+ - * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| - * +----------------+----------------+----------------+----------------+ - * | reserved | 64 - * +----------------+----------------+----------------+----------------+ - * - * operation - XENSND_OP_MUTE for mute or XENSND_OP_UNMUTE for unmute - * Buffer passed with XENSND_OP_OPEN is used to exchange mute/unmute - * values: - * - * 0 octet - * +----------------+----------------+----------------+----------------+ - * | channel[0] | 4 - * +----------------+----------------+----------------+----------------+ - * +/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| - * +----------------+----------------+----------------+----------------+ - * | channel[i] | i*4 - * +----------------+----------------+----------------+----------------+ - * +/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| - * +----------------+----------------+----------------+----------------+ - * | channel[N - 1] | (N-1)*4 - * +----------------+----------------+----------------+----------------+ - * - * N = XENSND_OP_OPEN.pcm_channels - * i - uint8_t, index of a channel - * channel[i] - uint8_t, non-zero if i-th channel needs to be muted/unmuted - * - *------------------------------------ N.B. ----------------------------------- - * - * The 'struct xensnd_rw_req' is also used for XENSND_OP_SET_VOLUME, - * XENSND_OP_GET_VOLUME, XENSND_OP_MUTE, XENSND_OP_UNMUTE. - * - * Request stream running state change - trigger PCM stream running state - * to start, stop, pause or resume: - * - * 0 1 2 3 octet - * +----------------+----------------+----------------+----------------+ - * | id | _OP_TRIGGER | reserved | 4 - * +----------------+----------------+----------------+----------------+ - * | reserved | 8 - * +----------------+----------------+----------------+----------------+ - * | type | reserved | 12 - * +----------------+----------------+----------------+----------------+ - * | reserved | 16 - * +----------------+----------------+----------------+----------------+ - * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| - * +----------------+----------------+----------------+----------------+ - * | reserved | 64 - * +----------------+----------------+----------------+----------------+ - * - * type - uint8_t, XENSND_OP_TRIGGER_XXX value - */ - -struct xensnd_trigger_req { - uint8_t type; -}; - -/* - * Request stream parameter ranges: request intervals and - * masks of supported ranges for stream configuration values. - * - * Sound device configuration for a particular stream is a limited subset - * of the multidimensional configuration available on XenStore, e.g. - * once the frame rate has been selected there is a limited supported range - * for sample rates becomes available (which might be the same set configured - * on XenStore or less). For example, selecting 96kHz sample rate may limit - * number of channels available for such configuration from 4 to 2, etc. - * Thus, each call to XENSND_OP_HW_PARAM_QUERY may reduce configuration - * space making it possible to iteratively get the final stream configuration, - * used in XENSND_OP_OPEN request. - * - * See response format for this request. - * - * 0 1 2 3 octet - * +----------------+----------------+----------------+----------------+ - * | id | _HW_PARAM_QUERY| reserved | 4 - * +----------------+----------------+----------------+----------------+ - * | reserved | 8 - * +----------------+----------------+----------------+----------------+ - * | formats mask low 32-bit | 12 - * +----------------+----------------+----------------+----------------+ - * | formats mask high 32-bit | 16 - * +----------------+----------------+----------------+----------------+ - * | min rate | 20 - * +----------------+----------------+----------------+----------------+ - * | max rate | 24 - * +----------------+----------------+----------------+----------------+ - * | min channels | 28 - * +----------------+----------------+----------------+----------------+ - * | max channels | 32 - * +----------------+----------------+----------------+----------------+ - * | min buffer frames | 36 - * +----------------+----------------+----------------+----------------+ - * | max buffer frames | 40 - * +----------------+----------------+----------------+----------------+ - * | min period frames | 44 - * +----------------+----------------+----------------+----------------+ - * | max period frames | 48 - * +----------------+----------------+----------------+----------------+ - * | reserved | 52 - * +----------------+----------------+----------------+----------------+ - * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| - * +----------------+----------------+----------------+----------------+ - * | reserved | 64 - * +----------------+----------------+----------------+----------------+ - * - * formats - uint64_t, bit mask representing values of the parameter - * made as bitwise OR of (1 << XENSND_PCM_FORMAT_XXX) values - * - * For interval parameters: - * min - uint32_t, minimum value of the parameter - * max - uint32_t, maximum value of the parameter - * - * Frame is defined as a product of the number of channels by the - * number of octets per one sample. - */ - -struct xensnd_query_hw_param { - uint64_t formats; - struct { - uint32_t min; - uint32_t max; - } rates; - struct { - uint32_t min; - uint32_t max; - } channels; - struct { - uint32_t min; - uint32_t max; - } buffer; - struct { - uint32_t min; - uint32_t max; - } period; -}; - -/* - *---------------------------------- Responses -------------------------------- - * - * All response packets have the same length (64 octets) - * - * All response packets have common header: - * 0 1 2 3 octet - * +----------------+----------------+----------------+----------------+ - * | id | operation | reserved | 4 - * +----------------+----------------+----------------+----------------+ - * | status | 8 - * +----------------+----------------+----------------+----------------+ - * - * id - uint16_t, copied from the request - * operation - uint8_t, XENSND_OP_* - copied from request - * status - int32_t, response status, zero on success and -XEN_EXX on failure - * - * - * HW parameter query response - response for XENSND_OP_HW_PARAM_QUERY: - * 0 1 2 3 octet - * +----------------+----------------+----------------+----------------+ - * | id | operation | reserved | 4 - * +----------------+----------------+----------------+----------------+ - * | status | 8 - * +----------------+----------------+----------------+----------------+ - * | formats mask low 32-bit | 12 - * +----------------+----------------+----------------+----------------+ - * | formats mask high 32-bit | 16 - * +----------------+----------------+----------------+----------------+ - * | min rate | 20 - * +----------------+----------------+----------------+----------------+ - * | max rate | 24 - * +----------------+----------------+----------------+----------------+ - * | min channels | 28 - * +----------------+----------------+----------------+----------------+ - * | max channels | 32 - * +----------------+----------------+----------------+----------------+ - * | min buffer frames | 36 - * +----------------+----------------+----------------+----------------+ - * | max buffer frames | 40 - * +----------------+----------------+----------------+----------------+ - * | min period frames | 44 - * +----------------+----------------+----------------+----------------+ - * | max period frames | 48 - * +----------------+----------------+----------------+----------------+ - * | reserved | 52 - * +----------------+----------------+----------------+----------------+ - * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| - * +----------------+----------------+----------------+----------------+ - * | reserved | 64 - * +----------------+----------------+----------------+----------------+ - * - * Meaning of the values in this response is the same as for - * XENSND_OP_HW_PARAM_QUERY request. - */ - -/* - *----------------------------------- Events ---------------------------------- - * - * Events are sent via shared page allocated by the front and propagated by - * evt-event-channel/evt-ring-ref XenStore entries - * All event packets have the same length (64 octets) - * All event packets have common header: - * 0 1 2 3 octet - * +----------------+----------------+----------------+----------------+ - * | id | type | reserved | 4 - * +----------------+----------------+----------------+----------------+ - * | reserved | 8 - * +----------------+----------------+----------------+----------------+ - * - * id - uint16_t, event id, may be used by front - * type - uint8_t, type of the event - * - * - * Current stream position - event from back to front when stream's - * playback/capture position has advanced: - * 0 1 2 3 octet - * +----------------+----------------+----------------+----------------+ - * | id | _EVT_CUR_POS | reserved | 4 - * +----------------+----------------+----------------+----------------+ - * | reserved | 8 - * +----------------+----------------+----------------+----------------+ - * | position low 32-bit | 12 - * +----------------+----------------+----------------+----------------+ - * | position high 32-bit | 16 - * +----------------+----------------+----------------+----------------+ - * | reserved | 20 - * +----------------+----------------+----------------+----------------+ - * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| - * +----------------+----------------+----------------+----------------+ - * | reserved | 64 - * +----------------+----------------+----------------+----------------+ - * - * position - current value of stream's playback/capture position, octets - * - */ - -struct xensnd_cur_pos_evt { - uint64_t position; -}; - -struct xensnd_req { - uint16_t id; - uint8_t operation; - uint8_t reserved[5]; - union { - struct xensnd_open_req open; - struct xensnd_rw_req rw; - struct xensnd_trigger_req trigger; - struct xensnd_query_hw_param hw_param; - uint8_t reserved[56]; - } op; -}; - -struct xensnd_resp { - uint16_t id; - uint8_t operation; - uint8_t reserved; - int32_t status; - union { - struct xensnd_query_hw_param hw_param; - uint8_t reserved1[56]; - } resp; -}; - -struct xensnd_evt { - uint16_t id; - uint8_t type; - uint8_t reserved[5]; - union { - struct xensnd_cur_pos_evt cur_pos; - uint8_t reserved[56]; - } op; -}; - -DEFINE_RING_TYPES(xen_sndif, struct xensnd_req, struct xensnd_resp); - -/* - ****************************************************************************** - * Back to front events delivery - ****************************************************************************** - * In order to deliver asynchronous events from back to front a shared page is - * allocated by front and its granted reference propagated to back via - * XenStore entries (evt-ring-ref/evt-event-channel). - * This page has a common header used by both front and back to synchronize - * access and control event's ring buffer, while back being a producer of the - * events and front being a consumer. The rest of the page after the header - * is used for event packets. - * - * Upon reception of an event(s) front may confirm its reception - * for either each event, group of events or none. - */ - -struct xensnd_event_page { - uint32_t in_cons; - uint32_t in_prod; - uint8_t reserved[56]; -}; - -#define XENSND_EVENT_PAGE_SIZE 4096 -#define XENSND_IN_RING_OFFS (sizeof(struct xensnd_event_page)) -#define XENSND_IN_RING_SIZE (XENSND_EVENT_PAGE_SIZE - XENSND_IN_RING_OFFS) -#define XENSND_IN_RING_LEN (XENSND_IN_RING_SIZE / sizeof(struct xensnd_evt)) -#define XENSND_IN_RING(page) \ - ((struct xensnd_evt *)((char *)(page) + XENSND_IN_RING_OFFS)) -#define XENSND_IN_RING_REF(page, idx) \ - (XENSND_IN_RING((page))[(idx) % XENSND_IN_RING_LEN]) - -#endif /* __XEN_PUBLIC_IO_SNDIF_H__ */ - -/* - * Local variables: - * mode: C - * c-file-style: "BSD" - * c-basic-offset: 4 - * tab-width: 4 - * indent-tabs-mode: nil - * End: - */ diff --git a/sys/xen/interface/io/tpmif.h b/sys/xen/interface/io/tpmif.h deleted file mode 100644 index 9743dc9369d2..000000000000 --- a/sys/xen/interface/io/tpmif.h +++ /dev/null @@ -1,143 +0,0 @@ -/****************************************************************************** - * tpmif.h - * - * TPM I/O interface for Xen guest OSes. - * - * 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, IBM Corporation - * - * Author: Stefan Berger, stefanb@us.ibm.com - * Grant table support: Mahadevan Gomathisankaran - * - * This code has been derived from tools/libxc/xen/io/netif.h - * - * Copyright (c) 2003-2004, Keir Fraser - */ - -#ifndef __XEN_PUBLIC_IO_TPMIF_H__ -#define __XEN_PUBLIC_IO_TPMIF_H__ - -#include "../grant_table.h" - -struct tpmif_tx_request { - unsigned long addr; /* Machine address of packet. */ - grant_ref_t ref; /* grant table access reference */ - uint16_t unused; - uint16_t size; /* Packet size in bytes. */ -}; -typedef struct tpmif_tx_request tpmif_tx_request_t; - -/* - * The TPMIF_TX_RING_SIZE defines the number of pages the - * front-end and backend can exchange (= size of array). - */ -typedef uint32_t TPMIF_RING_IDX; - -#define TPMIF_TX_RING_SIZE 1 - -/* This structure must fit in a memory page. */ - -struct tpmif_ring { - struct tpmif_tx_request req; -}; -typedef struct tpmif_ring tpmif_ring_t; - -struct tpmif_tx_interface { - struct tpmif_ring ring[TPMIF_TX_RING_SIZE]; -}; -typedef struct tpmif_tx_interface tpmif_tx_interface_t; - -/****************************************************************************** - * TPM I/O interface for Xen guest OSes, v2 - * - * Author: Daniel De Graaf - * - * This protocol emulates the request/response behavior of a TPM using a Xen - * shared memory interface. All interaction with the TPM is at the direction - * of the frontend, since a TPM (hardware or virtual) is a passive device - - * the backend only processes commands as requested by the frontend. - * - * The frontend sends a request to the TPM by populating the shared page with - * the request packet, changing the state to TPMIF_STATE_SUBMIT, and sending - * and event channel notification. When the backend is finished, it will set - * the state to TPMIF_STATE_FINISH and send an event channel notification. - * - * In order to allow long-running commands to be canceled, the frontend can - * at any time change the state to TPMIF_STATE_CANCEL and send a notification. - * The TPM can either finish the command (changing state to TPMIF_STATE_FINISH) - * or can cancel the command and change the state to TPMIF_STATE_IDLE. The TPM - * can also change the state to TPMIF_STATE_IDLE instead of TPMIF_STATE_FINISH - * if another reason for cancellation is required - for example, a physical - * TPM may cancel a command if the interface is seized by another locality. - * - * The TPM command format is defined by the TCG, and is available at - * http://www.trustedcomputinggroup.org/resources/tpm_main_specification - */ - -enum tpmif_state { - TPMIF_STATE_IDLE, /* no contents / vTPM idle / cancel complete */ - TPMIF_STATE_SUBMIT, /* request ready / vTPM working */ - TPMIF_STATE_FINISH, /* response ready / vTPM idle */ - TPMIF_STATE_CANCEL, /* cancel requested / vTPM working */ -}; -/* Note: The backend should only change state to IDLE or FINISH, while the - * frontend should only change to SUBMIT or CANCEL. Status changes do not need - * to use atomic operations. - */ - - -/* The shared page for vTPM request/response packets looks like: - * - * Offset Contents - * ================================================= - * 0 struct tpmif_shared_page - * 16 [optional] List of grant IDs - * 16+4*nr_extra_pages TPM packet data - * - * If the TPM packet data extends beyond the end of a single page, the grant IDs - * defined in extra_pages are used as if they were mapped immediately following - * the primary shared page. The grants are allocated by the frontend and mapped - * by the backend. Before sending a request spanning multiple pages, the - * frontend should verify that the TPM supports such large requests by querying - * the TPM_CAP_PROP_INPUT_BUFFER property from the TPM. - */ -struct tpmif_shared_page { - uint32_t length; /* request/response length in bytes */ - - uint8_t state; /* enum tpmif_state */ - uint8_t locality; /* for the current request */ - uint8_t pad; /* should be zero */ - - uint8_t nr_extra_pages; /* extra pages for long packets; may be zero */ - uint32_t extra_pages[0]; /* grant IDs; length is actually nr_extra_pages */ -}; -typedef struct tpmif_shared_page tpmif_shared_page_t; - -#endif - -/* - * Local variables: - * mode: C - * c-file-style: "BSD" - * c-basic-offset: 4 - * tab-width: 4 - * indent-tabs-mode: nil - * End: - */ diff --git a/sys/xen/interface/io/usbif.h b/sys/xen/interface/io/usbif.h deleted file mode 100644 index c6a58639d6cc..000000000000 --- a/sys/xen/interface/io/usbif.h +++ /dev/null @@ -1,254 +0,0 @@ -/* - * usbif.h - * - * USB I/O interface for Xen guest OSes. - * - * Copyright (C) 2009, FUJITSU LABORATORIES LTD. - * Author: Noboru Iwamatsu - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to - * deal in the Software without restriction, including without limitation the - * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or - * sell copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ - -#ifndef __XEN_PUBLIC_IO_USBIF_H__ -#define __XEN_PUBLIC_IO_USBIF_H__ - -#include "ring.h" -#include "../grant_table.h" - -/* - * Feature and Parameter Negotiation - * ================================= - * The two halves of a Xen pvUSB driver utilize nodes within the XenStore to - * communicate capabilities and to negotiate operating parameters. This - * section enumerates these nodes which reside in the respective front and - * backend portions of the XenStore, following the XenBus convention. - * - * Any specified default value is in effect if the corresponding XenBus node - * is not present in the XenStore. - * - * XenStore nodes in sections marked "PRIVATE" are solely for use by the - * driver side whose XenBus tree contains them. - * - ***************************************************************************** - * Backend XenBus Nodes - ***************************************************************************** - * - *------------------ Backend Device Identification (PRIVATE) ------------------ - * - * num-ports - * Values: unsigned [1...31] - * - * Number of ports for this (virtual) USB host connector. - * - * usb-ver - * Values: unsigned [1...2] - * - * USB version of this host connector: 1 = USB 1.1, 2 = USB 2.0. - * - * port/[1...31] - * Values: string - * - * Physical USB device connected to the given port, e.g. "3-1.5". - * - ***************************************************************************** - * Frontend XenBus Nodes - ***************************************************************************** - * - *----------------------- Request Transport Parameters ----------------------- - * - * event-channel - * Values: unsigned - * - * The identifier of the Xen event channel used to signal activity - * in the ring buffer. - * - * urb-ring-ref - * Values: unsigned - * - * The Xen grant reference granting permission for the backend to map - * the sole page in a single page sized ring buffer. This is the ring - * buffer for urb requests. - * - * conn-ring-ref - * Values: unsigned - * - * The Xen grant reference granting permission for the backend to map - * the sole page in a single page sized ring buffer. This is the ring - * buffer for connection/disconnection requests. - * - * protocol - * Values: string (XEN_IO_PROTO_ABI_*) - * Default Value: XEN_IO_PROTO_ABI_NATIVE - * - * The machine ABI rules governing the format of all ring request and - * response structures. - * - */ - -enum usb_spec_version { - USB_VER_UNKNOWN = 0, - USB_VER_USB11, - USB_VER_USB20, - USB_VER_USB30, /* not supported yet */ -}; - -/* - * USB pipe in usbif_request - * - * - port number: bits 0-4 - * (USB_MAXCHILDREN is 31) - * - * - operation flag: bit 5 - * (0 = submit urb, - * 1 = unlink urb) - * - * - direction: bit 7 - * (0 = Host-to-Device [Out] - * 1 = Device-to-Host [In]) - * - * - device address: bits 8-14 - * - * - endpoint: bits 15-18 - * - * - pipe type: bits 30-31 - * (00 = isochronous, 01 = interrupt, - * 10 = control, 11 = bulk) - */ - -#define USBIF_PIPE_PORT_MASK 0x0000001f -#define USBIF_PIPE_UNLINK 0x00000020 -#define USBIF_PIPE_DIR 0x00000080 -#define USBIF_PIPE_DEV_MASK 0x0000007f -#define USBIF_PIPE_DEV_SHIFT 8 -#define USBIF_PIPE_EP_MASK 0x0000000f -#define USBIF_PIPE_EP_SHIFT 15 -#define USBIF_PIPE_TYPE_MASK 0x00000003 -#define USBIF_PIPE_TYPE_SHIFT 30 -#define USBIF_PIPE_TYPE_ISOC 0 -#define USBIF_PIPE_TYPE_INT 1 -#define USBIF_PIPE_TYPE_CTRL 2 -#define USBIF_PIPE_TYPE_BULK 3 - -#define usbif_pipeportnum(pipe) ((pipe) & USBIF_PIPE_PORT_MASK) -#define usbif_setportnum_pipe(pipe, portnum) ((pipe) | (portnum)) - -#define usbif_pipeunlink(pipe) ((pipe) & USBIF_PIPE_UNLINK) -#define usbif_pipesubmit(pipe) (!usbif_pipeunlink(pipe)) -#define usbif_setunlink_pipe(pipe) ((pipe) | USBIF_PIPE_UNLINK) - -#define usbif_pipein(pipe) ((pipe) & USBIF_PIPE_DIR) -#define usbif_pipeout(pipe) (!usbif_pipein(pipe)) - -#define usbif_pipedevice(pipe) \ - (((pipe) >> USBIF_PIPE_DEV_SHIFT) & USBIF_PIPE_DEV_MASK) - -#define usbif_pipeendpoint(pipe) \ - (((pipe) >> USBIF_PIPE_EP_SHIFT) & USBIF_PIPE_EP_MASK) - -#define usbif_pipetype(pipe) \ - (((pipe) >> USBIF_PIPE_TYPE_SHIFT) & USBIF_PIPE_TYPE_MASK) -#define usbif_pipeisoc(pipe) (usbif_pipetype(pipe) == USBIF_PIPE_TYPE_ISOC) -#define usbif_pipeint(pipe) (usbif_pipetype(pipe) == USBIF_PIPE_TYPE_INT) -#define usbif_pipectrl(pipe) (usbif_pipetype(pipe) == USBIF_PIPE_TYPE_CTRL) -#define usbif_pipebulk(pipe) (usbif_pipetype(pipe) == USBIF_PIPE_TYPE_BULK) - -#define USBIF_MAX_SEGMENTS_PER_REQUEST (16) -#define USBIF_MAX_PORTNR 31 -#define USBIF_RING_SIZE 4096 - -/* - * RING for transferring urbs. - */ -struct usbif_request_segment { - grant_ref_t gref; - uint16_t offset; - uint16_t length; -}; - -struct usbif_urb_request { - uint16_t id; /* request id */ - uint16_t nr_buffer_segs; /* number of urb->transfer_buffer segments */ - - /* basic urb parameter */ - uint32_t pipe; - uint16_t transfer_flags; -#define USBIF_SHORT_NOT_OK 0x0001 - uint16_t buffer_length; - union { - uint8_t ctrl[8]; /* setup_packet (Ctrl) */ - - struct { - uint16_t interval; /* maximum (1024*8) in usb core */ - uint16_t start_frame; /* start frame */ - uint16_t number_of_packets; /* number of ISO packet */ - uint16_t nr_frame_desc_segs; /* number of iso_frame_desc segments */ - } isoc; - - struct { - uint16_t interval; /* maximum (1024*8) in usb core */ - uint16_t pad[3]; - } intr; - - struct { - uint16_t unlink_id; /* unlink request id */ - uint16_t pad[3]; - } unlink; - - } u; - - /* urb data segments */ - struct usbif_request_segment seg[USBIF_MAX_SEGMENTS_PER_REQUEST]; -}; -typedef struct usbif_urb_request usbif_urb_request_t; - -struct usbif_urb_response { - uint16_t id; /* request id */ - uint16_t start_frame; /* start frame (ISO) */ - int32_t status; /* status (non-ISO) */ - int32_t actual_length; /* actual transfer length */ - int32_t error_count; /* number of ISO errors */ -}; -typedef struct usbif_urb_response usbif_urb_response_t; - -DEFINE_RING_TYPES(usbif_urb, struct usbif_urb_request, struct usbif_urb_response); -#define USB_URB_RING_SIZE __CONST_RING_SIZE(usbif_urb, USBIF_RING_SIZE) - -/* - * RING for notifying connect/disconnect events to frontend - */ -struct usbif_conn_request { - uint16_t id; -}; -typedef struct usbif_conn_request usbif_conn_request_t; - -struct usbif_conn_response { - uint16_t id; /* request id */ - uint8_t portnum; /* port number */ - uint8_t speed; /* usb_device_speed */ -#define USBIF_SPEED_NONE 0 -#define USBIF_SPEED_LOW 1 -#define USBIF_SPEED_FULL 2 -#define USBIF_SPEED_HIGH 3 -}; -typedef struct usbif_conn_response usbif_conn_response_t; - -DEFINE_RING_TYPES(usbif_conn, struct usbif_conn_request, struct usbif_conn_response); -#define USB_CONN_RING_SIZE __CONST_RING_SIZE(usbif_conn, USBIF_RING_SIZE) - -#endif /* __XEN_PUBLIC_IO_USBIF_H__ */ diff --git a/sys/xen/interface/io/vscsiif.h b/sys/xen/interface/io/vscsiif.h deleted file mode 100644 index c9ceb1884d55..000000000000 --- a/sys/xen/interface/io/vscsiif.h +++ /dev/null @@ -1,330 +0,0 @@ -/****************************************************************************** - * vscsiif.h - * - * Based on the blkif.h code. - * - * 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) FUJITSU Limited 2008. - */ - -#ifndef __XEN__PUBLIC_IO_SCSI_H__ -#define __XEN__PUBLIC_IO_SCSI_H__ - -#include "ring.h" -#include "../grant_table.h" - -/* - * Feature and Parameter Negotiation - * ================================= - * The two halves of a Xen pvSCSI driver utilize nodes within the XenStore to - * communicate capabilities and to negotiate operating parameters. This - * section enumerates these nodes which reside in the respective front and - * backend portions of the XenStore, following the XenBus convention. - * - * Any specified default value is in effect if the corresponding XenBus node - * is not present in the XenStore. - * - * XenStore nodes in sections marked "PRIVATE" are solely for use by the - * driver side whose XenBus tree contains them. - * - ***************************************************************************** - * Backend XenBus Nodes - ***************************************************************************** - * - *------------------ Backend Device Identification (PRIVATE) ------------------ - * - * p-devname - * Values: string - * - * A free string used to identify the physical device (e.g. a disk name). - * - * p-dev - * Values: string - * - * A string specifying the backend device: either a 4-tuple "h:c:t:l" - * (host, controller, target, lun, all integers), or a WWN (e.g. - * "naa.60014054ac780582:0"). - * - * v-dev - * Values: string - * - * A string specifying the frontend device in form of a 4-tuple "h:c:t:l" - * (host, controller, target, lun, all integers). - * - *--------------------------------- Features --------------------------------- - * - * feature-sg-grant - * Values: unsigned [VSCSIIF_SG_TABLESIZE...65535] - * Default Value: 0 - * - * Specifies the maximum number of scatter/gather elements in grant pages - * supported. If not set, the backend supports up to VSCSIIF_SG_TABLESIZE - * SG elements specified directly in the request. - * - ***************************************************************************** - * Frontend XenBus Nodes - ***************************************************************************** - * - *----------------------- Request Transport Parameters ----------------------- - * - * event-channel - * Values: unsigned - * - * The identifier of the Xen event channel used to signal activity - * in the ring buffer. - * - * ring-ref - * Values: unsigned - * - * The Xen grant reference granting permission for the backend to map - * the sole page in a single page sized ring buffer. - * - * protocol - * Values: string (XEN_IO_PROTO_ABI_*) - * Default Value: XEN_IO_PROTO_ABI_NATIVE - * - * The machine ABI rules governing the format of all ring request and - * response structures. - */ - -/* - * Xenstore format in practice - * =========================== - * - * The backend driver uses a single_host:many_devices notation to manage domU - * devices. Everything is stored in /local/domain//backend/vscsi/. - * The xenstore layout looks like this (dom0 is assumed to be the backend_domid): - * - * //feature-host = "0" - * //frontend = "/local/domain//device/vscsi/0" - * //frontend-id = "" - * //online = "1" - * //state = "4" - * //vscsi-devs/dev-0/p-dev = "8:0:2:1" or "naa.wwn:lun" - * //vscsi-devs/dev-0/state = "4" - * //vscsi-devs/dev-0/v-dev = "0:0:0:0" - * //vscsi-devs/dev-1/p-dev = "8:0:2:2" - * //vscsi-devs/dev-1/state = "4" - * //vscsi-devs/dev-1/v-dev = "0:0:1:0" - * - * The frontend driver maintains its state in - * /local/domain//device/vscsi/. - * - * /backend = "/local/domain/0/backend/vscsi//" - * /backend-id = "0" - * /event-channel = "20" - * /ring-ref = "43" - * /state = "4" - * /vscsi-devs/dev-0/state = "4" - * /vscsi-devs/dev-1/state = "4" - * - * In addition to the entries for backend and frontend these flags are stored - * for the toolstack: - * - * //vscsi-devs/dev-1/p-devname = "/dev/$device" - * //libxl_ctrl_index = "0" - * - * - * Backend/frontend protocol - * ========================= - * - * To create a vhost along with a device: - * //feature-host = "0" - * //frontend = "/local/domain//device/vscsi/0" - * //frontend-id = "" - * //online = "1" - * //state = "1" - * //vscsi-devs/dev-0/p-dev = "8:0:2:1" - * //vscsi-devs/dev-0/state = "1" - * //vscsi-devs/dev-0/v-dev = "0:0:0:0" - * Wait for //state + //vscsi-devs/dev-0/state become 4 - * - * To add another device to a vhost: - * //state = "7" - * //vscsi-devs/dev-1/p-dev = "8:0:2:2" - * //vscsi-devs/dev-1/state = "1" - * //vscsi-devs/dev-1/v-dev = "0:0:1:0" - * Wait for //state + //vscsi-devs/dev-1/state become 4 - * - * To remove a device from a vhost: - * //state = "7" - * //vscsi-devs/dev-1/state = "5" - * Wait for //state to become 4 - * Wait for //vscsi-devs/dev-1/state become 6 - * Remove //vscsi-devs/dev-1/{state,p-dev,v-dev,p-devname} - * Remove //vscsi-devs/dev-1/ - * - */ - -/* Requests from the frontend to the backend */ - -/* - * Request a SCSI operation specified via a CDB in vscsiif_request.cmnd. - * The target is specified via channel, id and lun. - * - * The operation to be performed is specified via a CDB in cmnd[], the length - * of the CDB is in cmd_len. sc_data_direction specifies the direction of data - * (to the device, from the device, or none at all). - * - * If data is to be transferred to or from the device the buffer(s) in the - * guest memory is/are specified via one or multiple scsiif_request_segment - * descriptors each specifying a memory page via a grant_ref_t, a offset into - * the page and the length of the area in that page. All scsiif_request_segment - * areas concatenated form the resulting data buffer used by the operation. - * If the number of scsiif_request_segment areas is not too large (less than - * or equal VSCSIIF_SG_TABLESIZE) the areas can be specified directly in the - * seg[] array and the number of valid scsiif_request_segment elements is to be - * set in nr_segments. - * - * If "feature-sg-grant" in the Xenstore is set it is possible to specify more - * than VSCSIIF_SG_TABLESIZE scsiif_request_segment elements via indirection. - * The maximum number of allowed scsiif_request_segment elements is the value - * of the "feature-sg-grant" entry from Xenstore. When using indirection the - * seg[] array doesn't contain specifications of the data buffers, but - * references to scsiif_request_segment arrays, which in turn reference the - * data buffers. While nr_segments holds the number of populated seg[] entries - * (plus the set VSCSIIF_SG_GRANT bit), the number of scsiif_request_segment - * elements referencing the target data buffers is calculated from the lengths - * of the seg[] elements (the sum of all valid seg[].length divided by the - * size of one scsiif_request_segment structure). The frontend may use a mix of - * direct and indirect requests. - */ -#define VSCSIIF_ACT_SCSI_CDB 1 - -/* - * Request abort of a running operation for the specified target given by - * channel, id, lun and the operation's rqid in ref_rqid. - */ -#define VSCSIIF_ACT_SCSI_ABORT 2 - -/* - * Request a device reset of the specified target (channel and id). - */ -#define VSCSIIF_ACT_SCSI_RESET 3 - -/* - * Preset scatter/gather elements for a following request. Deprecated. - * Keeping the define only to avoid usage of the value "4" for other actions. - */ -#define VSCSIIF_ACT_SCSI_SG_PRESET 4 - -/* - * Maximum scatter/gather segments per request. - * - * Considering balance between allocating at least 16 "vscsiif_request" - * structures on one page (4096 bytes) and the number of scatter/gather - * elements needed, we decided to use 26 as a magic number. - * - * If "feature-sg-grant" is set, more scatter/gather elements can be specified - * by placing them in one or more (up to VSCSIIF_SG_TABLESIZE) granted pages. - * In this case the vscsiif_request seg elements don't contain references to - * the user data, but to the SG elements referencing the user data. - */ -#define VSCSIIF_SG_TABLESIZE 26 - -/* - * based on Linux kernel 2.6.18, still valid - * - * Changing these values requires support of multiple protocols via the rings - * as "old clients" will blindly use these values and the resulting structure - * sizes. - */ -#define VSCSIIF_MAX_COMMAND_SIZE 16 -#define VSCSIIF_SENSE_BUFFERSIZE 96 -#define VSCSIIF_PAGE_SIZE 4096 - -struct scsiif_request_segment { - grant_ref_t gref; - uint16_t offset; - uint16_t length; -}; -typedef struct scsiif_request_segment vscsiif_segment_t; - -#define VSCSIIF_SG_PER_PAGE (VSCSIIF_PAGE_SIZE / sizeof(struct scsiif_request_segment)) - -/* Size of one request is 252 bytes */ -struct vscsiif_request { - uint16_t rqid; /* private guest value, echoed in resp */ - uint8_t act; /* command between backend and frontend */ - uint8_t cmd_len; /* valid CDB bytes */ - - uint8_t cmnd[VSCSIIF_MAX_COMMAND_SIZE]; /* the CDB */ - uint16_t timeout_per_command; /* deprecated: timeout in secs, 0=default */ - uint16_t channel, id, lun; /* (virtual) device specification */ - uint16_t ref_rqid; /* command abort reference */ - uint8_t sc_data_direction; /* for DMA_TO_DEVICE(1) - DMA_FROM_DEVICE(2) - DMA_NONE(3) requests */ - uint8_t nr_segments; /* Number of pieces of scatter-gather */ -/* - * flag in nr_segments: SG elements via grant page - * - * If VSCSIIF_SG_GRANT is set, the low 7 bits of nr_segments specify the number - * of grant pages containing SG elements. Usable if "feature-sg-grant" set. - */ -#define VSCSIIF_SG_GRANT 0x80 - - vscsiif_segment_t seg[VSCSIIF_SG_TABLESIZE]; - uint32_t reserved[3]; -}; -typedef struct vscsiif_request vscsiif_request_t; - -/* - * The following interface is deprecated! - */ -#define VSCSIIF_SG_LIST_SIZE ((sizeof(vscsiif_request_t) - 4) \ - / sizeof(vscsiif_segment_t)) - -struct vscsiif_sg_list { - /* First two fields must match struct vscsiif_request! */ - uint16_t rqid; /* private guest value, must match main req */ - uint8_t act; /* VSCSIIF_ACT_SCSI_SG_PRESET */ - uint8_t nr_segments; /* Number of pieces of scatter-gather */ - vscsiif_segment_t seg[VSCSIIF_SG_LIST_SIZE]; -}; -typedef struct vscsiif_sg_list vscsiif_sg_list_t; -/* End of deprecated interface */ - -/* Size of one response is 252 bytes */ -struct vscsiif_response { - uint16_t rqid; /* identifies request */ - uint8_t act; /* deprecated: valid only if SG_PRESET supported */ - uint8_t sense_len; - uint8_t sense_buffer[VSCSIIF_SENSE_BUFFERSIZE]; - int32_t rslt; - uint32_t residual_len; /* request bufflen - - return the value from physical device */ - uint32_t reserved[36]; -}; -typedef struct vscsiif_response vscsiif_response_t; - -DEFINE_RING_TYPES(vscsiif, struct vscsiif_request, struct vscsiif_response); - - -#endif /*__XEN__PUBLIC_IO_SCSI_H__*/ -/* - * Local variables: - * mode: C - * c-file-style: "BSD" - * c-basic-offset: 4 - * tab-width: 4 - * indent-tabs-mode: nil - * End: - */ diff --git a/sys/xen/interface/io/xenbus.h b/sys/xen/interface/io/xenbus.h deleted file mode 100644 index 927f9db55287..000000000000 --- a/sys/xen/interface/io/xenbus.h +++ /dev/null @@ -1,80 +0,0 @@ -/***************************************************************************** - * xenbus.h - * - * Xenbus protocol details. - * - * 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 XenSource Ltd. - */ - -#ifndef _XEN_PUBLIC_IO_XENBUS_H -#define _XEN_PUBLIC_IO_XENBUS_H - -/* - * The state of either end of the Xenbus, i.e. the current communication - * status of initialisation across the bus. States here imply nothing about - * the state of the connection between the driver and the kernel's device - * layers. - */ -enum xenbus_state { - XenbusStateUnknown = 0, - - XenbusStateInitialising = 1, - - /* - * InitWait: Finished early initialisation but waiting for information - * from the peer or hotplug scripts. - */ - XenbusStateInitWait = 2, - - /* - * Initialised: Waiting for a connection from the peer. - */ - XenbusStateInitialised = 3, - - XenbusStateConnected = 4, - - /* - * Closing: The device is being closed due to an error or an unplug event. - */ - XenbusStateClosing = 5, - - XenbusStateClosed = 6, - - /* - * Reconfiguring: The device is being reconfigured. - */ - XenbusStateReconfiguring = 7, - - XenbusStateReconfigured = 8 -}; -typedef enum xenbus_state XenbusState; - -#endif /* _XEN_PUBLIC_IO_XENBUS_H */ - -/* - * Local variables: - * mode: C - * c-file-style: "BSD" - * c-basic-offset: 4 - * tab-width: 4 - * indent-tabs-mode: nil - * End: - */ diff --git a/sys/xen/interface/io/xs_wire.h b/sys/xen/interface/io/xs_wire.h deleted file mode 100644 index 4dd663266961..000000000000 --- a/sys/xen/interface/io/xs_wire.h +++ /dev/null @@ -1,153 +0,0 @@ -/* - * Details of the "wire" protocol between Xen Store Daemon and client - * library or guest kernel. - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to - * deal in the Software without restriction, including without limitation the - * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or - * sell copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - * - * Copyright (C) 2005 Rusty Russell IBM Corporation - */ - -#ifndef _XS_WIRE_H -#define _XS_WIRE_H - -enum xsd_sockmsg_type -{ - XS_CONTROL, -#define XS_DEBUG XS_CONTROL - XS_DIRECTORY, - XS_READ, - XS_GET_PERMS, - XS_WATCH, - XS_UNWATCH, - XS_TRANSACTION_START, - XS_TRANSACTION_END, - XS_INTRODUCE, - XS_RELEASE, - XS_GET_DOMAIN_PATH, - XS_WRITE, - XS_MKDIR, - XS_RM, - XS_SET_PERMS, - XS_WATCH_EVENT, - XS_ERROR, - XS_IS_DOMAIN_INTRODUCED, - XS_RESUME, - XS_SET_TARGET, - /* XS_RESTRICT has been removed */ - XS_RESET_WATCHES = XS_SET_TARGET + 2, - XS_DIRECTORY_PART, - - XS_TYPE_COUNT, /* Number of valid types. */ - - XS_INVALID = 0xffff /* Guaranteed to remain an invalid type */ -}; - -#define XS_WRITE_NONE "NONE" -#define XS_WRITE_CREATE "CREATE" -#define XS_WRITE_CREATE_EXCL "CREATE|EXCL" - -/* We hand errors as strings, for portability. */ -struct xsd_errors -{ - int errnum; - const char *errstring; -}; -#ifdef EINVAL -#define XSD_ERROR(x) { x, #x } -/* LINTED: static unused */ -static struct xsd_errors xsd_errors[] -#if defined(__GNUC__) -__attribute__((unused)) -#endif - = { - XSD_ERROR(EINVAL), - XSD_ERROR(EACCES), - XSD_ERROR(EEXIST), - XSD_ERROR(EISDIR), - XSD_ERROR(ENOENT), - XSD_ERROR(ENOMEM), - XSD_ERROR(ENOSPC), - XSD_ERROR(EIO), - XSD_ERROR(ENOTEMPTY), - XSD_ERROR(ENOSYS), - XSD_ERROR(EROFS), - XSD_ERROR(EBUSY), - XSD_ERROR(EAGAIN), - XSD_ERROR(EISCONN), - XSD_ERROR(E2BIG) -}; -#endif - -struct xsd_sockmsg -{ - uint32_t type; /* XS_??? */ - uint32_t req_id;/* Request identifier, echoed in daemon's response. */ - uint32_t tx_id; /* Transaction id (0 if not related to a transaction). */ - uint32_t len; /* Length of data following this. */ - - /* Generally followed by nul-terminated string(s). */ -}; - -enum xs_watch_type -{ - XS_WATCH_PATH = 0, - XS_WATCH_TOKEN -}; - -/* - * `incontents 150 xenstore_struct XenStore wire protocol. - * - * Inter-domain shared memory communications. */ -#define XENSTORE_RING_SIZE 1024 -typedef uint32_t XENSTORE_RING_IDX; -#define MASK_XENSTORE_IDX(idx) ((idx) & (XENSTORE_RING_SIZE-1)) -struct xenstore_domain_interface { - char req[XENSTORE_RING_SIZE]; /* Requests to xenstore daemon. */ - char rsp[XENSTORE_RING_SIZE]; /* Replies and async watch events. */ - XENSTORE_RING_IDX req_cons, req_prod; - XENSTORE_RING_IDX rsp_cons, rsp_prod; - uint32_t server_features; /* Bitmap of features supported by the server */ - uint32_t connection; -}; - -/* Violating this is very bad. See docs/misc/xenstore.txt. */ -#define XENSTORE_PAYLOAD_MAX 4096 - -/* Violating these just gets you an error back */ -#define XENSTORE_ABS_PATH_MAX 3072 -#define XENSTORE_REL_PATH_MAX 2048 - -/* The ability to reconnect a ring */ -#define XENSTORE_SERVER_FEATURE_RECONNECTION 1 - -/* Valid values for the connection field */ -#define XENSTORE_CONNECTED 0 /* the steady-state */ -#define XENSTORE_RECONNECT 1 /* guest has initiated a reconnect */ - -#endif /* _XS_WIRE_H */ - -/* - * Local variables: - * mode: C - * c-file-style: "BSD" - * c-basic-offset: 4 - * tab-width: 4 - * indent-tabs-mode: nil - * End: - */ diff --git a/sys/xen/interface/kexec.h b/sys/xen/interface/kexec.h deleted file mode 100644 index 3f2a118381ba..000000000000 --- a/sys/xen/interface/kexec.h +++ /dev/null @@ -1,263 +0,0 @@ -/****************************************************************************** - * kexec.h - Public portion - * - * 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. - * - * Xen port written by: - * - Simon 'Horms' Horman - * - Magnus Damm - */ - -#ifndef _XEN_PUBLIC_KEXEC_H -#define _XEN_PUBLIC_KEXEC_H - - -/* This file describes the Kexec / Kdump hypercall interface for Xen. - * - * Kexec under vanilla Linux allows a user to reboot the physical machine - * into a new user-specified kernel. The Xen port extends this idea - * to allow rebooting of the machine from dom0. When kexec for dom0 - * is used to reboot, both the hypervisor and the domains get replaced - * with some other kernel. It is possible to kexec between vanilla - * Linux and Xen and back again. Xen to Xen works well too. - * - * The hypercall interface for kexec can be divided into three main - * types of hypercall operations: - * - * 1) Range information: - * This is used by the dom0 kernel to ask the hypervisor about various - * address information. This information is needed to allow kexec-tools - * to fill in the ELF headers for /proc/vmcore properly. - * - * 2) Load and unload of images: - * There are no big surprises here, the kexec binary from kexec-tools - * runs in userspace in dom0. The tool loads/unloads data into the - * dom0 kernel such as new kernel, initramfs and hypervisor. When - * loaded the dom0 kernel performs a load hypercall operation, and - * before releasing all page references the dom0 kernel calls unload. - * - * 3) Kexec operation: - * This is used to start a previously loaded kernel. - */ - -#include "xen.h" - -#if defined(__i386__) || defined(__x86_64__) -#define KEXEC_XEN_NO_PAGES 17 -#endif - -/* - * Prototype for this hypercall is: - * int kexec_op(int cmd, void *args) - * @cmd == KEXEC_CMD_... - * KEXEC operation to perform - * @args == Operation-specific extra arguments (NULL if none). - */ - -/* - * Kexec supports two types of operation: - * - kexec into a regular kernel, very similar to a standard reboot - * - KEXEC_TYPE_DEFAULT is used to specify this type - * - kexec into a special "crash kernel", aka kexec-on-panic - * - KEXEC_TYPE_CRASH is used to specify this type - * - parts of our system may be broken at kexec-on-panic time - * - the code should be kept as simple and self-contained as possible - */ - -#define KEXEC_TYPE_DEFAULT 0 -#define KEXEC_TYPE_CRASH 1 - - -/* The kexec implementation for Xen allows the user to load two - * types of kernels, KEXEC_TYPE_DEFAULT and KEXEC_TYPE_CRASH. - * All data needed for a kexec reboot is kept in one xen_kexec_image_t - * per "instance". The data mainly consists of machine address lists to pages - * together with destination addresses. The data in xen_kexec_image_t - * is passed to the "code page" which is one page of code that performs - * the final relocations before jumping to the new kernel. - */ - -typedef struct xen_kexec_image { -#if defined(__i386__) || defined(__x86_64__) - unsigned long page_list[KEXEC_XEN_NO_PAGES]; -#endif - unsigned long indirection_page; - unsigned long start_address; -} xen_kexec_image_t; - -/* - * Perform kexec having previously loaded a kexec or kdump kernel - * as appropriate. - * type == KEXEC_TYPE_DEFAULT or KEXEC_TYPE_CRASH [in] - * - * Control is transferred to the image entry point with the host in - * the following state. - * - * - The image may be executed on any PCPU and all other PCPUs are - * stopped. - * - * - Local interrupts are disabled. - * - * - Register values are undefined. - * - * - The image segments have writeable 1:1 virtual to machine - * mappings. The location of any page tables is undefined and these - * page table frames are not be mapped. - */ -#define KEXEC_CMD_kexec 0 -typedef struct xen_kexec_exec { - int type; -} xen_kexec_exec_t; - -/* - * Load/Unload kernel image for kexec or kdump. - * type == KEXEC_TYPE_DEFAULT or KEXEC_TYPE_CRASH [in] - * image == relocation information for kexec (ignored for unload) [in] - */ -#define KEXEC_CMD_kexec_load_v1 1 /* obsolete since 0x00040400 */ -#define KEXEC_CMD_kexec_unload_v1 2 /* obsolete since 0x00040400 */ -typedef struct xen_kexec_load_v1 { - int type; - xen_kexec_image_t image; -} xen_kexec_load_v1_t; - -#define KEXEC_RANGE_MA_CRASH 0 /* machine address and size of crash area */ -#define KEXEC_RANGE_MA_XEN 1 /* machine address and size of Xen itself */ -#define KEXEC_RANGE_MA_CPU 2 /* machine address and size of a CPU note */ -#define KEXEC_RANGE_MA_XENHEAP 3 /* machine address and size of xenheap - * Note that although this is adjacent - * to Xen it exists in a separate EFI - * region on ia64, and thus needs to be - * inserted into iomem_machine separately */ -#define KEXEC_RANGE_MA_BOOT_PARAM 4 /* Obsolete: machine address and size of - * the ia64_boot_param */ -#define KEXEC_RANGE_MA_EFI_MEMMAP 5 /* machine address and size of - * of the EFI Memory Map */ -#define KEXEC_RANGE_MA_VMCOREINFO 6 /* machine address and size of vmcoreinfo */ - -/* - * Find the address and size of certain memory areas - * range == KEXEC_RANGE_... [in] - * nr == physical CPU number (starting from 0) if KEXEC_RANGE_MA_CPU [in] - * size == number of bytes reserved in window [out] - * start == address of the first byte in the window [out] - */ -#define KEXEC_CMD_kexec_get_range 3 -typedef struct xen_kexec_range { - int range; - int nr; - unsigned long size; - unsigned long start; -} xen_kexec_range_t; - -#if __XEN_INTERFACE_VERSION__ >= 0x00040400 -/* - * A contiguous chunk of a kexec image and it's destination machine - * address. - */ -typedef struct xen_kexec_segment { - union { - XEN_GUEST_HANDLE(const_void) h; - uint64_t _pad; - } buf; - uint64_t buf_size; - uint64_t dest_maddr; - uint64_t dest_size; -} xen_kexec_segment_t; -DEFINE_XEN_GUEST_HANDLE(xen_kexec_segment_t); - -/* - * Load a kexec image into memory. - * - * For KEXEC_TYPE_DEFAULT images, the segments may be anywhere in RAM. - * The image is relocated prior to being executed. - * - * For KEXEC_TYPE_CRASH images, each segment of the image must reside - * in the memory region reserved for kexec (KEXEC_RANGE_MA_CRASH) and - * the entry point must be within the image. The caller is responsible - * for ensuring that multiple images do not overlap. - * - * All image segments will be loaded to their destination machine - * addresses prior to being executed. The trailing portion of any - * segments with a source buffer (from dest_maddr + buf_size to - * dest_maddr + dest_size) will be zeroed. - * - * Segments with no source buffer will be accessible to the image when - * it is executed. - */ - -#define KEXEC_CMD_kexec_load 4 -typedef struct xen_kexec_load { - uint8_t type; /* One of KEXEC_TYPE_* */ - uint8_t _pad; - uint16_t arch; /* ELF machine type (EM_*). */ - uint32_t nr_segments; - union { - XEN_GUEST_HANDLE(xen_kexec_segment_t) h; - uint64_t _pad; - } segments; - uint64_t entry_maddr; /* image entry point machine address. */ -} xen_kexec_load_t; -DEFINE_XEN_GUEST_HANDLE(xen_kexec_load_t); - -/* - * Unload a kexec image. - * - * Type must be one of KEXEC_TYPE_DEFAULT or KEXEC_TYPE_CRASH. - */ -#define KEXEC_CMD_kexec_unload 5 -typedef struct xen_kexec_unload { - uint8_t type; -} xen_kexec_unload_t; -DEFINE_XEN_GUEST_HANDLE(xen_kexec_unload_t); - -/* - * Figure out whether we have an image loaded. A return value of - * zero indicates no image loaded. A return value of one - * indicates an image is loaded. A negative return value - * indicates an error. - * - * Type must be one of KEXEC_TYPE_DEFAULT or KEXEC_TYPE_CRASH. - */ -#define KEXEC_CMD_kexec_status 6 -typedef struct xen_kexec_status { - uint8_t type; -} xen_kexec_status_t; -DEFINE_XEN_GUEST_HANDLE(xen_kexec_status_t); - -#else /* __XEN_INTERFACE_VERSION__ < 0x00040400 */ - -#define KEXEC_CMD_kexec_load KEXEC_CMD_kexec_load_v1 -#define KEXEC_CMD_kexec_unload KEXEC_CMD_kexec_unload_v1 -#define xen_kexec_load xen_kexec_load_v1 -#define xen_kexec_load_t xen_kexec_load_v1_t - -#endif - -#endif /* _XEN_PUBLIC_KEXEC_H */ - -/* - * Local variables: - * mode: C - * c-file-style: "BSD" - * c-basic-offset: 4 - * tab-width: 4 - * indent-tabs-mode: nil - * End: - */ diff --git a/sys/xen/interface/memory.h b/sys/xen/interface/memory.h deleted file mode 100644 index 21057ed78e3d..000000000000 --- a/sys/xen/interface/memory.h +++ /dev/null @@ -1,735 +0,0 @@ -/****************************************************************************** - * 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 - */ - -#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 - * physical address space (translated guests only). - * 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 - * physical address space (translated guests only). - * 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; - - /* IN: (XENMEM_paging_op_prep) buffer to immediately fill page from */ - XEN_GUEST_HANDLE_64(const_uint8) buffer; - /* IN: gfn of page being operated on */ - uint64_aligned_t gfn; -}; -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_fork 9 -#define XENMEM_sharing_op_fork_reset 10 - -#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; - struct mem_sharing_op_fork { /* OP_FORK */ - domid_t parent_domain; /* IN: parent's domain id */ -/* Only makes sense for short-lived forks */ -#define XENMEM_FORK_WITH_IOMMU_ALLOWED (1u << 0) -/* Only makes sense for short-lived forks */ -#define XENMEM_FORK_BLOCK_INTERRUPTS (1u << 1) - uint16_t flags; /* IN: optional settings */ - uint32_t pad; /* Must be set to 0 */ - } fork; - } 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 total page count 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__) */ - -/* - * Get the pages for a particular guest resource, so that they can be - * mapped directly by a tools domain. - */ -#define XENMEM_acquire_resource 28 -struct xen_mem_acquire_resource { - /* IN - The domain whose resource is to be mapped */ - domid_t domid; - /* IN - the type of resource */ - uint16_t type; - -#define XENMEM_resource_ioreq_server 0 -#define XENMEM_resource_grant_table 1 - - /* - * IN - a type-specific resource identifier, which must be zero - * unless stated otherwise. - * - * type == XENMEM_resource_ioreq_server -> id == ioreq server id - * type == XENMEM_resource_grant_table -> id defined below - */ - uint32_t id; - -#define XENMEM_resource_grant_table_id_shared 0 -#define XENMEM_resource_grant_table_id_status 1 - - /* - * IN/OUT - As an IN parameter number of frames of the resource - * to be mapped. However, if the specified value is 0 and - * frame_list is NULL then this field will be set to the - * maximum value supported by the implementation on return. - */ - uint32_t nr_frames; - uint32_t pad; - /* - * IN - the index of the initial frame to be mapped. This parameter - * is ignored if nr_frames is 0. - */ - uint64_t frame; - -#define XENMEM_resource_ioreq_server_frame_bufioreq 0 -#define XENMEM_resource_ioreq_server_frame_ioreq(n) (1 + (n)) - - /* - * IN/OUT - If the tools domain is PV then, upon return, frame_list - * will be populated with the MFNs of the resource. - * If the tools domain is HVM then it is expected that, on - * entry, frame_list will be populated with a list of GFNs - * that will be mapped to the MFNs of the resource. - * If -EIO is returned then the frame_list has only been - * partially mapped and it is up to the caller to unmap all - * the GFNs. - * This parameter may be NULL if nr_frames is 0. - */ - XEN_GUEST_HANDLE(xen_pfn_t) frame_list; -}; -typedef struct xen_mem_acquire_resource xen_mem_acquire_resource_t; -DEFINE_XEN_GUEST_HANDLE(xen_mem_acquire_resource_t); - -/* - * 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 29 */ - -#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/sys/xen/interface/nmi.h b/sys/xen/interface/nmi.h deleted file mode 100644 index 4dd7294d72d3..000000000000 --- a/sys/xen/interface/nmi.h +++ /dev/null @@ -1,85 +0,0 @@ -/****************************************************************************** - * nmi.h - * - * NMI callback registration and reason codes. - * - * 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 - */ - -#ifndef __XEN_PUBLIC_NMI_H__ -#define __XEN_PUBLIC_NMI_H__ - -#include "xen.h" - -/* - * NMI reason codes: - * Currently these are x86-specific, stored in arch_shared_info.nmi_reason. - */ - /* I/O-check error reported via ISA port 0x61, bit 6. */ -#define _XEN_NMIREASON_io_error 0 -#define XEN_NMIREASON_io_error (1UL << _XEN_NMIREASON_io_error) - /* PCI SERR reported via ISA port 0x61, bit 7. */ -#define _XEN_NMIREASON_pci_serr 1 -#define XEN_NMIREASON_pci_serr (1UL << _XEN_NMIREASON_pci_serr) -#if __XEN_INTERFACE_VERSION__ < 0x00040300 /* legacy alias of the above */ - /* Parity error reported via ISA port 0x61, bit 7. */ -#define _XEN_NMIREASON_parity_error 1 -#define XEN_NMIREASON_parity_error (1UL << _XEN_NMIREASON_parity_error) -#endif - /* Unknown hardware-generated NMI. */ -#define _XEN_NMIREASON_unknown 2 -#define XEN_NMIREASON_unknown (1UL << _XEN_NMIREASON_unknown) - -/* - * long nmi_op(unsigned int cmd, void *arg) - * NB. All ops return zero on success, else a negative error code. - */ - -/* - * Register NMI callback for this (calling) VCPU. Currently this only makes - * sense for domain 0, vcpu 0. All other callers will be returned EINVAL. - * arg == pointer to xennmi_callback structure. - */ -#define XENNMI_register_callback 0 -struct xennmi_callback { - unsigned long handler_address; - unsigned long pad; -}; -typedef struct xennmi_callback xennmi_callback_t; -DEFINE_XEN_GUEST_HANDLE(xennmi_callback_t); - -/* - * Deregister NMI callback for this (calling) VCPU. - * arg == NULL. - */ -#define XENNMI_unregister_callback 1 - -#endif /* __XEN_PUBLIC_NMI_H__ */ - -/* - * Local variables: - * mode: C - * c-file-style: "BSD" - * c-basic-offset: 4 - * tab-width: 4 - * indent-tabs-mode: nil - * End: - */ diff --git a/sys/xen/interface/physdev.h b/sys/xen/interface/physdev.h deleted file mode 100644 index aedb71d678f9..000000000000 --- a/sys/xen/interface/physdev.h +++ /dev/null @@ -1,383 +0,0 @@ -/* - * 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) - */ - uint32_t optarr[XEN_FLEX_ARRAY_DIM]; -}; -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/sys/xen/interface/platform.h b/sys/xen/interface/platform.h deleted file mode 100644 index f3c84ebc7841..000000000000 --- a/sys/xen/interface/platform.h +++ /dev/null @@ -1,663 +0,0 @@ -/****************************************************************************** - * platform.h - * - * Hardware platform operations. Intended for use by domain-0 kernel. - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to - * deal in the Software without restriction, including without limitation the - * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or - * sell copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - * - * Copyright (c) 2002-2006, K Fraser - */ - -#ifndef __XEN_PUBLIC_PLATFORM_H__ -#define __XEN_PUBLIC_PLATFORM_H__ - -#include "xen.h" - -#define XENPF_INTERFACE_VERSION 0x03000001 - -/* - * Set clock such that it would read after 00:00:00 UTC, - * 1 January, 1970 if the current system time was . - */ -#define XENPF_settime32 17 -struct xenpf_settime32 { - /* IN variables. */ - uint32_t secs; - uint32_t nsecs; - uint64_t system_time; -}; -#define XENPF_settime64 62 -struct xenpf_settime64 { - /* IN variables. */ - uint64_t secs; - uint32_t nsecs; - uint32_t mbz; - uint64_t system_time; -}; -#if __XEN_INTERFACE_VERSION__ < 0x00040600 -#define XENPF_settime XENPF_settime32 -#define xenpf_settime xenpf_settime32 -#else -#define XENPF_settime XENPF_settime64 -#define xenpf_settime xenpf_settime64 -#endif -typedef struct xenpf_settime xenpf_settime_t; -DEFINE_XEN_GUEST_HANDLE(xenpf_settime_t); - -/* - * Request memory range (@mfn, @mfn+@nr_mfns-1) to have type @type. - * On x86, @type is an architecture-defined MTRR memory type. - * On success, returns the MTRR that was used (@reg) and a handle that can - * be passed to XENPF_DEL_MEMTYPE to accurately tear down the new setting. - * (x86-specific). - */ -#define XENPF_add_memtype 31 -struct xenpf_add_memtype { - /* IN variables. */ - xen_pfn_t mfn; - uint64_t nr_mfns; - uint32_t type; - /* OUT variables. */ - uint32_t handle; - uint32_t reg; -}; -typedef struct xenpf_add_memtype xenpf_add_memtype_t; -DEFINE_XEN_GUEST_HANDLE(xenpf_add_memtype_t); - -/* - * Tear down an existing memory-range type. If @handle is remembered then it - * should be passed in to accurately tear down the correct setting (in case - * of overlapping memory regions with differing types). If it is not known - * then @handle should be set to zero. In all cases @reg must be set. - * (x86-specific). - */ -#define XENPF_del_memtype 32 -struct xenpf_del_memtype { - /* IN variables. */ - uint32_t handle; - uint32_t reg; -}; -typedef struct xenpf_del_memtype xenpf_del_memtype_t; -DEFINE_XEN_GUEST_HANDLE(xenpf_del_memtype_t); - -/* Read current type of an MTRR (x86-specific). */ -#define XENPF_read_memtype 33 -struct xenpf_read_memtype { - /* IN variables. */ - uint32_t reg; - /* OUT variables. */ - xen_pfn_t mfn; - uint64_t nr_mfns; - uint32_t type; -}; -typedef struct xenpf_read_memtype xenpf_read_memtype_t; -DEFINE_XEN_GUEST_HANDLE(xenpf_read_memtype_t); - -#define XENPF_microcode_update 35 -struct xenpf_microcode_update { - /* IN variables. */ - XEN_GUEST_HANDLE(const_void) data;/* Pointer to microcode data */ - uint32_t length; /* Length of microcode data. */ -}; -typedef struct xenpf_microcode_update xenpf_microcode_update_t; -DEFINE_XEN_GUEST_HANDLE(xenpf_microcode_update_t); - -#define XENPF_platform_quirk 39 -#define QUIRK_NOIRQBALANCING 1 /* Do not restrict IO-APIC RTE targets */ -#define QUIRK_IOAPIC_BAD_REGSEL 2 /* IO-APIC REGSEL forgets its value */ -#define QUIRK_IOAPIC_GOOD_REGSEL 3 /* IO-APIC REGSEL behaves properly */ -struct xenpf_platform_quirk { - /* IN variables. */ - uint32_t quirk_id; -}; -typedef struct xenpf_platform_quirk xenpf_platform_quirk_t; -DEFINE_XEN_GUEST_HANDLE(xenpf_platform_quirk_t); - -#define XENPF_efi_runtime_call 49 -#define XEN_EFI_get_time 1 -#define XEN_EFI_set_time 2 -#define XEN_EFI_get_wakeup_time 3 -#define XEN_EFI_set_wakeup_time 4 -#define XEN_EFI_get_next_high_monotonic_count 5 -#define XEN_EFI_get_variable 6 -#define XEN_EFI_set_variable 7 -#define XEN_EFI_get_next_variable_name 8 -#define XEN_EFI_query_variable_info 9 -#define XEN_EFI_query_capsule_capabilities 10 -#define XEN_EFI_update_capsule 11 - -struct xenpf_efi_time { - uint16_t year; - uint8_t month; - uint8_t day; - uint8_t hour; - uint8_t min; - uint8_t sec; - uint32_t ns; - int16_t tz; - uint8_t daylight; -}; - -struct xenpf_efi_guid { - uint32_t data1; - uint16_t data2; - uint16_t data3; - uint8_t data4[8]; -}; - -struct xenpf_efi_runtime_call { - uint32_t function; - /* - * This field is generally used for per sub-function flags (defined - * below), except for the XEN_EFI_get_next_high_monotonic_count case, - * where it holds the single returned value. - */ - uint32_t misc; - xen_ulong_t status; - union { -#define XEN_EFI_GET_TIME_SET_CLEARS_NS 0x00000001 - struct { - struct xenpf_efi_time time; - uint32_t resolution; - uint32_t accuracy; - } get_time; - - struct xenpf_efi_time set_time; - -#define XEN_EFI_GET_WAKEUP_TIME_ENABLED 0x00000001 -#define XEN_EFI_GET_WAKEUP_TIME_PENDING 0x00000002 - struct xenpf_efi_time get_wakeup_time; - -#define XEN_EFI_SET_WAKEUP_TIME_ENABLE 0x00000001 -#define XEN_EFI_SET_WAKEUP_TIME_ENABLE_ONLY 0x00000002 - struct xenpf_efi_time set_wakeup_time; - -#define XEN_EFI_VARIABLE_NON_VOLATILE 0x00000001 -#define XEN_EFI_VARIABLE_BOOTSERVICE_ACCESS 0x00000002 -#define XEN_EFI_VARIABLE_RUNTIME_ACCESS 0x00000004 - struct { - XEN_GUEST_HANDLE(void) name; /* UCS-2/UTF-16 string */ - xen_ulong_t size; - XEN_GUEST_HANDLE(void) data; - struct xenpf_efi_guid vendor_guid; - } get_variable, set_variable; - - struct { - xen_ulong_t size; - XEN_GUEST_HANDLE(void) name; /* UCS-2/UTF-16 string */ - struct xenpf_efi_guid vendor_guid; - } get_next_variable_name; - -#define XEN_EFI_VARINFO_BOOT_SNAPSHOT 0x00000001 - struct { - uint32_t attr; - uint64_t max_store_size; - uint64_t remain_store_size; - uint64_t max_size; - } query_variable_info; - - struct { - XEN_GUEST_HANDLE(void) capsule_header_array; - xen_ulong_t capsule_count; - uint64_t max_capsule_size; - uint32_t reset_type; - } query_capsule_capabilities; - - struct { - XEN_GUEST_HANDLE(void) capsule_header_array; - xen_ulong_t capsule_count; - uint64_t sg_list; /* machine address */ - } update_capsule; - } u; -}; -typedef struct xenpf_efi_runtime_call xenpf_efi_runtime_call_t; -DEFINE_XEN_GUEST_HANDLE(xenpf_efi_runtime_call_t); - -#define XENPF_firmware_info 50 -#define XEN_FW_DISK_INFO 1 /* from int 13 AH=08/41/48 */ -#define XEN_FW_DISK_MBR_SIGNATURE 2 /* from MBR offset 0x1b8 */ -#define XEN_FW_VBEDDC_INFO 3 /* from int 10 AX=4f15 */ -#define XEN_FW_EFI_INFO 4 /* from EFI */ -#define XEN_FW_EFI_VERSION 0 -#define XEN_FW_EFI_CONFIG_TABLE 1 -#define XEN_FW_EFI_VENDOR 2 -#define XEN_FW_EFI_MEM_INFO 3 -#define XEN_FW_EFI_RT_VERSION 4 -#define XEN_FW_EFI_PCI_ROM 5 -#define XEN_FW_EFI_APPLE_PROPERTIES 6 -#define XEN_FW_KBD_SHIFT_FLAGS 5 -struct xenpf_firmware_info { - /* IN variables. */ - uint32_t type; - uint32_t index; - /* OUT variables. */ - union { - struct { - /* Int13, Fn48: Check Extensions Present. */ - uint8_t device; /* %dl: bios device number */ - uint8_t version; /* %ah: major version */ - uint16_t interface_support; /* %cx: support bitmap */ - /* Int13, Fn08: Legacy Get Device Parameters. */ - uint16_t legacy_max_cylinder; /* %cl[7:6]:%ch: max cyl # */ - uint8_t legacy_max_head; /* %dh: max head # */ - uint8_t legacy_sectors_per_track; /* %cl[5:0]: max sector # */ - /* Int13, Fn41: Get Device Parameters (as filled into %ds:%esi). */ - /* NB. First uint16_t of buffer must be set to buffer size. */ - XEN_GUEST_HANDLE(void) edd_params; - } disk_info; /* XEN_FW_DISK_INFO */ - struct { - uint8_t device; /* bios device number */ - uint32_t mbr_signature; /* offset 0x1b8 in mbr */ - } disk_mbr_signature; /* XEN_FW_DISK_MBR_SIGNATURE */ - struct { - /* Int10, AX=4F15: Get EDID info. */ - uint8_t capabilities; - uint8_t edid_transfer_time; - /* must refer to 128-byte buffer */ - XEN_GUEST_HANDLE(uint8) edid; - } vbeddc_info; /* XEN_FW_VBEDDC_INFO */ - union xenpf_efi_info { - uint32_t version; - struct { - uint64_t addr; /* EFI_CONFIGURATION_TABLE */ - uint32_t nent; - } cfg; - struct { - uint32_t revision; - uint32_t bufsz; /* input, in bytes */ - XEN_GUEST_HANDLE(void) name; /* UCS-2/UTF-16 string */ - } vendor; - struct { - uint64_t addr; - uint64_t size; - uint64_t attr; - uint32_t type; - } mem; - struct { - /* IN variables */ - uint16_t segment; - uint8_t bus; - uint8_t devfn; - uint16_t vendor; - uint16_t devid; - /* OUT variables */ - uint64_t address; - xen_ulong_t size; - } pci_rom; - struct { - /* OUT variables */ - uint64_t address; - xen_ulong_t size; - } apple_properties; - } efi_info; /* XEN_FW_EFI_INFO */ - - /* Int16, Fn02: Get keyboard shift flags. */ - uint8_t kbd_shift_flags; /* XEN_FW_KBD_SHIFT_FLAGS */ - } u; -}; -typedef struct xenpf_firmware_info xenpf_firmware_info_t; -DEFINE_XEN_GUEST_HANDLE(xenpf_firmware_info_t); - -#define XENPF_enter_acpi_sleep 51 -struct xenpf_enter_acpi_sleep { - /* IN variables */ -#if __XEN_INTERFACE_VERSION__ < 0x00040300 - uint16_t pm1a_cnt_val; /* PM1a control value. */ - uint16_t pm1b_cnt_val; /* PM1b control value. */ -#else - uint16_t val_a; /* PM1a control / sleep type A. */ - uint16_t val_b; /* PM1b control / sleep type B. */ -#endif - uint32_t sleep_state; /* Which state to enter (Sn). */ -#define XENPF_ACPI_SLEEP_EXTENDED 0x00000001 - uint32_t flags; /* XENPF_ACPI_SLEEP_*. */ -}; -typedef struct xenpf_enter_acpi_sleep xenpf_enter_acpi_sleep_t; -DEFINE_XEN_GUEST_HANDLE(xenpf_enter_acpi_sleep_t); - -#define XENPF_change_freq 52 -struct xenpf_change_freq { - /* IN variables */ - uint32_t flags; /* Must be zero. */ - uint32_t cpu; /* Physical cpu. */ - uint64_t freq; /* New frequency (Hz). */ -}; -typedef struct xenpf_change_freq xenpf_change_freq_t; -DEFINE_XEN_GUEST_HANDLE(xenpf_change_freq_t); - -/* - * Get idle times (nanoseconds since boot) for physical CPUs specified in the - * @cpumap_bitmap with range [0..@cpumap_nr_cpus-1]. The @idletime array is - * indexed by CPU number; only entries with the corresponding @cpumap_bitmap - * bit set are written to. On return, @cpumap_bitmap is modified so that any - * non-existent CPUs are cleared. Such CPUs have their @idletime array entry - * cleared. - */ -#define XENPF_getidletime 53 -struct xenpf_getidletime { - /* IN/OUT variables */ - /* IN: CPUs to interrogate; OUT: subset of IN which are present */ - XEN_GUEST_HANDLE(uint8) cpumap_bitmap; - /* IN variables */ - /* Size of cpumap bitmap. */ - uint32_t cpumap_nr_cpus; - /* Must be indexable for every cpu in cpumap_bitmap. */ - XEN_GUEST_HANDLE(uint64) idletime; - /* OUT variables */ - /* System time when the idletime snapshots were taken. */ - uint64_t now; -}; -typedef struct xenpf_getidletime xenpf_getidletime_t; -DEFINE_XEN_GUEST_HANDLE(xenpf_getidletime_t); - -#define XENPF_set_processor_pminfo 54 - -/* ability bits */ -#define XEN_PROCESSOR_PM_CX 1 -#define XEN_PROCESSOR_PM_PX 2 -#define XEN_PROCESSOR_PM_TX 4 - -/* cmd type */ -#define XEN_PM_CX 0 -#define XEN_PM_PX 1 -#define XEN_PM_TX 2 -#define XEN_PM_PDC 3 - -/* Px sub info type */ -#define XEN_PX_PCT 1 -#define XEN_PX_PSS 2 -#define XEN_PX_PPC 4 -#define XEN_PX_PSD 8 - -struct xen_power_register { - uint32_t space_id; - uint32_t bit_width; - uint32_t bit_offset; - uint32_t access_size; - uint64_t address; -}; - -struct xen_processor_csd { - uint32_t domain; /* domain number of one dependent group */ - uint32_t coord_type; /* coordination type */ - uint32_t num; /* number of processors in same domain */ -}; -typedef struct xen_processor_csd xen_processor_csd_t; -DEFINE_XEN_GUEST_HANDLE(xen_processor_csd_t); - -struct xen_processor_cx { - struct xen_power_register reg; /* GAS for Cx trigger register */ - uint8_t type; /* cstate value, c0: 0, c1: 1, ... */ - uint32_t latency; /* worst latency (ms) to enter/exit this cstate */ - uint32_t power; /* average power consumption(mW) */ - uint32_t dpcnt; /* number of dependency entries */ - XEN_GUEST_HANDLE(xen_processor_csd_t) dp; /* NULL if no dependency */ -}; -typedef struct xen_processor_cx xen_processor_cx_t; -DEFINE_XEN_GUEST_HANDLE(xen_processor_cx_t); - -struct xen_processor_flags { - uint32_t bm_control:1; - uint32_t bm_check:1; - uint32_t has_cst:1; - uint32_t power_setup_done:1; - uint32_t bm_rld_set:1; -}; - -struct xen_processor_power { - uint32_t count; /* number of C state entries in array below */ - struct xen_processor_flags flags; /* global flags of this processor */ - XEN_GUEST_HANDLE(xen_processor_cx_t) states; /* supported c states */ -}; - -struct xen_pct_register { - uint8_t descriptor; - uint16_t length; - uint8_t space_id; - uint8_t bit_width; - uint8_t bit_offset; - uint8_t reserved; - uint64_t address; -}; - -struct xen_processor_px { - uint64_t core_frequency; /* megahertz */ - uint64_t power; /* milliWatts */ - uint64_t transition_latency; /* microseconds */ - uint64_t bus_master_latency; /* microseconds */ - uint64_t control; /* control value */ - uint64_t status; /* success indicator */ -}; -typedef struct xen_processor_px xen_processor_px_t; -DEFINE_XEN_GUEST_HANDLE(xen_processor_px_t); - -struct xen_psd_package { - uint64_t num_entries; - uint64_t revision; - uint64_t domain; - uint64_t coord_type; - uint64_t num_processors; -}; - -struct xen_processor_performance { - uint32_t flags; /* flag for Px sub info type */ - uint32_t platform_limit; /* Platform limitation on freq usage */ - struct xen_pct_register control_register; - struct xen_pct_register status_register; - uint32_t state_count; /* total available performance states */ - XEN_GUEST_HANDLE(xen_processor_px_t) states; - struct xen_psd_package domain_info; - uint32_t shared_type; /* coordination type of this processor */ -}; -typedef struct xen_processor_performance xen_processor_performance_t; -DEFINE_XEN_GUEST_HANDLE(xen_processor_performance_t); - -struct xenpf_set_processor_pminfo { - /* IN variables */ - uint32_t id; /* ACPI CPU ID */ - uint32_t type; /* {XEN_PM_CX, XEN_PM_PX} */ - union { - struct xen_processor_power power;/* Cx: _CST/_CSD */ - struct xen_processor_performance perf; /* Px: _PPC/_PCT/_PSS/_PSD */ - XEN_GUEST_HANDLE(uint32) pdc; /* _PDC */ - } u; -}; -typedef struct xenpf_set_processor_pminfo xenpf_set_processor_pminfo_t; -DEFINE_XEN_GUEST_HANDLE(xenpf_set_processor_pminfo_t); - -#define XENPF_get_cpuinfo 55 -struct xenpf_pcpuinfo { - /* IN */ - uint32_t xen_cpuid; - /* OUT */ - /* The maxium cpu_id that is present */ - uint32_t max_present; -#define XEN_PCPU_FLAGS_ONLINE 1 - /* Correponding xen_cpuid is not present*/ -#define XEN_PCPU_FLAGS_INVALID 2 - uint32_t flags; - uint32_t apic_id; - uint32_t acpi_id; -}; -typedef struct xenpf_pcpuinfo xenpf_pcpuinfo_t; -DEFINE_XEN_GUEST_HANDLE(xenpf_pcpuinfo_t); - -#define XENPF_get_cpu_version 48 -struct xenpf_pcpu_version { - /* IN */ - uint32_t xen_cpuid; - /* OUT */ - /* The maxium cpu_id that is present */ - uint32_t max_present; - char vendor_id[12]; - uint32_t family; - uint32_t model; - uint32_t stepping; -}; -typedef struct xenpf_pcpu_version xenpf_pcpu_version_t; -DEFINE_XEN_GUEST_HANDLE(xenpf_pcpu_version_t); - -#define XENPF_cpu_online 56 -#define XENPF_cpu_offline 57 -struct xenpf_cpu_ol -{ - uint32_t cpuid; -}; -typedef struct xenpf_cpu_ol xenpf_cpu_ol_t; -DEFINE_XEN_GUEST_HANDLE(xenpf_cpu_ol_t); - -#define XENPF_cpu_hotadd 58 -struct xenpf_cpu_hotadd -{ - uint32_t apic_id; - uint32_t acpi_id; - uint32_t pxm; -}; - -#define XENPF_mem_hotadd 59 -struct xenpf_mem_hotadd -{ - uint64_t spfn; - uint64_t epfn; - uint32_t pxm; - uint32_t flags; -}; - -#define XENPF_core_parking 60 - -#define XEN_CORE_PARKING_SET 1 -#define XEN_CORE_PARKING_GET 2 -struct xenpf_core_parking { - /* IN variables */ - uint32_t type; - /* IN variables: set cpu nums expected to be idled */ - /* OUT variables: get cpu nums actually be idled */ - uint32_t idle_nums; -}; -typedef struct xenpf_core_parking xenpf_core_parking_t; -DEFINE_XEN_GUEST_HANDLE(xenpf_core_parking_t); - -/* - * Access generic platform resources(e.g., accessing MSR, port I/O, etc) - * in unified way. Batch resource operations in one call are supported and - * they are always non-preemptible and executed in their original order. - * The batch itself returns a negative integer for general errors, or a - * non-negative integer for the number of successful operations. For the latter - * case, the @ret in the failed entry (if any) indicates the exact error. - */ -#define XENPF_resource_op 61 - -#define XEN_RESOURCE_OP_MSR_READ 0 -#define XEN_RESOURCE_OP_MSR_WRITE 1 - -/* - * Specially handled MSRs: - * - MSR_IA32_TSC - * READ: Returns the scaled system time(ns) instead of raw timestamp. In - * multiple entry case, if other MSR read is followed by a MSR_IA32_TSC - * read, then both reads are guaranteed to be performed atomically (with - * IRQ disabled). The return time indicates the point of reading that MSR. - * WRITE: Not supported. - */ - -struct xenpf_resource_entry { - union { - uint32_t cmd; /* IN: XEN_RESOURCE_OP_* */ - int32_t ret; /* OUT: return value for failed entry */ - } u; - uint32_t rsvd; /* IN: padding and must be zero */ - uint64_t idx; /* IN: resource address to access */ - uint64_t val; /* IN/OUT: resource value to set/get */ -}; -typedef struct xenpf_resource_entry xenpf_resource_entry_t; -DEFINE_XEN_GUEST_HANDLE(xenpf_resource_entry_t); - -struct xenpf_resource_op { - uint32_t nr_entries; /* number of resource entry */ - uint32_t cpu; /* which cpu to run */ - XEN_GUEST_HANDLE(xenpf_resource_entry_t) entries; -}; -typedef struct xenpf_resource_op xenpf_resource_op_t; -DEFINE_XEN_GUEST_HANDLE(xenpf_resource_op_t); - -#define XENPF_get_symbol 63 -struct xenpf_symdata { - /* IN/OUT variables */ - uint32_t namelen; /* IN: size of name buffer */ - /* OUT: strlen(name) of hypervisor symbol (may be */ - /* larger than what's been copied to guest) */ - uint32_t symnum; /* IN: Symbol to read */ - /* OUT: Next available symbol. If same as IN then */ - /* we reached the end */ - - /* OUT variables */ - XEN_GUEST_HANDLE(char) name; - uint64_t address; - char type; -}; -typedef struct xenpf_symdata xenpf_symdata_t; -DEFINE_XEN_GUEST_HANDLE(xenpf_symdata_t); - -/* - * ` enum neg_errnoval - * ` HYPERVISOR_platform_op(const struct xen_platform_op*); - */ -struct xen_platform_op { - uint32_t cmd; - uint32_t interface_version; /* XENPF_INTERFACE_VERSION */ - union { - struct xenpf_settime settime; - struct xenpf_settime32 settime32; - struct xenpf_settime64 settime64; - struct xenpf_add_memtype add_memtype; - struct xenpf_del_memtype del_memtype; - struct xenpf_read_memtype read_memtype; - struct xenpf_microcode_update microcode; - struct xenpf_platform_quirk platform_quirk; - struct xenpf_efi_runtime_call efi_runtime_call; - struct xenpf_firmware_info firmware_info; - struct xenpf_enter_acpi_sleep enter_acpi_sleep; - struct xenpf_change_freq change_freq; - struct xenpf_getidletime getidletime; - struct xenpf_set_processor_pminfo set_pminfo; - struct xenpf_pcpuinfo pcpu_info; - struct xenpf_pcpu_version pcpu_version; - struct xenpf_cpu_ol cpu_ol; - struct xenpf_cpu_hotadd cpu_add; - struct xenpf_mem_hotadd mem_add; - struct xenpf_core_parking core_parking; - struct xenpf_resource_op resource_op; - struct xenpf_symdata symdata; - uint8_t pad[128]; - } u; -}; -typedef struct xen_platform_op xen_platform_op_t; -DEFINE_XEN_GUEST_HANDLE(xen_platform_op_t); - -#endif /* __XEN_PUBLIC_PLATFORM_H__ */ - -/* - * Local variables: - * mode: C - * c-file-style: "BSD" - * c-basic-offset: 4 - * tab-width: 4 - * indent-tabs-mode: nil - * End: - */ diff --git a/sys/xen/interface/pmu.h b/sys/xen/interface/pmu.h deleted file mode 100644 index 0e1312cfe50d..000000000000 --- a/sys/xen/interface/pmu.h +++ /dev/null @@ -1,143 +0,0 @@ -/* - * 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) 2015 Oracle and/or its affiliates. All rights reserved. - */ - -#ifndef __XEN_PUBLIC_PMU_H__ -#define __XEN_PUBLIC_PMU_H__ - -#include "xen.h" -#if defined(__i386__) || defined(__x86_64__) -#include "arch-x86/pmu.h" -#elif defined (__arm__) || defined (__aarch64__) -#include "arch-arm.h" -#else -#error "Unsupported architecture" -#endif - -#define XENPMU_VER_MAJ 0 -#define XENPMU_VER_MIN 1 - -/* - * ` enum neg_errnoval - * ` HYPERVISOR_xenpmu_op(enum xenpmu_op cmd, struct xenpmu_params *args); - * - * @cmd == XENPMU_* (PMU operation) - * @args == struct xenpmu_params - */ -/* ` enum xenpmu_op { */ -#define XENPMU_mode_get 0 /* Also used for getting PMU version */ -#define XENPMU_mode_set 1 -#define XENPMU_feature_get 2 -#define XENPMU_feature_set 3 -#define XENPMU_init 4 -#define XENPMU_finish 5 -#define XENPMU_lvtpc_set 6 -#define XENPMU_flush 7 /* Write cached MSR values to HW */ -/* ` } */ - -/* Parameters structure for HYPERVISOR_xenpmu_op call */ -struct xen_pmu_params { - /* IN/OUT parameters */ - struct { - uint32_t maj; - uint32_t min; - } version; - uint64_t val; - - /* IN parameters */ - uint32_t vcpu; - uint32_t pad; -}; -typedef struct xen_pmu_params xen_pmu_params_t; -DEFINE_XEN_GUEST_HANDLE(xen_pmu_params_t); - -/* PMU modes: - * - XENPMU_MODE_OFF: No PMU virtualization - * - XENPMU_MODE_SELF: Guests can profile themselves - * - XENPMU_MODE_HV: Guests can profile themselves, dom0 profiles - * itself and Xen - * - XENPMU_MODE_ALL: Only dom0 has access to VPMU and it profiles - * everyone: itself, the hypervisor and the guests. - */ -#define XENPMU_MODE_OFF 0 -#define XENPMU_MODE_SELF (1<<0) -#define XENPMU_MODE_HV (1<<1) -#define XENPMU_MODE_ALL (1<<2) - -/* - * PMU features: - * - XENPMU_FEATURE_INTEL_BTS: Intel BTS support (ignored on AMD) - * - XENPMU_FEATURE_IPC_ONLY: Restrict PMCs to the most minimum set possible. - * Instructions, cycles, and ref cycles. Can be - * used to calculate instructions-per-cycle (IPC) - * (ignored on AMD). - * - XENPMU_FEATURE_ARCH_ONLY: Restrict PMCs to the Intel Pre-Defined - * Architectural Performance Events exposed by - * cpuid and listed in the Intel developer's manual - * (ignored on AMD). - */ -#define XENPMU_FEATURE_INTEL_BTS (1<<0) -#define XENPMU_FEATURE_IPC_ONLY (1<<1) -#define XENPMU_FEATURE_ARCH_ONLY (1<<2) - -/* - * Shared PMU data between hypervisor and PV(H) domains. - * - * The hypervisor fills out this structure during PMU interrupt and sends an - * interrupt to appropriate VCPU. - * Architecture-independent fields of xen_pmu_data are WO for the hypervisor - * and RO for the guest but some fields in xen_pmu_arch can be writable - * by both the hypervisor and the guest (see arch-$arch/pmu.h). - */ -struct xen_pmu_data { - /* Interrupted VCPU */ - uint32_t vcpu_id; - - /* - * Physical processor on which the interrupt occurred. On non-privileged - * guests set to vcpu_id; - */ - uint32_t pcpu_id; - - /* - * Domain that was interrupted. On non-privileged guests set to DOMID_SELF. - * On privileged guests can be DOMID_SELF, DOMID_XEN, or, when in - * XENPMU_MODE_ALL mode, domain ID of another domain. - */ - domid_t domain_id; - - uint8_t pad[6]; - - /* Architecture-specific information */ - struct xen_pmu_arch pmu; -}; - -#endif /* __XEN_PUBLIC_PMU_H__ */ - -/* - * Local variables: - * mode: C - * c-file-style: "BSD" - * c-basic-offset: 4 - * tab-width: 4 - * indent-tabs-mode: nil - * End: - */ diff --git a/sys/xen/interface/sched.h b/sys/xen/interface/sched.h deleted file mode 100644 index 811bd87c82e7..000000000000 --- a/sys/xen/interface/sched.h +++ /dev/null @@ -1,202 +0,0 @@ -/****************************************************************************** - * sched.h - * - * Scheduler state interactions - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to - * deal in the Software without restriction, including without limitation the - * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or - * sell copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - * - * Copyright (c) 2005, Keir Fraser - */ - -#ifndef __XEN_PUBLIC_SCHED_H__ -#define __XEN_PUBLIC_SCHED_H__ - -#include "event_channel.h" - -/* - * `incontents 150 sched Guest Scheduler Operations - * - * The SCHEDOP interface provides mechanisms for a guest to interact - * with the scheduler, including yield, blocking and shutting itself - * down. - */ - -/* - * The prototype for this hypercall is: - * ` long HYPERVISOR_sched_op(enum sched_op cmd, void *arg, ...) - * - * @cmd == SCHEDOP_??? (scheduler operation). - * @arg == Operation-specific extra argument(s), as described below. - * ... == Additional Operation-specific extra arguments, described below. - * - * Versions of Xen prior to 3.0.2 provided only the following legacy version - * of this hypercall, supporting only the commands yield, block and shutdown: - * long sched_op(int cmd, unsigned long arg) - * @cmd == SCHEDOP_??? (scheduler operation). - * @arg == 0 (SCHEDOP_yield and SCHEDOP_block) - * == SHUTDOWN_* code (SCHEDOP_shutdown) - * - * This legacy version is available to new guests as: - * ` long HYPERVISOR_sched_op_compat(enum sched_op cmd, unsigned long arg) - */ - -/* ` enum sched_op { // SCHEDOP_* => struct sched_* */ -/* - * Voluntarily yield the CPU. - * @arg == NULL. - */ -#define SCHEDOP_yield 0 - -/* - * Block execution of this VCPU until an event is received for processing. - * If called with event upcalls masked, this operation will atomically - * reenable event delivery and check for pending events before blocking the - * VCPU. This avoids a "wakeup waiting" race. - * @arg == NULL. - */ -#define SCHEDOP_block 1 - -/* - * Halt execution of this domain (all VCPUs) and notify the system controller. - * @arg == pointer to sched_shutdown_t structure. - * - * If the sched_shutdown_t reason is SHUTDOWN_suspend then - * x86 PV guests must also set RDX (EDX for 32-bit guests) to the MFN - * of the guest's start info page. RDX/EDX is the third hypercall - * argument. - * - * In addition, which reason is SHUTDOWN_suspend this hypercall - * returns 1 if suspend was cancelled or the domain was merely - * checkpointed, and 0 if it is resuming in a new domain. - */ -#define SCHEDOP_shutdown 2 - -/* - * Poll a set of event-channel ports. Return when one or more are pending. An - * optional timeout may be specified. - * @arg == pointer to sched_poll_t structure. - */ -#define SCHEDOP_poll 3 - -/* - * Declare a shutdown for another domain. The main use of this function is - * in interpreting shutdown requests and reasons for fully-virtualized - * domains. A para-virtualized domain may use SCHEDOP_shutdown directly. - * @arg == pointer to sched_remote_shutdown_t structure. - */ -#define SCHEDOP_remote_shutdown 4 - -/* - * Latch a shutdown code, so that when the domain later shuts down it - * reports this code to the control tools. - * @arg == sched_shutdown_t, as for SCHEDOP_shutdown. - */ -#define SCHEDOP_shutdown_code 5 - -/* - * Setup, poke and destroy a domain watchdog timer. - * @arg == pointer to sched_watchdog_t structure. - * With id == 0, setup a domain watchdog timer to cause domain shutdown - * after timeout, returns watchdog id. - * With id != 0 and timeout == 0, destroy domain watchdog timer. - * With id != 0 and timeout != 0, poke watchdog timer and set new timeout. - */ -#define SCHEDOP_watchdog 6 - -/* - * Override the current vcpu affinity by pinning it to one physical cpu or - * undo this override restoring the previous affinity. - * @arg == pointer to sched_pin_override_t structure. - * - * A negative pcpu value will undo a previous pin override and restore the - * previous cpu affinity. - * This call is allowed for the hardware domain only and requires the cpu - * to be part of the domain's cpupool. - */ -#define SCHEDOP_pin_override 7 -/* ` } */ - -struct sched_shutdown { - unsigned int reason; /* SHUTDOWN_* => enum sched_shutdown_reason */ -}; -typedef struct sched_shutdown sched_shutdown_t; -DEFINE_XEN_GUEST_HANDLE(sched_shutdown_t); - -struct sched_poll { - XEN_GUEST_HANDLE(evtchn_port_t) ports; - unsigned int nr_ports; - uint64_t timeout; -}; -typedef struct sched_poll sched_poll_t; -DEFINE_XEN_GUEST_HANDLE(sched_poll_t); - -struct sched_remote_shutdown { - domid_t domain_id; /* Remote domain ID */ - unsigned int reason; /* SHUTDOWN_* => enum sched_shutdown_reason */ -}; -typedef struct sched_remote_shutdown sched_remote_shutdown_t; -DEFINE_XEN_GUEST_HANDLE(sched_remote_shutdown_t); - -struct sched_watchdog { - uint32_t id; /* watchdog ID */ - uint32_t timeout; /* timeout */ -}; -typedef struct sched_watchdog sched_watchdog_t; -DEFINE_XEN_GUEST_HANDLE(sched_watchdog_t); - -struct sched_pin_override { - int32_t pcpu; -}; -typedef struct sched_pin_override sched_pin_override_t; -DEFINE_XEN_GUEST_HANDLE(sched_pin_override_t); - -/* - * Reason codes for SCHEDOP_shutdown. These may be interpreted by control - * software to determine the appropriate action. For the most part, Xen does - * not care about the shutdown code. - */ -/* ` enum sched_shutdown_reason { */ -#define SHUTDOWN_poweroff 0 /* Domain exited normally. Clean up and kill. */ -#define SHUTDOWN_reboot 1 /* Clean up, kill, and then restart. */ -#define SHUTDOWN_suspend 2 /* Clean up, save suspend info, kill. */ -#define SHUTDOWN_crash 3 /* Tell controller we've crashed. */ -#define SHUTDOWN_watchdog 4 /* Restart because watchdog time expired. */ - -/* - * Domain asked to perform 'soft reset' for it. The expected behavior is to - * reset internal Xen state for the domain returning it to the point where it - * was created but leaving the domain's memory contents and vCPU contexts - * intact. This will allow the domain to start over and set up all Xen specific - * interfaces again. - */ -#define SHUTDOWN_soft_reset 5 -#define SHUTDOWN_MAX 5 /* Maximum valid shutdown reason. */ -/* ` } */ - -#endif /* __XEN_PUBLIC_SCHED_H__ */ - -/* - * Local variables: - * mode: C - * c-file-style: "BSD" - * c-basic-offset: 4 - * tab-width: 4 - * indent-tabs-mode: nil - * End: - */ diff --git a/sys/xen/interface/sysctl.h b/sys/xen/interface/sysctl.h deleted file mode 100644 index a07364711794..000000000000 --- a/sys/xen/interface/sysctl.h +++ /dev/null @@ -1,1141 +0,0 @@ -/****************************************************************************** - * sysctl.h - * - * System management operations. For use by node control stack. - * - * 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) 2002-2006, K Fraser - */ - -#ifndef __XEN_PUBLIC_SYSCTL_H__ -#define __XEN_PUBLIC_SYSCTL_H__ - -#if !defined(__XEN__) && !defined(__XEN_TOOLS__) -#error "sysctl operations are intended for use by node control tools only" -#endif - -#include "xen.h" -#include "domctl.h" -#include "physdev.h" - -#define XEN_SYSCTL_INTERFACE_VERSION 0x00000013 - -/* - * Read console content from Xen buffer ring. - */ -/* XEN_SYSCTL_readconsole */ -struct xen_sysctl_readconsole { - /* IN: Non-zero -> clear after reading. */ - uint8_t clear; - /* IN: Non-zero -> start index specified by @index field. */ - uint8_t incremental; - uint8_t pad0, pad1; - /* - * IN: Start index for consuming from ring buffer (if @incremental); - * OUT: End index after consuming from ring buffer. - */ - uint32_t index; - /* IN: Virtual address to write console data. */ - XEN_GUEST_HANDLE_64(char) buffer; - /* IN: Size of buffer; OUT: Bytes written to buffer. */ - uint32_t count; -}; - -/* Get trace buffers machine base address */ -/* XEN_SYSCTL_tbuf_op */ -struct xen_sysctl_tbuf_op { - /* IN variables */ -#define XEN_SYSCTL_TBUFOP_get_info 0 -#define XEN_SYSCTL_TBUFOP_set_cpu_mask 1 -#define XEN_SYSCTL_TBUFOP_set_evt_mask 2 -#define XEN_SYSCTL_TBUFOP_set_size 3 -#define XEN_SYSCTL_TBUFOP_enable 4 -#define XEN_SYSCTL_TBUFOP_disable 5 - uint32_t cmd; - /* IN/OUT variables */ - struct xenctl_bitmap cpu_mask; - uint32_t evt_mask; - /* OUT variables */ - uint64_aligned_t buffer_mfn; - uint32_t size; /* Also an IN variable! */ -}; - -/* - * Get physical information about the host machine - */ -/* XEN_SYSCTL_physinfo */ - /* The platform supports HVM guests. */ -#define _XEN_SYSCTL_PHYSCAP_hvm 0 -#define XEN_SYSCTL_PHYSCAP_hvm (1u<<_XEN_SYSCTL_PHYSCAP_hvm) - /* The platform supports PV guests. */ -#define _XEN_SYSCTL_PHYSCAP_pv 1 -#define XEN_SYSCTL_PHYSCAP_pv (1u<<_XEN_SYSCTL_PHYSCAP_pv) - /* The platform supports direct access to I/O devices with IOMMU. */ -#define _XEN_SYSCTL_PHYSCAP_directio 2 -#define XEN_SYSCTL_PHYSCAP_directio (1u<<_XEN_SYSCTL_PHYSCAP_directio) -/* The platform supports Hardware Assisted Paging. */ -#define _XEN_SYSCTL_PHYSCAP_hap 3 -#define XEN_SYSCTL_PHYSCAP_hap (1u<<_XEN_SYSCTL_PHYSCAP_hap) -/* The platform supports software paging. */ -#define _XEN_SYSCTL_PHYSCAP_shadow 4 -#define XEN_SYSCTL_PHYSCAP_shadow (1u<<_XEN_SYSCTL_PHYSCAP_shadow) -/* The platform supports sharing of HAP page tables with the IOMMU. */ -#define _XEN_SYSCTL_PHYSCAP_iommu_hap_pt_share 5 -#define XEN_SYSCTL_PHYSCAP_iommu_hap_pt_share \ - (1u << _XEN_SYSCTL_PHYSCAP_iommu_hap_pt_share) - -/* Max XEN_SYSCTL_PHYSCAP_* constant. Used for ABI checking. */ -#define XEN_SYSCTL_PHYSCAP_MAX XEN_SYSCTL_PHYSCAP_iommu_hap_pt_share - -struct xen_sysctl_physinfo { - uint32_t threads_per_core; - uint32_t cores_per_socket; - uint32_t nr_cpus; /* # CPUs currently online */ - uint32_t max_cpu_id; /* Largest possible CPU ID on this host */ - uint32_t nr_nodes; /* # nodes currently online */ - uint32_t max_node_id; /* Largest possible node ID on this host */ - uint32_t cpu_khz; - uint32_t capabilities;/* XEN_SYSCTL_PHYSCAP_??? */ - uint64_aligned_t total_pages; - uint64_aligned_t free_pages; - uint64_aligned_t scrub_pages; - uint64_aligned_t outstanding_pages; - uint64_aligned_t max_mfn; /* Largest possible MFN on this host */ - uint32_t hw_cap[8]; -}; - -/* - * Get the ID of the current scheduler. - */ -/* XEN_SYSCTL_sched_id */ -struct xen_sysctl_sched_id { - /* OUT variable */ - uint32_t sched_id; -}; - -/* Interface for controlling Xen software performance counters. */ -/* XEN_SYSCTL_perfc_op */ -/* Sub-operations: */ -#define XEN_SYSCTL_PERFCOP_reset 1 /* Reset all counters to zero. */ -#define XEN_SYSCTL_PERFCOP_query 2 /* Get perfctr information. */ -struct xen_sysctl_perfc_desc { - char name[80]; /* name of perf counter */ - uint32_t nr_vals; /* number of values for this counter */ -}; -typedef struct xen_sysctl_perfc_desc xen_sysctl_perfc_desc_t; -DEFINE_XEN_GUEST_HANDLE(xen_sysctl_perfc_desc_t); -typedef uint32_t xen_sysctl_perfc_val_t; -DEFINE_XEN_GUEST_HANDLE(xen_sysctl_perfc_val_t); - -struct xen_sysctl_perfc_op { - /* IN variables. */ - uint32_t cmd; /* XEN_SYSCTL_PERFCOP_??? */ - /* OUT variables. */ - uint32_t nr_counters; /* number of counters description */ - uint32_t nr_vals; /* number of values */ - /* counter information (or NULL) */ - XEN_GUEST_HANDLE_64(xen_sysctl_perfc_desc_t) desc; - /* counter values (or NULL) */ - XEN_GUEST_HANDLE_64(xen_sysctl_perfc_val_t) val; -}; - -/* XEN_SYSCTL_getdomaininfolist */ -struct xen_sysctl_getdomaininfolist { - /* IN variables. */ - domid_t first_domain; - uint32_t max_domains; - XEN_GUEST_HANDLE_64(xen_domctl_getdomaininfo_t) buffer; - /* OUT variables. */ - uint32_t num_domains; -}; - -/* Inject debug keys into Xen. */ -/* XEN_SYSCTL_debug_keys */ -struct xen_sysctl_debug_keys { - /* IN variables. */ - XEN_GUEST_HANDLE_64(const_char) keys; - uint32_t nr_keys; -}; - -/* Get physical CPU information. */ -/* XEN_SYSCTL_getcpuinfo */ -struct xen_sysctl_cpuinfo { - uint64_aligned_t idletime; -}; -typedef struct xen_sysctl_cpuinfo xen_sysctl_cpuinfo_t; -DEFINE_XEN_GUEST_HANDLE(xen_sysctl_cpuinfo_t); -struct xen_sysctl_getcpuinfo { - /* IN variables. */ - uint32_t max_cpus; - XEN_GUEST_HANDLE_64(xen_sysctl_cpuinfo_t) info; - /* OUT variables. */ - uint32_t nr_cpus; -}; - -/* XEN_SYSCTL_availheap */ -struct xen_sysctl_availheap { - /* IN variables. */ - uint32_t min_bitwidth; /* Smallest address width (zero if don't care). */ - uint32_t max_bitwidth; /* Largest address width (zero if don't care). */ - int32_t node; /* NUMA node of interest (-1 for all nodes). */ - /* OUT variables. */ - uint64_aligned_t avail_bytes;/* Bytes available in the specified region. */ -}; - -/* XEN_SYSCTL_get_pmstat */ -struct pm_px_val { - uint64_aligned_t freq; /* Px core frequency */ - uint64_aligned_t residency; /* Px residency time */ - uint64_aligned_t count; /* Px transition count */ -}; -typedef struct pm_px_val pm_px_val_t; -DEFINE_XEN_GUEST_HANDLE(pm_px_val_t); - -struct pm_px_stat { - uint8_t total; /* total Px states */ - uint8_t usable; /* usable Px states */ - uint8_t last; /* last Px state */ - uint8_t cur; /* current Px state */ - XEN_GUEST_HANDLE_64(uint64) trans_pt; /* Px transition table */ - XEN_GUEST_HANDLE_64(pm_px_val_t) pt; -}; - -struct pm_cx_stat { - uint32_t nr; /* entry nr in triggers & residencies, including C0 */ - uint32_t last; /* last Cx state */ - uint64_aligned_t idle_time; /* idle time from boot */ - XEN_GUEST_HANDLE_64(uint64) triggers; /* Cx trigger counts */ - XEN_GUEST_HANDLE_64(uint64) residencies; /* Cx residencies */ - uint32_t nr_pc; /* entry nr in pc[] */ - uint32_t nr_cc; /* entry nr in cc[] */ - /* - * These two arrays may (and generally will) have unused slots; slots not - * having a corresponding hardware register will not be written by the - * hypervisor. It is therefore up to the caller to put a suitable sentinel - * into all slots before invoking the function. - * Indexing is 1-biased (PC1/CC1 being at index 0). - */ - XEN_GUEST_HANDLE_64(uint64) pc; - XEN_GUEST_HANDLE_64(uint64) cc; -}; - -struct xen_sysctl_get_pmstat { -#define PMSTAT_CATEGORY_MASK 0xf0 -#define PMSTAT_PX 0x10 -#define PMSTAT_CX 0x20 -#define PMSTAT_get_max_px (PMSTAT_PX | 0x1) -#define PMSTAT_get_pxstat (PMSTAT_PX | 0x2) -#define PMSTAT_reset_pxstat (PMSTAT_PX | 0x3) -#define PMSTAT_get_max_cx (PMSTAT_CX | 0x1) -#define PMSTAT_get_cxstat (PMSTAT_CX | 0x2) -#define PMSTAT_reset_cxstat (PMSTAT_CX | 0x3) - uint32_t type; - uint32_t cpuid; - union { - struct pm_px_stat getpx; - struct pm_cx_stat getcx; - /* other struct for tx, etc */ - } u; -}; - -/* XEN_SYSCTL_cpu_hotplug */ -struct xen_sysctl_cpu_hotplug { - /* IN variables */ - uint32_t cpu; /* Physical cpu. */ - - /* Single CPU enable/disable. */ -#define XEN_SYSCTL_CPU_HOTPLUG_ONLINE 0 -#define XEN_SYSCTL_CPU_HOTPLUG_OFFLINE 1 - - /* - * SMT enable/disable. - * - * These two ops loop over all present CPUs, and either online or offline - * every non-primary sibling thread (those with a thread id which is not - * 0). This behaviour is chosen to simplify the implementation. - * - * They are intended as a shorthand for identifying and feeding the cpu - * numbers individually to HOTPLUG_{ON,OFF}LINE. - * - * These are not expected to be used in conjunction with debugging options - * such as `maxcpus=` or when other manual configuration of offline cpus - * is in use. - */ -#define XEN_SYSCTL_CPU_HOTPLUG_SMT_ENABLE 2 -#define XEN_SYSCTL_CPU_HOTPLUG_SMT_DISABLE 3 - uint32_t op; /* hotplug opcode */ -}; - -/* - * Get/set xen power management, include - * 1. cpufreq governors and related parameters - */ -/* XEN_SYSCTL_pm_op */ -struct xen_userspace { - uint32_t scaling_setspeed; -}; - -struct xen_ondemand { - uint32_t sampling_rate_max; - uint32_t sampling_rate_min; - - uint32_t sampling_rate; - uint32_t up_threshold; -}; - -/* - * cpufreq para name of this structure named - * same as sysfs file name of native linux - */ -#define CPUFREQ_NAME_LEN 16 -struct xen_get_cpufreq_para { - /* IN/OUT variable */ - uint32_t cpu_num; - uint32_t freq_num; - uint32_t gov_num; - - /* for all governors */ - /* OUT variable */ - XEN_GUEST_HANDLE_64(uint32) affected_cpus; - XEN_GUEST_HANDLE_64(uint32) scaling_available_frequencies; - XEN_GUEST_HANDLE_64(char) scaling_available_governors; - char scaling_driver[CPUFREQ_NAME_LEN]; - - uint32_t cpuinfo_cur_freq; - uint32_t cpuinfo_max_freq; - uint32_t cpuinfo_min_freq; - uint32_t scaling_cur_freq; - - char scaling_governor[CPUFREQ_NAME_LEN]; - uint32_t scaling_max_freq; - uint32_t scaling_min_freq; - - /* for specific governor */ - union { - struct xen_userspace userspace; - struct xen_ondemand ondemand; - } u; - - int32_t turbo_enabled; -}; - -struct xen_set_cpufreq_gov { - char scaling_governor[CPUFREQ_NAME_LEN]; -}; - -struct xen_set_cpufreq_para { - #define SCALING_MAX_FREQ 1 - #define SCALING_MIN_FREQ 2 - #define SCALING_SETSPEED 3 - #define SAMPLING_RATE 4 - #define UP_THRESHOLD 5 - - uint32_t ctrl_type; - uint32_t ctrl_value; -}; - -struct xen_sysctl_pm_op { - #define PM_PARA_CATEGORY_MASK 0xf0 - #define CPUFREQ_PARA 0x10 - - /* cpufreq command type */ - #define GET_CPUFREQ_PARA (CPUFREQ_PARA | 0x01) - #define SET_CPUFREQ_GOV (CPUFREQ_PARA | 0x02) - #define SET_CPUFREQ_PARA (CPUFREQ_PARA | 0x03) - #define GET_CPUFREQ_AVGFREQ (CPUFREQ_PARA | 0x04) - - /* set/reset scheduler power saving option */ - #define XEN_SYSCTL_pm_op_set_sched_opt_smt 0x21 - - /* - * cpuidle max C-state and max C-sub-state access command: - * Set cpuid to 0 for max C-state. - * Set cpuid to 1 for max C-sub-state. - */ - #define XEN_SYSCTL_pm_op_get_max_cstate 0x22 - #define XEN_SYSCTL_pm_op_set_max_cstate 0x23 - - /* set scheduler migration cost value */ - #define XEN_SYSCTL_pm_op_set_vcpu_migration_delay 0x24 - #define XEN_SYSCTL_pm_op_get_vcpu_migration_delay 0x25 - - /* enable/disable turbo mode when in dbs governor */ - #define XEN_SYSCTL_pm_op_enable_turbo 0x26 - #define XEN_SYSCTL_pm_op_disable_turbo 0x27 - - uint32_t cmd; - uint32_t cpuid; - union { - struct xen_get_cpufreq_para get_para; - struct xen_set_cpufreq_gov set_gov; - struct xen_set_cpufreq_para set_para; - uint64_aligned_t get_avgfreq; - uint32_t set_sched_opt_smt; -#define XEN_SYSCTL_CX_UNLIMITED 0xffffffff - uint32_t get_max_cstate; - uint32_t set_max_cstate; - } u; -}; - -/* XEN_SYSCTL_page_offline_op */ -struct xen_sysctl_page_offline_op { - /* IN: range of page to be offlined */ -#define sysctl_page_offline 1 -#define sysctl_page_online 2 -#define sysctl_query_page_offline 3 - uint32_t cmd; - uint32_t start; - uint32_t end; - /* OUT: result of page offline request */ - /* - * bit 0~15: result flags - * bit 16~31: owner - */ - XEN_GUEST_HANDLE(uint32) status; -}; - -#define PG_OFFLINE_STATUS_MASK (0xFFUL) - -/* The result is invalid, i.e. HV does not handle it */ -#define PG_OFFLINE_INVALID (0x1UL << 0) - -#define PG_OFFLINE_OFFLINED (0x1UL << 1) -#define PG_OFFLINE_PENDING (0x1UL << 2) -#define PG_OFFLINE_FAILED (0x1UL << 3) -#define PG_OFFLINE_AGAIN (0x1UL << 4) - -#define PG_ONLINE_FAILED PG_OFFLINE_FAILED -#define PG_ONLINE_ONLINED PG_OFFLINE_OFFLINED - -#define PG_OFFLINE_STATUS_OFFLINED (0x1UL << 1) -#define PG_OFFLINE_STATUS_ONLINE (0x1UL << 2) -#define PG_OFFLINE_STATUS_OFFLINE_PENDING (0x1UL << 3) -#define PG_OFFLINE_STATUS_BROKEN (0x1UL << 4) - -#define PG_OFFLINE_MISC_MASK (0xFFUL << 4) - -/* valid when PG_OFFLINE_FAILED or PG_OFFLINE_PENDING */ -#define PG_OFFLINE_XENPAGE (0x1UL << 8) -#define PG_OFFLINE_DOM0PAGE (0x1UL << 9) -#define PG_OFFLINE_ANONYMOUS (0x1UL << 10) -#define PG_OFFLINE_NOT_CONV_RAM (0x1UL << 11) -#define PG_OFFLINE_OWNED (0x1UL << 12) - -#define PG_OFFLINE_BROKEN (0x1UL << 13) -#define PG_ONLINE_BROKEN PG_OFFLINE_BROKEN - -#define PG_OFFLINE_OWNER_SHIFT 16 - -/* XEN_SYSCTL_lockprof_op */ -/* Sub-operations: */ -#define XEN_SYSCTL_LOCKPROF_reset 1 /* Reset all profile data to zero. */ -#define XEN_SYSCTL_LOCKPROF_query 2 /* Get lock profile information. */ -/* Record-type: */ -#define LOCKPROF_TYPE_GLOBAL 0 /* global lock, idx meaningless */ -#define LOCKPROF_TYPE_PERDOM 1 /* per-domain lock, idx is domid */ -#define LOCKPROF_TYPE_N 2 /* number of types */ -struct xen_sysctl_lockprof_data { - char name[40]; /* lock name (may include up to 2 %d specifiers) */ - int32_t type; /* LOCKPROF_TYPE_??? */ - int32_t idx; /* index (e.g. domain id) */ - uint64_aligned_t lock_cnt; /* # of locking succeeded */ - uint64_aligned_t block_cnt; /* # of wait for lock */ - uint64_aligned_t lock_time; /* nsecs lock held */ - uint64_aligned_t block_time; /* nsecs waited for lock */ -}; -typedef struct xen_sysctl_lockprof_data xen_sysctl_lockprof_data_t; -DEFINE_XEN_GUEST_HANDLE(xen_sysctl_lockprof_data_t); -struct xen_sysctl_lockprof_op { - /* IN variables. */ - uint32_t cmd; /* XEN_SYSCTL_LOCKPROF_??? */ - uint32_t max_elem; /* size of output buffer */ - /* OUT variables (query only). */ - uint32_t nr_elem; /* number of elements available */ - uint64_aligned_t time; /* nsecs of profile measurement */ - /* profile information (or NULL) */ - XEN_GUEST_HANDLE_64(xen_sysctl_lockprof_data_t) data; -}; - -/* XEN_SYSCTL_cputopoinfo */ -#define XEN_INVALID_CORE_ID (~0U) -#define XEN_INVALID_SOCKET_ID (~0U) -#define XEN_INVALID_NODE_ID (~0U) - -struct xen_sysctl_cputopo { - uint32_t core; - uint32_t socket; - uint32_t node; -}; -typedef struct xen_sysctl_cputopo xen_sysctl_cputopo_t; -DEFINE_XEN_GUEST_HANDLE(xen_sysctl_cputopo_t); - -/* - * IN: - * - a NULL 'cputopo' handle is a request for maximun 'num_cpus'. - * - otherwise it's the number of entries in 'cputopo' - * - * OUT: - * - If 'num_cpus' is less than the number Xen wants to write but the handle - * handle is not a NULL one, partial data gets returned and 'num_cpus' gets - * updated to reflect the intended number. - * - Otherwise, 'num_cpus' shall indicate the number of entries written, which - * may be less than the input value. - */ -struct xen_sysctl_cputopoinfo { - uint32_t num_cpus; - XEN_GUEST_HANDLE_64(xen_sysctl_cputopo_t) cputopo; -}; - -/* XEN_SYSCTL_numainfo */ -#define XEN_INVALID_MEM_SZ (~0U) -#define XEN_INVALID_NODE_DIST (~0U) - -struct xen_sysctl_meminfo { - uint64_t memsize; - uint64_t memfree; -}; -typedef struct xen_sysctl_meminfo xen_sysctl_meminfo_t; -DEFINE_XEN_GUEST_HANDLE(xen_sysctl_meminfo_t); - -/* - * IN: - * - Both 'meminfo' and 'distance' handles being null is a request - * for maximum value of 'num_nodes'. - * - Otherwise it's the number of entries in 'meminfo' and square root - * of number of entries in 'distance' (when corresponding handle is - * non-null) - * - * OUT: - * - If 'num_nodes' is less than the number Xen wants to write but either - * handle is not a NULL one, partial data gets returned and 'num_nodes' - * gets updated to reflect the intended number. - * - Otherwise, 'num_nodes' shall indicate the number of entries written, which - * may be less than the input value. - */ - -struct xen_sysctl_numainfo { - uint32_t num_nodes; - - XEN_GUEST_HANDLE_64(xen_sysctl_meminfo_t) meminfo; - - /* - * Distance between nodes 'i' and 'j' is stored in index 'i*N + j', - * where N is the number of nodes that will be returned in 'num_nodes' - * (i.e. not 'num_nodes' provided by the caller) - */ - XEN_GUEST_HANDLE_64(uint32) distance; -}; - -/* XEN_SYSCTL_cpupool_op */ -#define XEN_SYSCTL_CPUPOOL_OP_CREATE 1 /* C */ -#define XEN_SYSCTL_CPUPOOL_OP_DESTROY 2 /* D */ -#define XEN_SYSCTL_CPUPOOL_OP_INFO 3 /* I */ -#define XEN_SYSCTL_CPUPOOL_OP_ADDCPU 4 /* A */ -#define XEN_SYSCTL_CPUPOOL_OP_RMCPU 5 /* R */ -#define XEN_SYSCTL_CPUPOOL_OP_MOVEDOMAIN 6 /* M */ -#define XEN_SYSCTL_CPUPOOL_OP_FREEINFO 7 /* F */ -#define XEN_SYSCTL_CPUPOOL_PAR_ANY 0xFFFFFFFF -struct xen_sysctl_cpupool_op { - uint32_t op; /* IN */ - uint32_t cpupool_id; /* IN: CDIARM OUT: CI */ - uint32_t sched_id; /* IN: C OUT: I */ - uint32_t domid; /* IN: M */ - uint32_t cpu; /* IN: AR */ - uint32_t n_dom; /* OUT: I */ - struct xenctl_bitmap cpumap; /* OUT: IF */ -}; - -/* - * Error return values of cpupool operations: - * - * -EADDRINUSE: - * XEN_SYSCTL_CPUPOOL_OP_RMCPU: A vcpu is temporarily pinned to the cpu - * which is to be removed from a cpupool. - * -EADDRNOTAVAIL: - * XEN_SYSCTL_CPUPOOL_OP_ADDCPU, XEN_SYSCTL_CPUPOOL_OP_RMCPU: A previous - * request to remove a cpu from a cpupool was terminated with -EAGAIN - * and has not been retried using the same parameters. - * -EAGAIN: - * XEN_SYSCTL_CPUPOOL_OP_RMCPU: The cpu can't be removed from the cpupool - * as it is active in the hypervisor. A retry will succeed soon. - * -EBUSY: - * XEN_SYSCTL_CPUPOOL_OP_DESTROY, XEN_SYSCTL_CPUPOOL_OP_RMCPU: A cpupool - * can't be destroyed or the last cpu can't be removed as there is still - * a running domain in that cpupool. - * -EEXIST: - * XEN_SYSCTL_CPUPOOL_OP_CREATE: A cpupool_id was specified and is already - * existing. - * -EINVAL: - * XEN_SYSCTL_CPUPOOL_OP_ADDCPU, XEN_SYSCTL_CPUPOOL_OP_RMCPU: An illegal - * cpu was specified (cpu does not exist). - * XEN_SYSCTL_CPUPOOL_OP_MOVEDOMAIN: An illegal domain was specified - * (domain id illegal or not suitable for operation). - * -ENODEV: - * XEN_SYSCTL_CPUPOOL_OP_ADDCPU, XEN_SYSCTL_CPUPOOL_OP_RMCPU: The specified - * cpu is either not free (add) or not member of the specified cpupool - * (remove). - * -ENOENT: - * all: The cpupool with the specified cpupool_id doesn't exist. - * - * Some common error return values like -ENOMEM and -EFAULT are possible for - * all the operations. - */ - -#define ARINC653_MAX_DOMAINS_PER_SCHEDULE 64 -/* - * This structure is used to pass a new ARINC653 schedule from a - * privileged domain (ie dom0) to Xen. - */ -struct xen_sysctl_arinc653_schedule { - /* major_frame holds the time for the new schedule's major frame - * in nanoseconds. */ - uint64_aligned_t major_frame; - /* num_sched_entries holds how many of the entries in the - * sched_entries[] array are valid. */ - uint8_t num_sched_entries; - /* The sched_entries array holds the actual schedule entries. */ - struct { - /* dom_handle must match a domain's UUID */ - xen_domain_handle_t dom_handle; - /* If a domain has multiple VCPUs, vcpu_id specifies which one - * this schedule entry applies to. It should be set to 0 if - * there is only one VCPU for the domain. */ - unsigned int vcpu_id; - /* runtime specifies the amount of time that should be allocated - * to this VCPU per major frame. It is specified in nanoseconds */ - uint64_aligned_t runtime; - } sched_entries[ARINC653_MAX_DOMAINS_PER_SCHEDULE]; -}; -typedef struct xen_sysctl_arinc653_schedule xen_sysctl_arinc653_schedule_t; -DEFINE_XEN_GUEST_HANDLE(xen_sysctl_arinc653_schedule_t); - -/* - * Valid range for context switch rate limit (in microseconds). - * Applicable to Credit and Credit2 schedulers. - */ -#define XEN_SYSCTL_SCHED_RATELIMIT_MAX 500000 -#define XEN_SYSCTL_SCHED_RATELIMIT_MIN 100 - -struct xen_sysctl_credit_schedule { - /* Length of timeslice in milliseconds */ -#define XEN_SYSCTL_CSCHED_TSLICE_MAX 1000 -#define XEN_SYSCTL_CSCHED_TSLICE_MIN 1 - unsigned tslice_ms; - unsigned ratelimit_us; - /* - * How long we consider a vCPU to be cache-hot on the - * CPU where it has run (max 100ms, in microseconds) - */ -#define XEN_SYSCTL_CSCHED_MGR_DLY_MAX_US (100 * 1000) - unsigned vcpu_migr_delay_us; -}; - -struct xen_sysctl_credit2_schedule { - unsigned ratelimit_us; -}; - -/* XEN_SYSCTL_scheduler_op */ -/* Set or get info? */ -#define XEN_SYSCTL_SCHEDOP_putinfo 0 -#define XEN_SYSCTL_SCHEDOP_getinfo 1 -struct xen_sysctl_scheduler_op { - uint32_t cpupool_id; /* Cpupool whose scheduler is to be targetted. */ - uint32_t sched_id; /* XEN_SCHEDULER_* (domctl.h) */ - uint32_t cmd; /* XEN_SYSCTL_SCHEDOP_* */ - union { - struct xen_sysctl_sched_arinc653 { - XEN_GUEST_HANDLE_64(xen_sysctl_arinc653_schedule_t) schedule; - } sched_arinc653; - struct xen_sysctl_credit_schedule sched_credit; - struct xen_sysctl_credit2_schedule sched_credit2; - } u; -}; - -/* - * Output format of gcov data: - * - * XEN_GCOV_FORMAT_MAGIC XEN_GCOV_RECORD ... XEN_GCOV_RECORD - * - * That is, one magic number followed by 0 or more record. - * - * The magic number is stored as an uint32_t field. - * - * The record is packed and variable in length. It has the form: - * - * filename: a NULL terminated path name extracted from gcov, used to - * create the name of gcda file. - * size: a uint32_t field indicating the size of the payload, the - * unit is byte. - * payload: the actual payload, length is `size' bytes. - * - * Userspace tool will split the record to different files. - */ - -#define XEN_GCOV_FORMAT_MAGIC 0x58434f56 /* XCOV */ - -/* - * Ouput format of LLVM coverage data is just a raw stream, as would be - * written by the compiler_rt run time library into a .profraw file. There - * are no special Xen tags or delimiters because none are needed. - */ - -#define XEN_SYSCTL_COVERAGE_get_size 0 /* Get total size of output data */ -#define XEN_SYSCTL_COVERAGE_read 1 /* Read output data */ -#define XEN_SYSCTL_COVERAGE_reset 2 /* Reset all counters */ - -struct xen_sysctl_coverage_op { - uint32_t cmd; - uint32_t size; /* IN/OUT: size of the buffer */ - XEN_GUEST_HANDLE_64(char) buffer; /* OUT */ -}; - -#define XEN_SYSCTL_PSR_CMT_get_total_rmid 0 -#define XEN_SYSCTL_PSR_CMT_get_l3_upscaling_factor 1 -/* The L3 cache size is returned in KB unit */ -#define XEN_SYSCTL_PSR_CMT_get_l3_cache_size 2 -#define XEN_SYSCTL_PSR_CMT_enabled 3 -#define XEN_SYSCTL_PSR_CMT_get_l3_event_mask 4 -struct xen_sysctl_psr_cmt_op { - uint32_t cmd; /* IN: XEN_SYSCTL_PSR_CMT_* */ - uint32_t flags; /* padding variable, may be extended for future use */ - union { - uint64_t data; /* OUT */ - struct { - uint32_t cpu; /* IN */ - uint32_t rsvd; - } l3_cache; - } u; -}; - -/* XEN_SYSCTL_pcitopoinfo */ -#define XEN_INVALID_DEV (XEN_INVALID_NODE_ID - 1) -struct xen_sysctl_pcitopoinfo { - /* - * IN: Number of elements in 'devs' and 'nodes' arrays. - * OUT: Number of processed elements of those arrays. - */ - uint32_t num_devs; - - /* IN: list of devices for which node IDs are requested. */ - XEN_GUEST_HANDLE_64(physdev_pci_device_t) devs; - - /* - * OUT: node identifier for each device. - * If information for a particular device is not available then - * corresponding entry will be set to XEN_INVALID_NODE_ID. If - * device is not known to the hypervisor then XEN_INVALID_DEV - * will be provided. - */ - XEN_GUEST_HANDLE_64(uint32) nodes; -}; - -#define XEN_SYSCTL_PSR_get_l3_info 0 -#define XEN_SYSCTL_PSR_get_l2_info 1 -#define XEN_SYSCTL_PSR_get_mba_info 2 -struct xen_sysctl_psr_alloc { - uint32_t cmd; /* IN: XEN_SYSCTL_PSR_* */ - uint32_t target; /* IN */ - union { - struct { - uint32_t cbm_len; /* OUT: CBM length */ - uint32_t cos_max; /* OUT: Maximum COS */ -#define XEN_SYSCTL_PSR_CAT_L3_CDP (1u << 0) - uint32_t flags; /* OUT: CAT flags */ - } cat_info; - - struct { - uint32_t thrtl_max; /* OUT: Maximum throttle */ - uint32_t cos_max; /* OUT: Maximum COS */ -#define XEN_SYSCTL_PSR_MBA_LINEAR (1u << 0) - uint32_t flags; /* OUT: MBA flags */ - } mba_info; - } u; -}; - -/* - * XEN_SYSCTL_get_cpu_levelling_caps (x86 specific) - * - * Return hardware capabilities concerning masking or faulting of the cpuid - * instruction for PV guests. - */ -struct xen_sysctl_cpu_levelling_caps { -#define XEN_SYSCTL_CPU_LEVELCAP_faulting (1ul << 0) /* CPUID faulting */ -#define XEN_SYSCTL_CPU_LEVELCAP_ecx (1ul << 1) /* 0x00000001.ecx */ -#define XEN_SYSCTL_CPU_LEVELCAP_edx (1ul << 2) /* 0x00000001.edx */ -#define XEN_SYSCTL_CPU_LEVELCAP_extd_ecx (1ul << 3) /* 0x80000001.ecx */ -#define XEN_SYSCTL_CPU_LEVELCAP_extd_edx (1ul << 4) /* 0x80000001.edx */ -#define XEN_SYSCTL_CPU_LEVELCAP_xsave_eax (1ul << 5) /* 0x0000000D:1.eax */ -#define XEN_SYSCTL_CPU_LEVELCAP_thermal_ecx (1ul << 6) /* 0x00000006.ecx */ -#define XEN_SYSCTL_CPU_LEVELCAP_l7s0_eax (1ul << 7) /* 0x00000007:0.eax */ -#define XEN_SYSCTL_CPU_LEVELCAP_l7s0_ebx (1ul << 8) /* 0x00000007:0.ebx */ - uint32_t caps; -}; - -/* - * XEN_SYSCTL_get_cpu_featureset (x86 specific) - * - * Return information about featuresets available on this host. - * - Raw: The real cpuid values. - * - Host: The values Xen is using, (after command line overrides, etc). - * - PV: Maximum set of features which can be given to a PV guest. - * - HVM: Maximum set of features which can be given to a HVM guest. - * May fail with -EOPNOTSUPP if querying for PV or HVM data when support is - * compiled out of Xen. - */ -struct xen_sysctl_cpu_featureset { -#define XEN_SYSCTL_cpu_featureset_raw 0 -#define XEN_SYSCTL_cpu_featureset_host 1 -#define XEN_SYSCTL_cpu_featureset_pv 2 -#define XEN_SYSCTL_cpu_featureset_hvm 3 - uint32_t index; /* IN: Which featureset to query? */ - uint32_t nr_features; /* IN/OUT: Number of entries in/written to - * 'features', or the maximum number of features if - * the guest handle is NULL. NB. All featuresets - * come from the same numberspace, so have the same - * maximum length. */ - XEN_GUEST_HANDLE_64(uint32) features; /* OUT: */ -}; - -/* - * XEN_SYSCTL_LIVEPATCH_op - * - * Refer to the docs/unstable/misc/livepatch.markdown - * for the design details of this hypercall. - * - * There are four sub-ops: - * XEN_SYSCTL_LIVEPATCH_UPLOAD (0) - * XEN_SYSCTL_LIVEPATCH_GET (1) - * XEN_SYSCTL_LIVEPATCH_LIST (2) - * XEN_SYSCTL_LIVEPATCH_ACTION (3) - * - * The normal sequence of sub-ops is to: - * 1) XEN_SYSCTL_LIVEPATCH_UPLOAD to upload the payload. If errors STOP. - * 2) XEN_SYSCTL_LIVEPATCH_GET to check the `->rc`. If -XEN_EAGAIN spin. - * If zero go to next step. - * 3) XEN_SYSCTL_LIVEPATCH_ACTION with LIVEPATCH_ACTION_APPLY to apply the patch. - * 4) XEN_SYSCTL_LIVEPATCH_GET to check the `->rc`. If in -XEN_EAGAIN spin. - * If zero exit with success. - */ - -#define LIVEPATCH_PAYLOAD_VERSION 2 -/* - * .livepatch.funcs structure layout defined in the `Payload format` - * section in the Live Patch design document. - * - * We guard this with __XEN__ as toolstacks SHOULD not use it. - */ -#ifdef __XEN__ -#define LIVEPATCH_OPAQUE_SIZE 31 - -struct livepatch_expectation { - uint8_t enabled : 1; - uint8_t len : 5; /* Length of data up to LIVEPATCH_OPAQUE_SIZE - (5 bits is enough for now) */ - uint8_t rsv : 2; /* Reserved. Zero value */ - uint8_t data[LIVEPATCH_OPAQUE_SIZE]; /* Same size as opaque[] buffer of - struct livepatch_func. This is the - max number of bytes to be patched */ -}; -typedef struct livepatch_expectation livepatch_expectation_t; - -typedef enum livepatch_func_state { - LIVEPATCH_FUNC_NOT_APPLIED, - LIVEPATCH_FUNC_APPLIED -} livepatch_func_state_t; - -struct livepatch_func { - const char *name; /* Name of function to be patched. */ - void *new_addr; - void *old_addr; - uint32_t new_size; - uint32_t old_size; - uint8_t version; /* MUST be LIVEPATCH_PAYLOAD_VERSION. */ - uint8_t opaque[LIVEPATCH_OPAQUE_SIZE]; - uint8_t applied; - uint8_t _pad[7]; - livepatch_expectation_t expect; -}; -typedef struct livepatch_func livepatch_func_t; -#endif - -/* - * Structure describing an ELF payload. Uniquely identifies the - * payload. Should be human readable. - * Recommended length is upto XEN_LIVEPATCH_NAME_SIZE. - * Includes the NUL terminator. - */ -#define XEN_LIVEPATCH_NAME_SIZE 128 -struct xen_livepatch_name { - XEN_GUEST_HANDLE_64(char) name; /* IN: pointer to name. */ - uint16_t size; /* IN: size of name. May be upto - XEN_LIVEPATCH_NAME_SIZE. */ - uint16_t pad[3]; /* IN: MUST be zero. */ -}; - -/* - * Upload a payload to the hypervisor. The payload is verified - * against basic checks and if there are any issues the proper return code - * will be returned. The payload is not applied at this time - that is - * controlled by XEN_SYSCTL_LIVEPATCH_ACTION. - * - * The return value is zero if the payload was succesfully uploaded. - * Otherwise an EXX return value is provided. Duplicate `name` are not - * supported. - * - * The payload at this point is verified against basic checks. - * - * The `payload` is the ELF payload as mentioned in the `Payload format` - * section in the Live Patch design document. - */ -#define XEN_SYSCTL_LIVEPATCH_UPLOAD 0 -struct xen_sysctl_livepatch_upload { - struct xen_livepatch_name name; /* IN, name of the patch. */ - uint64_t size; /* IN, size of the ELF file. */ - XEN_GUEST_HANDLE_64(uint8) payload; /* IN, the ELF file. */ -}; - -/* - * Retrieve an status of an specific payload. - * - * Upon completion the `struct xen_livepatch_status` is updated. - * - * The return value is zero on success and XEN_EXX on failure. This operation - * is synchronous and does not require preemption. - */ -#define XEN_SYSCTL_LIVEPATCH_GET 1 - -struct xen_livepatch_status { -#define LIVEPATCH_STATE_CHECKED 1 -#define LIVEPATCH_STATE_APPLIED 2 - uint32_t state; /* OUT: LIVEPATCH_STATE_*. */ - int32_t rc; /* OUT: 0 if no error, otherwise -XEN_EXX. */ -}; -typedef struct xen_livepatch_status xen_livepatch_status_t; -DEFINE_XEN_GUEST_HANDLE(xen_livepatch_status_t); - -struct xen_sysctl_livepatch_get { - struct xen_livepatch_name name; /* IN, name of the payload. */ - struct xen_livepatch_status status; /* IN/OUT, state of it. */ -}; - -/* - * Retrieve an array of abbreviated status, names and metadata of payloads that - * are loaded in the hypervisor. - * - * If the hypercall returns an positive number, it is the number (up to `nr`) - * of the payloads returned, along with `nr` updated with the number of remaining - * payloads, `version` updated (it may be the same across hypercalls. If it varies - * the data is stale and further calls could fail), `name_total_size` and - * `metadata_total_size` containing total sizes of transferred data for both the - * arrays. - * The `status`, `name`, `len`, `metadata` and `metadata_len` are updated at their - * designed index value (`idx`) with the returned value of data. - * - * If the hypercall returns E2BIG the `nr` is too big and should be - * lowered. The upper limit of `nr` is left to the implemention. - * - * Note that due to the asynchronous nature of hypercalls the domain might have - * added or removed the number of payloads making this information stale. It is - * the responsibility of the toolstack to use the `version` field to check - * between each invocation. if the version differs it should discard the stale - * data and start from scratch. It is OK for the toolstack to use the new - * `version` field. - */ -#define XEN_SYSCTL_LIVEPATCH_LIST 2 -struct xen_sysctl_livepatch_list { - uint32_t version; /* OUT: Hypervisor stamps value. - If varies between calls, we are - * getting stale data. */ - uint32_t idx; /* IN: Index into hypervisor list. */ - uint32_t nr; /* IN: How many status, name, and len - should fill out. Can be zero to get - amount of payloads and version. - OUT: How many payloads left. */ - uint32_t pad; /* IN: Must be zero. */ - uint32_t name_total_size; /* OUT: Total size of all transfer names */ - uint32_t metadata_total_size; /* OUT: Total size of all transfer metadata */ - XEN_GUEST_HANDLE_64(xen_livepatch_status_t) status; /* OUT. Must have enough - space allocate for nr of them. */ - XEN_GUEST_HANDLE_64(char) name; /* OUT: Array of names. Each member - may have an arbitrary length up to - XEN_LIVEPATCH_NAME_SIZE bytes. Must have - nr of them. */ - XEN_GUEST_HANDLE_64(uint32) len; /* OUT: Array of lengths of name's. - Must have nr of them. */ - XEN_GUEST_HANDLE_64(char) metadata; /* OUT: Array of metadata strings. Each - member may have an arbitrary length. - Must have nr of them. */ - XEN_GUEST_HANDLE_64(uint32) metadata_len; /* OUT: Array of lengths of metadata's. - Must have nr of them. */ -}; - -/* - * Perform an operation on the payload structure referenced by the `name` field. - * The operation request is asynchronous and the status should be retrieved - * by using either XEN_SYSCTL_LIVEPATCH_GET or XEN_SYSCTL_LIVEPATCH_LIST hypercall. - */ -#define XEN_SYSCTL_LIVEPATCH_ACTION 3 -struct xen_sysctl_livepatch_action { - struct xen_livepatch_name name; /* IN, name of the patch. */ -#define LIVEPATCH_ACTION_UNLOAD 1 -#define LIVEPATCH_ACTION_REVERT 2 -#define LIVEPATCH_ACTION_APPLY 3 -#define LIVEPATCH_ACTION_REPLACE 4 - uint32_t cmd; /* IN: LIVEPATCH_ACTION_*. */ - uint32_t timeout; /* IN: If zero then uses */ - /* hypervisor default. */ - /* Or upper bound of time (ns) */ - /* for operation to take. */ - -/* - * Override default inter-module buildid dependency chain enforcement. - * Check only if module is built for given hypervisor by comparing buildid. - */ -#define LIVEPATCH_ACTION_APPLY_NODEPS (1 << 0) - uint32_t flags; /* IN: action flags. */ - /* Provide additional parameters */ - /* for an action. */ - uint32_t pad; /* IN: Always zero. */ -}; - -struct xen_sysctl_livepatch_op { - uint32_t cmd; /* IN: XEN_SYSCTL_LIVEPATCH_*. */ - uint32_t pad; /* IN: Always zero. */ - union { - struct xen_sysctl_livepatch_upload upload; - struct xen_sysctl_livepatch_list list; - struct xen_sysctl_livepatch_get get; - struct xen_sysctl_livepatch_action action; - } u; -}; - -#if defined(__i386__) || defined(__x86_64__) -/* - * XEN_SYSCTL_get_cpu_policy (x86 specific) - * - * Return information about CPUID and MSR policies available on this host. - * - Raw: The real H/W values. - * - Host: The values Xen is using, (after command line overrides, etc). - * - Max_*: Maximum set of features a PV or HVM guest can use. Includes - * experimental features outside of security support. - * - Default_*: Default set of features a PV or HVM guest can use. This is - * the security supported set. - * May fail with -EOPNOTSUPP if querying for PV or HVM data when support is - * compiled out of Xen. - */ -struct xen_sysctl_cpu_policy { -#define XEN_SYSCTL_cpu_policy_raw 0 -#define XEN_SYSCTL_cpu_policy_host 1 -#define XEN_SYSCTL_cpu_policy_pv_max 2 -#define XEN_SYSCTL_cpu_policy_hvm_max 3 -#define XEN_SYSCTL_cpu_policy_pv_default 4 -#define XEN_SYSCTL_cpu_policy_hvm_default 5 - uint32_t index; /* IN: Which policy to query? */ - uint32_t nr_leaves; /* IN/OUT: Number of leaves in/written to - * 'cpuid_policy', or the maximum number of leaves - * if the guest handle is NULL. */ - uint32_t nr_msrs; /* IN/OUT: Number of MSRs in/written to - * 'msr_policy', or the maximum number of MSRs if - * the guest handle is NULL. */ - uint32_t _rsvd; /* Must be zero. */ - XEN_GUEST_HANDLE_64(xen_cpuid_leaf_t) cpuid_policy; /* OUT */ - XEN_GUEST_HANDLE_64(xen_msr_entry_t) msr_policy; /* OUT */ -}; -typedef struct xen_sysctl_cpu_policy xen_sysctl_cpu_policy_t; -DEFINE_XEN_GUEST_HANDLE(xen_sysctl_cpu_policy_t); -#endif - -struct xen_sysctl { - uint32_t cmd; -#define XEN_SYSCTL_readconsole 1 -#define XEN_SYSCTL_tbuf_op 2 -#define XEN_SYSCTL_physinfo 3 -#define XEN_SYSCTL_sched_id 4 -#define XEN_SYSCTL_perfc_op 5 -#define XEN_SYSCTL_getdomaininfolist 6 -#define XEN_SYSCTL_debug_keys 7 -#define XEN_SYSCTL_getcpuinfo 8 -#define XEN_SYSCTL_availheap 9 -#define XEN_SYSCTL_get_pmstat 10 -#define XEN_SYSCTL_cpu_hotplug 11 -#define XEN_SYSCTL_pm_op 12 -#define XEN_SYSCTL_page_offline_op 14 -#define XEN_SYSCTL_lockprof_op 15 -#define XEN_SYSCTL_cputopoinfo 16 -#define XEN_SYSCTL_numainfo 17 -#define XEN_SYSCTL_cpupool_op 18 -#define XEN_SYSCTL_scheduler_op 19 -#define XEN_SYSCTL_coverage_op 20 -#define XEN_SYSCTL_psr_cmt_op 21 -#define XEN_SYSCTL_pcitopoinfo 22 -#define XEN_SYSCTL_psr_alloc 23 -/* #define XEN_SYSCTL_tmem_op 24 */ -#define XEN_SYSCTL_get_cpu_levelling_caps 25 -#define XEN_SYSCTL_get_cpu_featureset 26 -#define XEN_SYSCTL_livepatch_op 27 -/* #define XEN_SYSCTL_set_parameter 28 */ -#define XEN_SYSCTL_get_cpu_policy 29 - uint32_t interface_version; /* XEN_SYSCTL_INTERFACE_VERSION */ - union { - struct xen_sysctl_readconsole readconsole; - struct xen_sysctl_tbuf_op tbuf_op; - struct xen_sysctl_physinfo physinfo; - struct xen_sysctl_cputopoinfo cputopoinfo; - struct xen_sysctl_pcitopoinfo pcitopoinfo; - struct xen_sysctl_numainfo numainfo; - struct xen_sysctl_sched_id sched_id; - struct xen_sysctl_perfc_op perfc_op; - struct xen_sysctl_getdomaininfolist getdomaininfolist; - struct xen_sysctl_debug_keys debug_keys; - struct xen_sysctl_getcpuinfo getcpuinfo; - struct xen_sysctl_availheap availheap; - struct xen_sysctl_get_pmstat get_pmstat; - struct xen_sysctl_cpu_hotplug cpu_hotplug; - struct xen_sysctl_pm_op pm_op; - struct xen_sysctl_page_offline_op page_offline; - struct xen_sysctl_lockprof_op lockprof_op; - struct xen_sysctl_cpupool_op cpupool_op; - struct xen_sysctl_scheduler_op scheduler_op; - struct xen_sysctl_coverage_op coverage_op; - struct xen_sysctl_psr_cmt_op psr_cmt_op; - struct xen_sysctl_psr_alloc psr_alloc; - struct xen_sysctl_cpu_levelling_caps cpu_levelling_caps; - struct xen_sysctl_cpu_featureset cpu_featureset; - struct xen_sysctl_livepatch_op livepatch; -#if defined(__i386__) || defined(__x86_64__) - struct xen_sysctl_cpu_policy cpu_policy; -#endif - uint8_t pad[128]; - } u; -}; -typedef struct xen_sysctl xen_sysctl_t; -DEFINE_XEN_GUEST_HANDLE(xen_sysctl_t); - -#endif /* __XEN_PUBLIC_SYSCTL_H__ */ - -/* - * Local variables: - * mode: C - * c-file-style: "BSD" - * c-basic-offset: 4 - * tab-width: 4 - * indent-tabs-mode: nil - * End: - */ diff --git a/sys/xen/interface/tmem.h b/sys/xen/interface/tmem.h deleted file mode 100644 index 362ba45d5ada..000000000000 --- a/sys/xen/interface/tmem.h +++ /dev/null @@ -1,122 +0,0 @@ -/****************************************************************************** - * tmem.h - * - * Guest OS interface to Xen Transcendent Memory. - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to - * deal in the Software without restriction, including without limitation the - * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or - * sell copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - * - * Copyright (c) 2004, K A Fraser - */ - -#ifndef __XEN_PUBLIC_TMEM_H__ -#define __XEN_PUBLIC_TMEM_H__ - -#include "xen.h" - -#if __XEN_INTERFACE_VERSION__ < 0x00041300 - -/* version of ABI */ -#define TMEM_SPEC_VERSION 1 - -#define TMEM_NEW_POOL 1 -#define TMEM_DESTROY_POOL 2 -#define TMEM_PUT_PAGE 4 -#define TMEM_GET_PAGE 5 -#define TMEM_FLUSH_PAGE 6 -#define TMEM_FLUSH_OBJECT 7 -#if __XEN_INTERFACE_VERSION__ < 0x00040400 -#define TMEM_NEW_PAGE 3 -#define TMEM_READ 8 -#define TMEM_WRITE 9 -#define TMEM_XCHG 10 -#endif - -/* Privileged commands now called via XEN_SYSCTL_tmem_op. */ -#define TMEM_AUTH 101 /* as XEN_SYSCTL_TMEM_OP_SET_AUTH. */ -#define TMEM_RESTORE_NEW 102 /* as XEN_SYSCTL_TMEM_OP_SET_POOL. */ - -/* Bits for HYPERVISOR_tmem_op(TMEM_NEW_POOL) */ -#define TMEM_POOL_PERSIST 1 -#define TMEM_POOL_SHARED 2 -#define TMEM_POOL_PRECOMPRESSED 4 -#define TMEM_POOL_PAGESIZE_SHIFT 4 -#define TMEM_POOL_PAGESIZE_MASK 0xf -#define TMEM_POOL_VERSION_SHIFT 24 -#define TMEM_POOL_VERSION_MASK 0xff -#define TMEM_POOL_RESERVED_BITS 0x00ffff00 - -/* Bits for client flags (save/restore) */ -#define TMEM_CLIENT_COMPRESS 1 -#define TMEM_CLIENT_FROZEN 2 - -/* Special errno values */ -#define EFROZEN 1000 -#define EEMPTY 1001 - -struct xen_tmem_oid { - uint64_t oid[3]; -}; -typedef struct xen_tmem_oid xen_tmem_oid_t; -DEFINE_XEN_GUEST_HANDLE(xen_tmem_oid_t); - -#ifndef __ASSEMBLY__ -#if __XEN_INTERFACE_VERSION__ < 0x00040400 -typedef xen_pfn_t tmem_cli_mfn_t; -#endif -typedef XEN_GUEST_HANDLE(char) tmem_cli_va_t; -struct tmem_op { - uint32_t cmd; - int32_t pool_id; - union { - struct { - uint64_t uuid[2]; - uint32_t flags; - uint32_t arg1; - } creat; /* for cmd == TMEM_NEW_POOL. */ - struct { -#if __XEN_INTERFACE_VERSION__ < 0x00040600 - uint64_t oid[3]; -#else - xen_tmem_oid_t oid; -#endif - uint32_t index; - uint32_t tmem_offset; - uint32_t pfn_offset; - uint32_t len; - xen_pfn_t cmfn; /* client machine page frame */ - } gen; /* for all other cmd ("generic") */ - } u; -}; -typedef struct tmem_op tmem_op_t; -DEFINE_XEN_GUEST_HANDLE(tmem_op_t); -#endif - -#endif /* __XEN_INTERFACE_VERSION__ < 0x00041300 */ - -#endif /* __XEN_PUBLIC_TMEM_H__ */ - -/* - * Local variables: - * mode: C - * c-file-style: "BSD" - * c-basic-offset: 4 - * tab-width: 4 - * indent-tabs-mode: nil - * End: - */ diff --git a/sys/xen/interface/trace.h b/sys/xen/interface/trace.h deleted file mode 100644 index d5fa4aea8dd8..000000000000 --- a/sys/xen/interface/trace.h +++ /dev/null @@ -1,341 +0,0 @@ -/****************************************************************************** - * 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<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/sys/xen/interface/vcpu.h b/sys/xen/interface/vcpu.h deleted file mode 100644 index 3623af932f7e..000000000000 --- a/sys/xen/interface/vcpu.h +++ /dev/null @@ -1,248 +0,0 @@ -/****************************************************************************** - * vcpu.h - * - * VCPU initialisation, query, and hotplug. - * - * 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 - */ - -#ifndef __XEN_PUBLIC_VCPU_H__ -#define __XEN_PUBLIC_VCPU_H__ - -#include "xen.h" - -/* - * Prototype for this hypercall is: - * long vcpu_op(int cmd, unsigned int vcpuid, void *extra_args) - * @cmd == VCPUOP_??? (VCPU operation). - * @vcpuid == VCPU to operate on. - * @extra_args == Operation-specific extra arguments (NULL if none). - */ - -/* - * Initialise a VCPU. Each VCPU can be initialised only once. A - * newly-initialised VCPU will not run until it is brought up by VCPUOP_up. - * - * @extra_arg == For PV or ARM guests this is a pointer to a vcpu_guest_context - * structure containing the initial state for the VCPU. For x86 - * HVM based guests this is a pointer to a vcpu_hvm_context - * structure. - */ -#define VCPUOP_initialise 0 - -/* - * Bring up a VCPU. This makes the VCPU runnable. This operation will fail - * if the VCPU has not been initialised (VCPUOP_initialise). - */ -#define VCPUOP_up 1 - -/* - * Bring down a VCPU (i.e., make it non-runnable). - * There are a few caveats that callers should observe: - * 1. This operation may return, and VCPU_is_up may return false, before the - * VCPU stops running (i.e., the command is asynchronous). It is a good - * idea to ensure that the VCPU has entered a non-critical loop before - * bringing it down. Alternatively, this operation is guaranteed - * synchronous if invoked by the VCPU itself. - * 2. After a VCPU is initialised, there is currently no way to drop all its - * references to domain memory. Even a VCPU that is down still holds - * memory references via its pagetable base pointer and GDT. It is good - * practise to move a VCPU onto an 'idle' or default page table, LDT and - * GDT before bringing it down. - */ -#define VCPUOP_down 2 - -/* Returns 1 if the given VCPU is up. */ -#define VCPUOP_is_up 3 - -/* - * Return information about the state and running time of a VCPU. - * @extra_arg == pointer to vcpu_runstate_info structure. - */ -#define VCPUOP_get_runstate_info 4 -struct vcpu_runstate_info { - /* VCPU's current state (RUNSTATE_*). */ - int state; - /* When was current state entered (system time, ns)? */ - uint64_t state_entry_time; - /* - * Update indicator set in state_entry_time: - * When activated via VMASST_TYPE_runstate_update_flag, set during - * updates in guest memory mapped copy of vcpu_runstate_info. - */ -#define XEN_RUNSTATE_UPDATE (xen_mk_ullong(1) << 63) - /* - * Time spent in each RUNSTATE_* (ns). The sum of these times is - * guaranteed not to drift from system time. - */ - uint64_t time[4]; -}; -typedef struct vcpu_runstate_info vcpu_runstate_info_t; -DEFINE_XEN_GUEST_HANDLE(vcpu_runstate_info_t); - -/* VCPU is currently running on a physical CPU. */ -#define RUNSTATE_running 0 - -/* VCPU is runnable, but not currently scheduled on any physical CPU. */ -#define RUNSTATE_runnable 1 - -/* VCPU is blocked (a.k.a. idle). It is therefore not runnable. */ -#define RUNSTATE_blocked 2 - -/* - * VCPU is not runnable, but it is not blocked. - * This is a 'catch all' state for things like hotplug and pauses by the - * system administrator (or for critical sections in the hypervisor). - * RUNSTATE_blocked dominates this state (it is the preferred state). - */ -#define RUNSTATE_offline 3 - -/* - * Register a shared memory area from which the guest may obtain its own - * runstate information without needing to execute a hypercall. - * Notes: - * 1. The registered address may be virtual or physical or guest handle, - * depending on the platform. Virtual address or guest handle should be - * registered on x86 systems. - * 2. Only one shared area may be registered per VCPU. The shared area is - * updated by the hypervisor each time the VCPU is scheduled. Thus - * runstate.state will always be RUNSTATE_running and - * runstate.state_entry_time will indicate the system time at which the - * VCPU was last scheduled to run. - * @extra_arg == pointer to vcpu_register_runstate_memory_area structure. - */ -#define VCPUOP_register_runstate_memory_area 5 -struct vcpu_register_runstate_memory_area { - union { - XEN_GUEST_HANDLE(vcpu_runstate_info_t) h; - struct vcpu_runstate_info *v; - uint64_t p; - } addr; -}; -typedef struct vcpu_register_runstate_memory_area vcpu_register_runstate_memory_area_t; -DEFINE_XEN_GUEST_HANDLE(vcpu_register_runstate_memory_area_t); - -/* - * Set or stop a VCPU's periodic timer. Every VCPU has one periodic timer - * which can be set via these commands. Periods smaller than one millisecond - * may not be supported. - */ -#define VCPUOP_set_periodic_timer 6 /* arg == vcpu_set_periodic_timer_t */ -#define VCPUOP_stop_periodic_timer 7 /* arg == NULL */ -struct vcpu_set_periodic_timer { - uint64_t period_ns; -}; -typedef struct vcpu_set_periodic_timer vcpu_set_periodic_timer_t; -DEFINE_XEN_GUEST_HANDLE(vcpu_set_periodic_timer_t); - -/* - * Set or stop a VCPU's single-shot timer. Every VCPU has one single-shot - * timer which can be set via these commands. - */ -#define VCPUOP_set_singleshot_timer 8 /* arg == vcpu_set_singleshot_timer_t */ -#define VCPUOP_stop_singleshot_timer 9 /* arg == NULL */ -struct vcpu_set_singleshot_timer { - uint64_t timeout_abs_ns; /* Absolute system time value in nanoseconds. */ - uint32_t flags; /* VCPU_SSHOTTMR_??? */ -}; -typedef struct vcpu_set_singleshot_timer vcpu_set_singleshot_timer_t; -DEFINE_XEN_GUEST_HANDLE(vcpu_set_singleshot_timer_t); - -/* Flags to VCPUOP_set_singleshot_timer. */ - /* Require the timeout to be in the future (return -ETIME if it's passed). */ -#define _VCPU_SSHOTTMR_future (0) -#define VCPU_SSHOTTMR_future (1U << _VCPU_SSHOTTMR_future) - -/* - * Register a memory location in the guest address space for the - * vcpu_info structure. This allows the guest to place the vcpu_info - * structure in a convenient place, such as in a per-cpu data area. - * The pointer need not be page aligned, but the structure must not - * cross a page boundary. - * - * This may be called only once per vcpu. - */ -#define VCPUOP_register_vcpu_info 10 /* arg == vcpu_register_vcpu_info_t */ -struct vcpu_register_vcpu_info { - uint64_t mfn; /* mfn of page to place vcpu_info */ - uint32_t offset; /* offset within page */ - uint32_t rsvd; /* unused */ -}; -typedef struct vcpu_register_vcpu_info vcpu_register_vcpu_info_t; -DEFINE_XEN_GUEST_HANDLE(vcpu_register_vcpu_info_t); - -/* Send an NMI to the specified VCPU. @extra_arg == NULL. */ -#define VCPUOP_send_nmi 11 - -/* - * Get the physical ID information for a pinned vcpu's underlying physical - * processor. The physical ID informmation is architecture-specific. - * On x86: id[31:0]=apic_id, id[63:32]=acpi_id. - * This command returns -EINVAL if it is not a valid operation for this VCPU. - */ -#define VCPUOP_get_physid 12 /* arg == vcpu_get_physid_t */ -struct vcpu_get_physid { - uint64_t phys_id; -}; -typedef struct vcpu_get_physid vcpu_get_physid_t; -DEFINE_XEN_GUEST_HANDLE(vcpu_get_physid_t); -#define xen_vcpu_physid_to_x86_apicid(physid) ((uint32_t)(physid)) -#define xen_vcpu_physid_to_x86_acpiid(physid) ((uint32_t)((physid) >> 32)) - -/* - * Register a memory location to get a secondary copy of the vcpu time - * parameters. The master copy still exists as part of the vcpu shared - * memory area, and this secondary copy is updated whenever the master copy - * is updated (and using the same versioning scheme for synchronisation). - * - * The intent is that this copy may be mapped (RO) into userspace so - * that usermode can compute system time using the time info and the - * tsc. Usermode will see an array of vcpu_time_info structures, one - * for each vcpu, and choose the right one by an existing mechanism - * which allows it to get the current vcpu number (such as via a - * segment limit). It can then apply the normal algorithm to compute - * system time from the tsc. - * - * @extra_arg == pointer to vcpu_register_time_info_memory_area structure. - */ -#define VCPUOP_register_vcpu_time_memory_area 13 -DEFINE_XEN_GUEST_HANDLE(vcpu_time_info_t); -struct vcpu_register_time_memory_area { - union { - XEN_GUEST_HANDLE(vcpu_time_info_t) h; - struct vcpu_time_info *v; - uint64_t p; - } addr; -}; -typedef struct vcpu_register_time_memory_area vcpu_register_time_memory_area_t; -DEFINE_XEN_GUEST_HANDLE(vcpu_register_time_memory_area_t); - -#endif /* __XEN_PUBLIC_VCPU_H__ */ - -/* - * Local variables: - * mode: C - * c-file-style: "BSD" - * c-basic-offset: 4 - * tab-width: 4 - * indent-tabs-mode: nil - * End: - */ diff --git a/sys/xen/interface/version.h b/sys/xen/interface/version.h deleted file mode 100644 index 17a81e23cde4..000000000000 --- a/sys/xen/interface/version.h +++ /dev/null @@ -1,113 +0,0 @@ -/****************************************************************************** - * version.h - * - * Xen version, type, and compile 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, Nguyen Anh Quynh - * Copyright (c) 2005, Keir Fraser - */ - -#ifndef __XEN_PUBLIC_VERSION_H__ -#define __XEN_PUBLIC_VERSION_H__ - -#include "xen.h" - -/* NB. All ops return zero on success, except XENVER_{version,pagesize} - * XENVER_{version,pagesize,build_id} */ - -/* arg == NULL; returns major:minor (16:16). */ -#define XENVER_version 0 - -/* arg == xen_extraversion_t. */ -#define XENVER_extraversion 1 -typedef char xen_extraversion_t[16]; -#define XEN_EXTRAVERSION_LEN (sizeof(xen_extraversion_t)) - -/* arg == xen_compile_info_t. */ -#define XENVER_compile_info 2 -struct xen_compile_info { - char compiler[64]; - char compile_by[16]; - char compile_domain[32]; - char compile_date[32]; -}; -typedef struct xen_compile_info xen_compile_info_t; - -#define XENVER_capabilities 3 -typedef char xen_capabilities_info_t[1024]; -#define XEN_CAPABILITIES_INFO_LEN (sizeof(xen_capabilities_info_t)) - -#define XENVER_changeset 4 -typedef char xen_changeset_info_t[64]; -#define XEN_CHANGESET_INFO_LEN (sizeof(xen_changeset_info_t)) - -#define XENVER_platform_parameters 5 -struct xen_platform_parameters { - xen_ulong_t virt_start; -}; -typedef struct xen_platform_parameters xen_platform_parameters_t; - -#define XENVER_get_features 6 -struct xen_feature_info { - unsigned int submap_idx; /* IN: which 32-bit submap to return */ - uint32_t submap; /* OUT: 32-bit submap */ -}; -typedef struct xen_feature_info xen_feature_info_t; - -/* Declares the features reported by XENVER_get_features. */ -#include "features.h" - -/* arg == NULL; returns host memory page size. */ -#define XENVER_pagesize 7 - -/* arg == xen_domain_handle_t. - * - * The toolstack fills it out for guest consumption. It is intended to hold - * the UUID of the guest. - */ -#define XENVER_guest_handle 8 - -#define XENVER_commandline 9 -typedef char xen_commandline_t[1024]; - -/* - * Return value is the number of bytes written, or XEN_Exx on error. - * Calling with empty parameter returns the size of build_id. - */ -#define XENVER_build_id 10 -struct xen_build_id { - uint32_t len; /* IN: size of buf[]. */ - unsigned char buf[XEN_FLEX_ARRAY_DIM]; - /* OUT: Variable length buffer with build_id. */ -}; -typedef struct xen_build_id xen_build_id_t; - -#endif /* __XEN_PUBLIC_VERSION_H__ */ - -/* - * Local variables: - * mode: C - * c-file-style: "BSD" - * c-basic-offset: 4 - * tab-width: 4 - * indent-tabs-mode: nil - * End: - */ diff --git a/sys/xen/interface/vm_event.h b/sys/xen/interface/vm_event.h deleted file mode 100644 index fdd3ad8a308a..000000000000 --- a/sys/xen/interface/vm_event.h +++ /dev/null @@ -1,415 +0,0 @@ -/****************************************************************************** - * vm_event.h - * - * Memory event common structures. - * - * Copyright (c) 2009 by Citrix Systems, Inc. (Patrick Colp) - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to - * deal in the Software without restriction, including without limitation the - * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or - * sell copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ - -#ifndef _XEN_PUBLIC_VM_EVENT_H -#define _XEN_PUBLIC_VM_EVENT_H - -#include "xen.h" - -#define VM_EVENT_INTERFACE_VERSION 0x00000006 - -#if defined(__XEN__) || defined(__XEN_TOOLS__) - -#include "io/ring.h" - -/* - * Memory event flags - */ - -/* - * VCPU_PAUSED in a request signals that the vCPU triggering the event has been - * paused - * VCPU_PAUSED in a response signals to unpause the vCPU - */ -#define VM_EVENT_FLAG_VCPU_PAUSED (1 << 0) -/* Flags to aid debugging vm_event */ -#define VM_EVENT_FLAG_FOREIGN (1 << 1) -/* - * The following flags can be set in response to a mem_access event. - * - * Emulate the fault-causing instruction (if set in the event response flags). - * This will allow the guest to continue execution without lifting the page - * access restrictions. - */ -#define VM_EVENT_FLAG_EMULATE (1 << 2) -/* - * Same as VM_EVENT_FLAG_EMULATE, but with write operations or operations - * potentially having side effects (like memory mapped or port I/O) disabled. - */ -#define VM_EVENT_FLAG_EMULATE_NOWRITE (1 << 3) -/* - * Toggle singlestepping on vm_event response. - * Requires the vCPU to be paused already (synchronous events only). - */ -#define VM_EVENT_FLAG_TOGGLE_SINGLESTEP (1 << 4) -/* - * Data is being sent back to the hypervisor in the event response, to be - * returned by the read function when emulating an instruction. - * This flag is only useful when combined with VM_EVENT_FLAG_EMULATE - * and takes precedence if combined with VM_EVENT_FLAG_EMULATE_NOWRITE - * (i.e. if both VM_EVENT_FLAG_EMULATE_NOWRITE and - * VM_EVENT_FLAG_SET_EMUL_READ_DATA are set, only the latter will be honored). - */ -#define VM_EVENT_FLAG_SET_EMUL_READ_DATA (1 << 5) -/* - * Deny completion of the operation that triggered the event. - * Currently only useful for MSR and control-register write events. - * Requires the vCPU to be paused already (synchronous events only). - */ -#define VM_EVENT_FLAG_DENY (1 << 6) -/* - * This flag can be set in a request or a response - * - * On a request, indicates that the event occurred in the alternate p2m - * specified by the altp2m_idx request field. - * - * On a response, indicates that the VCPU should resume in the alternate p2m - * specified by the altp2m_idx response field if possible. - */ -#define VM_EVENT_FLAG_ALTERNATE_P2M (1 << 7) -/* - * Set the vCPU registers to the values in the vm_event response. - * At the moment x86-only, applies to EAX-EDX, ESP, EBP, ESI, EDI, R8-R15, - * EFLAGS, and EIP. - * Requires the vCPU to be paused already (synchronous events only). - */ -#define VM_EVENT_FLAG_SET_REGISTERS (1 << 8) -/* - * Instruction cache is being sent back to the hypervisor in the event response - * to be used by the emulator. This flag is only useful when combined with - * VM_EVENT_FLAG_EMULATE and does not take presedence if combined with - * VM_EVENT_FLAG_EMULATE_NOWRITE or VM_EVENT_FLAG_SET_EMUL_READ_DATA, (i.e. - * if any of those flags are set, only those will be honored). - */ -#define VM_EVENT_FLAG_SET_EMUL_INSN_DATA (1 << 9) -/* - * Have a one-shot VM_EVENT_REASON_INTERRUPT event sent for the first - * interrupt pending after resuming the VCPU. - */ -#define VM_EVENT_FLAG_GET_NEXT_INTERRUPT (1 << 10) -/* - * Execute fast singlestepping on vm_event response. - * Requires the vCPU to be paused already (synchronous events only). - * - * On a response requires setting the p2midx field of fast_singlestep to which - * Xen will switch the vCPU to on the occurance of the first singlestep, after - * which singlestep gets automatically disabled. - */ -#define VM_EVENT_FLAG_FAST_SINGLESTEP (1 << 11) - -/* - * Reasons for the vm event request - */ - -/* Default case */ -#define VM_EVENT_REASON_UNKNOWN 0 -/* Memory access violation */ -#define VM_EVENT_REASON_MEM_ACCESS 1 -/* Memory sharing event */ -#define VM_EVENT_REASON_MEM_SHARING 2 -/* Memory paging event */ -#define VM_EVENT_REASON_MEM_PAGING 3 -/* A control register was updated */ -#define VM_EVENT_REASON_WRITE_CTRLREG 4 -/* An MSR was updated. */ -#define VM_EVENT_REASON_MOV_TO_MSR 5 -/* Debug operation executed (e.g. int3) */ -#define VM_EVENT_REASON_SOFTWARE_BREAKPOINT 6 -/* Single-step (e.g. MTF) */ -#define VM_EVENT_REASON_SINGLESTEP 7 -/* An event has been requested via HVMOP_guest_request_vm_event. */ -#define VM_EVENT_REASON_GUEST_REQUEST 8 -/* A debug exception was caught */ -#define VM_EVENT_REASON_DEBUG_EXCEPTION 9 -/* CPUID executed */ -#define VM_EVENT_REASON_CPUID 10 -/* - * Privileged call executed (e.g. SMC). - * Note: event may be generated even if SMC condition check fails on some CPUs. - * As this behavior is CPU-specific, users are advised to not rely on it. - * These kinds of events will be filtered out in future versions. - */ -#define VM_EVENT_REASON_PRIVILEGED_CALL 11 -/* An interrupt has been delivered. */ -#define VM_EVENT_REASON_INTERRUPT 12 -/* A descriptor table register was accessed. */ -#define VM_EVENT_REASON_DESCRIPTOR_ACCESS 13 -/* Current instruction is not implemented by the emulator */ -#define VM_EVENT_REASON_EMUL_UNIMPLEMENTED 14 - -/* Supported values for the vm_event_write_ctrlreg index. */ -#define VM_EVENT_X86_CR0 0 -#define VM_EVENT_X86_CR3 1 -#define VM_EVENT_X86_CR4 2 -#define VM_EVENT_X86_XCR0 3 - -/* The limit field is right-shifted by 12 bits if .ar.g is set. */ -struct vm_event_x86_selector_reg { - uint32_t limit : 20; - uint32_t ar : 12; -}; - -/* - * Using custom vCPU structs (i.e. not hvm_hw_cpu) for both x86 and ARM - * so as to not fill the vm_event ring buffer too quickly. - */ -struct vm_event_regs_x86 { - uint64_t rax; - uint64_t rcx; - uint64_t rdx; - uint64_t rbx; - uint64_t rsp; - uint64_t rbp; - uint64_t rsi; - uint64_t rdi; - uint64_t r8; - uint64_t r9; - uint64_t r10; - uint64_t r11; - uint64_t r12; - uint64_t r13; - uint64_t r14; - uint64_t r15; - uint64_t rflags; - uint64_t dr6; - uint64_t dr7; - uint64_t rip; - uint64_t cr0; - uint64_t cr2; - uint64_t cr3; - uint64_t cr4; - uint64_t sysenter_cs; - uint64_t sysenter_esp; - uint64_t sysenter_eip; - uint64_t msr_efer; - uint64_t msr_star; - uint64_t msr_lstar; - uint64_t gdtr_base; - uint32_t cs_base; - uint32_t ss_base; - uint32_t ds_base; - uint32_t es_base; - uint64_t fs_base; - uint64_t gs_base; - struct vm_event_x86_selector_reg cs; - struct vm_event_x86_selector_reg ss; - struct vm_event_x86_selector_reg ds; - struct vm_event_x86_selector_reg es; - struct vm_event_x86_selector_reg fs; - struct vm_event_x86_selector_reg gs; - uint64_t shadow_gs; - uint16_t gdtr_limit; - uint16_t cs_sel; - uint16_t ss_sel; - uint16_t ds_sel; - uint16_t es_sel; - uint16_t fs_sel; - uint16_t gs_sel; - uint16_t _pad; -}; - -/* - * Only the register 'pc' can be set on a vm_event response using the - * VM_EVENT_FLAG_SET_REGISTERS flag. - */ -struct vm_event_regs_arm { - uint64_t ttbr0; - uint64_t ttbr1; - uint64_t ttbcr; - uint64_t pc; - uint32_t cpsr; - uint32_t _pad; -}; - -/* - * mem_access flag definitions - * - * These flags are set only as part of a mem_event request. - * - * R/W/X: Defines the type of violation that has triggered the event - * Multiple types can be set in a single violation! - * GLA_VALID: If the gla field holds a guest VA associated with the event - * FAULT_WITH_GLA: If the violation was triggered by accessing gla - * FAULT_IN_GPT: If the violation was triggered during translating gla - */ -#define MEM_ACCESS_R (1 << 0) -#define MEM_ACCESS_W (1 << 1) -#define MEM_ACCESS_X (1 << 2) -#define MEM_ACCESS_RWX (MEM_ACCESS_R | MEM_ACCESS_W | MEM_ACCESS_X) -#define MEM_ACCESS_RW (MEM_ACCESS_R | MEM_ACCESS_W) -#define MEM_ACCESS_RX (MEM_ACCESS_R | MEM_ACCESS_X) -#define MEM_ACCESS_WX (MEM_ACCESS_W | MEM_ACCESS_X) -#define MEM_ACCESS_GLA_VALID (1 << 3) -#define MEM_ACCESS_FAULT_WITH_GLA (1 << 4) -#define MEM_ACCESS_FAULT_IN_GPT (1 << 5) - -struct vm_event_mem_access { - uint64_t gfn; - uint64_t offset; - uint64_t gla; /* if flags has MEM_ACCESS_GLA_VALID set */ - uint32_t flags; /* MEM_ACCESS_* */ - uint32_t _pad; -}; - -struct vm_event_write_ctrlreg { - uint32_t index; - uint32_t _pad; - uint64_t new_value; - uint64_t old_value; -}; - -struct vm_event_singlestep { - uint64_t gfn; -}; - -struct vm_event_fast_singlestep { - uint16_t p2midx; -}; - -struct vm_event_debug { - uint64_t gfn; - uint64_t pending_dbg; /* Behaves like the VT-x PENDING_DBG field. */ - uint32_t insn_length; - uint8_t type; /* HVMOP_TRAP_* */ - uint8_t _pad[3]; -}; - -struct vm_event_mov_to_msr { - uint64_t msr; - uint64_t new_value; - uint64_t old_value; -}; - -#define VM_EVENT_DESC_IDTR 1 -#define VM_EVENT_DESC_GDTR 2 -#define VM_EVENT_DESC_LDTR 3 -#define VM_EVENT_DESC_TR 4 - -struct vm_event_desc_access { - union { - struct { - uint32_t instr_info; /* VMX: VMCS Instruction-Information */ - uint32_t _pad1; - uint64_t exit_qualification; /* VMX: VMCS Exit Qualification */ - } vmx; - } arch; - uint8_t descriptor; /* VM_EVENT_DESC_* */ - uint8_t is_write; - uint8_t _pad[6]; -}; - -struct vm_event_cpuid { - uint32_t insn_length; - uint32_t leaf; - uint32_t subleaf; - uint32_t _pad; -}; - -struct vm_event_interrupt_x86 { - uint32_t vector; - uint32_t type; - uint32_t error_code; - uint32_t _pad; - uint64_t cr2; -}; - -#define MEM_PAGING_DROP_PAGE (1 << 0) -#define MEM_PAGING_EVICT_FAIL (1 << 1) - -struct vm_event_paging { - uint64_t gfn; - uint32_t p2mt; - uint32_t flags; -}; - -struct vm_event_sharing { - uint64_t gfn; - uint32_t p2mt; - uint32_t _pad; -}; - -struct vm_event_emul_read_data { - uint32_t size; - /* The struct is used in a union with vm_event_regs_x86. */ - uint8_t data[sizeof(struct vm_event_regs_x86) - sizeof(uint32_t)]; -}; - -struct vm_event_emul_insn_data { - uint8_t data[16]; /* Has to be completely filled */ -}; - -typedef struct vm_event_st { - uint32_t version; /* VM_EVENT_INTERFACE_VERSION */ - uint32_t flags; /* VM_EVENT_FLAG_* */ - uint32_t reason; /* VM_EVENT_REASON_* */ - uint32_t vcpu_id; - uint16_t altp2m_idx; /* may be used during request and response */ - uint16_t _pad[3]; - - union { - struct vm_event_paging mem_paging; - struct vm_event_sharing mem_sharing; - struct vm_event_mem_access mem_access; - struct vm_event_write_ctrlreg write_ctrlreg; - struct vm_event_mov_to_msr mov_to_msr; - struct vm_event_desc_access desc_access; - struct vm_event_singlestep singlestep; - struct vm_event_fast_singlestep fast_singlestep; - struct vm_event_debug software_breakpoint; - struct vm_event_debug debug_exception; - struct vm_event_cpuid cpuid; - union { - struct vm_event_interrupt_x86 x86; - } interrupt; - } u; - - union { - union { - struct vm_event_regs_x86 x86; - struct vm_event_regs_arm arm; - } regs; - - union { - struct vm_event_emul_read_data read; - struct vm_event_emul_insn_data insn; - } emul; - } data; -} vm_event_request_t, vm_event_response_t; - -DEFINE_RING_TYPES(vm_event, vm_event_request_t, vm_event_response_t); - -#endif /* defined(__XEN__) || defined(__XEN_TOOLS__) */ -#endif /* _XEN_PUBLIC_VM_EVENT_H */ - -/* - * Local variables: - * mode: C - * c-file-style: "BSD" - * c-basic-offset: 4 - * tab-width: 4 - * indent-tabs-mode: nil - * End: - */ diff --git a/sys/xen/interface/xen-compat.h b/sys/xen/interface/xen-compat.h deleted file mode 100644 index e1c027a95c7c..000000000000 --- a/sys/xen/interface/xen-compat.h +++ /dev/null @@ -1,46 +0,0 @@ -/****************************************************************************** - * xen-compat.h - * - * Guest OS interface to Xen. Compatibility layer. - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to - * deal in the Software without restriction, including without limitation the - * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or - * sell copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - * - * Copyright (c) 2006, Christian Limpach - */ - -#ifndef __XEN_PUBLIC_XEN_COMPAT_H__ -#define __XEN_PUBLIC_XEN_COMPAT_H__ - -#define __XEN_LATEST_INTERFACE_VERSION__ 0x00040e00 - -#if defined(__XEN__) || defined(__XEN_TOOLS__) -/* Xen is built with matching headers and implements the latest interface. */ -#define __XEN_INTERFACE_VERSION__ __XEN_LATEST_INTERFACE_VERSION__ -#elif !defined(__XEN_INTERFACE_VERSION__) -/* Guests which do not specify a version get the legacy interface. */ -#define __XEN_INTERFACE_VERSION__ 0x00000000 -#endif - -#if __XEN_INTERFACE_VERSION__ > __XEN_LATEST_INTERFACE_VERSION__ -#error "These header files do not support the requested interface version." -#endif - -#define COMPAT_FLEX_ARRAY_DIM XEN_FLEX_ARRAY_DIM - -#endif /* __XEN_PUBLIC_XEN_COMPAT_H__ */ diff --git a/sys/xen/interface/xen.h b/sys/xen/interface/xen.h deleted file mode 100644 index 945ef3027354..000000000000 --- a/sys/xen/interface/xen.h +++ /dev/null @@ -1,1048 +0,0 @@ -/****************************************************************************** - * xen.h - * - * Guest OS interface to Xen. - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to - * deal in the Software without restriction, including without limitation the - * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or - * sell copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - * - * Copyright (c) 2004, K A Fraser - */ - -#ifndef __XEN_PUBLIC_XEN_H__ -#define __XEN_PUBLIC_XEN_H__ - -#include "xen-compat.h" - -#if defined(__i386__) || defined(__x86_64__) -#include "arch-x86/xen.h" -#elif defined(__arm__) || defined (__aarch64__) -#include "arch-arm.h" -#else -#error "Unsupported architecture" -#endif - -#ifndef __ASSEMBLY__ -/* Guest handles for primitive C types. */ -DEFINE_XEN_GUEST_HANDLE(char); -__DEFINE_XEN_GUEST_HANDLE(uchar, unsigned char); -DEFINE_XEN_GUEST_HANDLE(int); -__DEFINE_XEN_GUEST_HANDLE(uint, unsigned int); -#if __XEN_INTERFACE_VERSION__ < 0x00040300 -DEFINE_XEN_GUEST_HANDLE(long); -__DEFINE_XEN_GUEST_HANDLE(ulong, unsigned long); -#endif -DEFINE_XEN_GUEST_HANDLE(void); - -DEFINE_XEN_GUEST_HANDLE(uint64_t); -DEFINE_XEN_GUEST_HANDLE(xen_pfn_t); -DEFINE_XEN_GUEST_HANDLE(xen_ulong_t); - -/* Define a variable length array (depends on compiler). */ -#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L -#define XEN_FLEX_ARRAY_DIM -#elif defined(__GNUC__) -#define XEN_FLEX_ARRAY_DIM 0 -#else -#define XEN_FLEX_ARRAY_DIM 1 /* variable size */ -#endif - -/* 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_ullong(x) x - -#endif - -/* - * HYPERCALLS - */ - -/* `incontents 100 hcalls List of hypercalls - * ` enum hypercall_num { // __HYPERVISOR_* => HYPERVISOR_*() - */ - -#define __HYPERVISOR_set_trap_table 0 -#define __HYPERVISOR_mmu_update 1 -#define __HYPERVISOR_set_gdt 2 -#define __HYPERVISOR_stack_switch 3 -#define __HYPERVISOR_set_callbacks 4 -#define __HYPERVISOR_fpu_taskswitch 5 -#define __HYPERVISOR_sched_op_compat 6 /* compat since 0x00030101 */ -#define __HYPERVISOR_platform_op 7 -#define __HYPERVISOR_set_debugreg 8 -#define __HYPERVISOR_get_debugreg 9 -#define __HYPERVISOR_update_descriptor 10 -#define __HYPERVISOR_memory_op 12 -#define __HYPERVISOR_multicall 13 -#define __HYPERVISOR_update_va_mapping 14 -#define __HYPERVISOR_set_timer_op 15 -#define __HYPERVISOR_event_channel_op_compat 16 /* compat since 0x00030202 */ -#define __HYPERVISOR_xen_version 17 -#define __HYPERVISOR_console_io 18 -#define __HYPERVISOR_physdev_op_compat 19 /* compat since 0x00030202 */ -#define __HYPERVISOR_grant_table_op 20 -#define __HYPERVISOR_vm_assist 21 -#define __HYPERVISOR_update_va_mapping_otherdomain 22 -#define __HYPERVISOR_iret 23 /* x86 only */ -#define __HYPERVISOR_vcpu_op 24 -#define __HYPERVISOR_set_segment_base 25 /* x86/64 only */ -#define __HYPERVISOR_mmuext_op 26 -#define __HYPERVISOR_xsm_op 27 -#define __HYPERVISOR_nmi_op 28 -#define __HYPERVISOR_sched_op 29 -#define __HYPERVISOR_callback_op 30 -#define __HYPERVISOR_xenoprof_op 31 -#define __HYPERVISOR_event_channel_op 32 -#define __HYPERVISOR_physdev_op 33 -#define __HYPERVISOR_hvm_op 34 -#define __HYPERVISOR_sysctl 35 -#define __HYPERVISOR_domctl 36 -#define __HYPERVISOR_kexec_op 37 -#define __HYPERVISOR_tmem_op 38 -#define __HYPERVISOR_argo_op 39 -#define __HYPERVISOR_xenpmu_op 40 -#define __HYPERVISOR_dm_op 41 -#define __HYPERVISOR_hypfs_op 42 - -/* Architecture-specific hypercall definitions. */ -#define __HYPERVISOR_arch_0 48 -#define __HYPERVISOR_arch_1 49 -#define __HYPERVISOR_arch_2 50 -#define __HYPERVISOR_arch_3 51 -#define __HYPERVISOR_arch_4 52 -#define __HYPERVISOR_arch_5 53 -#define __HYPERVISOR_arch_6 54 -#define __HYPERVISOR_arch_7 55 - -/* ` } */ - -/* - * HYPERCALL COMPATIBILITY. - */ - -/* New sched_op hypercall introduced in 0x00030101. */ -#if __XEN_INTERFACE_VERSION__ < 0x00030101 -#undef __HYPERVISOR_sched_op -#define __HYPERVISOR_sched_op __HYPERVISOR_sched_op_compat -#endif - -/* New event-channel and physdev hypercalls introduced in 0x00030202. */ -#if __XEN_INTERFACE_VERSION__ < 0x00030202 -#undef __HYPERVISOR_event_channel_op -#define __HYPERVISOR_event_channel_op __HYPERVISOR_event_channel_op_compat -#undef __HYPERVISOR_physdev_op -#define __HYPERVISOR_physdev_op __HYPERVISOR_physdev_op_compat -#endif - -/* New platform_op hypercall introduced in 0x00030204. */ -#if __XEN_INTERFACE_VERSION__ < 0x00030204 -#define __HYPERVISOR_dom0_op __HYPERVISOR_platform_op -#endif - -/* - * VIRTUAL INTERRUPTS - * - * Virtual interrupts that a guest OS may receive from Xen. - * - * In the side comments, 'V.' denotes a per-VCPU VIRQ while 'G.' denotes a - * global VIRQ. The former can be bound once per VCPU and cannot be re-bound. - * The latter can be allocated only once per guest: they must initially be - * allocated to VCPU0 but can subsequently be re-bound. - */ -/* ` enum virq { */ -#define VIRQ_TIMER 0 /* V. Timebase update, and/or requested timeout. */ -#define VIRQ_DEBUG 1 /* V. Request guest to dump debug info. */ -#define VIRQ_CONSOLE 2 /* G. (DOM0) Bytes received on emergency console. */ -#define VIRQ_DOM_EXC 3 /* G. (DOM0) Exceptional event for some domain. */ -#define VIRQ_TBUF 4 /* G. (DOM0) Trace buffer has records available. */ -#define VIRQ_DEBUGGER 6 /* G. (DOM0) A domain has paused for debugging. */ -#define VIRQ_XENOPROF 7 /* V. XenOprofile interrupt: new sample available */ -#define VIRQ_CON_RING 8 /* G. (DOM0) Bytes received on console */ -#define VIRQ_PCPU_STATE 9 /* G. (DOM0) PCPU state changed */ -#define VIRQ_MEM_EVENT 10 /* G. (DOM0) A memory event has occurred */ -#define VIRQ_ARGO 11 /* G. Argo interdomain message notification */ -#define VIRQ_ENOMEM 12 /* G. (DOM0) Low on heap memory */ -#define VIRQ_XENPMU 13 /* V. PMC interrupt */ - -/* Architecture-specific VIRQ definitions. */ -#define VIRQ_ARCH_0 16 -#define VIRQ_ARCH_1 17 -#define VIRQ_ARCH_2 18 -#define VIRQ_ARCH_3 19 -#define VIRQ_ARCH_4 20 -#define VIRQ_ARCH_5 21 -#define VIRQ_ARCH_6 22 -#define VIRQ_ARCH_7 23 -/* ` } */ - -#define NR_VIRQS 24 - -/* - * ` enum neg_errnoval - * ` HYPERVISOR_mmu_update(const struct mmu_update reqs[], - * ` unsigned count, unsigned *done_out, - * ` unsigned foreigndom) - * ` - * @reqs is an array of mmu_update_t structures ((ptr, val) pairs). - * @count is the length of the above array. - * @pdone is an output parameter indicating number of completed operations - * @foreigndom[15:0]: FD, the expected owner of data pages referenced in this - * hypercall invocation. Can be DOMID_SELF. - * @foreigndom[31:16]: PFD, the expected owner of pagetable pages referenced - * in this hypercall invocation. The value of this field - * (x) encodes the PFD as follows: - * x == 0 => PFD == DOMID_SELF - * x != 0 => PFD == x - 1 - * - * Sub-commands: ptr[1:0] specifies the appropriate MMU_* command. - * ------------- - * ptr[1:0] == MMU_NORMAL_PT_UPDATE: - * Updates an entry in a page table belonging to PFD. If updating an L1 table, - * and the new table entry is valid/present, the mapped frame must belong to - * FD. If attempting to map an I/O page then the caller assumes the privilege - * of the FD. - * FD == DOMID_IO: Permit /only/ I/O mappings, at the priv level of the caller. - * FD == DOMID_XEN: Map restricted areas of Xen's heap space. - * ptr[:2] -- Machine address of the page-table entry to modify. - * val -- Value to write. - * - * There also certain implicit requirements when using this hypercall. The - * pages that make up a pagetable must be mapped read-only in the guest. - * This prevents uncontrolled guest updates to the pagetable. Xen strictly - * enforces this, and will disallow any pagetable update which will end up - * mapping pagetable page RW, and will disallow using any writable page as a - * pagetable. In practice it means that when constructing a page table for a - * process, thread, etc, we MUST be very dilligient in following these rules: - * 1). Start with top-level page (PGD or in Xen language: L4). Fill out - * the entries. - * 2). Keep on going, filling out the upper (PUD or L3), and middle (PMD - * or L2). - * 3). Start filling out the PTE table (L1) with the PTE entries. Once - * done, make sure to set each of those entries to RO (so writeable bit - * is unset). Once that has been completed, set the PMD (L2) for this - * PTE table as RO. - * 4). When completed with all of the PMD (L2) entries, and all of them have - * been set to RO, make sure to set RO the PUD (L3). Do the same - * operation on PGD (L4) pagetable entries that have a PUD (L3) entry. - * 5). Now before you can use those pages (so setting the cr3), you MUST also - * pin them so that the hypervisor can verify the entries. This is done - * via the HYPERVISOR_mmuext_op(MMUEXT_PIN_L4_TABLE, guest physical frame - * number of the PGD (L4)). And this point the HYPERVISOR_mmuext_op( - * MMUEXT_NEW_BASEPTR, guest physical frame number of the PGD (L4)) can be - * issued. - * For 32-bit guests, the L4 is not used (as there is less pagetables), so - * instead use L3. - * At this point the pagetables can be modified using the MMU_NORMAL_PT_UPDATE - * hypercall. Also if so desired the OS can also try to write to the PTE - * and be trapped by the hypervisor (as the PTE entry is RO). - * - * To deallocate the pages, the operations are the reverse of the steps - * mentioned above. The argument is MMUEXT_UNPIN_TABLE for all levels and the - * pagetable MUST not be in use (meaning that the cr3 is not set to it). - * - * ptr[1:0] == MMU_MACHPHYS_UPDATE: - * Updates an entry in the machine->pseudo-physical mapping table. - * ptr[:2] -- Machine address within the frame whose mapping to modify. - * The frame must belong to the FD, if one is specified. - * val -- Value to write into the mapping entry. - * - * ptr[1:0] == MMU_PT_UPDATE_PRESERVE_AD: - * As MMU_NORMAL_PT_UPDATE above, but A/D bits currently in the PTE are ORed - * with those in @val. - * - * ptr[1:0] == MMU_PT_UPDATE_NO_TRANSLATE: - * As MMU_NORMAL_PT_UPDATE above, but @val is not translated though FD - * page tables. - * - * @val is usually the machine frame number along with some attributes. - * The attributes by default follow the architecture defined bits. Meaning that - * if this is a X86_64 machine and four page table layout is used, the layout - * of val is: - * - 63 if set means No execute (NX) - * - 46-13 the machine frame number - * - 12 available for guest - * - 11 available for guest - * - 10 available for guest - * - 9 available for guest - * - 8 global - * - 7 PAT (PSE is disabled, must use hypercall to make 4MB or 2MB pages) - * - 6 dirty - * - 5 accessed - * - 4 page cached disabled - * - 3 page write through - * - 2 userspace accessible - * - 1 writeable - * - 0 present - * - * The one bits that does not fit with the default layout is the PAGE_PSE - * also called PAGE_PAT). The MMUEXT_[UN]MARK_SUPER arguments to the - * HYPERVISOR_mmuext_op serve as mechanism to set a pagetable to be 4MB - * (or 2MB) instead of using the PAGE_PSE bit. - * - * The reason that the PAGE_PSE (bit 7) is not being utilized is due to Xen - * using it as the Page Attribute Table (PAT) bit - for details on it please - * refer to Intel SDM 10.12. The PAT allows to set the caching attributes of - * pages instead of using MTRRs. - * - * The PAT MSR is as follows (it is a 64-bit value, each entry is 8 bits): - * PAT4 PAT0 - * +-----+-----+----+----+----+-----+----+----+ - * | UC | UC- | WC | WB | UC | UC- | WC | WB | <= Linux - * +-----+-----+----+----+----+-----+----+----+ - * | UC | UC- | WT | WB | UC | UC- | WT | WB | <= BIOS (default when machine boots) - * +-----+-----+----+----+----+-----+----+----+ - * | rsv | rsv | WP | WC | UC | UC- | WT | WB | <= Xen - * +-----+-----+----+----+----+-----+----+----+ - * - * The lookup of this index table translates to looking up - * Bit 7, Bit 4, and Bit 3 of val entry: - * - * PAT/PSE (bit 7) ... PCD (bit 4) .. PWT (bit 3). - * - * If all bits are off, then we are using PAT0. If bit 3 turned on, - * then we are using PAT1, if bit 3 and bit 4, then PAT2.. - * - * As you can see, the Linux PAT1 translates to PAT4 under Xen. Which means - * that if a guest that follows Linux's PAT setup and would like to set Write - * Combined on pages it MUST use PAT4 entry. Meaning that Bit 7 (PAGE_PAT) is - * set. For example, under Linux it only uses PAT0, PAT1, and PAT2 for the - * caching as: - * - * WB = none (so PAT0) - * WC = PWT (bit 3 on) - * UC = PWT | PCD (bit 3 and 4 are on). - * - * To make it work with Xen, it needs to translate the WC bit as so: - * - * PWT (so bit 3 on) --> PAT (so bit 7 is on) and clear bit 3 - * - * And to translate back it would: - * - * PAT (bit 7 on) --> PWT (bit 3 on) and clear bit 7. - */ -#define MMU_NORMAL_PT_UPDATE 0 /* checked '*ptr = val'. ptr is MA. */ -#define MMU_MACHPHYS_UPDATE 1 /* ptr = MA of frame to modify entry for */ -#define MMU_PT_UPDATE_PRESERVE_AD 2 /* atomically: *ptr = val | (*ptr&(A|D)) */ -#define MMU_PT_UPDATE_NO_TRANSLATE 3 /* checked '*ptr = val'. ptr is MA. */ - /* val never translated. */ - -/* - * MMU EXTENDED OPERATIONS - * - * ` enum neg_errnoval - * ` HYPERVISOR_mmuext_op(mmuext_op_t uops[], - * ` unsigned int count, - * ` unsigned int *pdone, - * ` unsigned int foreigndom) - */ -/* HYPERVISOR_mmuext_op() accepts a list of mmuext_op structures. - * A foreigndom (FD) can be specified (or DOMID_SELF for none). - * Where the FD has some effect, it is described below. - * - * cmd: MMUEXT_(UN)PIN_*_TABLE - * mfn: Machine frame number to be (un)pinned as a p.t. page. - * The frame must belong to the FD, if one is specified. - * - * cmd: MMUEXT_NEW_BASEPTR - * mfn: Machine frame number of new page-table base to install in MMU. - * - * cmd: MMUEXT_NEW_USER_BASEPTR [x86/64 only] - * mfn: Machine frame number of new page-table base to install in MMU - * when in user space. - * - * cmd: MMUEXT_TLB_FLUSH_LOCAL - * No additional arguments. Flushes local TLB. - * - * cmd: MMUEXT_INVLPG_LOCAL - * linear_addr: Linear address to be flushed from the local TLB. - * - * cmd: MMUEXT_TLB_FLUSH_MULTI - * vcpumask: Pointer to bitmap of VCPUs to be flushed. - * - * cmd: MMUEXT_INVLPG_MULTI - * linear_addr: Linear address to be flushed. - * vcpumask: Pointer to bitmap of VCPUs to be flushed. - * - * cmd: MMUEXT_TLB_FLUSH_ALL - * No additional arguments. Flushes all VCPUs' TLBs. - * - * cmd: MMUEXT_INVLPG_ALL - * linear_addr: Linear address to be flushed from all VCPUs' TLBs. - * - * cmd: MMUEXT_FLUSH_CACHE - * No additional arguments. Writes back and flushes cache contents. - * - * cmd: MMUEXT_FLUSH_CACHE_GLOBAL - * No additional arguments. Writes back and flushes cache contents - * on all CPUs in the system. - * - * cmd: MMUEXT_SET_LDT - * linear_addr: Linear address of LDT base (NB. must be page-aligned). - * nr_ents: Number of entries in LDT. - * - * cmd: MMUEXT_CLEAR_PAGE - * mfn: Machine frame number to be cleared. - * - * cmd: MMUEXT_COPY_PAGE - * mfn: Machine frame number of the destination page. - * src_mfn: Machine frame number of the source page. - * - * cmd: MMUEXT_[UN]MARK_SUPER - * mfn: Machine frame number of head of superpage to be [un]marked. - */ -/* ` enum mmuext_cmd { */ -#define MMUEXT_PIN_L1_TABLE 0 -#define MMUEXT_PIN_L2_TABLE 1 -#define MMUEXT_PIN_L3_TABLE 2 -#define MMUEXT_PIN_L4_TABLE 3 -#define MMUEXT_UNPIN_TABLE 4 -#define MMUEXT_NEW_BASEPTR 5 -#define MMUEXT_TLB_FLUSH_LOCAL 6 -#define MMUEXT_INVLPG_LOCAL 7 -#define MMUEXT_TLB_FLUSH_MULTI 8 -#define MMUEXT_INVLPG_MULTI 9 -#define MMUEXT_TLB_FLUSH_ALL 10 -#define MMUEXT_INVLPG_ALL 11 -#define MMUEXT_FLUSH_CACHE 12 -#define MMUEXT_SET_LDT 13 -#define MMUEXT_NEW_USER_BASEPTR 15 -#define MMUEXT_CLEAR_PAGE 16 -#define MMUEXT_COPY_PAGE 17 -#define MMUEXT_FLUSH_CACHE_GLOBAL 18 -#define MMUEXT_MARK_SUPER 19 -#define MMUEXT_UNMARK_SUPER 20 -/* ` } */ - -#ifndef __ASSEMBLY__ -struct mmuext_op { - unsigned int cmd; /* => enum mmuext_cmd */ - union { - /* [UN]PIN_TABLE, NEW_BASEPTR, NEW_USER_BASEPTR - * CLEAR_PAGE, COPY_PAGE, [UN]MARK_SUPER */ - xen_pfn_t mfn; - /* INVLPG_LOCAL, INVLPG_ALL, SET_LDT */ - unsigned long linear_addr; - } arg1; - union { - /* SET_LDT */ - unsigned int nr_ents; - /* TLB_FLUSH_MULTI, INVLPG_MULTI */ -#if __XEN_INTERFACE_VERSION__ >= 0x00030205 - XEN_GUEST_HANDLE(const_void) vcpumask; -#else - const void *vcpumask; -#endif - /* COPY_PAGE */ - xen_pfn_t src_mfn; - } arg2; -}; -typedef struct mmuext_op mmuext_op_t; -DEFINE_XEN_GUEST_HANDLE(mmuext_op_t); -#endif - -/* - * ` enum neg_errnoval - * ` HYPERVISOR_update_va_mapping(unsigned long va, u64 val, - * ` enum uvm_flags flags) - * ` - * ` enum neg_errnoval - * ` HYPERVISOR_update_va_mapping_otherdomain(unsigned long va, u64 val, - * ` enum uvm_flags flags, - * ` domid_t domid) - * ` - * ` @va: The virtual address whose mapping we want to change - * ` @val: The new page table entry, must contain a machine address - * ` @flags: Control TLB flushes - */ -/* These are passed as 'flags' to update_va_mapping. They can be ORed. */ -/* When specifying UVMF_MULTI, also OR in a pointer to a CPU bitmap. */ -/* UVMF_LOCAL is merely UVMF_MULTI with a NULL bitmap pointer. */ -/* ` enum uvm_flags { */ -#define UVMF_NONE (xen_mk_ulong(0)<<0) /* No flushing at all. */ -#define UVMF_TLB_FLUSH (xen_mk_ulong(1)<<0) /* Flush entire TLB(s). */ -#define UVMF_INVLPG (xen_mk_ulong(2)<<0) /* Flush only one entry. */ -#define UVMF_FLUSHTYPE_MASK (xen_mk_ulong(3)<<0) -#define UVMF_MULTI (xen_mk_ulong(0)<<2) /* Flush subset of TLBs. */ -#define UVMF_LOCAL (xen_mk_ulong(0)<<2) /* Flush local TLB. */ -#define UVMF_ALL (xen_mk_ulong(1)<<2) /* Flush all TLBs. */ -/* ` } */ - -/* - * ` int - * ` HYPERVISOR_console_io(unsigned int cmd, - * ` unsigned int count, - * ` char buffer[]); - * - * @cmd: Command (see below) - * @count: Size of the buffer to read/write - * @buffer: Pointer in the guest memory - * - * List of commands: - * - * * CONSOLEIO_write: Write the buffer to Xen console. - * For the hardware domain, all the characters in the buffer will - * be written. Characters will be printed directly to the console. - * For all the other domains, only the printable characters will be - * written. Characters may be buffered until a newline (i.e '\n') is - * found. - * @return 0 on success, otherwise return an error code. - * * CONSOLEIO_read: Attempts to read up to @count characters from Xen - * console. The maximum buffer size (i.e. @count) supported is 2GB. - * @return the number of characters read on success, otherwise return - * an error code. - */ -#define CONSOLEIO_write 0 -#define CONSOLEIO_read 1 - -/* - * Commands to HYPERVISOR_vm_assist(). - */ -#define VMASST_CMD_enable 0 -#define VMASST_CMD_disable 1 - -/* x86/32 guests: simulate full 4GB segment limits. */ -#define VMASST_TYPE_4gb_segments 0 - -/* x86/32 guests: trap (vector 15) whenever above vmassist is used. */ -#define VMASST_TYPE_4gb_segments_notify 1 - -/* - * x86 guests: support writes to bottom-level PTEs. - * NB1. Page-directory entries cannot be written. - * NB2. Guest must continue to remove all writable mappings of PTEs. - */ -#define VMASST_TYPE_writable_pagetables 2 - -/* x86/PAE guests: support PDPTs above 4GB. */ -#define VMASST_TYPE_pae_extended_cr3 3 - -/* - * 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: - * - when not set, L4 tables get created with the respective slot blank, - * and whenever the L4 table gets used as a kernel one the missing - * mapping gets inserted, - * - when set, L4 tables get created with the respective slot initialized - * as before, and whenever the L4 table gets used as a user one the - * mapping gets zapped. - */ -#define VMASST_TYPE_m2p_strict 32 - -#if __XEN_INTERFACE_VERSION__ < 0x00040600 -#define MAX_VMASST_TYPE 3 -#endif - -/* Domain ids >= DOMID_FIRST_RESERVED cannot be used for ordinary domains. */ -#define DOMID_FIRST_RESERVED xen_mk_uint(0x7FF0) - -/* DOMID_SELF is used in certain contexts to refer to oneself. */ -#define DOMID_SELF xen_mk_uint(0x7FF0) - -/* - * DOMID_IO is used to restrict page-table updates to mapping I/O memory. - * Although no Foreign Domain need be specified to map I/O pages, DOMID_IO - * is useful to ensure that no mappings to the OS's own heap are accidentally - * installed. (e.g., in Linux this could cause havoc as reference counts - * aren't adjusted on the I/O-mapping code path). - * This only makes sense 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 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) - -/* - * DOMID_COW is used as the owner of sharable pages */ -#define DOMID_COW xen_mk_uint(0x7FF3) - -/* DOMID_INVALID is used to identify pages with unknown owner. */ -#define DOMID_INVALID xen_mk_uint(0x7FF4) - -/* Idle domain. */ -#define DOMID_IDLE xen_mk_uint(0x7FFF) - -/* Mask for valid domain id values */ -#define DOMID_MASK xen_mk_uint(0x7FFF) - -#ifndef __ASSEMBLY__ - -typedef uint16_t domid_t; - -/* - * Send an array of these to HYPERVISOR_mmu_update(). - * NB. The fields are natural pointer/address size for this architecture. - */ -struct mmu_update { - uint64_t ptr; /* Machine address of PTE. */ - uint64_t val; /* New contents of PTE. */ -}; -typedef struct mmu_update mmu_update_t; -DEFINE_XEN_GUEST_HANDLE(mmu_update_t); - -/* - * ` enum neg_errnoval - * ` HYPERVISOR_multicall(multicall_entry_t call_list[], - * ` uint32_t nr_calls); - * - * NB. The fields are logically the natural register size for this - * architecture. In cases where xen_ulong_t is larger than this then - * any unused bits in the upper portion must be zero. - */ -struct multicall_entry { - xen_ulong_t op, result; - xen_ulong_t args[6]; -}; -typedef struct multicall_entry multicall_entry_t; -DEFINE_XEN_GUEST_HANDLE(multicall_entry_t); - -#if __XEN_INTERFACE_VERSION__ < 0x00040400 -/* - * Event channel endpoints per domain (when using the 2-level ABI): - * 1024 if a long is 32 bits; 4096 if a long is 64 bits. - */ -#define NR_EVENT_CHANNELS EVTCHN_2L_NR_CHANNELS -#endif - -struct vcpu_time_info { - /* - * Updates to the following values are preceded and followed by an - * increment of 'version'. The guest can therefore detect updates by - * looking for changes to 'version'. If the least-significant bit of - * the version number is set then an update is in progress and the guest - * must wait to read a consistent set of values. - * The correct way to interact with the version number is similar to - * Linux's seqlock: see the implementations of read_seqbegin/read_seqretry. - */ - uint32_t version; - uint32_t pad0; - uint64_t tsc_timestamp; /* TSC at last update of time vals. */ - uint64_t system_time; /* Time, in nanosecs, since boot. */ - /* - * Current system time: - * system_time + - * ((((tsc - tsc_timestamp) << tsc_shift) * tsc_to_system_mul) >> 32) - * CPU frequency (Hz): - * ((10^9 << 32) / tsc_to_system_mul) >> tsc_shift - */ - uint32_t tsc_to_system_mul; - int8_t tsc_shift; -#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 - * a pending notification for a particular VCPU. It is then cleared - * by the guest OS /before/ checking for pending work, thus avoiding - * a set-and-check race. Note that the mask is only accessed by Xen - * on the CPU that is currently hosting the VCPU. This means that the - * pending and mask flags can be updated by the guest without special - * synchronisation (i.e., no need for the x86 LOCK prefix). - * This may seem suboptimal because if the pending flag is set by - * a different CPU then an IPI may be scheduled even when the mask - * is set. However, note: - * 1. The task of 'interrupt holdoff' is covered by the per-event- - * channel mask bits. A 'noisy' event that is continually being - * triggered can be masked at source at this very precise - * granularity. - * 2. The main purpose of the per-VCPU mask is therefore to restrict - * reentrant execution: whether for concurrency control, or to - * prevent unbounded stack usage. Whatever the purpose, we expect - * that the mask will be asserted only for short periods at a time, - * and so the likelihood of a 'spurious' IPI is suitably small. - * The mask is read before making an event upcall to the guest: a - * non-zero mask therefore guarantees that the VCPU will not receive - * an upcall activation. The mask is cleared when the VCPU requests - * to block: this avoids wakeup-waiting races. - */ - uint8_t evtchn_upcall_pending; -#ifdef XEN_HAVE_PV_UPCALL_MASK - uint8_t evtchn_upcall_mask; -#else /* XEN_HAVE_PV_UPCALL_MASK */ - uint8_t pad0; -#endif /* XEN_HAVE_PV_UPCALL_MASK */ - xen_ulong_t evtchn_pending_sel; - struct arch_vcpu_info arch; - struct vcpu_time_info time; -}; /* 64 bytes (x86) */ -#ifndef __XEN__ -typedef struct vcpu_info vcpu_info_t; -#endif - -/* - * `incontents 200 startofday_shared Start-of-day shared data structure - * Xen/kernel shared data -- pointer provided in start_info. - * - * This structure is defined to be both smaller than a page, and the - * only data on the shared page, but may vary in actual size even within - * compatible Xen versions; guests should not rely on the size - * of this structure remaining constant. - */ -struct shared_info { - struct vcpu_info vcpu_info[XEN_LEGACY_MAX_VCPUS]; - - /* - * A domain can create "event channels" on which it can send and receive - * asynchronous event notifications. There are three classes of event that - * are delivered by this mechanism: - * 1. Bi-directional inter- and intra-domain connections. Domains must - * arrange out-of-band to set up a connection (usually by allocating - * an unbound 'listener' port and avertising that via a storage service - * such as xenstore). - * 2. Physical interrupts. A domain with suitable hardware-access - * privileges can bind an event-channel port to a physical interrupt - * source. - * 3. Virtual interrupts ('events'). A domain can bind an event-channel - * port to a virtual interrupt source, such as the virtual-timer - * device or the emergency console. - * - * Event channels are addressed by a "port index". Each channel is - * associated with two bits of information: - * 1. PENDING -- notifies the domain that there is a pending notification - * to be processed. This bit is cleared by the guest. - * 2. MASK -- if this bit is clear then a 0->1 transition of PENDING - * will cause an asynchronous upcall to be scheduled. This bit is only - * updated by the guest. It is read-only within Xen. If a channel - * becomes pending while the channel is masked then the 'edge' is lost - * (i.e., when the channel is unmasked, the guest must manually handle - * pending notifications as no upcall will be scheduled by Xen). - * - * To expedite scanning of pending notifications, any 0->1 pending - * transition on an unmasked channel causes a corresponding bit in a - * per-vcpu selector word to be set. Each bit in the selector covers a - * 'C long' in the PENDING bitfield array. - */ - xen_ulong_t evtchn_pending[sizeof(xen_ulong_t) * 8]; - xen_ulong_t evtchn_mask[sizeof(xen_ulong_t) * 8]; - - /* - * Wallclock time: updated by control software or RTC emulation. - * Guests should base their gettimeofday() syscall on this - * wallclock-base value. - * The values of wc_sec and wc_nsec are offsets from the Unix epoch - * adjusted by the domain's 'time offset' (in seconds) as set either - * by XEN_DOMCTL_settimeoffset, or adjusted via a guest write to the - * emulated RTC. - */ - uint32_t wc_version; /* Version counter: see vcpu_time_info_t. */ - uint32_t wc_sec; - uint32_t wc_nsec; -#if !defined(__i386__) - uint32_t wc_sec_hi; -# define xen_wc_sec_hi wc_sec_hi -#elif !defined(__XEN__) && !defined(__XEN_TOOLS__) -# define xen_wc_sec_hi arch.wc_sec_hi -#endif - - struct arch_shared_info arch; - -}; -#ifndef __XEN__ -typedef struct shared_info shared_info_t; -#endif - -/* - * `incontents 200 startofday Start-of-day memory layout - * - * 1. The domain is started within contiguous virtual-memory region. - * 2. The contiguous region ends on an aligned 4MB boundary. - * 3. This the order of bootstrap elements in the initial virtual region: - * a. relocated kernel image - * b. initial ram disk [mod_start, mod_len] - * (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 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 - * g. bootstrap page tables [pt_base and CR3 (x86)] - * h. bootstrap stack [register ESP (x86)] - * 4. Bootstrap elements are packed together, but each is 4kB-aligned. - * 5. The list of page frames forms a contiguous 'pseudo-physical' memory - * layout for the domain. In particular, the bootstrap virtual-memory - * region is a 1:1 mapping to the first section of the pseudo-physical map. - * 6. All bootstrap elements are mapped read-writable for the guest OS. The - * only exception is the bootstrap page table, which is mapped read-only. - * 7. There is guaranteed to be at least 512kB padding after the final - * bootstrap element. If necessary, the bootstrap virtual region is - * extended by an extra 4MB to ensure this. - * - * Note: Prior to 25833:bb85bbccb1c9. ("x86/32-on-64 adjust Dom0 initial page - * table layout") a bug caused the pt_base (3.g above) and cr3 to not point - * to the start of the guest page tables (it was offset by two pages). - * This only manifested itself on 32-on-64 dom0 kernels and not 32-on-64 domU - * or 64-bit kernels of any colour. The page tables for a 32-on-64 dom0 got - * allocated in the order: 'first L1','first L2', 'first L3', so the offset - * to the page table base is by two pages back. The initial domain if it is - * 32-bit and runs under a 64-bit hypervisor should _NOT_ use two of the - * pages preceding pt_base and mark them as reserved/unused. - */ -#ifdef XEN_HAVE_PV_GUEST_ENTRY -struct start_info { - /* THE FOLLOWING ARE FILLED IN BOTH ON INITIAL BOOT AND ON RESUME. */ - char magic[32]; /* "xen--". */ - unsigned long nr_pages; /* Total pages allocated to this domain. */ - unsigned long shared_info; /* MACHINE address of shared info struct. */ - uint32_t flags; /* SIF_xxx flags. */ - xen_pfn_t store_mfn; /* MACHINE page number of shared page. */ - uint32_t store_evtchn; /* Event channel for store communication. */ - union { - struct { - xen_pfn_t mfn; /* MACHINE page number of console page. */ - uint32_t evtchn; /* Event channel for console page. */ - } domU; - struct { - uint32_t info_off; /* Offset of console_info struct. */ - uint32_t info_size; /* Size of console_info struct from start.*/ - } dom0; - } console; - /* THE FOLLOWING ARE ONLY FILLED IN ON INITIAL BOOT (NOT RESUME). */ - unsigned long pt_base; /* VIRTUAL address of page directory. */ - unsigned long nr_pt_frames; /* Number of bootstrap p.t. frames. */ - unsigned long mfn_list; /* VIRTUAL address of page-frame list. */ - unsigned long mod_start; /* VIRTUAL address of pre-loaded module */ - /* (PFN of pre-loaded module if */ - /* SIF_MOD_START_PFN set in flags). */ - unsigned long mod_len; /* Size (bytes) of pre-loaded module. */ -#define MAX_GUEST_CMDLINE 1024 - int8_t cmd_line[MAX_GUEST_CMDLINE]; - /* The pfn range here covers both page table and p->m table frames. */ - unsigned long first_p2m_pfn;/* 1st pfn forming initial P->M table. */ - unsigned long nr_p2m_frames;/* # of pfns forming initial P->M table. */ -}; -typedef struct start_info start_info_t; - -/* New console union for dom0 introduced in 0x00030203. */ -#if __XEN_INTERFACE_VERSION__ < 0x00030203 -#define console_mfn console.domU.mfn -#define console_evtchn console.domU.evtchn -#endif -#endif /* XEN_HAVE_PV_GUEST_ENTRY */ - -/* These flags are passed in the 'flags' field of start_info_t. */ -#define SIF_PRIVILEGED (1<<0) /* Is the domain privileged? */ -#define SIF_INITDOMAIN (1<<1) /* Is this the initial control domain? */ -#define SIF_MULTIBOOT_MOD (1<<2) /* Is mod_start a multiboot module? */ -#define SIF_MOD_START_PFN (1<<3) /* Is mod_start a PFN? */ -#define SIF_VIRT_P2M_4TOOLS (1<<4) /* Do Xen tools understand a virt. mapped */ - /* P->M making the 3 level tree obsolete? */ -#define SIF_PM_MASK (0xFF<<8) /* reserve 1 byte for xen-pm options */ - -/* - * A multiboot module is a package containing modules very similar to a - * multiboot module array. The only differences are: - * - the array of module descriptors is by convention simply at the beginning - * of the multiboot module, - * - addresses in the module descriptors are based on the beginning of the - * multiboot module, - * - the number of modules is determined by a termination descriptor that has - * mod_start == 0. - * - * This permits to both build it statically and reference it in a configuration - * file, and let the PV guest easily rebase the addresses to virtual addresses - * and at the same time count the number of modules. - */ -struct xen_multiboot_mod_list -{ - /* Address of first byte of the module */ - uint32_t mod_start; - /* Address of last byte of the module (inclusive) */ - uint32_t mod_end; - /* Address of zero-terminated command line */ - uint32_t cmdline; - /* Unused, must be zero */ - uint32_t pad; -}; -/* - * `incontents 200 startofday_dom0_console Dom0_console - * - * The console structure in start_info.console.dom0 - * - * This structure includes a variety of information required to - * have a working VGA/VESA console. - */ -typedef struct dom0_vga_console_info { - uint8_t video_type; /* DOM0_VGA_CONSOLE_??? */ -#define XEN_VGATYPE_TEXT_MODE_3 0x03 -#define XEN_VGATYPE_VESA_LFB 0x23 -#define XEN_VGATYPE_EFI_LFB 0x70 - - union { - struct { - /* Font height, in pixels. */ - uint16_t font_height; - /* Cursor location (column, row). */ - uint16_t cursor_x, cursor_y; - /* Number of rows and columns (dimensions in characters). */ - uint16_t rows, columns; - } text_mode_3; - - struct { - /* Width and height, in pixels. */ - uint16_t width, height; - /* Bytes per scan line. */ - uint16_t bytes_per_line; - /* Bits per pixel. */ - uint16_t bits_per_pixel; - /* LFB physical address, and size (in units of 64kB). */ - uint32_t lfb_base; - uint32_t lfb_size; - /* RGB mask offsets and sizes, as defined by VBE 1.2+ */ - uint8_t red_pos, red_size; - uint8_t green_pos, green_size; - uint8_t blue_pos, blue_size; - uint8_t rsvd_pos, rsvd_size; -#if __XEN_INTERFACE_VERSION__ >= 0x00030206 - /* VESA capabilities (offset 0xa, VESA command 0x4f00). */ - uint32_t gbl_caps; - /* Mode attributes (offset 0x0, VESA command 0x4f01). */ - uint16_t mode_attrs; - uint16_t pad; -#endif -#if __XEN_INTERFACE_VERSION__ >= 0x00040d00 - /* high 32 bits of lfb_base */ - uint32_t ext_lfb_base; -#endif - } vesa_lfb; - } u; -} dom0_vga_console_info_t; -#define xen_vga_console_info dom0_vga_console_info -#define xen_vga_console_info_t dom0_vga_console_info_t - -typedef uint8_t xen_domain_handle_t[16]; - -__DEFINE_XEN_GUEST_HANDLE(uint8, uint8_t); -__DEFINE_XEN_GUEST_HANDLE(uint16, uint16_t); -__DEFINE_XEN_GUEST_HANDLE(uint32, uint32_t); -__DEFINE_XEN_GUEST_HANDLE(uint64, uint64_t); - -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. */ -#if defined(__XEN__) || defined(__XEN_TOOLS__) - -#ifndef int64_aligned_t -#define int64_aligned_t int64_t -#endif -#ifndef uint64_aligned_t -#define uint64_aligned_t uint64_t -#endif -#ifndef XEN_GUEST_HANDLE_64 -#define XEN_GUEST_HANDLE_64(name) XEN_GUEST_HANDLE(name) -#endif - -#ifndef __ASSEMBLY__ -struct xenctl_bitmap { - XEN_GUEST_HANDLE_64(uint8) bitmap; - uint32_t nr_bits; -}; -#endif - -#endif /* defined(__XEN__) || defined(__XEN_TOOLS__) */ - -#endif /* __XEN_PUBLIC_XEN_H__ */ - -/* - * Local variables: - * mode: C - * c-file-style: "BSD" - * c-basic-offset: 4 - * tab-width: 4 - * indent-tabs-mode: nil - * End: - */ diff --git a/sys/xen/interface/xencomm.h b/sys/xen/interface/xencomm.h deleted file mode 100644 index ac45e0712afa..000000000000 --- a/sys/xen/interface/xencomm.h +++ /dev/null @@ -1,41 +0,0 @@ -/* - * 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) IBM Corp. 2006 - */ - -#ifndef _XEN_XENCOMM_H_ -#define _XEN_XENCOMM_H_ - -/* A xencomm descriptor is a scatter/gather list containing physical - * addresses corresponding to a virtually contiguous memory area. The - * hypervisor translates these physical addresses to machine addresses to copy - * to and from the virtually contiguous area. - */ - -#define XENCOMM_MAGIC 0x58434F4D /* 'XCOM' */ -#define XENCOMM_INVALID (~0UL) - -struct xencomm_desc { - uint32_t magic; - uint32_t nr_addrs; /* the number of entries in address[] */ - uint64_t address[0]; -}; - -#endif /* _XEN_XENCOMM_H_ */ diff --git a/sys/xen/interface/xenoprof.h b/sys/xen/interface/xenoprof.h deleted file mode 100644 index 9f5ca87d9e54..000000000000 --- a/sys/xen/interface/xenoprof.h +++ /dev/null @@ -1,152 +0,0 @@ -/****************************************************************************** - * xenoprof.h - * - * Interface for enabling system wide profiling based on hardware performance - * counters - * - * 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 Hewlett-Packard Co. - * Written by Aravind Menon & Jose Renato Santos - */ - -#ifndef __XEN_PUBLIC_XENOPROF_H__ -#define __XEN_PUBLIC_XENOPROF_H__ - -#include "xen.h" - -/* - * Commands to HYPERVISOR_xenoprof_op(). - */ -#define XENOPROF_init 0 -#define XENOPROF_reset_active_list 1 -#define XENOPROF_reset_passive_list 2 -#define XENOPROF_set_active 3 -#define XENOPROF_set_passive 4 -#define XENOPROF_reserve_counters 5 -#define XENOPROF_counter 6 -#define XENOPROF_setup_events 7 -#define XENOPROF_enable_virq 8 -#define XENOPROF_start 9 -#define XENOPROF_stop 10 -#define XENOPROF_disable_virq 11 -#define XENOPROF_release_counters 12 -#define XENOPROF_shutdown 13 -#define XENOPROF_get_buffer 14 -#define XENOPROF_set_backtrace 15 - -/* AMD IBS support */ -#define XENOPROF_get_ibs_caps 16 -#define XENOPROF_ibs_counter 17 -#define XENOPROF_last_op 17 - -#define MAX_OPROF_EVENTS 32 -#define MAX_OPROF_DOMAINS 25 -#define XENOPROF_CPU_TYPE_SIZE 64 - -/* Xenoprof performance events (not Xen events) */ -struct event_log { - uint64_t eip; - uint8_t mode; - uint8_t event; -}; - -/* PC value that indicates a special code */ -#define XENOPROF_ESCAPE_CODE (~xen_mk_ullong(0)) -/* Transient events for the xenoprof->oprofile cpu buf */ -#define XENOPROF_TRACE_BEGIN 1 - -/* Xenoprof buffer shared between Xen and domain - 1 per VCPU */ -struct xenoprof_buf { - uint32_t event_head; - uint32_t event_tail; - uint32_t event_size; - uint32_t vcpu_id; - uint64_t xen_samples; - uint64_t kernel_samples; - uint64_t user_samples; - uint64_t lost_samples; - struct event_log event_log[1]; -}; -#ifndef __XEN__ -typedef struct xenoprof_buf xenoprof_buf_t; -DEFINE_XEN_GUEST_HANDLE(xenoprof_buf_t); -#endif - -struct xenoprof_init { - int32_t num_events; - int32_t is_primary; - char cpu_type[XENOPROF_CPU_TYPE_SIZE]; -}; -typedef struct xenoprof_init xenoprof_init_t; -DEFINE_XEN_GUEST_HANDLE(xenoprof_init_t); - -struct xenoprof_get_buffer { - int32_t max_samples; - int32_t nbuf; - int32_t bufsize; - uint64_t buf_gmaddr; -}; -typedef struct xenoprof_get_buffer xenoprof_get_buffer_t; -DEFINE_XEN_GUEST_HANDLE(xenoprof_get_buffer_t); - -struct xenoprof_counter { - uint32_t ind; - uint64_t count; - uint32_t enabled; - uint32_t event; - uint32_t hypervisor; - uint32_t kernel; - uint32_t user; - uint64_t unit_mask; -}; -typedef struct xenoprof_counter xenoprof_counter_t; -DEFINE_XEN_GUEST_HANDLE(xenoprof_counter_t); - -typedef struct xenoprof_passive { - uint16_t domain_id; - int32_t max_samples; - int32_t nbuf; - int32_t bufsize; - uint64_t buf_gmaddr; -} xenoprof_passive_t; -DEFINE_XEN_GUEST_HANDLE(xenoprof_passive_t); - -struct xenoprof_ibs_counter { - uint64_t op_enabled; - uint64_t fetch_enabled; - uint64_t max_cnt_fetch; - uint64_t max_cnt_op; - uint64_t rand_en; - uint64_t dispatched_ops; -}; -typedef struct xenoprof_ibs_counter xenoprof_ibs_counter_t; -DEFINE_XEN_GUEST_HANDLE(xenoprof_ibs_counter_t); - -#endif /* __XEN_PUBLIC_XENOPROF_H__ */ - -/* - * Local variables: - * mode: C - * c-file-style: "BSD" - * c-basic-offset: 4 - * tab-width: 4 - * indent-tabs-mode: nil - * End: - */ diff --git a/sys/xen/interface/xsm/flask_op.h b/sys/xen/interface/xsm/flask_op.h deleted file mode 100644 index 970ec07f0b36..000000000000 --- a/sys/xen/interface/xsm/flask_op.h +++ /dev/null @@ -1,216 +0,0 @@ -/* - * This file contains the flask_op hypercall commands and definitions. - * - * Author: George Coker, - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to - * deal in the Software without restriction, including without limitation the - * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or - * sell copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ - -#ifndef __FLASK_OP_H__ -#define __FLASK_OP_H__ - -#include "../event_channel.h" - -#define XEN_FLASK_INTERFACE_VERSION 1 - -struct xen_flask_load { - XEN_GUEST_HANDLE(char) buffer; - uint32_t size; -}; - -struct xen_flask_setenforce { - uint32_t enforcing; -}; - -struct xen_flask_sid_context { - /* IN/OUT: sid to convert to/from string */ - uint32_t sid; - /* IN: size of the context buffer - * OUT: actual size of the output context string - */ - uint32_t size; - XEN_GUEST_HANDLE(char) context; -}; - -struct xen_flask_access { - /* IN: access request */ - uint32_t ssid; - uint32_t tsid; - uint32_t tclass; - uint32_t req; - /* OUT: AVC data */ - uint32_t allowed; - uint32_t audit_allow; - uint32_t audit_deny; - uint32_t seqno; -}; - -struct xen_flask_transition { - /* IN: transition SIDs and class */ - uint32_t ssid; - uint32_t tsid; - uint32_t tclass; - /* OUT: new SID */ - uint32_t newsid; -}; - -#if __XEN_INTERFACE_VERSION__ < 0x00040800 -struct xen_flask_userlist { - /* IN: starting SID for list */ - uint32_t start_sid; - /* IN: size of user string and output buffer - * OUT: number of SIDs returned */ - uint32_t size; - union { - /* IN: user to enumerate SIDs */ - XEN_GUEST_HANDLE(char) user; - /* OUT: SID list */ - XEN_GUEST_HANDLE(uint32) sids; - } u; -}; -#endif - -struct xen_flask_boolean { - /* IN/OUT: numeric identifier for boolean [GET/SET] - * If -1, name will be used and bool_id will be filled in. */ - uint32_t bool_id; - /* OUT: current enforcing value of boolean [GET/SET] */ - uint8_t enforcing; - /* OUT: pending value of boolean [GET/SET] */ - uint8_t pending; - /* IN: new value of boolean [SET] */ - uint8_t new_value; - /* IN: commit new value instead of only setting pending [SET] */ - uint8_t commit; - /* IN: size of boolean name buffer [GET/SET] - * OUT: actual size of name [GET only] */ - uint32_t size; - /* IN: if bool_id is -1, used to find boolean [GET/SET] - * OUT: textual name of boolean [GET only] - */ - XEN_GUEST_HANDLE(char) name; -}; - -struct xen_flask_setavc_threshold { - /* IN */ - uint32_t threshold; -}; - -struct xen_flask_hash_stats { - /* OUT */ - uint32_t entries; - uint32_t buckets_used; - uint32_t buckets_total; - uint32_t max_chain_len; -}; - -struct xen_flask_cache_stats { - /* IN */ - uint32_t cpu; - /* OUT */ - uint32_t lookups; - uint32_t hits; - uint32_t misses; - uint32_t allocations; - uint32_t reclaims; - uint32_t frees; -}; - -struct xen_flask_ocontext { - /* IN */ - uint32_t ocon; - uint32_t sid; - uint64_t low, high; -}; - -struct xen_flask_peersid { - /* IN */ - evtchn_port_t evtchn; - /* OUT */ - uint32_t sid; -}; - -struct xen_flask_relabel { - /* IN */ - uint32_t domid; - uint32_t sid; -}; - -struct xen_flask_devicetree_label { - /* IN */ - uint32_t sid; - uint32_t length; - XEN_GUEST_HANDLE(char) path; -}; - -struct xen_flask_op { - uint32_t cmd; -#define FLASK_LOAD 1 -#define FLASK_GETENFORCE 2 -#define FLASK_SETENFORCE 3 -#define FLASK_CONTEXT_TO_SID 4 -#define FLASK_SID_TO_CONTEXT 5 -#define FLASK_ACCESS 6 -#define FLASK_CREATE 7 -#define FLASK_RELABEL 8 -#define FLASK_USER 9 /* No longer implemented */ -#define FLASK_POLICYVERS 10 -#define FLASK_GETBOOL 11 -#define FLASK_SETBOOL 12 -#define FLASK_COMMITBOOLS 13 -#define FLASK_MLS 14 -#define FLASK_DISABLE 15 -#define FLASK_GETAVC_THRESHOLD 16 -#define FLASK_SETAVC_THRESHOLD 17 -#define FLASK_AVC_HASHSTATS 18 -#define FLASK_AVC_CACHESTATS 19 -#define FLASK_MEMBER 20 -#define FLASK_ADD_OCONTEXT 21 -#define FLASK_DEL_OCONTEXT 22 -#define FLASK_GET_PEER_SID 23 -#define FLASK_RELABEL_DOMAIN 24 -#define FLASK_DEVICETREE_LABEL 25 - uint32_t interface_version; /* XEN_FLASK_INTERFACE_VERSION */ - union { - struct xen_flask_load load; - struct xen_flask_setenforce enforce; - /* FLASK_CONTEXT_TO_SID and FLASK_SID_TO_CONTEXT */ - struct xen_flask_sid_context sid_context; - struct xen_flask_access access; - /* FLASK_CREATE, FLASK_RELABEL, FLASK_MEMBER */ - struct xen_flask_transition transition; -#if __XEN_INTERFACE_VERSION__ < 0x00040800 - struct xen_flask_userlist userlist; -#endif - /* FLASK_GETBOOL, FLASK_SETBOOL */ - struct xen_flask_boolean boolean; - struct xen_flask_setavc_threshold setavc_threshold; - struct xen_flask_hash_stats hash_stats; - struct xen_flask_cache_stats cache_stats; - /* FLASK_ADD_OCONTEXT, FLASK_DEL_OCONTEXT */ - struct xen_flask_ocontext ocontext; - struct xen_flask_peersid peersid; - struct xen_flask_relabel relabel; - struct xen_flask_devicetree_label devicetree_label; - } u; -}; -typedef struct xen_flask_op xen_flask_op_t; -DEFINE_XEN_GUEST_HANDLE(xen_flask_op_t); - -#endif