xen: remove public headers in sys/xen/interface
Those are superseded by the ones in sys/contrib/xen and no longer used. Sponsored by: Citrix Systems R&D
This commit is contained in:
parent
ad7dd51499
commit
476438e81f
@ -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.
|
@ -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:
|
||||
*/
|
@ -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:
|
||||
*/
|
@ -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
|
||||
*/
|
@ -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 <public/arch-x86/cpufeatureset.h>
|
||||
*
|
||||
* 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:
|
||||
*/
|
@ -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 <keir@xen.org>
|
||||
*/
|
||||
|
||||
#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__ */
|
@ -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 <device:INTx#> 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:
|
||||
*/
|
@ -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__ */
|
@ -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:
|
||||
*/
|
||||
|
@ -1,448 +0,0 @@
|
||||
/******************************************************************************
|
||||
* arch-x86/mca.h
|
||||
*
|
||||
* Contributed by Advanced Micro Devices, Inc.
|
||||
* Author: Christoph Egger <Christoph.Egger@amd.com>
|
||||
*
|
||||
* 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__ */
|
@ -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:
|
||||
*/
|
@ -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:
|
||||
*/
|
@ -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:
|
||||
*/
|
@ -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"
|
@ -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 (???).
|
||||
*/
|
@ -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
|
@ -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:
|
||||
*/
|
@ -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
|
@ -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:
|
||||
*/
|
File diff suppressed because it is too large
Load Diff
@ -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:
|
||||
*/
|
@ -1,126 +0,0 @@
|
||||
/*
|
||||
* There are two expected ways of including this header.
|
||||
*
|
||||
* 1) The "default" case (expected from tools etc).
|
||||
*
|
||||
* Simply #include <public/errno.h>
|
||||
*
|
||||
* 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 */
|
@ -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 <dom> and mark as
|
||||
* accepting interdomain bindings from domain <remote_dom>. A fresh port
|
||||
* is allocated in <dom> and returned as <port>.
|
||||
* NOTES:
|
||||
* 1. If the caller is unprivileged then <dom> must be DOMID_SELF.
|
||||
* 2. <remote_dom> 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 <remote_dom>. <remote_dom,remote_port> must identify
|
||||
* a port that is unbound and marked as accepting bindings from the calling
|
||||
* domain. A fresh port is allocated in the calling domain and returned as
|
||||
* <local_port>.
|
||||
*
|
||||
* 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. <remote_dom> 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 <irq> on specified
|
||||
* vcpu.
|
||||
* NOTES:
|
||||
* 1. Virtual IRQs are classified as per-vcpu or global. See the VIRQ list
|
||||
* in xen.h for the classification of each VIRQ.
|
||||
* 2. Global VIRQs must be allocated on VCPU0 but can subsequently be
|
||||
* re-bound via EVTCHNOP_bind_vcpu.
|
||||
* 3. Per-vcpu VIRQs may be bound to at most one event channel per vcpu.
|
||||
* The allocated event channel is bound to the specified vcpu and the
|
||||
* binding cannot be changed.
|
||||
*/
|
||||
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 <irq>).
|
||||
* NOTES:
|
||||
* 1. A physical IRQ may be bound to at most one event channel per domain.
|
||||
* 2. Only a sufficiently-privileged domain may bind to a physical IRQ.
|
||||
*/
|
||||
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 <port>. 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 <port>.
|
||||
*/
|
||||
struct evtchn_send {
|
||||
/* IN parameters. */
|
||||
evtchn_port_t port;
|
||||
};
|
||||
typedef struct evtchn_send evtchn_send_t;
|
||||
|
||||
/*
|
||||
* EVTCHNOP_status: Get the current status of the communication channel which
|
||||
* has an endpoint at <dom, port>.
|
||||
* NOTES:
|
||||
* 1. <dom> may be specified as DOMID_SELF.
|
||||
* 2. Only a sufficiently-privileged domain may obtain the status of an event
|
||||
* channel for which <dom> is not DOMID_SELF.
|
||||
*/
|
||||
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. <dom> 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 <dom> == 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:
|
||||
*/
|
@ -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 <keir@xensource.com>
|
||||
*/
|
||||
|
||||
#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:
|
||||
*/
|
@ -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__ */
|
@ -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 (<dom>,<ref>) for access
|
||||
* by devices and/or host CPUs. If successful, <handle> is a tracking number
|
||||
* that must be presented later to destroy the mapping(s). On error, <status>
|
||||
* is a negative status code.
|
||||
* NOTES:
|
||||
* 1. If GNTMAP_device_map is specified then <dev_bus_addr> is the address
|
||||
* via which I/O devices may access the granted frame.
|
||||
* 2. If GNTMAP_host_map is specified then a mapping will be added at
|
||||
* either a host virtual address in the current address space, or at
|
||||
* a PTE at the specified machine address. The type of mapping to
|
||||
* perform is selected through the GNTMAP_contains_pte flag, and the
|
||||
* address is specified in <host_addr>.
|
||||
* 3. Mappings should only be destroyed via GNTTABOP_unmap_grant_ref. If a
|
||||
* host mapping is destroyed by other means then it is *NOT* guaranteed
|
||||
* to be accounted to the correct grant reference!
|
||||
*/
|
||||
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 <handle>. If <host_addr> or <dev_bus_addr> is zero, that
|
||||
* field is ignored. If non-zero, they must refer to a device/host mapping
|
||||
* that is tracked by <handle>
|
||||
* NOTES:
|
||||
* 1. The call may fail in an undefined manner if either mapping is not
|
||||
* tracked by <handle>.
|
||||
* 3. After executing a batch of unmaps, it is guaranteed that no stale
|
||||
* mappings will remain in the device or host TLBs.
|
||||
*/
|
||||
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 <dom> comprising at least
|
||||
* <nr_frames> pages. The frame addresses are written to the <frame_list>.
|
||||
* Only <nr_frames> addresses are written, even if the table is larger.
|
||||
* NOTES:
|
||||
* 1. <dom> may be specified as DOMID_SELF.
|
||||
* 2. Only a sufficiently-privileged domain may specify <dom> != DOMID_SELF.
|
||||
* 3. Xen may not support more than a single grant-table page per domain.
|
||||
*/
|
||||
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 <frame> to a foreign domain. The foreign domain
|
||||
* has previously registered its interest in the transfer via <domid, ref>.
|
||||
*
|
||||
* Note that, even if the transfer fails, the specified page no 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. <dom> may be specified as DOMID_SELF.
|
||||
* 2. Only a sufficiently-privileged domain may specify <dom> != 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 <handle> but atomically replace the page table entry with one
|
||||
* pointing to the machine address under <new_addr>. <new_addr> will be
|
||||
* redirected to the null entry.
|
||||
* NOTES:
|
||||
* 1. The call may fail in an undefined manner if either mapping is not
|
||||
* tracked by <handle>.
|
||||
* 2. After executing a batch of unmaps, it is guaranteed that no stale
|
||||
* mappings will remain in the device or host TLBs.
|
||||
*/
|
||||
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 <dom>. In grant format version 2, the status is separated
|
||||
* from the other shared grant fields to allow more efficient synchronization
|
||||
* using barriers instead of atomic cmpexch operations.
|
||||
* <nr_frames> specify the size of vector <frame_list>.
|
||||
* The frame addresses are returned in the <frame_list>.
|
||||
* Only <nr_frames> addresses are returned, even if the table is larger.
|
||||
* NOTES:
|
||||
* 1. <dom> may be specified as DOMID_SELF.
|
||||
* 2. Only a sufficiently-privileged domain may specify <dom> != DOMID_SELF.
|
||||
*/
|
||||
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 <dom>.
|
||||
*/
|
||||
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:
|
||||
*/
|
@ -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 <id> handed back is unique for target domain. The valur of
|
||||
* <handle_bufioreq> 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 <id>.
|
||||
*
|
||||
* If the IOREQ Server is handling buffered emulation requests, the
|
||||
* emulator needs to bind to event channel <bufioreq_port> 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 <flags> does
|
||||
* not contain XEN_DMOP_no_gfns then these pages will be made available and
|
||||
* the frame numbers passed back in gfns <ioreq_gfn> and <bufioreq_gfn>
|
||||
* respectively. (If the IOREQ Server is not handling buffered emulation
|
||||
* only <ioreq_gfn> 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 <id>.
|
||||
* XEN_DMOP_unmap_io_range_from_ioreq_server: Deregister an I/O range
|
||||
* previously registered for
|
||||
* emulation by the client of
|
||||
* IOREQ Server <id>.
|
||||
*
|
||||
* There are three types of I/O that can be emulated: port I/O, memory
|
||||
* accesses and PCI config space accesses. The <type> field denotes which
|
||||
* type of range* the <start> and <end> (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 <id>
|
||||
*
|
||||
* 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 <id>.
|
||||
*
|
||||
* 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 <id>
|
||||
* to specific memory type <type>
|
||||
* for specific accesses <flags>
|
||||
*
|
||||
* 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:
|
||||
*/
|
@ -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__ */
|
@ -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__ */
|
@ -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 <vector> that should be used for event
|
||||
* channel upcalls on the specified <vcpu>. If set,
|
||||
* this vector will be used in preference to the
|
||||
* domain global callback via (see
|
||||
* HVM_PARAM_CALLBACK_IRQ).
|
||||
*/
|
||||
#define HVMOP_set_evtchn_upcall_vector 23
|
||||
struct xen_hvm_evtchn_upcall_vector {
|
||||
uint32_t vcpu;
|
||||
uint8_t vector;
|
||||
};
|
||||
typedef struct xen_hvm_evtchn_upcall_vector xen_hvm_evtchn_upcall_vector_t;
|
||||
DEFINE_XEN_GUEST_HANDLE(xen_hvm_evtchn_upcall_vector_t);
|
||||
|
||||
#endif /* defined(__i386__) || defined(__x86_64__) */
|
||||
|
||||
#define HVMOP_guest_request_vm_event 24
|
||||
|
||||
/* HVMOP_altp2m: perform altp2m state operations */
|
||||
#define HVMOP_altp2m 25
|
||||
|
||||
#define HVMOP_ALTP2M_INTERFACE_VERSION 0x00000001
|
||||
|
||||
struct xen_hvm_altp2m_domain_state {
|
||||
/* IN or OUT variable on/off */
|
||||
uint8_t state;
|
||||
};
|
||||
typedef struct xen_hvm_altp2m_domain_state xen_hvm_altp2m_domain_state_t;
|
||||
DEFINE_XEN_GUEST_HANDLE(xen_hvm_altp2m_domain_state_t);
|
||||
|
||||
struct xen_hvm_altp2m_vcpu_enable_notify {
|
||||
uint32_t vcpu_id;
|
||||
uint32_t pad;
|
||||
/* #VE info area gfn */
|
||||
uint64_t gfn;
|
||||
};
|
||||
typedef struct xen_hvm_altp2m_vcpu_enable_notify xen_hvm_altp2m_vcpu_enable_notify_t;
|
||||
DEFINE_XEN_GUEST_HANDLE(xen_hvm_altp2m_vcpu_enable_notify_t);
|
||||
|
||||
struct xen_hvm_altp2m_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:
|
||||
*/
|
@ -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 <roger.pau@citrix.com>
|
||||
*/
|
||||
|
||||
#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:
|
||||
*/
|
@ -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:
|
||||
*
|
||||
* <length><struct><length><struct>...
|
||||
*
|
||||
* 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__ */
|
@ -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:
|
||||
*/
|
@ -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 <hvm/ioreq.h>
|
||||
*/
|
||||
#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__ */
|
@ -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_ */
|
@ -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 <xen/lib.h> /* 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__ */
|
@ -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__ */
|
@ -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 <stefano@aporeto.com>
|
||||
*/
|
||||
|
||||
#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:
|
||||
*/
|
@ -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: <uint32_t>
|
||||
* 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: <uint32_t>
|
||||
* 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: <uint32_t>
|
||||
* 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: <uint32_t>
|
||||
* 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: <uint32_t> (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: <uint32_t>
|
||||
*
|
||||
* 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: <uint32_t>
|
||||
* 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: <uint64_t>
|
||||
*
|
||||
* 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: <uint32_t>
|
||||
*
|
||||
* The identifier of the Xen event channel used to signal activity
|
||||
* in the ring buffer.
|
||||
*
|
||||
* ring-ref
|
||||
* Values: <uint32_t>
|
||||
* 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: <uint32_t>
|
||||
* 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: <uint32_t>
|
||||
* 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: <uint32_t>
|
||||
* 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: <uint32_t>
|
||||
*
|
||||
* 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 = "<ring-ref#0>"
|
||||
* /local/domain/1/device/vbd/0/queue-0/event-channel = "<evtchn#0>"
|
||||
* /local/domain/1/device/vbd/0/queue-1 = ""
|
||||
* /local/domain/1/device/vbd/0/queue-1/ring-ref = "<ring-ref#1>"
|
||||
* /local/domain/1/device/vbd/0/queue-1/event-channel = "<evtchn#1>"
|
||||
*
|
||||
* 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 = "<ring-ref#0>"
|
||||
* /local/domain/1/device/vbd/0/queue-0/ring-ref1 = "<ring-ref#1>"
|
||||
* /local/domain/1/device/vbd/0/queue-0/event-channel = "<evtchn#0>"
|
||||
* /local/domain/1/device/vbd/0/queue-1 = ""
|
||||
* /local/domain/1/device/vbd/0/queue-1/ring-ref0 = "<ring-ref#2>"
|
||||
* /local/domain/1/device/vbd/0/queue-1/ring-ref1 = "<ring-ref#3>"
|
||||
* /local/domain/1/device/vbd/0/queue-1/event-channel = "<evtchn#1>"
|
||||
*
|
||||
*/
|
||||
|
||||
/*
|
||||
* 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:
|
||||
*/
|
File diff suppressed because it is too large
Load Diff
@ -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:
|
||||
*/
|
@ -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_andrushchenko@epam.com>
|
||||
* Oleksandr Grytsov <oleksandr_grytsov@epam.com>
|
||||
*/
|
||||
|
||||
#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: <string>
|
||||
*
|
||||
* List of XENDISPL_LIST_SEPARATOR separated protocol versions supported
|
||||
* by the backend. For example "1,2,3".
|
||||
*
|
||||
******************************************************************************
|
||||
* Frontend XenBus Nodes
|
||||
******************************************************************************
|
||||
*
|
||||
*-------------------------------- Addressing ---------------------------------
|
||||
*
|
||||
* dom-id
|
||||
* Values: <uint16_t>
|
||||
*
|
||||
* Domain identifier.
|
||||
*
|
||||
* dev-id
|
||||
* Values: <uint16_t>
|
||||
*
|
||||
* Device identifier.
|
||||
*
|
||||
* conn-idx
|
||||
* Values: <uint8_t>
|
||||
*
|
||||
* Zero based contigous index of the connector.
|
||||
* /local/domain/<dom-id>/device/vdispl/<dev-id>/<conn-idx>/...
|
||||
*
|
||||
*----------------------------- Protocol version ------------------------------
|
||||
*
|
||||
* version
|
||||
* Values: <string>
|
||||
*
|
||||
* 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: <string>
|
||||
*
|
||||
* 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: <width, uint32_t>x<height, uint32_t>
|
||||
*
|
||||
* 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: <uint32_t>
|
||||
*
|
||||
* The identifier of the Xen connector's control event channel
|
||||
* used to signal activity in the ring buffer.
|
||||
*
|
||||
* req-ring-ref
|
||||
* Values: <uint32_t>
|
||||
*
|
||||
* 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: <uint32_t>
|
||||
*
|
||||
* The identifier of the Xen connector's event channel
|
||||
* used to signal activity in the ring buffer.
|
||||
*
|
||||
* evt-ring-ref
|
||||
* Values: <uint32_t>
|
||||
*
|
||||
* 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/<dom-id>/device/vdispl/<dev-id>/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/<dom-id>/device/vdispl/<dev-id>/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/<dom-id>/device/vdispl/<dev-id>/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/<dom-id>/device/vdispl/<dev-id>/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/<dom-id>/device/vdispl/<dev-id>/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:
|
||||
*/
|
@ -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 <aliguori@us.ibm.com>
|
||||
* Copyright (C) 2006 Red Hat, Inc., Markus Armbruster <armbru@redhat.com>
|
||||
*/
|
||||
|
||||
#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:
|
||||
*/
|
@ -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, <gm281@cam.ac.uk>.
|
||||
*/
|
||||
|
||||
#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
|
@ -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 <aliguori@us.ibm.com>
|
||||
* Copyright (C) 2006 Red Hat, Inc., Markus Armbruster <armbru@redhat.com>
|
||||
*/
|
||||
|
||||
#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: <uint>
|
||||
*
|
||||
* 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: <uint>
|
||||
*
|
||||
* 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: <uint>
|
||||
*
|
||||
* Backends, which support reporting of absolute coordinates for pointer
|
||||
* device should set this to 1.
|
||||
*
|
||||
* feature-multi-touch
|
||||
* Values: <uint>
|
||||
*
|
||||
* Backends, which support reporting of multi-touch events
|
||||
* should set this to 1.
|
||||
*
|
||||
* feature-raw-pointer
|
||||
* Values: <uint>
|
||||
*
|
||||
* 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: <string>
|
||||
*
|
||||
* 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: <uint>
|
||||
*
|
||||
* Maximum X coordinate (width) to be used by the frontend
|
||||
* while reporting input events, pixels, [0; UINT32_MAX].
|
||||
*
|
||||
* height
|
||||
* Values: <uint>
|
||||
*
|
||||
* 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: <uint>
|
||||
*
|
||||
* Number of simultaneous touches reported.
|
||||
*
|
||||
* multi-touch-width
|
||||
* Values: <uint>
|
||||
*
|
||||
* Width of the touch area to be used by the frontend
|
||||
* while reporting input events, pixels, [0; UINT32_MAX].
|
||||
*
|
||||
* multi-touch-height
|
||||
* Values: <uint>
|
||||
*
|
||||
* 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: <uint>
|
||||
*
|
||||
* Request backend to report absolute pointer coordinates
|
||||
* (XENKBD_TYPE_POS) instead of relative ones (XENKBD_TYPE_MOTION).
|
||||
*
|
||||
* request-multi-touch
|
||||
* Values: <uint>
|
||||
*
|
||||
* Request backend to report multi-touch events.
|
||||
*
|
||||
* request-raw-pointer
|
||||
* Values: <uint>
|
||||
*
|
||||
* 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: <uint>
|
||||
*
|
||||
* The identifier of the Xen event channel used to signal activity
|
||||
* in the ring buffer.
|
||||
*
|
||||
* page-gref
|
||||
* Values: <uint>
|
||||
*
|
||||
* 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: <uint>
|
||||
*
|
||||
* 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:
|
||||
*/
|
@ -1,101 +0,0 @@
|
||||
/**
|
||||
* @file
|
||||
* @section AUTHORS
|
||||
*
|
||||
* Copyright (C) 2010 Rafal Wojtczuk <rafal@invisiblethingslab.com>
|
||||
*
|
||||
* Authors:
|
||||
* Rafal Wojtczuk <rafal@invisiblethingslab.com>
|
||||
* Daniel De Graaf <dgdegra@tycho.nsa.gov>
|
||||
*
|
||||
* @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 <stdint.h>
|
||||
#include <sys/types.h>
|
||||
|
||||
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];
|
||||
};
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -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 <hap9@epoch.ncsc.mil>
|
||||
*/
|
||||
#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:
|
||||
*/
|
@ -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
|
@ -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 <stefano@aporeto.com>
|
||||
*/
|
||||
|
||||
#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:
|
||||
*/
|
@ -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:
|
||||
*/
|
File diff suppressed because it is too large
Load Diff
@ -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 <dgdegra@tycho.nsa.gov>
|
||||
*
|
||||
* 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:
|
||||
*/
|
@ -1,254 +0,0 @@
|
||||
/*
|
||||
* usbif.h
|
||||
*
|
||||
* USB I/O interface for Xen guest OSes.
|
||||
*
|
||||
* Copyright (C) 2009, FUJITSU LABORATORIES LTD.
|
||||
* Author: Noboru Iwamatsu <n_iwamatsu@jp.fujitsu.com>
|
||||
*
|
||||
* 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__ */
|
@ -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_domid>/backend/vscsi/.
|
||||
* The xenstore layout looks like this (dom0 is assumed to be the backend_domid):
|
||||
*
|
||||
* <domid>/<vhost>/feature-host = "0"
|
||||
* <domid>/<vhost>/frontend = "/local/domain/<domid>/device/vscsi/0"
|
||||
* <domid>/<vhost>/frontend-id = "<domid>"
|
||||
* <domid>/<vhost>/online = "1"
|
||||
* <domid>/<vhost>/state = "4"
|
||||
* <domid>/<vhost>/vscsi-devs/dev-0/p-dev = "8:0:2:1" or "naa.wwn:lun"
|
||||
* <domid>/<vhost>/vscsi-devs/dev-0/state = "4"
|
||||
* <domid>/<vhost>/vscsi-devs/dev-0/v-dev = "0:0:0:0"
|
||||
* <domid>/<vhost>/vscsi-devs/dev-1/p-dev = "8:0:2:2"
|
||||
* <domid>/<vhost>/vscsi-devs/dev-1/state = "4"
|
||||
* <domid>/<vhost>/vscsi-devs/dev-1/v-dev = "0:0:1:0"
|
||||
*
|
||||
* The frontend driver maintains its state in
|
||||
* /local/domain/<domid>/device/vscsi/.
|
||||
*
|
||||
* <vhost>/backend = "/local/domain/0/backend/vscsi/<domid>/<vhost>"
|
||||
* <vhost>/backend-id = "0"
|
||||
* <vhost>/event-channel = "20"
|
||||
* <vhost>/ring-ref = "43"
|
||||
* <vhost>/state = "4"
|
||||
* <vhost>/vscsi-devs/dev-0/state = "4"
|
||||
* <vhost>/vscsi-devs/dev-1/state = "4"
|
||||
*
|
||||
* In addition to the entries for backend and frontend these flags are stored
|
||||
* for the toolstack:
|
||||
*
|
||||
* <domid>/<vhost>/vscsi-devs/dev-1/p-devname = "/dev/$device"
|
||||
* <domid>/<vhost>/libxl_ctrl_index = "0"
|
||||
*
|
||||
*
|
||||
* Backend/frontend protocol
|
||||
* =========================
|
||||
*
|
||||
* To create a vhost along with a device:
|
||||
* <domid>/<vhost>/feature-host = "0"
|
||||
* <domid>/<vhost>/frontend = "/local/domain/<domid>/device/vscsi/0"
|
||||
* <domid>/<vhost>/frontend-id = "<domid>"
|
||||
* <domid>/<vhost>/online = "1"
|
||||
* <domid>/<vhost>/state = "1"
|
||||
* <domid>/<vhost>/vscsi-devs/dev-0/p-dev = "8:0:2:1"
|
||||
* <domid>/<vhost>/vscsi-devs/dev-0/state = "1"
|
||||
* <domid>/<vhost>/vscsi-devs/dev-0/v-dev = "0:0:0:0"
|
||||
* Wait for <domid>/<vhost>/state + <domid>/<vhost>/vscsi-devs/dev-0/state become 4
|
||||
*
|
||||
* To add another device to a vhost:
|
||||
* <domid>/<vhost>/state = "7"
|
||||
* <domid>/<vhost>/vscsi-devs/dev-1/p-dev = "8:0:2:2"
|
||||
* <domid>/<vhost>/vscsi-devs/dev-1/state = "1"
|
||||
* <domid>/<vhost>/vscsi-devs/dev-1/v-dev = "0:0:1:0"
|
||||
* Wait for <domid>/<vhost>/state + <domid>/<vhost>/vscsi-devs/dev-1/state become 4
|
||||
*
|
||||
* To remove a device from a vhost:
|
||||
* <domid>/<vhost>/state = "7"
|
||||
* <domid>/<vhost>/vscsi-devs/dev-1/state = "5"
|
||||
* Wait for <domid>/<vhost>/state to become 4
|
||||
* Wait for <domid>/<vhost>/vscsi-devs/dev-1/state become 6
|
||||
* Remove <domid>/<vhost>/vscsi-devs/dev-1/{state,p-dev,v-dev,p-devname}
|
||||
* Remove <domid>/<vhost>/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:
|
||||
*/
|
@ -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:
|
||||
*/
|
@ -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:
|
||||
*/
|
@ -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 <horms@verge.net.au>
|
||||
* - Magnus Damm <magnus@valinux.co.jp>
|
||||
*/
|
||||
|
||||
#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:
|
||||
*/
|
@ -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 <keir@xensource.com>
|
||||
*/
|
||||
|
||||
#ifndef __XEN_PUBLIC_MEMORY_H__
|
||||
#define __XEN_PUBLIC_MEMORY_H__
|
||||
|
||||
#include "xen.h"
|
||||
#include "physdev.h"
|
||||
|
||||
/*
|
||||
* Increase or decrease the specified domain's memory reservation. Returns the
|
||||
* number of extents successfully allocated or freed.
|
||||
* arg == addr of struct xen_memory_reservation.
|
||||
*/
|
||||
#define XENMEM_increase_reservation 0
|
||||
#define XENMEM_decrease_reservation 1
|
||||
#define XENMEM_populate_physmap 6
|
||||
|
||||
#if __XEN_INTERFACE_VERSION__ >= 0x00030209
|
||||
/*
|
||||
* Maximum # bits addressable by the user of the allocated region (e.g., I/O
|
||||
* devices often have a 32-bit limitation even in 64-bit systems). If zero
|
||||
* then the user has no addressing restriction. This field is not used by
|
||||
* XENMEM_decrease_reservation.
|
||||
*/
|
||||
#define XENMEMF_address_bits(x) (x)
|
||||
#define XENMEMF_get_address_bits(x) ((x) & 0xffu)
|
||||
/* NUMA node to allocate from. */
|
||||
#define XENMEMF_node(x) (((x) + 1) << 8)
|
||||
#define XENMEMF_get_node(x) ((((x) >> 8) - 1) & 0xffu)
|
||||
/* Flag to populate physmap with populate-on-demand entries */
|
||||
#define XENMEMF_populate_on_demand (1<<16)
|
||||
/* Flag to request allocation only from the node specified */
|
||||
#define XENMEMF_exact_node_request (1<<17)
|
||||
#define XENMEMF_exact_node(n) (XENMEMF_node(n) | XENMEMF_exact_node_request)
|
||||
/* Flag to indicate the node specified is virtual node */
|
||||
#define XENMEMF_vnode (1<<18)
|
||||
#endif
|
||||
|
||||
struct xen_memory_reservation {
|
||||
|
||||
/*
|
||||
* XENMEM_increase_reservation:
|
||||
* OUT: MFN (*not* GMFN) bases of extents that were allocated
|
||||
* XENMEM_decrease_reservation:
|
||||
* IN: GMFN bases of extents to free
|
||||
* XENMEM_populate_physmap:
|
||||
* IN: GPFN bases of extents to populate with memory
|
||||
* OUT: GMFN bases of extents that were allocated
|
||||
* (NB. This command also updates the mach_to_phys translation table)
|
||||
* XENMEM_claim_pages:
|
||||
* IN: must be zero
|
||||
*/
|
||||
XEN_GUEST_HANDLE(xen_pfn_t) extent_start;
|
||||
|
||||
/* Number of extents, and size/alignment of each (2^extent_order pages). */
|
||||
xen_ulong_t nr_extents;
|
||||
unsigned int extent_order;
|
||||
|
||||
#if __XEN_INTERFACE_VERSION__ >= 0x00030209
|
||||
/* XENMEMF flags. */
|
||||
unsigned int mem_flags;
|
||||
#else
|
||||
unsigned int address_bits;
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Domain whose reservation is being changed.
|
||||
* Unprivileged domains can specify only DOMID_SELF.
|
||||
*/
|
||||
domid_t domid;
|
||||
};
|
||||
typedef struct xen_memory_reservation xen_memory_reservation_t;
|
||||
DEFINE_XEN_GUEST_HANDLE(xen_memory_reservation_t);
|
||||
|
||||
/*
|
||||
* An atomic exchange of memory pages. If return code is zero then
|
||||
* @out.extent_list provides GMFNs of the newly-allocated memory.
|
||||
* Returns zero on complete success, otherwise a negative error code.
|
||||
* On complete success then always @nr_exchanged == @in.nr_extents.
|
||||
* On partial success @nr_exchanged indicates how much work was done.
|
||||
*
|
||||
* Note that only PV guests can use this operation.
|
||||
*/
|
||||
#define XENMEM_exchange 11
|
||||
struct xen_memory_exchange {
|
||||
/*
|
||||
* [IN] Details of memory extents to be exchanged (GMFN bases).
|
||||
* Note that @in.address_bits is ignored and unused.
|
||||
*/
|
||||
struct xen_memory_reservation in;
|
||||
|
||||
/*
|
||||
* [IN/OUT] Details of new memory extents.
|
||||
* We require that:
|
||||
* 1. @in.domid == @out.domid
|
||||
* 2. @in.nr_extents << @in.extent_order ==
|
||||
* @out.nr_extents << @out.extent_order
|
||||
* 3. @in.extent_start and @out.extent_start lists must not overlap
|
||||
* 4. @out.extent_start lists GPFN bases to be populated
|
||||
* 5. @out.extent_start is overwritten with allocated GMFN bases
|
||||
*/
|
||||
struct xen_memory_reservation out;
|
||||
|
||||
/*
|
||||
* [OUT] Number of input extents that were successfully exchanged:
|
||||
* 1. The first @nr_exchanged input extents were successfully
|
||||
* deallocated.
|
||||
* 2. The corresponding first entries in the output extent list correctly
|
||||
* indicate the GMFNs that were successfully exchanged.
|
||||
* 3. All other input and output extents are untouched.
|
||||
* 4. If not all input exents are exchanged then the return code of this
|
||||
* command will be non-zero.
|
||||
* 5. THIS FIELD MUST BE INITIALISED TO ZERO BY THE CALLER!
|
||||
*/
|
||||
xen_ulong_t nr_exchanged;
|
||||
};
|
||||
typedef struct xen_memory_exchange xen_memory_exchange_t;
|
||||
DEFINE_XEN_GUEST_HANDLE(xen_memory_exchange_t);
|
||||
|
||||
/*
|
||||
* Returns the maximum machine frame number of mapped RAM in this system.
|
||||
* This command always succeeds (it never returns an error code).
|
||||
* arg == NULL.
|
||||
*/
|
||||
#define XENMEM_maximum_ram_page 2
|
||||
|
||||
/*
|
||||
* Returns the current or maximum memory reservation, in pages, of the
|
||||
* specified domain (may be DOMID_SELF). Returns -ve errcode on failure.
|
||||
* arg == addr of domid_t.
|
||||
*/
|
||||
#define XENMEM_current_reservation 3
|
||||
#define XENMEM_maximum_reservation 4
|
||||
|
||||
/*
|
||||
* Returns the maximum GPFN in use by the guest, or -ve errcode on failure.
|
||||
*/
|
||||
#define XENMEM_maximum_gpfn 14
|
||||
|
||||
/*
|
||||
* Returns a list of MFN bases of 2MB extents comprising the machine_to_phys
|
||||
* mapping table. Architectures which do not have a m2p table do not implement
|
||||
* this command.
|
||||
* arg == addr of xen_machphys_mfn_list_t.
|
||||
*/
|
||||
#define XENMEM_machphys_mfn_list 5
|
||||
struct xen_machphys_mfn_list {
|
||||
/*
|
||||
* Size of the 'extent_start' array. Fewer entries will be filled if the
|
||||
* machphys table is smaller than max_extents * 2MB.
|
||||
*/
|
||||
unsigned int max_extents;
|
||||
|
||||
/*
|
||||
* Pointer to buffer to fill with list of extent starts. If there are
|
||||
* any large discontiguities in the machine address space, 2MB gaps in
|
||||
* the machphys table will be represented by an MFN base of zero.
|
||||
*/
|
||||
XEN_GUEST_HANDLE(xen_pfn_t) extent_start;
|
||||
|
||||
/*
|
||||
* Number of extents written to the above array. This will be smaller
|
||||
* than 'max_extents' if the machphys table is smaller than max_e * 2MB.
|
||||
*/
|
||||
unsigned int nr_extents;
|
||||
};
|
||||
typedef struct xen_machphys_mfn_list xen_machphys_mfn_list_t;
|
||||
DEFINE_XEN_GUEST_HANDLE(xen_machphys_mfn_list_t);
|
||||
|
||||
/*
|
||||
* For a compat caller, this is identical to XENMEM_machphys_mfn_list.
|
||||
*
|
||||
* For a non compat caller, this functions similarly to
|
||||
* XENMEM_machphys_mfn_list, but returns the mfns making up the compatibility
|
||||
* m2p table.
|
||||
*/
|
||||
#define XENMEM_machphys_compat_mfn_list 25
|
||||
|
||||
/*
|
||||
* Returns the location in virtual address space of the machine_to_phys
|
||||
* mapping table. Architectures which do not have a m2p table, or which do not
|
||||
* map it by default into guest address space, do not implement this command.
|
||||
* arg == addr of xen_machphys_mapping_t.
|
||||
*/
|
||||
#define XENMEM_machphys_mapping 12
|
||||
struct xen_machphys_mapping {
|
||||
xen_ulong_t v_start, v_end; /* Start and end virtual addresses. */
|
||||
xen_ulong_t max_mfn; /* Maximum MFN that can be looked up. */
|
||||
};
|
||||
typedef struct xen_machphys_mapping xen_machphys_mapping_t;
|
||||
DEFINE_XEN_GUEST_HANDLE(xen_machphys_mapping_t);
|
||||
|
||||
/* Source mapping space. */
|
||||
/* ` enum phys_map_space { */
|
||||
#define XENMAPSPACE_shared_info 0 /* shared info page */
|
||||
#define XENMAPSPACE_grant_table 1 /* grant table page */
|
||||
#define XENMAPSPACE_gmfn 2 /* GMFN */
|
||||
#define XENMAPSPACE_gmfn_range 3 /* GMFN range, XENMEM_add_to_physmap only. */
|
||||
#define XENMAPSPACE_gmfn_foreign 4 /* GMFN from another dom,
|
||||
* XENMEM_add_to_physmap_batch only. */
|
||||
#define XENMAPSPACE_dev_mmio 5 /* device mmio region
|
||||
ARM only; the region is mapped in
|
||||
Stage-2 using the Normal Memory
|
||||
Inner/Outer Write-Back Cacheable
|
||||
memory attribute. */
|
||||
/* ` } */
|
||||
|
||||
/*
|
||||
* Sets the GPFN at which a particular page appears in the specified guest's
|
||||
* 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:
|
||||
*/
|
@ -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 <keir@xensource.com>
|
||||
*/
|
||||
|
||||
#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:
|
||||
*/
|
@ -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:
|
||||
*/
|
@ -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 <secs,nsecs> after 00:00:00 UTC,
|
||||
* 1 January, 1970 if the current system time was <system_time>.
|
||||
*/
|
||||
#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:
|
||||
*/
|
@ -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:
|
||||
*/
|
@ -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 <keir@xensource.com>
|
||||
*/
|
||||
|
||||
#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:
|
||||
*/
|
File diff suppressed because it is too large
Load Diff
@ -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:
|
||||
*/
|
@ -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<<TRC_SCHED_ID_BITS) - 1) << TRC_SCHED_ID_SHIFT)
|
||||
#define TRC_SCHED_EVT_MASK (~(TRC_SCHED_ID_MASK))
|
||||
|
||||
/* Per-scheduler IDs, to identify scheduler specific events */
|
||||
#define TRC_SCHED_CSCHED 0
|
||||
#define TRC_SCHED_CSCHED2 1
|
||||
/* #define XEN_SCHEDULER_SEDF 2 (Removed) */
|
||||
#define TRC_SCHED_ARINC653 3
|
||||
#define TRC_SCHED_RTDS 4
|
||||
#define TRC_SCHED_SNULL 5
|
||||
|
||||
/* Per-scheduler tracing */
|
||||
#define TRC_SCHED_CLASS_EVT(_c, _e) \
|
||||
( ( TRC_SCHED_CLASS | \
|
||||
((TRC_SCHED_##_c << TRC_SCHED_ID_SHIFT) & TRC_SCHED_ID_MASK) ) + \
|
||||
(_e & TRC_SCHED_EVT_MASK) )
|
||||
|
||||
/* Trace classes for DOM0 operations */
|
||||
#define TRC_DOM0_DOMOPS 0x00041000 /* Domains manipulations */
|
||||
|
||||
/* Trace classes for Hardware */
|
||||
#define TRC_HW_PM 0x00801000 /* Power management traces */
|
||||
#define TRC_HW_IRQ 0x00802000 /* Traces relating to the handling of IRQs */
|
||||
|
||||
/* Trace events per class */
|
||||
#define TRC_LOST_RECORDS (TRC_GEN + 1)
|
||||
#define TRC_TRACE_WRAP_BUFFER (TRC_GEN + 2)
|
||||
#define TRC_TRACE_CPU_CHANGE (TRC_GEN + 3)
|
||||
|
||||
#define TRC_SCHED_RUNSTATE_CHANGE (TRC_SCHED_MIN + 1)
|
||||
#define TRC_SCHED_CONTINUE_RUNNING (TRC_SCHED_MIN + 2)
|
||||
#define TRC_SCHED_DOM_ADD (TRC_SCHED_VERBOSE + 1)
|
||||
#define TRC_SCHED_DOM_REM (TRC_SCHED_VERBOSE + 2)
|
||||
#define TRC_SCHED_SLEEP (TRC_SCHED_VERBOSE + 3)
|
||||
#define TRC_SCHED_WAKE (TRC_SCHED_VERBOSE + 4)
|
||||
#define TRC_SCHED_YIELD (TRC_SCHED_VERBOSE + 5)
|
||||
#define TRC_SCHED_BLOCK (TRC_SCHED_VERBOSE + 6)
|
||||
#define TRC_SCHED_SHUTDOWN (TRC_SCHED_VERBOSE + 7)
|
||||
#define TRC_SCHED_CTL (TRC_SCHED_VERBOSE + 8)
|
||||
#define TRC_SCHED_ADJDOM (TRC_SCHED_VERBOSE + 9)
|
||||
#define TRC_SCHED_SWITCH (TRC_SCHED_VERBOSE + 10)
|
||||
#define TRC_SCHED_S_TIMER_FN (TRC_SCHED_VERBOSE + 11)
|
||||
#define TRC_SCHED_T_TIMER_FN (TRC_SCHED_VERBOSE + 12)
|
||||
#define TRC_SCHED_DOM_TIMER_FN (TRC_SCHED_VERBOSE + 13)
|
||||
#define TRC_SCHED_SWITCH_INFPREV (TRC_SCHED_VERBOSE + 14)
|
||||
#define TRC_SCHED_SWITCH_INFNEXT (TRC_SCHED_VERBOSE + 15)
|
||||
#define TRC_SCHED_SHUTDOWN_CODE (TRC_SCHED_VERBOSE + 16)
|
||||
#define TRC_SCHED_SWITCH_INFCONT (TRC_SCHED_VERBOSE + 17)
|
||||
|
||||
#define TRC_DOM0_DOM_ADD (TRC_DOM0_DOMOPS + 1)
|
||||
#define TRC_DOM0_DOM_REM (TRC_DOM0_DOMOPS + 2)
|
||||
|
||||
#define TRC_MEM_PAGE_GRANT_MAP (TRC_MEM + 1)
|
||||
#define TRC_MEM_PAGE_GRANT_UNMAP (TRC_MEM + 2)
|
||||
#define TRC_MEM_PAGE_GRANT_TRANSFER (TRC_MEM + 3)
|
||||
#define TRC_MEM_SET_P2M_ENTRY (TRC_MEM + 4)
|
||||
#define TRC_MEM_DECREASE_RESERVATION (TRC_MEM + 5)
|
||||
#define TRC_MEM_POD_POPULATE (TRC_MEM + 16)
|
||||
#define TRC_MEM_POD_ZERO_RECLAIM (TRC_MEM + 17)
|
||||
#define TRC_MEM_POD_SUPERPAGE_SPLINTER (TRC_MEM + 18)
|
||||
|
||||
#define TRC_PV_ENTRY 0x00201000 /* Hypervisor entry points for PV guests. */
|
||||
#define TRC_PV_SUBCALL 0x00202000 /* Sub-call in a multicall hypercall */
|
||||
|
||||
#define TRC_PV_HYPERCALL (TRC_PV_ENTRY + 1)
|
||||
#define TRC_PV_TRAP (TRC_PV_ENTRY + 3)
|
||||
#define TRC_PV_PAGE_FAULT (TRC_PV_ENTRY + 4)
|
||||
#define TRC_PV_FORCED_INVALID_OP (TRC_PV_ENTRY + 5)
|
||||
#define TRC_PV_EMULATE_PRIVOP (TRC_PV_ENTRY + 6)
|
||||
#define TRC_PV_EMULATE_4GB (TRC_PV_ENTRY + 7)
|
||||
#define TRC_PV_MATH_STATE_RESTORE (TRC_PV_ENTRY + 8)
|
||||
#define TRC_PV_PAGING_FIXUP (TRC_PV_ENTRY + 9)
|
||||
#define TRC_PV_GDT_LDT_MAPPING_FAULT (TRC_PV_ENTRY + 10)
|
||||
#define TRC_PV_PTWR_EMULATION (TRC_PV_ENTRY + 11)
|
||||
#define TRC_PV_PTWR_EMULATION_PAE (TRC_PV_ENTRY + 12)
|
||||
#define TRC_PV_HYPERCALL_V2 (TRC_PV_ENTRY + 13)
|
||||
#define TRC_PV_HYPERCALL_SUBCALL (TRC_PV_SUBCALL + 14)
|
||||
|
||||
/*
|
||||
* TRC_PV_HYPERCALL_V2 format
|
||||
*
|
||||
* Only some of the hypercall argument are recorded. Bit fields A0 to
|
||||
* A5 in the first extra word are set if the argument is present and
|
||||
* the arguments themselves are packed sequentially in the following
|
||||
* words.
|
||||
*
|
||||
* The TRC_64_FLAG bit is not set for these events (even if there are
|
||||
* 64-bit arguments in the record).
|
||||
*
|
||||
* Word
|
||||
* 0 bit 31 30|29 28|27 26|25 24|23 22|21 20|19 ... 0
|
||||
* A5 |A4 |A3 |A2 |A1 |A0 |Hypercall op
|
||||
* 1 First 32 bit (or low word of first 64 bit) arg in record
|
||||
* 2 Second 32 bit (or high word of first 64 bit) arg in record
|
||||
* ...
|
||||
*
|
||||
* A0-A5 bitfield values:
|
||||
*
|
||||
* 00b Argument not present
|
||||
* 01b 32-bit argument present
|
||||
* 10b 64-bit argument present
|
||||
* 11b Reserved
|
||||
*/
|
||||
#define TRC_PV_HYPERCALL_V2_ARG_32(i) (0x1 << (20 + 2*(i)))
|
||||
#define TRC_PV_HYPERCALL_V2_ARG_64(i) (0x2 << (20 + 2*(i)))
|
||||
#define TRC_PV_HYPERCALL_V2_ARG_MASK (0xfff00000)
|
||||
|
||||
#define TRC_SHADOW_NOT_SHADOW (TRC_SHADOW + 1)
|
||||
#define TRC_SHADOW_FAST_PROPAGATE (TRC_SHADOW + 2)
|
||||
#define TRC_SHADOW_FAST_MMIO (TRC_SHADOW + 3)
|
||||
#define TRC_SHADOW_FALSE_FAST_PATH (TRC_SHADOW + 4)
|
||||
#define TRC_SHADOW_MMIO (TRC_SHADOW + 5)
|
||||
#define TRC_SHADOW_FIXUP (TRC_SHADOW + 6)
|
||||
#define TRC_SHADOW_DOMF_DYING (TRC_SHADOW + 7)
|
||||
#define TRC_SHADOW_EMULATE (TRC_SHADOW + 8)
|
||||
#define TRC_SHADOW_EMULATE_UNSHADOW_USER (TRC_SHADOW + 9)
|
||||
#define TRC_SHADOW_EMULATE_UNSHADOW_EVTINJ (TRC_SHADOW + 10)
|
||||
#define TRC_SHADOW_EMULATE_UNSHADOW_UNHANDLED (TRC_SHADOW + 11)
|
||||
#define TRC_SHADOW_WRMAP_BF (TRC_SHADOW + 12)
|
||||
#define TRC_SHADOW_PREALLOC_UNPIN (TRC_SHADOW + 13)
|
||||
#define TRC_SHADOW_RESYNC_FULL (TRC_SHADOW + 14)
|
||||
#define TRC_SHADOW_RESYNC_ONLY (TRC_SHADOW + 15)
|
||||
|
||||
/* trace events per subclass */
|
||||
#define TRC_HVM_NESTEDFLAG (0x400)
|
||||
#define TRC_HVM_VMENTRY (TRC_HVM_ENTRYEXIT + 0x01)
|
||||
#define TRC_HVM_VMEXIT (TRC_HVM_ENTRYEXIT + 0x02)
|
||||
#define TRC_HVM_VMEXIT64 (TRC_HVM_ENTRYEXIT + TRC_64_FLAG + 0x02)
|
||||
#define TRC_HVM_PF_XEN (TRC_HVM_HANDLER + 0x01)
|
||||
#define TRC_HVM_PF_XEN64 (TRC_HVM_HANDLER + TRC_64_FLAG + 0x01)
|
||||
#define TRC_HVM_PF_INJECT (TRC_HVM_HANDLER + 0x02)
|
||||
#define TRC_HVM_PF_INJECT64 (TRC_HVM_HANDLER + TRC_64_FLAG + 0x02)
|
||||
#define TRC_HVM_INJ_EXC (TRC_HVM_HANDLER + 0x03)
|
||||
#define TRC_HVM_INJ_VIRQ (TRC_HVM_HANDLER + 0x04)
|
||||
#define TRC_HVM_REINJ_VIRQ (TRC_HVM_HANDLER + 0x05)
|
||||
#define TRC_HVM_IO_READ (TRC_HVM_HANDLER + 0x06)
|
||||
#define TRC_HVM_IO_WRITE (TRC_HVM_HANDLER + 0x07)
|
||||
#define TRC_HVM_CR_READ (TRC_HVM_HANDLER + 0x08)
|
||||
#define TRC_HVM_CR_READ64 (TRC_HVM_HANDLER + TRC_64_FLAG + 0x08)
|
||||
#define TRC_HVM_CR_WRITE (TRC_HVM_HANDLER + 0x09)
|
||||
#define TRC_HVM_CR_WRITE64 (TRC_HVM_HANDLER + TRC_64_FLAG + 0x09)
|
||||
#define TRC_HVM_DR_READ (TRC_HVM_HANDLER + 0x0A)
|
||||
#define TRC_HVM_DR_WRITE (TRC_HVM_HANDLER + 0x0B)
|
||||
#define TRC_HVM_MSR_READ (TRC_HVM_HANDLER + 0x0C)
|
||||
#define TRC_HVM_MSR_WRITE (TRC_HVM_HANDLER + 0x0D)
|
||||
#define TRC_HVM_CPUID (TRC_HVM_HANDLER + 0x0E)
|
||||
#define TRC_HVM_INTR (TRC_HVM_HANDLER + 0x0F)
|
||||
#define TRC_HVM_NMI (TRC_HVM_HANDLER + 0x10)
|
||||
#define TRC_HVM_SMI (TRC_HVM_HANDLER + 0x11)
|
||||
#define TRC_HVM_VMMCALL (TRC_HVM_HANDLER + 0x12)
|
||||
#define TRC_HVM_HLT (TRC_HVM_HANDLER + 0x13)
|
||||
#define TRC_HVM_INVLPG (TRC_HVM_HANDLER + 0x14)
|
||||
#define TRC_HVM_INVLPG64 (TRC_HVM_HANDLER + TRC_64_FLAG + 0x14)
|
||||
#define TRC_HVM_MCE (TRC_HVM_HANDLER + 0x15)
|
||||
#define TRC_HVM_IOPORT_READ (TRC_HVM_HANDLER + 0x16)
|
||||
#define TRC_HVM_IOMEM_READ (TRC_HVM_HANDLER + 0x17)
|
||||
#define TRC_HVM_CLTS (TRC_HVM_HANDLER + 0x18)
|
||||
#define TRC_HVM_LMSW (TRC_HVM_HANDLER + 0x19)
|
||||
#define TRC_HVM_LMSW64 (TRC_HVM_HANDLER + TRC_64_FLAG + 0x19)
|
||||
#define TRC_HVM_RDTSC (TRC_HVM_HANDLER + 0x1a)
|
||||
#define TRC_HVM_INTR_WINDOW (TRC_HVM_HANDLER + 0x20)
|
||||
#define TRC_HVM_NPF (TRC_HVM_HANDLER + 0x21)
|
||||
#define TRC_HVM_REALMODE_EMULATE (TRC_HVM_HANDLER + 0x22)
|
||||
#define TRC_HVM_TRAP (TRC_HVM_HANDLER + 0x23)
|
||||
#define TRC_HVM_TRAP_DEBUG (TRC_HVM_HANDLER + 0x24)
|
||||
#define TRC_HVM_VLAPIC (TRC_HVM_HANDLER + 0x25)
|
||||
#define TRC_HVM_XCR_READ64 (TRC_HVM_HANDLER + TRC_64_FLAG + 0x26)
|
||||
#define TRC_HVM_XCR_WRITE64 (TRC_HVM_HANDLER + TRC_64_FLAG + 0x27)
|
||||
|
||||
#define TRC_HVM_IOPORT_WRITE (TRC_HVM_HANDLER + 0x216)
|
||||
#define TRC_HVM_IOMEM_WRITE (TRC_HVM_HANDLER + 0x217)
|
||||
|
||||
/* Trace events for emulated devices */
|
||||
#define TRC_HVM_EMUL_HPET_START_TIMER (TRC_HVM_EMUL + 0x1)
|
||||
#define TRC_HVM_EMUL_PIT_START_TIMER (TRC_HVM_EMUL + 0x2)
|
||||
#define TRC_HVM_EMUL_RTC_START_TIMER (TRC_HVM_EMUL + 0x3)
|
||||
#define TRC_HVM_EMUL_LAPIC_START_TIMER (TRC_HVM_EMUL + 0x4)
|
||||
#define TRC_HVM_EMUL_HPET_STOP_TIMER (TRC_HVM_EMUL + 0x5)
|
||||
#define TRC_HVM_EMUL_PIT_STOP_TIMER (TRC_HVM_EMUL + 0x6)
|
||||
#define TRC_HVM_EMUL_RTC_STOP_TIMER (TRC_HVM_EMUL + 0x7)
|
||||
#define TRC_HVM_EMUL_LAPIC_STOP_TIMER (TRC_HVM_EMUL + 0x8)
|
||||
#define TRC_HVM_EMUL_PIT_TIMER_CB (TRC_HVM_EMUL + 0x9)
|
||||
#define TRC_HVM_EMUL_LAPIC_TIMER_CB (TRC_HVM_EMUL + 0xA)
|
||||
#define TRC_HVM_EMUL_PIC_INT_OUTPUT (TRC_HVM_EMUL + 0xB)
|
||||
#define TRC_HVM_EMUL_PIC_KICK (TRC_HVM_EMUL + 0xC)
|
||||
#define TRC_HVM_EMUL_PIC_INTACK (TRC_HVM_EMUL + 0xD)
|
||||
#define TRC_HVM_EMUL_PIC_POSEDGE (TRC_HVM_EMUL + 0xE)
|
||||
#define TRC_HVM_EMUL_PIC_NEGEDGE (TRC_HVM_EMUL + 0xF)
|
||||
#define TRC_HVM_EMUL_PIC_PEND_IRQ_CALL (TRC_HVM_EMUL + 0x10)
|
||||
#define TRC_HVM_EMUL_LAPIC_PIC_INTR (TRC_HVM_EMUL + 0x11)
|
||||
|
||||
/* trace events for per class */
|
||||
#define TRC_PM_FREQ_CHANGE (TRC_HW_PM + 0x01)
|
||||
#define TRC_PM_IDLE_ENTRY (TRC_HW_PM + 0x02)
|
||||
#define TRC_PM_IDLE_EXIT (TRC_HW_PM + 0x03)
|
||||
|
||||
/* Trace events for IRQs */
|
||||
#define TRC_HW_IRQ_MOVE_CLEANUP_DELAY (TRC_HW_IRQ + 0x1)
|
||||
#define TRC_HW_IRQ_MOVE_CLEANUP (TRC_HW_IRQ + 0x2)
|
||||
#define TRC_HW_IRQ_BIND_VECTOR (TRC_HW_IRQ + 0x3)
|
||||
#define TRC_HW_IRQ_CLEAR_VECTOR (TRC_HW_IRQ + 0x4)
|
||||
#define TRC_HW_IRQ_MOVE_FINISH (TRC_HW_IRQ + 0x5)
|
||||
#define TRC_HW_IRQ_ASSIGN_VECTOR (TRC_HW_IRQ + 0x6)
|
||||
#define TRC_HW_IRQ_UNMAPPED_VECTOR (TRC_HW_IRQ + 0x7)
|
||||
#define TRC_HW_IRQ_HANDLED (TRC_HW_IRQ + 0x8)
|
||||
|
||||
/*
|
||||
* Event Flags
|
||||
*
|
||||
* Some events (e.g, TRC_PV_TRAP and TRC_HVM_IOMEM_READ) have multiple
|
||||
* record formats. These event flags distinguish between the
|
||||
* different formats.
|
||||
*/
|
||||
#define TRC_64_FLAG 0x100 /* Addresses are 64 bits (instead of 32 bits) */
|
||||
|
||||
/* This structure represents a single trace buffer record. */
|
||||
struct t_rec {
|
||||
uint32_t event:28;
|
||||
uint32_t extra_u32:3; /* # entries in trailing extra_u32[] array */
|
||||
uint32_t cycles_included:1; /* u.cycles or u.no_cycles? */
|
||||
union {
|
||||
struct {
|
||||
uint32_t cycles_lo, cycles_hi; /* cycle counter timestamp */
|
||||
uint32_t extra_u32[7]; /* event data items */
|
||||
} cycles;
|
||||
struct {
|
||||
uint32_t extra_u32[7]; /* event data items */
|
||||
} nocycles;
|
||||
} u;
|
||||
};
|
||||
|
||||
/*
|
||||
* This structure contains the metadata for a single trace buffer. The head
|
||||
* field, indexes into an array of struct t_rec's.
|
||||
*/
|
||||
struct t_buf {
|
||||
/* Assume the data buffer size is X. X is generally not a power of 2.
|
||||
* CONS and PROD are incremented modulo (2*X):
|
||||
* 0 <= cons < 2*X
|
||||
* 0 <= prod < 2*X
|
||||
* This is done because addition modulo X breaks at 2^32 when X is not a
|
||||
* power of 2:
|
||||
* (((2^32 - 1) % X) + 1) % X != (2^32) % X
|
||||
*/
|
||||
uint32_t cons; /* Offset of next item to be consumed by control tools. */
|
||||
uint32_t prod; /* Offset of next item to be produced by Xen. */
|
||||
/* Records follow immediately after the meta-data header. */
|
||||
};
|
||||
|
||||
/* Structure used to pass MFNs to the trace buffers back to trace consumers.
|
||||
* Offset is an offset into the mapped structure where the mfn list will be held.
|
||||
* MFNs will be at ((unsigned long *)(t_info))+(t_info->cpu_offset[cpu]).
|
||||
*/
|
||||
struct t_info {
|
||||
uint16_t tbuf_size; /* Size in pages of each trace buffer */
|
||||
uint16_t mfn_offset[]; /* Offset within t_info structure of the page list per cpu */
|
||||
/* MFN lists immediately after the header */
|
||||
};
|
||||
|
||||
#endif /* __XEN_PUBLIC_TRACE_H__ */
|
||||
|
||||
/*
|
||||
* Local variables:
|
||||
* mode: C
|
||||
* c-file-style: "BSD"
|
||||
* c-basic-offset: 4
|
||||
* tab-width: 4
|
||||
* indent-tabs-mode: nil
|
||||
* End:
|
||||
*/
|
@ -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 <keir@xensource.com>
|
||||
*/
|
||||
|
||||
#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:
|
||||
*/
|
@ -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 <aquynh@gmail.com>
|
||||
* Copyright (c) 2005, Keir Fraser <keir@xensource.com>
|
||||
*/
|
||||
|
||||
#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:
|
||||
*/
|
@ -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:
|
||||
*/
|
@ -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__ */
|
File diff suppressed because it is too large
Load Diff
@ -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_ */
|
@ -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:
|
||||
*/
|
@ -1,216 +0,0 @@
|
||||
/*
|
||||
* This file contains the flask_op hypercall commands and definitions.
|
||||
*
|
||||
* Author: George Coker, <gscoker@alpha.ncsc.mil>
|
||||
*
|
||||
* 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
|
Loading…
Reference in New Issue
Block a user