📄 xen.h
字号:
/****************************************************************************** * xen.h * * Guest OS interface to Xen. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. * * Copyright (c) 2004, K A Fraser */#ifndef __XEN_PUBLIC_XEN_H__#define __XEN_PUBLIC_XEN_H__#include "xen-compat.h"#if defined(__i386__) || defined(__x86_64__)#include "arch-x86/xen.h"#elif defined(__ia64__)#include "arch-ia64.h"#else#error "Unsupported architecture"#endif#ifndef __ASSEMBLY__/* Guest handles for primitive C types. */DEFINE_XEN_GUEST_HANDLE(char);__DEFINE_XEN_GUEST_HANDLE(uchar, unsigned char);DEFINE_XEN_GUEST_HANDLE(int);__DEFINE_XEN_GUEST_HANDLE(uint, unsigned int);DEFINE_XEN_GUEST_HANDLE(long);__DEFINE_XEN_GUEST_HANDLE(ulong, unsigned long);DEFINE_XEN_GUEST_HANDLE(void);DEFINE_XEN_GUEST_HANDLE(xen_pfn_t);#endif/* * HYPERCALLS */#define __HYPERVISOR_set_trap_table 0#define __HYPERVISOR_mmu_update 1#define __HYPERVISOR_set_gdt 2#define __HYPERVISOR_stack_switch 3#define __HYPERVISOR_set_callbacks 4#define __HYPERVISOR_fpu_taskswitch 5#define __HYPERVISOR_sched_op_compat 6 /* compat since 0x00030101 */#define __HYPERVISOR_platform_op 7#define __HYPERVISOR_set_debugreg 8#define __HYPERVISOR_get_debugreg 9#define __HYPERVISOR_update_descriptor 10#define __HYPERVISOR_memory_op 12#define __HYPERVISOR_multicall 13#define __HYPERVISOR_update_va_mapping 14#define __HYPERVISOR_set_timer_op 15#define __HYPERVISOR_event_channel_op_compat 16 /* compat since 0x00030202 */#define __HYPERVISOR_xen_version 17#define __HYPERVISOR_console_io 18#define __HYPERVISOR_physdev_op_compat 19 /* compat since 0x00030202 */#define __HYPERVISOR_grant_table_op 20#define __HYPERVISOR_vm_assist 21#define __HYPERVISOR_update_va_mapping_otherdomain 22#define __HYPERVISOR_iret 23 /* x86 only */#define __HYPERVISOR_vcpu_op 24#define __HYPERVISOR_set_segment_base 25 /* x86/64 only */#define __HYPERVISOR_mmuext_op 26#define __HYPERVISOR_xsm_op 27#define __HYPERVISOR_nmi_op 28#define __HYPERVISOR_sched_op 29#define __HYPERVISOR_callback_op 30#define __HYPERVISOR_xenoprof_op 31#define __HYPERVISOR_event_channel_op 32#define __HYPERVISOR_physdev_op 33#define __HYPERVISOR_hvm_op 34#define __HYPERVISOR_sysctl 35#define __HYPERVISOR_domctl 36#define __HYPERVISOR_kexec_op 37/* Architecture-specific hypercall definitions. */#define __HYPERVISOR_arch_0 48#define __HYPERVISOR_arch_1 49#define __HYPERVISOR_arch_2 50#define __HYPERVISOR_arch_3 51#define __HYPERVISOR_arch_4 52#define __HYPERVISOR_arch_5 53#define __HYPERVISOR_arch_6 54#define __HYPERVISOR_arch_7 55/* * HYPERCALL COMPATIBILITY. *//* New sched_op hypercall introduced in 0x00030101. */#if __XEN_INTERFACE_VERSION__ < 0x00030101#undef __HYPERVISOR_sched_op#define __HYPERVISOR_sched_op __HYPERVISOR_sched_op_compat#endif/* New event-channel and physdev hypercalls introduced in 0x00030202. */#if __XEN_INTERFACE_VERSION__ < 0x00030202#undef __HYPERVISOR_event_channel_op#define __HYPERVISOR_event_channel_op __HYPERVISOR_event_channel_op_compat#undef __HYPERVISOR_physdev_op#define __HYPERVISOR_physdev_op __HYPERVISOR_physdev_op_compat#endif/* New platform_op hypercall introduced in 0x00030204. */#if __XEN_INTERFACE_VERSION__ < 0x00030204#define __HYPERVISOR_dom0_op __HYPERVISOR_platform_op#endif/* * VIRTUAL INTERRUPTS * * Virtual interrupts that a guest OS may receive from Xen. * * In the side comments, 'V.' denotes a per-VCPU VIRQ while 'G.' denotes a * global VIRQ. The former can be bound once per VCPU and cannot be re-bound. * The latter can be allocated only once per guest: they must initially be * allocated to VCPU0 but can subsequently be re-bound. */#define VIRQ_TIMER 0 /* V. Timebase update, and/or requested timeout. */#define VIRQ_DEBUG 1 /* V. Request guest to dump debug info. */#define VIRQ_CONSOLE 2 /* G. (DOM0) Bytes received on emergency console. */#define VIRQ_DOM_EXC 3 /* G. (DOM0) Exceptional event for some domain. */#define VIRQ_TBUF 4 /* G. (DOM0) Trace buffer has records available. */#define VIRQ_DEBUGGER 6 /* G. (DOM0) A domain has paused for debugging. */#define VIRQ_XENOPROF 7 /* V. XenOprofile interrupt: new sample available */#define VIRQ_CON_RING 8 /* G. (DOM0) Bytes received on console *//* Architecture-specific VIRQ definitions. */#define VIRQ_ARCH_0 16#define VIRQ_ARCH_1 17#define VIRQ_ARCH_2 18#define VIRQ_ARCH_3 19#define VIRQ_ARCH_4 20#define VIRQ_ARCH_5 21#define VIRQ_ARCH_6 22#define VIRQ_ARCH_7 23#define NR_VIRQS 24/* * MMU-UPDATE REQUESTS * * HYPERVISOR_mmu_update() accepts a list of (ptr, val) pairs. * A foreigndom (FD) can be specified (or DOMID_SELF for none). * Where the FD has some effect, it is described below. * ptr[1:0] specifies the appropriate MMU_* command. * * ptr[1:0] == MMU_NORMAL_PT_UPDATE: * Updates an entry in a page table. If updating an L1 table, and the new * table entry is valid/present, the mapped frame must belong to the FD, if * an FD has been specified. If attempting to map an I/O page then the * caller assumes the privilege of the FD. * FD == DOMID_IO: Permit /only/ I/O mappings, at the priv level of the caller. * FD == DOMID_XEN: Map restricted areas of Xen's heap space. * ptr[:2] -- Machine address of the page-table entry to modify. * val -- Value to write. * * ptr[1:0] == MMU_MACHPHYS_UPDATE: * Updates an entry in the machine->pseudo-physical mapping table. * ptr[:2] -- Machine address within the frame whose mapping to modify. * The frame must belong to the FD, if one is specified. * val -- Value to write into the mapping entry. * * ptr[1:0] == MMU_PT_UPDATE_PRESERVE_AD: * As MMU_NORMAL_PT_UPDATE above, but A/D bits currently in the PTE are ORed * with those in @val. */#define MMU_NORMAL_PT_UPDATE 0 /* checked '*ptr = val'. ptr is MA. */#define MMU_MACHPHYS_UPDATE 1 /* ptr = MA of frame to modify entry for */#define MMU_PT_UPDATE_PRESERVE_AD 2 /* atomically: *ptr = val | (*ptr&(A|D)) *//* * MMU EXTENDED OPERATIONS * * HYPERVISOR_mmuext_op() accepts a list of mmuext_op structures. * A foreigndom (FD) can be specified (or DOMID_SELF for none). * Where the FD has some effect, it is described below. * * cmd: MMUEXT_(UN)PIN_*_TABLE * mfn: Machine frame number to be (un)pinned as a p.t. page. * The frame must belong to the FD, if one is specified. * * cmd: MMUEXT_NEW_BASEPTR * mfn: Machine frame number of new page-table base to install in MMU. * * cmd: MMUEXT_NEW_USER_BASEPTR [x86/64 only] * mfn: Machine frame number of new page-table base to install in MMU * when in user space. * * cmd: MMUEXT_TLB_FLUSH_LOCAL * No additional arguments. Flushes local TLB. * * cmd: MMUEXT_INVLPG_LOCAL * linear_addr: Linear address to be flushed from the local TLB. * * cmd: MMUEXT_TLB_FLUSH_MULTI * vcpumask: Pointer to bitmap of VCPUs to be flushed. * * cmd: MMUEXT_INVLPG_MULTI * linear_addr: Linear address to be flushed. * vcpumask: Pointer to bitmap of VCPUs to be flushed. * * cmd: MMUEXT_TLB_FLUSH_ALL * No additional arguments. Flushes all VCPUs' TLBs. * * cmd: MMUEXT_INVLPG_ALL * linear_addr: Linear address to be flushed from all VCPUs' TLBs. * * cmd: MMUEXT_FLUSH_CACHE * No additional arguments. Writes back and flushes cache contents. * * cmd: MMUEXT_SET_LDT * linear_addr: Linear address of LDT base (NB. must be page-aligned). * nr_ents: Number of entries in LDT. */#define MMUEXT_PIN_L1_TABLE 0#define MMUEXT_PIN_L2_TABLE 1#define MMUEXT_PIN_L3_TABLE 2#define MMUEXT_PIN_L4_TABLE 3#define MMUEXT_UNPIN_TABLE 4#define MMUEXT_NEW_BASEPTR 5#define MMUEXT_TLB_FLUSH_LOCAL 6#define MMUEXT_INVLPG_LOCAL 7#define MMUEXT_TLB_FLUSH_MULTI 8#define MMUEXT_INVLPG_MULTI 9#define MMUEXT_TLB_FLUSH_ALL 10#define MMUEXT_INVLPG_ALL 11#define MMUEXT_FLUSH_CACHE 12#define MMUEXT_SET_LDT 13#define MMUEXT_NEW_USER_BASEPTR 15#ifndef __ASSEMBLY__struct mmuext_op { unsigned int cmd; union { /* [UN]PIN_TABLE, NEW_BASEPTR, NEW_USER_BASEPTR */ xen_pfn_t mfn; /* INVLPG_LOCAL, INVLPG_ALL, SET_LDT */ unsigned long linear_addr; } arg1; union { /* SET_LDT */ unsigned int nr_ents; /* TLB_FLUSH_MULTI, INVLPG_MULTI */#if __XEN_INTERFACE_VERSION__ >= 0x00030205 XEN_GUEST_HANDLE(void) vcpumask;#else void *vcpumask;#endif } arg2;};typedef struct mmuext_op mmuext_op_t;DEFINE_XEN_GUEST_HANDLE(mmuext_op_t);#endif/* These are passed as 'flags' to update_va_mapping. They can be ORed. *//* When specifying UVMF_MULTI, also OR in a pointer to a CPU bitmap. *//* UVMF_LOCAL is merely UVMF_MULTI with a NULL bitmap pointer. */#define UVMF_NONE (0UL<<0) /* No flushing at all. */#define UVMF_TLB_FLUSH (1UL<<0) /* Flush entire TLB(s). */#define UVMF_INVLPG (2UL<<0) /* Flush only one entry. */#define UVMF_FLUSHTYPE_MASK (3UL<<0)#define UVMF_MULTI (0UL<<2) /* Flush subset of TLBs. */#define UVMF_LOCAL (0UL<<2) /* Flush local TLB. */#define UVMF_ALL (1UL<<2) /* Flush all TLBs. *//* * Commands to HYPERVISOR_console_io(). */#define CONSOLEIO_write 0#define CONSOLEIO_read 1/* * Commands to HYPERVISOR_vm_assist(). */#define VMASST_CMD_enable 0#define VMASST_CMD_disable 1/* x86/32 guests: simulate full 4GB segment limits. */#define VMASST_TYPE_4gb_segments 0/* x86/32 guests: trap (vector 15) whenever above vmassist is used. */#define VMASST_TYPE_4gb_segments_notify 1/* * x86 guests: support writes to bottom-level PTEs. * NB1. Page-directory entries cannot be written. * NB2. Guest must continue to remove all writable mappings of PTEs. */#define VMASST_TYPE_writable_pagetables 2/* x86/PAE guests: support PDPTs above 4GB. */#define VMASST_TYPE_pae_extended_cr3 3#define MAX_VMASST_TYPE 3#ifndef __ASSEMBLY__typedef uint16_t domid_t;/* Domain ids >= DOMID_FIRST_RESERVED cannot be used for ordinary domains. */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -