2010-07-07 11:12:45 +00:00
|
|
|
Subject: xen3 include-xen-interface
|
2011-04-19 20:09:59 +00:00
|
|
|
From: http://xenbits.xensource.com/linux-2.6.18-xen.hg (tip 1073:8fe973d8fb98)
|
2010-07-07 11:12:45 +00:00
|
|
|
Patch-mainline: n/a
|
|
|
|
Acked-by: jbeulich@novell.com
|
|
|
|
|
|
|
|
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
|
2011-04-19 20:09:59 +00:00
|
|
|
+++ b/include/xen/interface/COPYING 2007-06-12 13:14:19.000000000 +0200
|
2010-07-07 11:12:45 +00:00
|
|
|
@@ -0,0 +1,38 @@
|
|
|
|
+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.
|
|
|
|
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
|
2011-04-19 20:09:59 +00:00
|
|
|
+++ b/include/xen/interface/arch-x86/cpuid.h 2011-03-17 13:50:24.000000000 +0100
|
2010-07-07 11:12:45 +00:00
|
|
|
@@ -0,0 +1,68 @@
|
|
|
|
+/******************************************************************************
|
|
|
|
+ * 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:
|
2011-04-19 20:09:59 +00:00
|
|
|
+ * Keir Fraser <keir@xen.org>
|
2010-07-07 11:12:45 +00:00
|
|
|
+ */
|
|
|
|
+
|
|
|
|
+#ifndef __XEN_PUBLIC_ARCH_X86_CPUID_H__
|
|
|
|
+#define __XEN_PUBLIC_ARCH_X86_CPUID_H__
|
|
|
|
+
|
|
|
|
+/* Xen identification leaves start at 0x40000000. */
|
|
|
|
+#define XEN_CPUID_FIRST_LEAF 0x40000000
|
|
|
|
+#define XEN_CPUID_LEAF(i) (XEN_CPUID_FIRST_LEAF + (i))
|
|
|
|
+
|
|
|
|
+/*
|
|
|
|
+ * Leaf 1 (0x40000000)
|
|
|
|
+ * 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 (0x40000001)
|
|
|
|
+ * EAX[31:16]: Xen major version.
|
|
|
|
+ * EAX[15: 0]: Xen minor version.
|
|
|
|
+ * EBX-EDX: Reserved (currently all zeroes).
|
|
|
|
+ */
|
|
|
|
+
|
|
|
|
+/*
|
|
|
|
+ * Leaf 3 (0x40000002)
|
|
|
|
+ * 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)
|
|
|
|
+
|
|
|
|
+#endif /* __XEN_PUBLIC_ARCH_X86_CPUID_H__ */
|
|
|
|
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
|
2011-04-19 20:09:59 +00:00
|
|
|
+++ b/include/xen/interface/arch-x86/hvm/save.h 2011-03-17 13:50:24.000000000 +0100
|
|
|
|
@@ -0,0 +1,463 @@
|
2010-07-07 11:12:45 +00:00
|
|
|
+/*
|
|
|
|
+ * 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__
|
|
|
|
+
|
|
|
|
+/*
|
|
|
|
+ * 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
|
|
|
|
+ */
|
|
|
|
+
|
|
|
|
+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;
|
|
|
|
+ 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;
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+DECLARE_HVM_SAVE_TYPE(CPU, 2, struct hvm_hw_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
|
|
|
|
+ */
|
|
|
|
+
|
|
|
|
+#ifdef __ia64__
|
|
|
|
+#define VIOAPIC_IS_IOSAPIC 1
|
|
|
|
+#define VIOAPIC_NUM_PINS 24
|
|
|
|
+#else
|
|
|
|
+#define VIOAPIC_NUM_PINS 48 /* 16 ISA IRQs, 32 non-legacy PCI IRQS. */
|
|
|
|
+#endif
|
|
|
|
+
|
|
|
|
+struct hvm_hw_vioapic {
|
|
|
|
+ uint64_t base_address;
|
|
|
|
+ uint32_t ioregsel;
|
|
|
|
+ uint32_t id;
|
|
|
|
+ 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;
|
|
|
|
+#if !VIOAPIC_IS_IOSAPIC
|
|
|
|
+ uint8_t reserved[4];
|
|
|
|
+ uint8_t dest_id;
|
|
|
|
+#else
|
|
|
|
+ uint8_t reserved[3];
|
|
|
|
+ uint16_t dest_id;
|
|
|
|
+#endif
|
|
|
|
+ } fields;
|
|
|
|
+ } redirtbl[VIOAPIC_NUM_PINS];
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+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;
|
2011-04-19 20:09:59 +00:00
|
|
|
+ uint64_t tdt_msr;
|
2010-07-07 11:12:45 +00:00
|
|
|
+};
|
|
|
|
+
|
|
|
|
+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;
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+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);
|
|
|
|
+
|
|
|
|
+/*
|
|
|
|
+ * Viridian hypervisor context.
|
|
|
|
+ */
|
|
|
|
+
|
|
|
|
+struct hvm_viridian_context {
|
|
|
|
+ uint64_t hypercall_gpa;
|
|
|
|
+ uint64_t guest_os_id;
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+DECLARE_HVM_SAVE_TYPE(VIRIDIAN, 15, struct hvm_viridian_context);
|
|
|
|
+
|
2011-04-19 20:09:59 +00:00
|
|
|
+
|
|
|
|
+/*
|
|
|
|
+ * The save area of XSAVE/XRSTOR.
|
|
|
|
+ */
|
|
|
|
+
|
|
|
|
+struct hvm_hw_cpu_xsave {
|
|
|
|
+ uint64_t xfeature_mask;
|
|
|
|
+ uint64_t xcr0; /* Updated by XSETBV */
|
|
|
|
+ uint64_t xcr0_accum; /* Updated by XSETBV */
|
|
|
|
+ struct {
|
|
|
|
+ struct { char x[512]; } fpu_sse;
|
|
|
|
+
|
|
|
|
+ struct {
|
|
|
|
+ uint64_t xstate_bv; /* Updated by XRSTOR */
|
|
|
|
+ uint64_t reserved[7];
|
|
|
|
+ } xsave_hdr; /* The 64-byte header */
|
|
|
|
+
|
|
|
|
+ struct { char x[0]; } ymm; /* YMM */
|
|
|
|
+ } save_area;
|
|
|
|
+} __attribute__((packed));
|
|
|
|
+
|
|
|
|
+#define CPU_XSAVE_CODE 16
|
|
|
|
+
|
2010-07-07 11:12:45 +00:00
|
|
|
+/*
|
|
|
|
+ * Largest type-code in use
|
|
|
|
+ */
|
2011-04-19 20:09:59 +00:00
|
|
|
+#define HVM_SAVE_CODE_MAX 16
|
2010-07-07 11:12:45 +00:00
|
|
|
+
|
|
|
|
+#endif /* __XEN_PUBLIC_HVM_SAVE_X86_H__ */
|
|
|
|
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
|
2011-04-19 20:09:59 +00:00
|
|
|
+++ b/include/xen/interface/arch-x86/xen-mca.h 2010-08-31 09:24:21.000000000 +0200
|
|
|
|
@@ -0,0 +1,440 @@
|
2010-07-07 11:12:45 +00:00
|
|
|
+/******************************************************************************
|
|
|
|
+ * 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. */
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+#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 16/32 to leave room.
|
|
|
|
+ */
|
|
|
|
+ struct mcinfo_msr mc_msr[sizeof(void *) * 4];
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+/* 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
|
|
|
|
+#define __MC_NMSRS 1
|
|
|
|
+#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 */
|
|
|
|
+ uint32_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 XEN_MC_mceinject 5
|
|
|
|
+struct xen_mc_mceinject {
|
|
|
|
+ unsigned int mceinj_cpunr; /* target processor id */
|
|
|
|
+};
|
|
|
|
+
|
2011-04-19 20:09:59 +00:00
|
|
|
+#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_CPU_BROADCAST 0x8
|
|
|
|
+
|
|
|
|
+struct xen_mc_inject_v2 {
|
|
|
|
+ uint32_t flags;
|
|
|
|
+ struct xenctl_cpumap cpumap;
|
|
|
|
+};
|
|
|
|
+#endif
|
|
|
|
+
|
2010-07-07 11:12:45 +00:00
|
|
|
+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;
|
2011-04-19 20:09:59 +00:00
|
|
|
+#if defined(__XEN__) || defined(__XEN_TOOLS__)
|
|
|
|
+ struct xen_mc_inject_v2 mc_inject_v2;
|
|
|
|
+#endif
|
2010-07-07 11:12:45 +00:00
|
|
|
+ } u;
|
|
|
|
+};
|
|
|
|
+typedef struct xen_mc xen_mc_t;
|
|
|
|
+DEFINE_XEN_GUEST_HANDLE(xen_mc_t);
|
|
|
|
+
|
|
|
|
+#endif /* __ASSEMBLY__ */
|
|
|
|
+
|
|
|
|
+#endif /* __XEN_PUBLIC_ARCH_X86_MCA_H__ */
|
|
|
|
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
|
2011-04-19 20:09:59 +00:00
|
|
|
+++ b/include/xen/interface/arch-x86/xen-x86_32.h 2011-03-17 13:50:24.000000000 +0100
|
2010-07-07 11:12:45 +00:00
|
|
|
@@ -0,0 +1,180 @@
|
|
|
|
+/******************************************************************************
|
|
|
|
+ * 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 (arguments 1-5)
|
|
|
|
+ * 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)
|
|
|
|
+ */
|
|
|
|
+
|
|
|
|
+#if __XEN_INTERFACE_VERSION__ < 0x00030203
|
|
|
|
+/*
|
|
|
|
+ * Legacy hypercall interface:
|
|
|
|
+ * As above, except the entry sequence to the hypervisor is:
|
|
|
|
+ * mov $hypercall-number*32,%eax ; int $0x82
|
|
|
|
+ */
|
|
|
|
+#define TRAP_INSTR "int $0x82"
|
|
|
|
+#endif
|
|
|
|
+
|
|
|
|
+/*
|
|
|
|
+ * 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 \
|
|
|
|
+ mk_unsigned_long(__HYPERVISOR_VIRT_START_PAE)
|
|
|
|
+#define MACH2PHYS_VIRT_START_PAE \
|
|
|
|
+ mk_unsigned_long(__MACH2PHYS_VIRT_START_PAE)
|
|
|
|
+#define MACH2PHYS_VIRT_END_PAE \
|
|
|
|
+ mk_unsigned_long(__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 \
|
|
|
|
+ mk_unsigned_long(__HYPERVISOR_VIRT_START_NONPAE)
|
|
|
|
+#define MACH2PHYS_VIRT_START_NONPAE \
|
|
|
|
+ mk_unsigned_long(__MACH2PHYS_VIRT_START_NONPAE)
|
|
|
|
+#define MACH2PHYS_VIRT_END_NONPAE \
|
|
|
|
+ mk_unsigned_long(__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 mk_unsigned_long(__HYPERVISOR_VIRT_START)
|
|
|
|
+#endif
|
|
|
|
+
|
|
|
|
+#define MACH2PHYS_VIRT_START mk_unsigned_long(__MACH2PHYS_VIRT_START)
|
|
|
|
+#define MACH2PHYS_VIRT_END mk_unsigned_long(__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
|
2011-04-19 20:09:59 +00:00
|
|
|
+#undef set_xen_guest_handle_raw
|
|
|
|
+#define set_xen_guest_handle_raw(hnd, val) \
|
2010-07-07 11:12:45 +00:00
|
|
|
+ do { if ( sizeof(hnd) == 8 ) *(uint64_t *)&(hnd) = 0; \
|
|
|
|
+ (hnd).p = val; \
|
|
|
|
+ } while ( 0 )
|
|
|
|
+#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__
|
|
|
|
+
|
|
|
|
+struct cpu_user_regs {
|
|
|
|
+ uint32_t ebx;
|
|
|
|
+ uint32_t ecx;
|
|
|
|
+ uint32_t edx;
|
|
|
|
+ uint32_t esi;
|
|
|
|
+ uint32_t edi;
|
|
|
|
+ uint32_t ebp;
|
|
|
|
+ uint32_t eax;
|
|
|
|
+ uint16_t error_code; /* private */
|
|
|
|
+ uint16_t entry_vector; /* private */
|
|
|
|
+ uint32_t eip;
|
|
|
|
+ uint16_t cs;
|
|
|
|
+ uint8_t saved_upcall_mask;
|
|
|
|
+ uint8_t _pad0;
|
|
|
|
+ uint32_t eflags; /* eflags.IF == !saved_upcall_mask */
|
|
|
|
+ uint32_t esp;
|
|
|
|
+ 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);
|
|
|
|
+
|
|
|
|
+/*
|
|
|
|
+ * 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-set-style: "BSD"
|
|
|
|
+ * c-basic-offset: 4
|
|
|
|
+ * tab-width: 4
|
|
|
|
+ * indent-tabs-mode: nil
|
|
|
|
+ * End:
|
|
|
|
+ */
|
|
|
|
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
|
2011-04-19 20:09:59 +00:00
|
|
|
+++ b/include/xen/interface/arch-x86/xen-x86_64.h 2008-04-02 12:34:02.000000000 +0200
|
2010-07-07 11:12:45 +00:00
|
|
|
@@ -0,0 +1,212 @@
|
|
|
|
+/******************************************************************************
|
|
|
|
+ * 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 (arguments 1-5)
|
|
|
|
+ * 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)
|
|
|
|
+ */
|
|
|
|
+
|
|
|
|
+#if __XEN_INTERFACE_VERSION__ < 0x00030203
|
|
|
|
+/*
|
|
|
|
+ * Legacy hypercall interface:
|
|
|
|
+ * As above, except the entry sequence to the hypervisor is:
|
|
|
|
+ * mov $hypercall-number*32,%eax ; syscall
|
|
|
|
+ * Clobbered: %rcx, %r11, argument registers (as above)
|
|
|
|
+ */
|
|
|
|
+#define TRAP_INSTR "syscall"
|
|
|
|
+#endif
|
|
|
|
+
|
|
|
|
+/*
|
|
|
|
+ * 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 261 */
|
|
|
|
+#define FLAT_RING3_DS32 0xe02b /* GDT index 262 */
|
|
|
|
+#define FLAT_RING3_DS64 0x0000 /* NULL selector */
|
|
|
|
+#define FLAT_RING3_SS32 0xe02b /* GDT index 262 */
|
|
|
|
+#define FLAT_RING3_SS64 0xe02b /* GDT index 262 */
|
|
|
|
+
|
|
|
|
+#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 mk_unsigned_long(__HYPERVISOR_VIRT_START)
|
|
|
|
+#define HYPERVISOR_VIRT_END mk_unsigned_long(__HYPERVISOR_VIRT_END)
|
|
|
|
+#endif
|
|
|
|
+
|
|
|
|
+#define MACH2PHYS_VIRT_START mk_unsigned_long(__MACH2PHYS_VIRT_START)
|
|
|
|
+#define MACH2PHYS_VIRT_END mk_unsigned_long(__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(__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
|
|
|
|
+
|
|
|
|
+struct cpu_user_regs {
|
|
|
|
+ uint64_t r15;
|
|
|
|
+ uint64_t r14;
|
|
|
|
+ uint64_t r13;
|
|
|
|
+ uint64_t r12;
|
|
|
|
+ __DECL_REG(bp);
|
|
|
|
+ __DECL_REG(bx);
|
|
|
|
+ uint64_t r11;
|
|
|
|
+ uint64_t r10;
|
|
|
|
+ uint64_t r9;
|
|
|
|
+ uint64_t r8;
|
|
|
|
+ __DECL_REG(ax);
|
|
|
|
+ __DECL_REG(cx);
|
|
|
|
+ __DECL_REG(dx);
|
|
|
|
+ __DECL_REG(si);
|
|
|
|
+ __DECL_REG(di);
|
|
|
|
+ uint32_t error_code; /* private */
|
|
|
|
+ uint32_t entry_vector; /* private */
|
|
|
|
+ __DECL_REG(ip);
|
|
|
|
+ uint16_t cs, _pad0[1];
|
|
|
|
+ uint8_t saved_upcall_mask;
|
|
|
|
+ uint8_t _pad1[3];
|
|
|
|
+ __DECL_REG(flags); /* rflags.IF == !saved_upcall_mask */
|
|
|
|
+ __DECL_REG(sp);
|
|
|
|
+ uint16_t ss, _pad2[3];
|
|
|
|
+ uint16_t es, _pad3[3];
|
|
|
|
+ uint16_t ds, _pad4[3];
|
|
|
|
+ uint16_t fs, _pad5[3]; /* Non-zero => takes precedence over fs_base. */
|
|
|
|
+ uint16_t gs, _pad6[3]; /* Non-zero => takes precedence over gs_base_usr. */
|
|
|
|
+};
|
|
|
|
+typedef struct cpu_user_regs cpu_user_regs_t;
|
|
|
|
+DEFINE_XEN_GUEST_HANDLE(cpu_user_regs_t);
|
|
|
|
+
|
|
|
|
+#undef __DECL_REG
|
|
|
|
+
|
|
|
|
+#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-set-style: "BSD"
|
|
|
|
+ * c-basic-offset: 4
|
|
|
|
+ * tab-width: 4
|
|
|
|
+ * indent-tabs-mode: nil
|
|
|
|
+ * End:
|
|
|
|
+ */
|
|
|
|
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
|
2011-04-19 20:09:59 +00:00
|
|
|
+++ b/include/xen/interface/arch-x86/xen.h 2011-03-17 13:50:24.000000000 +0100
|
|
|
|
@@ -0,0 +1,201 @@
|
2010-07-07 11:12:45 +00:00
|
|
|
+/******************************************************************************
|
|
|
|
+ * 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
|
|
|
|
+
|
|
|
|
+#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)
|
2011-04-19 20:09:59 +00:00
|
|
|
+#define set_xen_guest_handle_raw(hnd, val) do { (hnd).p = val; } while (0)
|
2010-07-07 11:12:45 +00:00
|
|
|
+#ifdef __XEN_TOOLS__
|
|
|
|
+#define get_xen_guest_handle(val, hnd) do { val = (hnd).p; } while (0)
|
|
|
|
+#endif
|
2011-04-19 20:09:59 +00:00
|
|
|
+#define set_xen_guest_handle(hnd, val) set_xen_guest_handle_raw(hnd, val)
|
2010-07-07 11:12:45 +00:00
|
|
|
+
|
|
|
|
+#if defined(__i386__)
|
|
|
|
+#include "xen-x86_32.h"
|
|
|
|
+#elif defined(__x86_64__)
|
|
|
|
+#include "xen-x86_64.h"
|
|
|
|
+#endif
|
|
|
|
+
|
|
|
|
+#ifndef __ASSEMBLY__
|
|
|
|
+typedef unsigned long xen_pfn_t;
|
|
|
|
+#define PRI_xen_pfn "lx"
|
|
|
|
+#endif
|
|
|
|
+
|
|
|
|
+/*
|
|
|
|
+ * SEGMENT DESCRIPTOR TABLES
|
|
|
|
+ */
|
|
|
|
+/*
|
|
|
|
+ * 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.
|
|
|
|
+ */
|
|
|
|
+#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)
|
|
|
|
+
|
|
|
|
+/* Maximum number of virtual CPUs in legacy multi-processor guests. */
|
|
|
|
+#define XEN_LEGACY_MAX_VCPUS 32
|
|
|
|
+
|
|
|
|
+#ifndef __ASSEMBLY__
|
|
|
|
+
|
|
|
|
+typedef unsigned long xen_ulong_t;
|
|
|
|
+
|
|
|
|
+/*
|
|
|
|
+ * Send an array of these to HYPERVISOR_set_trap_table().
|
|
|
|
+ * 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.
|
|
|
|
+ */
|
|
|
|
+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 {
|
|
|
|
+ unsigned long max_pfn; /* max pfn that appears in table */
|
|
|
|
+ /* Frame containing list of mfns containing list of mfns containing p2m. */
|
|
|
|
+ xen_pfn_t pfn_to_mfn_frame_list_list;
|
|
|
|
+ unsigned long nmi_reason;
|
|
|
|
+ uint64_t pad[32];
|
|
|
|
+};
|
|
|
|
+typedef struct arch_shared_info arch_shared_info_t;
|
|
|
|
+
|
|
|
|
+#endif /* !__ASSEMBLY__ */
|
|
|
|
+
|
|
|
|
+/*
|
|
|
|
+ * 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
|
|
|
|
+
|
|
|
|
+#endif /* __XEN_PUBLIC_ARCH_X86_XEN_H__ */
|
|
|
|
+
|
|
|
|
+/*
|
|
|
|
+ * Local variables:
|
|
|
|
+ * mode: C
|
|
|
|
+ * c-set-style: "BSD"
|
|
|
|
+ * c-basic-offset: 4
|
|
|
|
+ * tab-width: 4
|
|
|
|
+ * indent-tabs-mode: nil
|
|
|
|
+ * End:
|
|
|
|
+ */
|
|
|
|
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
|
2011-04-19 20:09:59 +00:00
|
|
|
+++ b/include/xen/interface/arch-x86_32.h 2007-06-12 13:14:19.000000000 +0200
|
2010-07-07 11:12:45 +00:00
|
|
|
@@ -0,0 +1,27 @@
|
|
|
|
+/******************************************************************************
|
|
|
|
+ * 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"
|
|
|
|
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
|
2011-04-19 20:09:59 +00:00
|
|
|
+++ b/include/xen/interface/arch-x86_64.h 2007-06-12 13:14:19.000000000 +0200
|
2010-07-07 11:12:45 +00:00
|
|
|
@@ -0,0 +1,27 @@
|
|
|
|
+/******************************************************************************
|
|
|
|
+ * 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"
|
|
|
|
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
|
2011-04-19 20:09:59 +00:00
|
|
|
+++ b/include/xen/interface/dom0_ops.h 2007-06-12 13:14:19.000000000 +0200
|
2010-07-07 11:12:45 +00:00
|
|
|
@@ -0,0 +1,120 @@
|
|
|
|
+/******************************************************************************
|
|
|
|
+ * 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-set-style: "BSD"
|
|
|
|
+ * c-basic-offset: 4
|
|
|
|
+ * tab-width: 4
|
|
|
|
+ * indent-tabs-mode: nil
|
|
|
|
+ * End:
|
|
|
|
+ */
|
|
|
|
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
|
2011-04-19 20:09:59 +00:00
|
|
|
+++ b/include/xen/interface/domctl.h 2011-03-17 13:50:24.000000000 +0100
|
|
|
|
@@ -0,0 +1,968 @@
|
2010-07-07 11:12:45 +00:00
|
|
|
+/******************************************************************************
|
|
|
|
+ * domctl.h
|
|
|
|
+ *
|
|
|
|
+ * Domain management operations. For use by node control stack.
|
|
|
|
+ *
|
|
|
|
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
|
|
+ * of this software and associated documentation files (the "Software"), to
|
|
|
|
+ * deal in the Software without restriction, including without limitation the
|
|
|
|
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
|
|
|
+ * sell copies of the Software, and to permit persons to whom the Software is
|
|
|
|
+ * furnished to do so, subject to the following conditions:
|
|
|
|
+ *
|
|
|
|
+ * The above copyright notice and this permission notice shall be included in
|
|
|
|
+ * all copies or substantial portions of the Software.
|
|
|
|
+ *
|
|
|
|
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
|
|
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
|
|
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
|
|
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
|
|
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
|
|
|
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
|
|
|
+ * DEALINGS IN THE SOFTWARE.
|
|
|
|
+ *
|
|
|
|
+ * Copyright (c) 2002-2003, B Dragovic
|
|
|
|
+ * Copyright (c) 2002-2006, K Fraser
|
|
|
|
+ */
|
|
|
|
+
|
|
|
|
+#ifndef __XEN_PUBLIC_DOMCTL_H__
|
|
|
|
+#define __XEN_PUBLIC_DOMCTL_H__
|
|
|
|
+
|
|
|
|
+#if !defined(__XEN__) && !defined(__XEN_TOOLS__)
|
|
|
|
+#error "domctl operations are intended for use by node control tools only"
|
|
|
|
+#endif
|
|
|
|
+
|
|
|
|
+#include "xen.h"
|
|
|
|
+#include "grant_table.h"
|
|
|
|
+
|
|
|
|
+#define XEN_DOMCTL_INTERFACE_VERSION 0x00000007
|
|
|
|
+
|
|
|
|
+/*
|
|
|
|
+ * NB. xen_domctl.domain is an IN/OUT parameter for this operation.
|
|
|
|
+ * If it is specified as zero, an id is auto-allocated and returned.
|
|
|
|
+ */
|
|
|
|
+/* XEN_DOMCTL_createdomain */
|
|
|
|
+struct xen_domctl_createdomain {
|
|
|
|
+ /* IN parameters */
|
|
|
|
+ uint32_t ssidref;
|
|
|
|
+ xen_domain_handle_t handle;
|
|
|
|
+ /* Is this an HVM guest (as opposed to a PV guest)? */
|
|
|
|
+#define _XEN_DOMCTL_CDF_hvm_guest 0
|
|
|
|
+#define XEN_DOMCTL_CDF_hvm_guest (1U<<_XEN_DOMCTL_CDF_hvm_guest)
|
|
|
|
+ /* Use hardware-assisted paging if available? */
|
|
|
|
+#define _XEN_DOMCTL_CDF_hap 1
|
|
|
|
+#define XEN_DOMCTL_CDF_hap (1U<<_XEN_DOMCTL_CDF_hap)
|
|
|
|
+ /* Should domain memory integrity be verifed by tboot during Sx? */
|
|
|
|
+#define _XEN_DOMCTL_CDF_s3_integrity 2
|
|
|
|
+#define XEN_DOMCTL_CDF_s3_integrity (1U<<_XEN_DOMCTL_CDF_s3_integrity)
|
|
|
|
+ /* Disable out-of-sync shadow page tables? */
|
|
|
|
+#define _XEN_DOMCTL_CDF_oos_off 3
|
|
|
|
+#define XEN_DOMCTL_CDF_oos_off (1U<<_XEN_DOMCTL_CDF_oos_off)
|
|
|
|
+ uint32_t flags;
|
|
|
|
+};
|
|
|
|
+typedef struct xen_domctl_createdomain xen_domctl_createdomain_t;
|
|
|
|
+DEFINE_XEN_GUEST_HANDLE(xen_domctl_createdomain_t);
|
|
|
|
+
|
|
|
|
+/* XEN_DOMCTL_getdomaininfo */
|
|
|
|
+struct xen_domctl_getdomaininfo {
|
|
|
|
+ /* OUT variables. */
|
|
|
|
+ domid_t domain; /* Also echoed in domctl.domain */
|
|
|
|
+ /* Domain is scheduled to die. */
|
|
|
|
+#define _XEN_DOMINF_dying 0
|
|
|
|
+#define XEN_DOMINF_dying (1U<<_XEN_DOMINF_dying)
|
|
|
|
+ /* Domain is an HVM guest (as opposed to a PV guest). */
|
|
|
|
+#define _XEN_DOMINF_hvm_guest 1
|
|
|
|
+#define XEN_DOMINF_hvm_guest (1U<<_XEN_DOMINF_hvm_guest)
|
|
|
|
+ /* The guest OS has shut down. */
|
|
|
|
+#define _XEN_DOMINF_shutdown 2
|
|
|
|
+#define XEN_DOMINF_shutdown (1U<<_XEN_DOMINF_shutdown)
|
|
|
|
+ /* Currently paused by control software. */
|
|
|
|
+#define _XEN_DOMINF_paused 3
|
|
|
|
+#define XEN_DOMINF_paused (1U<<_XEN_DOMINF_paused)
|
|
|
|
+ /* Currently blocked pending an event. */
|
|
|
|
+#define _XEN_DOMINF_blocked 4
|
|
|
|
+#define XEN_DOMINF_blocked (1U<<_XEN_DOMINF_blocked)
|
|
|
|
+ /* Domain is currently running. */
|
|
|
|
+#define _XEN_DOMINF_running 5
|
|
|
|
+#define XEN_DOMINF_running (1U<<_XEN_DOMINF_running)
|
|
|
|
+ /* Being debugged. */
|
|
|
|
+#define _XEN_DOMINF_debugged 6
|
|
|
|
+#define XEN_DOMINF_debugged (1U<<_XEN_DOMINF_debugged)
|
|
|
|
+ /* XEN_DOMINF_shutdown guest-supplied code. */
|
|
|
|
+#define XEN_DOMINF_shutdownmask 255
|
|
|
|
+#define XEN_DOMINF_shutdownshift 16
|
|
|
|
+ uint32_t flags; /* XEN_DOMINF_* */
|
|
|
|
+ uint64_aligned_t tot_pages;
|
|
|
|
+ uint64_aligned_t max_pages;
|
|
|
|
+ uint64_aligned_t shr_pages;
|
|
|
|
+ uint64_aligned_t shared_info_frame; /* GMFN of shared_info struct */
|
|
|
|
+ uint64_aligned_t cpu_time;
|
|
|
|
+ uint32_t nr_online_vcpus; /* Number of VCPUs currently online. */
|
|
|
|
+ uint32_t max_vcpu_id; /* Maximum VCPUID in use by this domain. */
|
|
|
|
+ uint32_t ssidref;
|
|
|
|
+ xen_domain_handle_t handle;
|
|
|
|
+ uint32_t cpupool;
|
|
|
|
+};
|
|
|
|
+typedef struct xen_domctl_getdomaininfo xen_domctl_getdomaininfo_t;
|
|
|
|
+DEFINE_XEN_GUEST_HANDLE(xen_domctl_getdomaininfo_t);
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+/* XEN_DOMCTL_getmemlist */
|
|
|
|
+struct xen_domctl_getmemlist {
|
|
|
|
+ /* IN variables. */
|
|
|
|
+ /* Max entries to write to output buffer. */
|
|
|
|
+ uint64_aligned_t max_pfns;
|
|
|
|
+ /* Start index in guest's page list. */
|
|
|
|
+ uint64_aligned_t start_pfn;
|
|
|
|
+ XEN_GUEST_HANDLE_64(uint64) buffer;
|
|
|
|
+ /* OUT variables. */
|
|
|
|
+ uint64_aligned_t num_pfns;
|
|
|
|
+};
|
|
|
|
+typedef struct xen_domctl_getmemlist xen_domctl_getmemlist_t;
|
|
|
|
+DEFINE_XEN_GUEST_HANDLE(xen_domctl_getmemlist_t);
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+/* XEN_DOMCTL_getpageframeinfo */
|
|
|
|
+
|
|
|
|
+#define XEN_DOMCTL_PFINFO_LTAB_SHIFT 28
|
|
|
|
+#define XEN_DOMCTL_PFINFO_NOTAB (0x0U<<28)
|
|
|
|
+#define XEN_DOMCTL_PFINFO_L1TAB (0x1U<<28)
|
|
|
|
+#define XEN_DOMCTL_PFINFO_L2TAB (0x2U<<28)
|
|
|
|
+#define XEN_DOMCTL_PFINFO_L3TAB (0x3U<<28)
|
|
|
|
+#define XEN_DOMCTL_PFINFO_L4TAB (0x4U<<28)
|
|
|
|
+#define XEN_DOMCTL_PFINFO_LTABTYPE_MASK (0x7U<<28)
|
|
|
|
+#define XEN_DOMCTL_PFINFO_LPINTAB (0x1U<<31)
|
|
|
|
+#define XEN_DOMCTL_PFINFO_XTAB (0xfU<<28) /* invalid page */
|
|
|
|
+#define XEN_DOMCTL_PFINFO_PAGEDTAB (0x8U<<28)
|
|
|
|
+#define XEN_DOMCTL_PFINFO_LTAB_MASK (0xfU<<28)
|
|
|
|
+
|
|
|
|
+struct xen_domctl_getpageframeinfo {
|
|
|
|
+ /* IN variables. */
|
|
|
|
+ uint64_aligned_t gmfn; /* GMFN to query */
|
|
|
|
+ /* OUT variables. */
|
|
|
|
+ /* Is the page PINNED to a type? */
|
|
|
|
+ uint32_t type; /* see above type defs */
|
|
|
|
+};
|
|
|
|
+typedef struct xen_domctl_getpageframeinfo xen_domctl_getpageframeinfo_t;
|
|
|
|
+DEFINE_XEN_GUEST_HANDLE(xen_domctl_getpageframeinfo_t);
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+/* XEN_DOMCTL_getpageframeinfo2 */
|
|
|
|
+struct xen_domctl_getpageframeinfo2 {
|
|
|
|
+ /* IN variables. */
|
|
|
|
+ uint64_aligned_t num;
|
|
|
|
+ /* IN/OUT variables. */
|
|
|
|
+ XEN_GUEST_HANDLE_64(uint32) array;
|
|
|
|
+};
|
|
|
|
+typedef struct xen_domctl_getpageframeinfo2 xen_domctl_getpageframeinfo2_t;
|
|
|
|
+DEFINE_XEN_GUEST_HANDLE(xen_domctl_getpageframeinfo2_t);
|
|
|
|
+
|
|
|
|
+/* XEN_DOMCTL_getpageframeinfo3 */
|
|
|
|
+struct xen_domctl_getpageframeinfo3 {
|
|
|
|
+ /* IN variables. */
|
|
|
|
+ uint64_aligned_t num;
|
|
|
|
+ /* IN/OUT variables. */
|
|
|
|
+ XEN_GUEST_HANDLE_64(xen_pfn_t) array;
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+/*
|
|
|
|
+ * Control shadow pagetables operation
|
|
|
|
+ */
|
|
|
|
+/* XEN_DOMCTL_shadow_op */
|
|
|
|
+
|
|
|
|
+/* Disable shadow mode. */
|
|
|
|
+#define XEN_DOMCTL_SHADOW_OP_OFF 0
|
|
|
|
+
|
|
|
|
+/* Enable shadow mode (mode contains ORed XEN_DOMCTL_SHADOW_ENABLE_* flags). */
|
|
|
|
+#define XEN_DOMCTL_SHADOW_OP_ENABLE 32
|
|
|
|
+
|
|
|
|
+/* Log-dirty bitmap operations. */
|
|
|
|
+ /* Return the bitmap and clean internal copy for next round. */
|
|
|
|
+#define XEN_DOMCTL_SHADOW_OP_CLEAN 11
|
|
|
|
+ /* Return the bitmap but do not modify internal copy. */
|
|
|
|
+#define XEN_DOMCTL_SHADOW_OP_PEEK 12
|
|
|
|
+
|
|
|
|
+/* Memory allocation accessors. */
|
|
|
|
+#define XEN_DOMCTL_SHADOW_OP_GET_ALLOCATION 30
|
|
|
|
+#define XEN_DOMCTL_SHADOW_OP_SET_ALLOCATION 31
|
|
|
|
+
|
|
|
|
+/* Legacy enable operations. */
|
|
|
|
+ /* Equiv. to ENABLE with no mode flags. */
|
|
|
|
+#define XEN_DOMCTL_SHADOW_OP_ENABLE_TEST 1
|
|
|
|
+ /* Equiv. to ENABLE with mode flag ENABLE_LOG_DIRTY. */
|
|
|
|
+#define XEN_DOMCTL_SHADOW_OP_ENABLE_LOGDIRTY 2
|
|
|
|
+ /* Equiv. to ENABLE with mode flags ENABLE_REFCOUNT and ENABLE_TRANSLATE. */
|
|
|
|
+#define XEN_DOMCTL_SHADOW_OP_ENABLE_TRANSLATE 3
|
|
|
|
+
|
|
|
|
+/* Mode flags for XEN_DOMCTL_SHADOW_OP_ENABLE. */
|
|
|
|
+ /*
|
|
|
|
+ * Shadow pagetables are refcounted: guest does not use explicit mmu
|
|
|
|
+ * operations nor write-protect its pagetables.
|
|
|
|
+ */
|
|
|
|
+#define XEN_DOMCTL_SHADOW_ENABLE_REFCOUNT (1 << 1)
|
|
|
|
+ /*
|
|
|
|
+ * Log pages in a bitmap as they are dirtied.
|
|
|
|
+ * Used for live relocation to determine which pages must be re-sent.
|
|
|
|
+ */
|
|
|
|
+#define XEN_DOMCTL_SHADOW_ENABLE_LOG_DIRTY (1 << 2)
|
|
|
|
+ /*
|
|
|
|
+ * Automatically translate GPFNs into MFNs.
|
|
|
|
+ */
|
|
|
|
+#define XEN_DOMCTL_SHADOW_ENABLE_TRANSLATE (1 << 3)
|
|
|
|
+ /*
|
|
|
|
+ * Xen does not steal virtual address space from the guest.
|
|
|
|
+ * Requires HVM support.
|
|
|
|
+ */
|
|
|
|
+#define XEN_DOMCTL_SHADOW_ENABLE_EXTERNAL (1 << 4)
|
|
|
|
+
|
|
|
|
+struct xen_domctl_shadow_op_stats {
|
|
|
|
+ uint32_t fault_count;
|
|
|
|
+ uint32_t dirty_count;
|
|
|
|
+};
|
|
|
|
+typedef struct xen_domctl_shadow_op_stats xen_domctl_shadow_op_stats_t;
|
|
|
|
+DEFINE_XEN_GUEST_HANDLE(xen_domctl_shadow_op_stats_t);
|
|
|
|
+
|
|
|
|
+struct xen_domctl_shadow_op {
|
|
|
|
+ /* IN variables. */
|
|
|
|
+ uint32_t op; /* XEN_DOMCTL_SHADOW_OP_* */
|
|
|
|
+
|
|
|
|
+ /* OP_ENABLE */
|
|
|
|
+ uint32_t mode; /* XEN_DOMCTL_SHADOW_ENABLE_* */
|
|
|
|
+
|
|
|
|
+ /* OP_GET_ALLOCATION / OP_SET_ALLOCATION */
|
|
|
|
+ uint32_t mb; /* Shadow memory allocation in MB */
|
|
|
|
+
|
|
|
|
+ /* OP_PEEK / OP_CLEAN */
|
|
|
|
+ XEN_GUEST_HANDLE_64(uint8) dirty_bitmap;
|
|
|
|
+ uint64_aligned_t pages; /* Size of buffer. Updated with actual size. */
|
|
|
|
+ struct xen_domctl_shadow_op_stats stats;
|
|
|
|
+};
|
|
|
|
+typedef struct xen_domctl_shadow_op xen_domctl_shadow_op_t;
|
|
|
|
+DEFINE_XEN_GUEST_HANDLE(xen_domctl_shadow_op_t);
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+/* XEN_DOMCTL_max_mem */
|
|
|
|
+struct xen_domctl_max_mem {
|
|
|
|
+ /* IN variables. */
|
|
|
|
+ uint64_aligned_t max_memkb;
|
|
|
|
+};
|
|
|
|
+typedef struct xen_domctl_max_mem xen_domctl_max_mem_t;
|
|
|
|
+DEFINE_XEN_GUEST_HANDLE(xen_domctl_max_mem_t);
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+/* XEN_DOMCTL_setvcpucontext */
|
|
|
|
+/* XEN_DOMCTL_getvcpucontext */
|
|
|
|
+struct xen_domctl_vcpucontext {
|
|
|
|
+ uint32_t vcpu; /* IN */
|
|
|
|
+ XEN_GUEST_HANDLE_64(vcpu_guest_context_t) ctxt; /* IN/OUT */
|
|
|
|
+};
|
|
|
|
+typedef struct xen_domctl_vcpucontext xen_domctl_vcpucontext_t;
|
|
|
|
+DEFINE_XEN_GUEST_HANDLE(xen_domctl_vcpucontext_t);
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+/* XEN_DOMCTL_getvcpuinfo */
|
|
|
|
+struct xen_domctl_getvcpuinfo {
|
|
|
|
+ /* IN variables. */
|
|
|
|
+ uint32_t vcpu;
|
|
|
|
+ /* OUT variables. */
|
|
|
|
+ uint8_t online; /* currently online (not hotplugged)? */
|
|
|
|
+ uint8_t blocked; /* blocked waiting for an event? */
|
|
|
|
+ uint8_t running; /* currently scheduled on its CPU? */
|
|
|
|
+ uint64_aligned_t cpu_time; /* total cpu time consumed (ns) */
|
|
|
|
+ uint32_t cpu; /* current mapping */
|
|
|
|
+};
|
|
|
|
+typedef struct xen_domctl_getvcpuinfo xen_domctl_getvcpuinfo_t;
|
|
|
|
+DEFINE_XEN_GUEST_HANDLE(xen_domctl_getvcpuinfo_t);
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+/* Get/set which physical cpus a vcpu can execute on. */
|
|
|
|
+/* XEN_DOMCTL_setvcpuaffinity */
|
|
|
|
+/* XEN_DOMCTL_getvcpuaffinity */
|
|
|
|
+struct xen_domctl_vcpuaffinity {
|
|
|
|
+ uint32_t vcpu; /* IN */
|
|
|
|
+ struct xenctl_cpumap cpumap; /* IN/OUT */
|
|
|
|
+};
|
|
|
|
+typedef struct xen_domctl_vcpuaffinity xen_domctl_vcpuaffinity_t;
|
|
|
|
+DEFINE_XEN_GUEST_HANDLE(xen_domctl_vcpuaffinity_t);
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+/* XEN_DOMCTL_max_vcpus */
|
|
|
|
+struct xen_domctl_max_vcpus {
|
|
|
|
+ uint32_t max; /* maximum number of vcpus */
|
|
|
|
+};
|
|
|
|
+typedef struct xen_domctl_max_vcpus xen_domctl_max_vcpus_t;
|
|
|
|
+DEFINE_XEN_GUEST_HANDLE(xen_domctl_max_vcpus_t);
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+/* XEN_DOMCTL_scheduler_op */
|
|
|
|
+/* Scheduler types. */
|
|
|
|
+#define XEN_SCHEDULER_SEDF 4
|
|
|
|
+#define XEN_SCHEDULER_CREDIT 5
|
|
|
|
+#define XEN_SCHEDULER_CREDIT2 6
|
2011-04-19 20:09:59 +00:00
|
|
|
+#define XEN_SCHEDULER_ARINC653 7
|
2010-07-07 11:12:45 +00:00
|
|
|
+/* Set or get info? */
|
|
|
|
+#define XEN_DOMCTL_SCHEDOP_putinfo 0
|
|
|
|
+#define XEN_DOMCTL_SCHEDOP_getinfo 1
|
|
|
|
+struct xen_domctl_scheduler_op {
|
|
|
|
+ uint32_t sched_id; /* XEN_SCHEDULER_* */
|
|
|
|
+ uint32_t cmd; /* XEN_DOMCTL_SCHEDOP_* */
|
|
|
|
+ union {
|
|
|
|
+ struct xen_domctl_sched_sedf {
|
|
|
|
+ uint64_aligned_t period;
|
|
|
|
+ uint64_aligned_t slice;
|
|
|
|
+ uint64_aligned_t latency;
|
|
|
|
+ uint32_t extratime;
|
|
|
|
+ uint32_t weight;
|
|
|
|
+ } sedf;
|
|
|
|
+ struct xen_domctl_sched_credit {
|
|
|
|
+ uint16_t weight;
|
|
|
|
+ uint16_t cap;
|
|
|
|
+ } credit;
|
|
|
|
+ struct xen_domctl_sched_credit2 {
|
|
|
|
+ uint16_t weight;
|
|
|
|
+ } credit2;
|
|
|
|
+ } u;
|
|
|
|
+};
|
|
|
|
+typedef struct xen_domctl_scheduler_op xen_domctl_scheduler_op_t;
|
|
|
|
+DEFINE_XEN_GUEST_HANDLE(xen_domctl_scheduler_op_t);
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+/* XEN_DOMCTL_setdomainhandle */
|
|
|
|
+struct xen_domctl_setdomainhandle {
|
|
|
|
+ xen_domain_handle_t handle;
|
|
|
|
+};
|
|
|
|
+typedef struct xen_domctl_setdomainhandle xen_domctl_setdomainhandle_t;
|
|
|
|
+DEFINE_XEN_GUEST_HANDLE(xen_domctl_setdomainhandle_t);
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+/* XEN_DOMCTL_setdebugging */
|
|
|
|
+struct xen_domctl_setdebugging {
|
|
|
|
+ uint8_t enable;
|
|
|
|
+};
|
|
|
|
+typedef struct xen_domctl_setdebugging xen_domctl_setdebugging_t;
|
|
|
|
+DEFINE_XEN_GUEST_HANDLE(xen_domctl_setdebugging_t);
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+/* XEN_DOMCTL_irq_permission */
|
|
|
|
+struct xen_domctl_irq_permission {
|
|
|
|
+ uint8_t pirq;
|
|
|
|
+ uint8_t allow_access; /* flag to specify enable/disable of IRQ access */
|
|
|
|
+};
|
|
|
|
+typedef struct xen_domctl_irq_permission xen_domctl_irq_permission_t;
|
|
|
|
+DEFINE_XEN_GUEST_HANDLE(xen_domctl_irq_permission_t);
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+/* XEN_DOMCTL_iomem_permission */
|
|
|
|
+struct xen_domctl_iomem_permission {
|
|
|
|
+ uint64_aligned_t first_mfn;/* first page (physical page number) in range */
|
|
|
|
+ uint64_aligned_t nr_mfns; /* number of pages in range (>0) */
|
|
|
|
+ uint8_t allow_access; /* allow (!0) or deny (0) access to range? */
|
|
|
|
+};
|
|
|
|
+typedef struct xen_domctl_iomem_permission xen_domctl_iomem_permission_t;
|
|
|
|
+DEFINE_XEN_GUEST_HANDLE(xen_domctl_iomem_permission_t);
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+/* XEN_DOMCTL_ioport_permission */
|
|
|
|
+struct xen_domctl_ioport_permission {
|
|
|
|
+ uint32_t first_port; /* first port int range */
|
|
|
|
+ uint32_t nr_ports; /* size of port range */
|
|
|
|
+ uint8_t allow_access; /* allow or deny access to range? */
|
|
|
|
+};
|
|
|
|
+typedef struct xen_domctl_ioport_permission xen_domctl_ioport_permission_t;
|
|
|
|
+DEFINE_XEN_GUEST_HANDLE(xen_domctl_ioport_permission_t);
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+/* XEN_DOMCTL_hypercall_init */
|
|
|
|
+struct xen_domctl_hypercall_init {
|
|
|
|
+ uint64_aligned_t gmfn; /* GMFN to be initialised */
|
|
|
|
+};
|
|
|
|
+typedef struct xen_domctl_hypercall_init xen_domctl_hypercall_init_t;
|
|
|
|
+DEFINE_XEN_GUEST_HANDLE(xen_domctl_hypercall_init_t);
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+/* XEN_DOMCTL_arch_setup */
|
|
|
|
+#define _XEN_DOMAINSETUP_hvm_guest 0
|
|
|
|
+#define XEN_DOMAINSETUP_hvm_guest (1UL<<_XEN_DOMAINSETUP_hvm_guest)
|
|
|
|
+#define _XEN_DOMAINSETUP_query 1 /* Get parameters (for save) */
|
|
|
|
+#define XEN_DOMAINSETUP_query (1UL<<_XEN_DOMAINSETUP_query)
|
|
|
|
+#define _XEN_DOMAINSETUP_sioemu_guest 2
|
|
|
|
+#define XEN_DOMAINSETUP_sioemu_guest (1UL<<_XEN_DOMAINSETUP_sioemu_guest)
|
|
|
|
+typedef struct xen_domctl_arch_setup {
|
|
|
|
+ uint64_aligned_t flags; /* XEN_DOMAINSETUP_* */
|
|
|
|
+#ifdef __ia64__
|
|
|
|
+ uint64_aligned_t bp; /* mpaddr of boot param area */
|
|
|
|
+ uint64_aligned_t maxmem; /* Highest memory address for MDT. */
|
|
|
|
+ uint64_aligned_t xsi_va; /* Xen shared_info area virtual address. */
|
|
|
|
+ uint32_t hypercall_imm; /* Break imm for Xen hypercalls. */
|
|
|
|
+ int8_t vhpt_size_log2; /* Log2 of VHPT size. */
|
|
|
|
+#endif
|
|
|
|
+} xen_domctl_arch_setup_t;
|
|
|
|
+DEFINE_XEN_GUEST_HANDLE(xen_domctl_arch_setup_t);
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+/* XEN_DOMCTL_settimeoffset */
|
|
|
|
+struct xen_domctl_settimeoffset {
|
|
|
|
+ int32_t time_offset_seconds; /* applied to domain wallclock time */
|
|
|
|
+};
|
|
|
|
+typedef struct xen_domctl_settimeoffset xen_domctl_settimeoffset_t;
|
|
|
|
+DEFINE_XEN_GUEST_HANDLE(xen_domctl_settimeoffset_t);
|
|
|
|
+
|
|
|
|
+/* XEN_DOMCTL_gethvmcontext */
|
|
|
|
+/* XEN_DOMCTL_sethvmcontext */
|
|
|
|
+typedef struct xen_domctl_hvmcontext {
|
|
|
|
+ uint32_t size; /* IN/OUT: size of buffer / bytes filled */
|
|
|
|
+ XEN_GUEST_HANDLE_64(uint8) buffer; /* IN/OUT: data, or call
|
|
|
|
+ * gethvmcontext with NULL
|
|
|
|
+ * buffer to get size req'd */
|
|
|
|
+} xen_domctl_hvmcontext_t;
|
|
|
|
+DEFINE_XEN_GUEST_HANDLE(xen_domctl_hvmcontext_t);
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+/* XEN_DOMCTL_set_address_size */
|
|
|
|
+/* XEN_DOMCTL_get_address_size */
|
|
|
|
+typedef struct xen_domctl_address_size {
|
|
|
|
+ uint32_t size;
|
|
|
|
+} xen_domctl_address_size_t;
|
|
|
|
+DEFINE_XEN_GUEST_HANDLE(xen_domctl_address_size_t);
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+/* XEN_DOMCTL_real_mode_area */
|
|
|
|
+struct xen_domctl_real_mode_area {
|
|
|
|
+ uint32_t log; /* log2 of Real Mode Area size */
|
|
|
|
+};
|
|
|
|
+typedef struct xen_domctl_real_mode_area xen_domctl_real_mode_area_t;
|
|
|
|
+DEFINE_XEN_GUEST_HANDLE(xen_domctl_real_mode_area_t);
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+/* XEN_DOMCTL_sendtrigger */
|
|
|
|
+#define XEN_DOMCTL_SENDTRIGGER_NMI 0
|
|
|
|
+#define XEN_DOMCTL_SENDTRIGGER_RESET 1
|
|
|
|
+#define XEN_DOMCTL_SENDTRIGGER_INIT 2
|
|
|
|
+#define XEN_DOMCTL_SENDTRIGGER_POWER 3
|
|
|
|
+#define XEN_DOMCTL_SENDTRIGGER_SLEEP 4
|
|
|
|
+struct xen_domctl_sendtrigger {
|
|
|
|
+ uint32_t trigger; /* IN */
|
|
|
|
+ uint32_t vcpu; /* IN */
|
|
|
|
+};
|
|
|
|
+typedef struct xen_domctl_sendtrigger xen_domctl_sendtrigger_t;
|
|
|
|
+DEFINE_XEN_GUEST_HANDLE(xen_domctl_sendtrigger_t);
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+/* Assign PCI device to HVM guest. Sets up IOMMU structures. */
|
|
|
|
+/* XEN_DOMCTL_assign_device */
|
|
|
|
+/* XEN_DOMCTL_test_assign_device */
|
|
|
|
+/* XEN_DOMCTL_deassign_device */
|
|
|
|
+struct xen_domctl_assign_device {
|
|
|
|
+ uint32_t machine_bdf; /* machine PCI ID of assigned device */
|
|
|
|
+};
|
|
|
|
+typedef struct xen_domctl_assign_device xen_domctl_assign_device_t;
|
|
|
|
+DEFINE_XEN_GUEST_HANDLE(xen_domctl_assign_device_t);
|
|
|
|
+
|
|
|
|
+/* Retrieve sibling devices infomation of machine_bdf */
|
|
|
|
+/* XEN_DOMCTL_get_device_group */
|
|
|
|
+struct xen_domctl_get_device_group {
|
|
|
|
+ uint32_t machine_bdf; /* IN */
|
|
|
|
+ uint32_t max_sdevs; /* IN */
|
|
|
|
+ uint32_t num_sdevs; /* OUT */
|
|
|
|
+ XEN_GUEST_HANDLE_64(uint32) sdev_array; /* OUT */
|
|
|
|
+};
|
|
|
|
+typedef struct xen_domctl_get_device_group xen_domctl_get_device_group_t;
|
|
|
|
+DEFINE_XEN_GUEST_HANDLE(xen_domctl_get_device_group_t);
|
|
|
|
+
|
|
|
|
+/* Pass-through interrupts: bind real irq -> hvm devfn. */
|
|
|
|
+/* XEN_DOMCTL_bind_pt_irq */
|
|
|
|
+/* XEN_DOMCTL_unbind_pt_irq */
|
|
|
|
+typedef enum pt_irq_type_e {
|
|
|
|
+ PT_IRQ_TYPE_PCI,
|
|
|
|
+ PT_IRQ_TYPE_ISA,
|
|
|
|
+ PT_IRQ_TYPE_MSI,
|
|
|
|
+ PT_IRQ_TYPE_MSI_TRANSLATE,
|
|
|
|
+} pt_irq_type_t;
|
|
|
|
+struct xen_domctl_bind_pt_irq {
|
|
|
|
+ uint32_t machine_irq;
|
|
|
|
+ pt_irq_type_t irq_type;
|
|
|
|
+ uint32_t hvm_domid;
|
|
|
|
+
|
|
|
|
+ union {
|
|
|
|
+ struct {
|
|
|
|
+ uint8_t isa_irq;
|
|
|
|
+ } isa;
|
|
|
|
+ struct {
|
|
|
|
+ uint8_t bus;
|
|
|
|
+ uint8_t device;
|
|
|
|
+ uint8_t intx;
|
|
|
|
+ } pci;
|
|
|
|
+ struct {
|
|
|
|
+ uint8_t gvec;
|
|
|
|
+ uint32_t gflags;
|
|
|
|
+ uint64_aligned_t gtable;
|
|
|
|
+ } msi;
|
|
|
|
+ } u;
|
|
|
|
+};
|
|
|
|
+typedef struct xen_domctl_bind_pt_irq xen_domctl_bind_pt_irq_t;
|
|
|
|
+DEFINE_XEN_GUEST_HANDLE(xen_domctl_bind_pt_irq_t);
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+/* Bind machine I/O address range -> HVM address range. */
|
|
|
|
+/* XEN_DOMCTL_memory_mapping */
|
|
|
|
+#define DPCI_ADD_MAPPING 1
|
|
|
|
+#define DPCI_REMOVE_MAPPING 0
|
|
|
|
+struct xen_domctl_memory_mapping {
|
|
|
|
+ uint64_aligned_t first_gfn; /* first page (hvm guest phys page) in range */
|
|
|
|
+ uint64_aligned_t first_mfn; /* first page (machine page) in range */
|
|
|
|
+ uint64_aligned_t nr_mfns; /* number of pages in range (>0) */
|
|
|
|
+ uint32_t add_mapping; /* add or remove mapping */
|
|
|
|
+ uint32_t padding; /* padding for 64-bit aligned structure */
|
|
|
|
+};
|
|
|
|
+typedef struct xen_domctl_memory_mapping xen_domctl_memory_mapping_t;
|
|
|
|
+DEFINE_XEN_GUEST_HANDLE(xen_domctl_memory_mapping_t);
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+/* Bind machine I/O port range -> HVM I/O port range. */
|
|
|
|
+/* XEN_DOMCTL_ioport_mapping */
|
|
|
|
+struct xen_domctl_ioport_mapping {
|
|
|
|
+ uint32_t first_gport; /* first guest IO port*/
|
|
|
|
+ uint32_t first_mport; /* first machine IO port */
|
|
|
|
+ uint32_t nr_ports; /* size of port range */
|
|
|
|
+ uint32_t add_mapping; /* add or remove mapping */
|
|
|
|
+};
|
|
|
|
+typedef struct xen_domctl_ioport_mapping xen_domctl_ioport_mapping_t;
|
|
|
|
+DEFINE_XEN_GUEST_HANDLE(xen_domctl_ioport_mapping_t);
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+/*
|
|
|
|
+ * Pin caching type of RAM space for x86 HVM domU.
|
|
|
|
+ */
|
|
|
|
+/* XEN_DOMCTL_pin_mem_cacheattr */
|
|
|
|
+/* Caching types: these happen to be the same as x86 MTRR/PAT type codes. */
|
|
|
|
+#define XEN_DOMCTL_MEM_CACHEATTR_UC 0
|
|
|
|
+#define XEN_DOMCTL_MEM_CACHEATTR_WC 1
|
|
|
|
+#define XEN_DOMCTL_MEM_CACHEATTR_WT 4
|
|
|
|
+#define XEN_DOMCTL_MEM_CACHEATTR_WP 5
|
|
|
|
+#define XEN_DOMCTL_MEM_CACHEATTR_WB 6
|
|
|
|
+#define XEN_DOMCTL_MEM_CACHEATTR_UCM 7
|
|
|
|
+struct xen_domctl_pin_mem_cacheattr {
|
|
|
|
+ uint64_aligned_t start, end;
|
|
|
|
+ uint32_t type; /* XEN_DOMCTL_MEM_CACHEATTR_* */
|
|
|
|
+};
|
|
|
|
+typedef struct xen_domctl_pin_mem_cacheattr xen_domctl_pin_mem_cacheattr_t;
|
|
|
|
+DEFINE_XEN_GUEST_HANDLE(xen_domctl_pin_mem_cacheattr_t);
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+/* XEN_DOMCTL_set_ext_vcpucontext */
|
|
|
|
+/* XEN_DOMCTL_get_ext_vcpucontext */
|
|
|
|
+struct xen_domctl_ext_vcpucontext {
|
|
|
|
+ /* IN: VCPU that this call applies to. */
|
|
|
|
+ uint32_t vcpu;
|
|
|
|
+ /*
|
|
|
|
+ * SET: Size of struct (IN)
|
|
|
|
+ * GET: Size of struct (OUT)
|
|
|
|
+ */
|
|
|
|
+ uint32_t size;
|
|
|
|
+#if defined(__i386__) || defined(__x86_64__)
|
|
|
|
+ /* SYSCALL from 32-bit mode and SYSENTER callback information. */
|
|
|
|
+ /* NB. SYSCALL from 64-bit mode is contained in vcpu_guest_context_t */
|
|
|
|
+ uint64_aligned_t syscall32_callback_eip;
|
|
|
|
+ uint64_aligned_t sysenter_callback_eip;
|
|
|
|
+ uint16_t syscall32_callback_cs;
|
|
|
|
+ uint16_t sysenter_callback_cs;
|
|
|
|
+ uint8_t syscall32_disables_events;
|
|
|
|
+ uint8_t sysenter_disables_events;
|
|
|
|
+#endif
|
|
|
|
+};
|
|
|
|
+typedef struct xen_domctl_ext_vcpucontext xen_domctl_ext_vcpucontext_t;
|
|
|
|
+DEFINE_XEN_GUEST_HANDLE(xen_domctl_ext_vcpucontext_t);
|
|
|
|
+
|
|
|
|
+/*
|
|
|
|
+ * Set optimizaton features for a domain
|
|
|
|
+ */
|
|
|
|
+/* XEN_DOMCTL_set_opt_feature */
|
|
|
|
+struct xen_domctl_set_opt_feature {
|
|
|
|
+#if defined(__ia64__)
|
|
|
|
+ struct xen_ia64_opt_feature optf;
|
|
|
|
+#else
|
|
|
|
+ /* Make struct non-empty: do not depend on this field name! */
|
|
|
|
+ uint64_t dummy;
|
|
|
|
+#endif
|
|
|
|
+};
|
|
|
|
+typedef struct xen_domctl_set_opt_feature xen_domctl_set_opt_feature_t;
|
|
|
|
+DEFINE_XEN_GUEST_HANDLE(xen_domctl_set_opt_feature_t);
|
|
|
|
+
|
|
|
|
+/*
|
|
|
|
+ * Set the target domain for a domain
|
|
|
|
+ */
|
|
|
|
+/* XEN_DOMCTL_set_target */
|
|
|
|
+struct xen_domctl_set_target {
|
|
|
|
+ domid_t target;
|
|
|
|
+};
|
|
|
|
+typedef struct xen_domctl_set_target xen_domctl_set_target_t;
|
|
|
|
+DEFINE_XEN_GUEST_HANDLE(xen_domctl_set_target_t);
|
|
|
|
+
|
|
|
|
+#if defined(__i386__) || defined(__x86_64__)
|
|
|
|
+# define XEN_CPUID_INPUT_UNUSED 0xFFFFFFFF
|
|
|
|
+/* XEN_DOMCTL_set_cpuid */
|
|
|
|
+struct xen_domctl_cpuid {
|
|
|
|
+ uint32_t input[2];
|
|
|
|
+ uint32_t eax;
|
|
|
|
+ uint32_t ebx;
|
|
|
|
+ uint32_t ecx;
|
|
|
|
+ uint32_t edx;
|
|
|
|
+};
|
|
|
|
+typedef struct xen_domctl_cpuid xen_domctl_cpuid_t;
|
|
|
|
+DEFINE_XEN_GUEST_HANDLE(xen_domctl_cpuid_t);
|
|
|
|
+#endif
|
|
|
|
+
|
|
|
|
+/* XEN_DOMCTL_subscribe */
|
|
|
|
+struct xen_domctl_subscribe {
|
|
|
|
+ uint32_t port; /* IN */
|
|
|
|
+};
|
|
|
|
+typedef struct xen_domctl_subscribe xen_domctl_subscribe_t;
|
|
|
|
+DEFINE_XEN_GUEST_HANDLE(xen_domctl_subscribe_t);
|
|
|
|
+
|
|
|
|
+/*
|
|
|
|
+ * Define the maximum machine address size which should be allocated
|
|
|
|
+ * to a guest.
|
|
|
|
+ */
|
|
|
|
+/* XEN_DOMCTL_set_machine_address_size */
|
|
|
|
+/* XEN_DOMCTL_get_machine_address_size */
|
|
|
|
+
|
|
|
|
+/*
|
|
|
|
+ * Do not inject spurious page faults into this domain.
|
|
|
|
+ */
|
|
|
|
+/* XEN_DOMCTL_suppress_spurious_page_faults */
|
|
|
|
+
|
|
|
|
+/* XEN_DOMCTL_debug_op */
|
|
|
|
+#define XEN_DOMCTL_DEBUG_OP_SINGLE_STEP_OFF 0
|
|
|
|
+#define XEN_DOMCTL_DEBUG_OP_SINGLE_STEP_ON 1
|
|
|
|
+struct xen_domctl_debug_op {
|
|
|
|
+ uint32_t op; /* IN */
|
|
|
|
+ uint32_t vcpu; /* IN */
|
|
|
|
+};
|
|
|
|
+typedef struct xen_domctl_debug_op xen_domctl_debug_op_t;
|
|
|
|
+DEFINE_XEN_GUEST_HANDLE(xen_domctl_debug_op_t);
|
|
|
|
+
|
|
|
|
+/*
|
|
|
|
+ * Request a particular record from the HVM context
|
|
|
|
+ */
|
|
|
|
+/* XEN_DOMCTL_gethvmcontext_partial */
|
|
|
|
+typedef struct xen_domctl_hvmcontext_partial {
|
|
|
|
+ uint32_t type; /* IN: Type of record required */
|
|
|
|
+ uint32_t instance; /* IN: Instance of that type */
|
|
|
|
+ XEN_GUEST_HANDLE_64(uint8) buffer; /* OUT: buffer to write record into */
|
|
|
|
+} xen_domctl_hvmcontext_partial_t;
|
|
|
|
+DEFINE_XEN_GUEST_HANDLE(xen_domctl_hvmcontext_partial_t);
|
|
|
|
+
|
|
|
|
+/* XEN_DOMCTL_disable_migrate */
|
|
|
|
+typedef struct xen_domctl_disable_migrate {
|
|
|
|
+ uint32_t disable; /* IN: 1: disable migration and restore */
|
|
|
|
+} xen_domctl_disable_migrate_t;
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+/* XEN_DOMCTL_gettscinfo */
|
|
|
|
+/* XEN_DOMCTL_settscinfo */
|
|
|
|
+struct xen_guest_tsc_info {
|
|
|
|
+ uint32_t tsc_mode;
|
|
|
|
+ uint32_t gtsc_khz;
|
|
|
|
+ uint32_t incarnation;
|
|
|
|
+ uint32_t pad;
|
|
|
|
+ uint64_aligned_t elapsed_nsec;
|
|
|
|
+};
|
|
|
|
+typedef struct xen_guest_tsc_info xen_guest_tsc_info_t;
|
|
|
|
+DEFINE_XEN_GUEST_HANDLE(xen_guest_tsc_info_t);
|
|
|
|
+typedef struct xen_domctl_tsc_info {
|
|
|
|
+ XEN_GUEST_HANDLE_64(xen_guest_tsc_info_t) out_info; /* OUT */
|
|
|
|
+ xen_guest_tsc_info_t info; /* IN */
|
|
|
|
+} xen_domctl_tsc_info_t;
|
|
|
|
+
|
|
|
|
+/* XEN_DOMCTL_gdbsx_guestmemio guest mem io */
|
|
|
|
+struct xen_domctl_gdbsx_memio {
|
|
|
|
+ /* IN */
|
|
|
|
+ uint64_aligned_t pgd3val;/* optional: init_mm.pgd[3] value */
|
|
|
|
+ uint64_aligned_t gva; /* guest virtual address */
|
|
|
|
+ uint64_aligned_t uva; /* user buffer virtual address */
|
|
|
|
+ uint32_t len; /* number of bytes to read/write */
|
|
|
|
+ uint8_t gwr; /* 0 = read from guest. 1 = write to guest */
|
|
|
|
+ /* OUT */
|
|
|
|
+ uint32_t remain; /* bytes remaining to be copied */
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+/* XEN_DOMCTL_gdbsx_pausevcpu */
|
|
|
|
+/* XEN_DOMCTL_gdbsx_unpausevcpu */
|
|
|
|
+struct xen_domctl_gdbsx_pauseunp_vcpu { /* pause/unpause a vcpu */
|
|
|
|
+ uint32_t vcpu; /* which vcpu */
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+/* XEN_DOMCTL_gdbsx_domstatus */
|
|
|
|
+struct xen_domctl_gdbsx_domstatus {
|
|
|
|
+ /* OUT */
|
|
|
|
+ uint8_t paused; /* is the domain paused */
|
|
|
|
+ uint32_t vcpu_id; /* any vcpu in an event? */
|
|
|
|
+ uint32_t vcpu_ev; /* if yes, what event? */
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+/*
|
|
|
|
+ * Memory event operations
|
|
|
|
+ */
|
|
|
|
+
|
|
|
|
+/* XEN_DOMCTL_mem_event_op */
|
|
|
|
+
|
|
|
|
+/* Add and remove memory handlers */
|
|
|
|
+#define XEN_DOMCTL_MEM_EVENT_OP_ENABLE 0
|
|
|
|
+#define XEN_DOMCTL_MEM_EVENT_OP_DISABLE 1
|
|
|
|
+
|
|
|
|
+/*
|
|
|
|
+ * Page memory in and out.
|
|
|
|
+ */
|
2011-04-19 20:09:59 +00:00
|
|
|
+#define XEN_DOMCTL_MEM_EVENT_OP_PAGING 1
|
2010-07-07 11:12:45 +00:00
|
|
|
+
|
|
|
|
+/* Domain memory paging */
|
|
|
|
+#define XEN_DOMCTL_MEM_EVENT_OP_PAGING_NOMINATE 0
|
|
|
|
+#define XEN_DOMCTL_MEM_EVENT_OP_PAGING_EVICT 1
|
|
|
|
+#define XEN_DOMCTL_MEM_EVENT_OP_PAGING_PREP 2
|
|
|
|
+#define XEN_DOMCTL_MEM_EVENT_OP_PAGING_RESUME 3
|
|
|
|
+
|
2011-04-19 20:09:59 +00:00
|
|
|
+/*
|
|
|
|
+ * Access permissions.
|
|
|
|
+ *
|
|
|
|
+ * There are HVM hypercalls to set the per-page access permissions of every
|
|
|
|
+ * page in a domain. When one of these permissions--independent, read,
|
|
|
|
+ * write, and execute--is violated, the VCPU is paused and a memory event
|
|
|
|
+ * is sent with what happened. (See public/mem_event.h) The memory event
|
|
|
|
+ * handler can then resume the VCPU and redo the access with an
|
|
|
|
+ * ACCESS_RESUME mode for the following domctl.
|
|
|
|
+ */
|
|
|
|
+#define XEN_DOMCTL_MEM_EVENT_OP_ACCESS 2
|
|
|
|
+#define XEN_DOMCTL_MEM_EVENT_OP_ACCESS_RESUME 0
|
|
|
|
+
|
2010-07-07 11:12:45 +00:00
|
|
|
+struct xen_domctl_mem_event_op {
|
|
|
|
+ uint32_t op; /* XEN_DOMCTL_MEM_EVENT_OP_* */
|
|
|
|
+ uint32_t mode; /* XEN_DOMCTL_MEM_EVENT_ENABLE_* */
|
|
|
|
+
|
|
|
|
+ /* OP_ENABLE */
|
|
|
|
+ uint64_aligned_t shared_addr; /* IN: Virtual address of shared page */
|
|
|
|
+ uint64_aligned_t ring_addr; /* IN: Virtual address of ring page */
|
|
|
|
+
|
|
|
|
+ /* Other OPs */
|
|
|
|
+ uint64_aligned_t gfn; /* IN: gfn of page being operated on */
|
|
|
|
+};
|
|
|
|
+typedef struct xen_domctl_mem_event_op xen_domctl_mem_event_op_t;
|
|
|
|
+DEFINE_XEN_GUEST_HANDLE(xen_domctl_mem_event_op_t);
|
|
|
|
+
|
|
|
|
+/*
|
|
|
|
+ * Memory sharing operations
|
|
|
|
+ */
|
|
|
|
+/* XEN_DOMCTL_mem_sharing_op */
|
|
|
|
+
|
|
|
|
+#define XEN_DOMCTL_MEM_SHARING_OP_CONTROL 0
|
|
|
|
+#define XEN_DOMCTL_MEM_SHARING_OP_NOMINATE_GFN 1
|
|
|
|
+#define XEN_DOMCTL_MEM_SHARING_OP_NOMINATE_GREF 2
|
|
|
|
+#define XEN_DOMCTL_MEM_SHARING_OP_SHARE 3
|
|
|
|
+#define XEN_DOMCTL_MEM_SHARING_OP_RESUME 4
|
|
|
|
+#define XEN_DOMCTL_MEM_SHARING_OP_DEBUG_GFN 5
|
|
|
|
+#define XEN_DOMCTL_MEM_SHARING_OP_DEBUG_MFN 6
|
|
|
|
+#define XEN_DOMCTL_MEM_SHARING_OP_DEBUG_GREF 7
|
|
|
|
+
|
|
|
|
+#define XEN_DOMCTL_MEM_SHARING_S_HANDLE_INVALID (-10)
|
|
|
|
+#define XEN_DOMCTL_MEM_SHARING_C_HANDLE_INVALID (-9)
|
|
|
|
+
|
|
|
|
+struct xen_domctl_mem_sharing_op {
|
|
|
|
+ uint8_t op; /* XEN_DOMCTL_MEM_EVENT_OP_* */
|
|
|
|
+
|
|
|
|
+ union {
|
|
|
|
+ uint8_t enable; /* OP_CONTROL */
|
|
|
|
+
|
|
|
|
+ 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 */
|
|
|
|
+ uint64_aligned_t source_handle; /* IN: handle to the source page */
|
|
|
|
+ uint64_aligned_t client_handle; /* IN: handle to the client page */
|
|
|
|
+ } share;
|
|
|
|
+ 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 */
|
|
|
|
+ grant_ref_t gref; /* IN: gref to debug */
|
|
|
|
+ } u;
|
|
|
|
+ } debug;
|
|
|
|
+ } u;
|
|
|
|
+};
|
|
|
|
+typedef struct xen_domctl_mem_sharing_op xen_domctl_mem_sharing_op_t;
|
|
|
|
+DEFINE_XEN_GUEST_HANDLE(xen_domctl_mem_sharing_op_t);
|
|
|
|
+
|
2011-04-19 20:09:59 +00:00
|
|
|
+#if defined(__i386__) || defined(__x86_64__)
|
|
|
|
+/* XEN_DOMCTL_setvcpuextstate */
|
|
|
|
+/* XEN_DOMCTL_getvcpuextstate */
|
|
|
|
+struct xen_domctl_vcpuextstate {
|
|
|
|
+ /* IN: VCPU that this call applies to. */
|
|
|
|
+ uint32_t vcpu;
|
|
|
|
+ /*
|
|
|
|
+ * SET: xfeature support mask of struct (IN)
|
|
|
|
+ * GET: xfeature support mask of struct (IN/OUT)
|
|
|
|
+ * xfeature mask is served as identifications of the saving format
|
|
|
|
+ * so that compatible CPUs can have a check on format to decide
|
|
|
|
+ * whether it can restore.
|
|
|
|
+ */
|
|
|
|
+ uint64_aligned_t xfeature_mask;
|
|
|
|
+ /*
|
|
|
|
+ * SET: Size of struct (IN)
|
|
|
|
+ * GET: Size of struct (IN/OUT)
|
|
|
|
+ */
|
|
|
|
+ uint64_aligned_t size;
|
|
|
|
+ XEN_GUEST_HANDLE_64(uint64) buffer;
|
|
|
|
+};
|
|
|
|
+typedef struct xen_domctl_vcpuextstate xen_domctl_vcpuextstate_t;
|
|
|
|
+DEFINE_XEN_GUEST_HANDLE(xen_domctl_vcpuextstate_t);
|
|
|
|
+#endif
|
|
|
|
+
|
|
|
|
+/* XEN_DOMCTL_set_access_required: sets whether a memory event listener
|
|
|
|
+ * must be present to handle page access events: if false, the page
|
|
|
|
+ * access will revert to full permissions if no one is listening;
|
|
|
|
+ * */
|
|
|
|
+struct xen_domctl_set_access_required {
|
|
|
|
+ uint8_t access_required;
|
|
|
|
+};
|
|
|
|
+typedef struct xen_domctl_set_access_required xen_domctl_set_access_required_t;
|
|
|
|
+DEFINE_XEN_GUEST_HANDLE(xen_domctl_set_access_required_t);
|
|
|
|
+
|
2010-07-07 11:12:45 +00:00
|
|
|
+struct xen_domctl {
|
|
|
|
+ uint32_t cmd;
|
|
|
|
+#define XEN_DOMCTL_createdomain 1
|
|
|
|
+#define XEN_DOMCTL_destroydomain 2
|
|
|
|
+#define XEN_DOMCTL_pausedomain 3
|
|
|
|
+#define XEN_DOMCTL_unpausedomain 4
|
|
|
|
+#define XEN_DOMCTL_getdomaininfo 5
|
|
|
|
+#define XEN_DOMCTL_getmemlist 6
|
|
|
|
+#define XEN_DOMCTL_getpageframeinfo 7
|
|
|
|
+#define XEN_DOMCTL_getpageframeinfo2 8
|
|
|
|
+#define XEN_DOMCTL_setvcpuaffinity 9
|
|
|
|
+#define XEN_DOMCTL_shadow_op 10
|
|
|
|
+#define XEN_DOMCTL_max_mem 11
|
|
|
|
+#define XEN_DOMCTL_setvcpucontext 12
|
|
|
|
+#define XEN_DOMCTL_getvcpucontext 13
|
|
|
|
+#define XEN_DOMCTL_getvcpuinfo 14
|
|
|
|
+#define XEN_DOMCTL_max_vcpus 15
|
|
|
|
+#define XEN_DOMCTL_scheduler_op 16
|
|
|
|
+#define XEN_DOMCTL_setdomainhandle 17
|
|
|
|
+#define XEN_DOMCTL_setdebugging 18
|
|
|
|
+#define XEN_DOMCTL_irq_permission 19
|
|
|
|
+#define XEN_DOMCTL_iomem_permission 20
|
|
|
|
+#define XEN_DOMCTL_ioport_permission 21
|
|
|
|
+#define XEN_DOMCTL_hypercall_init 22
|
|
|
|
+#define XEN_DOMCTL_arch_setup 23
|
|
|
|
+#define XEN_DOMCTL_settimeoffset 24
|
|
|
|
+#define XEN_DOMCTL_getvcpuaffinity 25
|
|
|
|
+#define XEN_DOMCTL_real_mode_area 26
|
|
|
|
+#define XEN_DOMCTL_resumedomain 27
|
|
|
|
+#define XEN_DOMCTL_sendtrigger 28
|
|
|
|
+#define XEN_DOMCTL_subscribe 29
|
|
|
|
+#define XEN_DOMCTL_gethvmcontext 33
|
|
|
|
+#define XEN_DOMCTL_sethvmcontext 34
|
|
|
|
+#define XEN_DOMCTL_set_address_size 35
|
|
|
|
+#define XEN_DOMCTL_get_address_size 36
|
|
|
|
+#define XEN_DOMCTL_assign_device 37
|
|
|
|
+#define XEN_DOMCTL_bind_pt_irq 38
|
|
|
|
+#define XEN_DOMCTL_memory_mapping 39
|
|
|
|
+#define XEN_DOMCTL_ioport_mapping 40
|
|
|
|
+#define XEN_DOMCTL_pin_mem_cacheattr 41
|
|
|
|
+#define XEN_DOMCTL_set_ext_vcpucontext 42
|
|
|
|
+#define XEN_DOMCTL_get_ext_vcpucontext 43
|
|
|
|
+#define XEN_DOMCTL_set_opt_feature 44
|
|
|
|
+#define XEN_DOMCTL_test_assign_device 45
|
|
|
|
+#define XEN_DOMCTL_set_target 46
|
|
|
|
+#define XEN_DOMCTL_deassign_device 47
|
|
|
|
+#define XEN_DOMCTL_unbind_pt_irq 48
|
|
|
|
+#define XEN_DOMCTL_set_cpuid 49
|
|
|
|
+#define XEN_DOMCTL_get_device_group 50
|
|
|
|
+#define XEN_DOMCTL_set_machine_address_size 51
|
|
|
|
+#define XEN_DOMCTL_get_machine_address_size 52
|
|
|
|
+#define XEN_DOMCTL_suppress_spurious_page_faults 53
|
|
|
|
+#define XEN_DOMCTL_debug_op 54
|
|
|
|
+#define XEN_DOMCTL_gethvmcontext_partial 55
|
|
|
|
+#define XEN_DOMCTL_mem_event_op 56
|
|
|
|
+#define XEN_DOMCTL_mem_sharing_op 57
|
|
|
|
+#define XEN_DOMCTL_disable_migrate 58
|
|
|
|
+#define XEN_DOMCTL_gettscinfo 59
|
|
|
|
+#define XEN_DOMCTL_settscinfo 60
|
|
|
|
+#define XEN_DOMCTL_getpageframeinfo3 61
|
2011-04-19 20:09:59 +00:00
|
|
|
+#define XEN_DOMCTL_setvcpuextstate 62
|
|
|
|
+#define XEN_DOMCTL_getvcpuextstate 63
|
|
|
|
+#define XEN_DOMCTL_set_access_required 64
|
2010-07-07 11:12:45 +00:00
|
|
|
+#define XEN_DOMCTL_gdbsx_guestmemio 1000
|
|
|
|
+#define XEN_DOMCTL_gdbsx_pausevcpu 1001
|
|
|
|
+#define XEN_DOMCTL_gdbsx_unpausevcpu 1002
|
|
|
|
+#define XEN_DOMCTL_gdbsx_domstatus 1003
|
|
|
|
+ uint32_t interface_version; /* XEN_DOMCTL_INTERFACE_VERSION */
|
|
|
|
+ domid_t domain;
|
|
|
|
+ union {
|
|
|
|
+ struct xen_domctl_createdomain createdomain;
|
|
|
|
+ struct xen_domctl_getdomaininfo getdomaininfo;
|
|
|
|
+ struct xen_domctl_getmemlist getmemlist;
|
|
|
|
+ struct xen_domctl_getpageframeinfo getpageframeinfo;
|
|
|
|
+ struct xen_domctl_getpageframeinfo2 getpageframeinfo2;
|
|
|
|
+ struct xen_domctl_getpageframeinfo3 getpageframeinfo3;
|
|
|
|
+ struct xen_domctl_vcpuaffinity vcpuaffinity;
|
|
|
|
+ struct xen_domctl_shadow_op shadow_op;
|
|
|
|
+ struct xen_domctl_max_mem max_mem;
|
|
|
|
+ struct xen_domctl_vcpucontext vcpucontext;
|
|
|
|
+ struct xen_domctl_getvcpuinfo getvcpuinfo;
|
|
|
|
+ struct xen_domctl_max_vcpus max_vcpus;
|
|
|
|
+ struct xen_domctl_scheduler_op scheduler_op;
|
|
|
|
+ struct xen_domctl_setdomainhandle setdomainhandle;
|
|
|
|
+ struct xen_domctl_setdebugging setdebugging;
|
|
|
|
+ struct xen_domctl_irq_permission irq_permission;
|
|
|
|
+ struct xen_domctl_iomem_permission iomem_permission;
|
|
|
|
+ struct xen_domctl_ioport_permission ioport_permission;
|
|
|
|
+ struct xen_domctl_hypercall_init hypercall_init;
|
|
|
|
+ struct xen_domctl_arch_setup arch_setup;
|
|
|
|
+ struct xen_domctl_settimeoffset settimeoffset;
|
|
|
|
+ struct xen_domctl_disable_migrate disable_migrate;
|
|
|
|
+ struct xen_domctl_tsc_info tsc_info;
|
|
|
|
+ struct xen_domctl_real_mode_area real_mode_area;
|
|
|
|
+ struct xen_domctl_hvmcontext hvmcontext;
|
|
|
|
+ struct xen_domctl_hvmcontext_partial hvmcontext_partial;
|
|
|
|
+ struct xen_domctl_address_size address_size;
|
|
|
|
+ struct xen_domctl_sendtrigger sendtrigger;
|
|
|
|
+ struct xen_domctl_get_device_group get_device_group;
|
|
|
|
+ struct xen_domctl_assign_device assign_device;
|
|
|
|
+ struct xen_domctl_bind_pt_irq bind_pt_irq;
|
|
|
|
+ struct xen_domctl_memory_mapping memory_mapping;
|
|
|
|
+ struct xen_domctl_ioport_mapping ioport_mapping;
|
|
|
|
+ struct xen_domctl_pin_mem_cacheattr pin_mem_cacheattr;
|
|
|
|
+ struct xen_domctl_ext_vcpucontext ext_vcpucontext;
|
|
|
|
+ struct xen_domctl_set_opt_feature set_opt_feature;
|
|
|
|
+ struct xen_domctl_set_target set_target;
|
|
|
|
+ struct xen_domctl_subscribe subscribe;
|
|
|
|
+ struct xen_domctl_debug_op debug_op;
|
|
|
|
+ struct xen_domctl_mem_event_op mem_event_op;
|
|
|
|
+ struct xen_domctl_mem_sharing_op mem_sharing_op;
|
|
|
|
+#if defined(__i386__) || defined(__x86_64__)
|
|
|
|
+ struct xen_domctl_cpuid cpuid;
|
2011-04-19 20:09:59 +00:00
|
|
|
+ struct xen_domctl_vcpuextstate vcpuextstate;
|
2010-07-07 11:12:45 +00:00
|
|
|
+#endif
|
2011-04-19 20:09:59 +00:00
|
|
|
+ struct xen_domctl_set_access_required access_required;
|
2010-07-07 11:12:45 +00:00
|
|
|
+ struct xen_domctl_gdbsx_memio gdbsx_guest_memio;
|
|
|
|
+ struct xen_domctl_gdbsx_pauseunp_vcpu gdbsx_pauseunp_vcpu;
|
|
|
|
+ struct xen_domctl_gdbsx_domstatus gdbsx_domstatus;
|
|
|
|
+ uint8_t pad[128];
|
|
|
|
+ } u;
|
|
|
|
+};
|
|
|
|
+typedef struct xen_domctl xen_domctl_t;
|
|
|
|
+DEFINE_XEN_GUEST_HANDLE(xen_domctl_t);
|
|
|
|
+
|
|
|
|
+#endif /* __XEN_PUBLIC_DOMCTL_H__ */
|
|
|
|
+
|
|
|
|
+/*
|
|
|
|
+ * Local variables:
|
|
|
|
+ * mode: C
|
|
|
|
+ * c-set-style: "BSD"
|
|
|
|
+ * c-basic-offset: 4
|
|
|
|
+ * tab-width: 4
|
|
|
|
+ * indent-tabs-mode: nil
|
|
|
|
+ * End:
|
|
|
|
+ */
|
|
|
|
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
|
2011-04-19 20:09:59 +00:00
|
|
|
+++ b/include/xen/interface/hvm/e820.h 2007-06-12 13:14:19.000000000 +0200
|
2010-07-07 11:12:45 +00:00
|
|
|
@@ -0,0 +1,34 @@
|
|
|
|
+
|
|
|
|
+/*
|
|
|
|
+ * 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_E820_H__
|
|
|
|
+#define __XEN_PUBLIC_HVM_E820_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 ((1ULL << 32) - HVM_BELOW_4G_MMIO_START)
|
|
|
|
+
|
|
|
|
+#endif /* __XEN_PUBLIC_HVM_E820_H__ */
|
|
|
|
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
|
2011-04-19 20:09:59 +00:00
|
|
|
+++ b/include/xen/interface/hvm/hvm_info_table.h 2010-05-07 11:10:48.000000000 +0200
|
2010-07-07 11:12:45 +00:00
|
|
|
@@ -0,0 +1,75 @@
|
|
|
|
+/******************************************************************************
|
|
|
|
+ * 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.
|
|
|
|
+ */
|
|
|
|
+
|
|
|
|
+#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
|
|
|
|
+
|
|
|
|
+struct hvm_info_table {
|
|
|
|
+ char signature[8]; /* "HVM INFO" */
|
|
|
|
+ uint32_t length;
|
|
|
|
+ uint8_t checksum;
|
|
|
|
+
|
|
|
|
+ /* Should firmware build ACPI tables? */
|
|
|
|
+ uint8_t acpi_enabled;
|
|
|
|
+
|
|
|
|
+ /* 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__ */
|
|
|
|
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
|
2011-04-19 20:09:59 +00:00
|
|
|
+++ b/include/xen/interface/hvm/ioreq.h 2011-03-17 13:50:24.000000000 +0100
|
|
|
|
@@ -0,0 +1,140 @@
|
2010-07-07 11:12:45 +00:00
|
|
|
+/*
|
|
|
|
+ * 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_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
|
|
|
|
+ */
|
|
|
|
+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 {
|
|
|
|
+ unsigned int read_pointer;
|
|
|
|
+ unsigned int write_pointer;
|
|
|
|
+ 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;
|
|
|
|
+
|
|
|
|
+#if defined(__ia64__)
|
|
|
|
+struct pio_buffer {
|
|
|
|
+ uint32_t page_offset;
|
|
|
|
+ uint32_t pointer;
|
|
|
|
+ uint32_t data_end;
|
|
|
|
+ uint32_t buf_size;
|
|
|
|
+ void *opaque;
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+#define PIO_BUFFER_IDE_PRIMARY 0 /* I/O port = 0x1F0 */
|
|
|
|
+#define PIO_BUFFER_IDE_SECONDARY 1 /* I/O port = 0x170 */
|
|
|
|
+#define PIO_BUFFER_ENTRY_NUM 2
|
|
|
|
+struct buffered_piopage {
|
|
|
|
+ struct pio_buffer pio[PIO_BUFFER_ENTRY_NUM];
|
|
|
|
+ uint8_t buffer[1];
|
|
|
|
+};
|
|
|
|
+#endif /* defined(__ia64__) */
|
|
|
|
+
|
2011-04-19 20:09:59 +00:00
|
|
|
+/*
|
|
|
|
+ * ACPI Control/Event register locations. Location is controlled by a
|
|
|
|
+ * version number in HVM_PARAM_ACPI_IOPORTS_LOCATION.
|
|
|
|
+ */
|
|
|
|
+
|
|
|
|
+/* Version 0 (default): Traditional Xen locations. */
|
|
|
|
+#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. */
|
|
|
|
+#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
|
|
|
|
+
|
2010-07-07 11:12:45 +00:00
|
|
|
+
|
|
|
|
+#endif /* _IOREQ_H_ */
|
|
|
|
+
|
|
|
|
+/*
|
|
|
|
+ * Local variables:
|
|
|
|
+ * mode: C
|
|
|
|
+ * c-set-style: "BSD"
|
|
|
|
+ * c-basic-offset: 4
|
|
|
|
+ * tab-width: 4
|
|
|
|
+ * indent-tabs-mode: nil
|
|
|
|
+ * End:
|
|
|
|
+ */
|
|
|
|
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
|
2011-04-19 20:09:59 +00:00
|
|
|
+++ b/include/xen/interface/hvm/save.h 2008-04-02 12:34:02.000000000 +0200
|
2010-07-07 11:12:45 +00:00
|
|
|
@@ -0,0 +1,88 @@
|
|
|
|
+/*
|
|
|
|
+ * 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.
|
|
|
|
+ */
|
|
|
|
+
|
|
|
|
+#define DECLARE_HVM_SAVE_TYPE(_x, _code, _type) \
|
|
|
|
+ struct __HVM_SAVE_TYPE_##_x { _type t; char c[_code]; }
|
|
|
|
+
|
|
|
|
+#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))
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+/*
|
|
|
|
+ * 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(__ia64__)
|
|
|
|
+#include "../arch-ia64/hvm/save.h"
|
|
|
|
+#else
|
|
|
|
+#error "unsupported architecture"
|
|
|
|
+#endif
|
|
|
|
+
|
|
|
|
+#endif /* __XEN_PUBLIC_HVM_SAVE_H__ */
|
|
|
|
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
|
2011-04-19 20:09:59 +00:00
|
|
|
+++ b/include/xen/interface/io/fsif.h 2009-06-23 09:28:21.000000000 +0200
|
2010-07-07 11:12:45 +00:00
|
|
|
@@ -0,0 +1,192 @@
|
|
|
|
+/******************************************************************************
|
|
|
|
+ * 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
|
|
|
|
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
|
2011-04-19 20:09:59 +00:00
|
|
|
+++ b/include/xen/interface/io/tpmif.h 2007-06-12 13:14:19.000000000 +0200
|
2010-07-07 11:12:45 +00:00
|
|
|
@@ -0,0 +1,77 @@
|
|
|
|
+/******************************************************************************
|
|
|
|
+ * 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;
|
|
|
|
+
|
|
|
|
+#endif
|
|
|
|
+
|
|
|
|
+/*
|
|
|
|
+ * Local variables:
|
|
|
|
+ * mode: C
|
|
|
|
+ * c-set-style: "BSD"
|
|
|
|
+ * c-basic-offset: 4
|
|
|
|
+ * tab-width: 4
|
|
|
|
+ * indent-tabs-mode: nil
|
|
|
|
+ * End:
|
|
|
|
+ */
|
|
|
|
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
|
2011-04-19 20:09:59 +00:00
|
|
|
+++ b/include/xen/interface/io/usbif.h 2010-02-24 13:13:46.000000000 +0100
|
2010-07-07 11:12:45 +00:00
|
|
|
@@ -0,0 +1,151 @@
|
|
|
|
+/*
|
|
|
|
+ * 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"
|
|
|
|
+
|
|
|
|
+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
|
|
|
|
+ *
|
|
|
|
+ * bits 0-5 are specific bits for virtual USB driver.
|
|
|
|
+ * bits 7-31 are standard urb pipe.
|
|
|
|
+ *
|
|
|
|
+ * - port number(NEW): bits 0-4
|
|
|
|
+ * (USB_MAXCHILDREN is 31)
|
|
|
|
+ *
|
|
|
|
+ * - operation flag(NEW): 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_pipeportnum(pipe) ((pipe) & 0x1f)
|
|
|
|
+#define usbif_setportnum_pipe(pipe, portnum) \
|
|
|
|
+ ((pipe)|(portnum))
|
|
|
|
+
|
|
|
|
+#define usbif_pipeunlink(pipe) ((pipe) & 0x20)
|
|
|
|
+#define usbif_pipesubmit(pipe) (!usbif_pipeunlink(pipe))
|
|
|
|
+#define usbif_setunlink_pipe(pipe) ((pipe)|(0x20))
|
|
|
|
+
|
|
|
|
+#define USBIF_BACK_MAX_PENDING_REQS (128)
|
|
|
|
+#define USBIF_MAX_SEGMENTS_PER_REQUEST (16)
|
|
|
|
+
|
|
|
|
+/*
|
|
|
|
+ * 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;
|
|
|
|
+ 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, PAGE_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 */
|
|
|
|
+};
|
|
|
|
+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, PAGE_SIZE)
|
|
|
|
+
|
|
|
|
+#endif /* __XEN_PUBLIC_IO_USBIF_H__ */
|
|
|
|
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
|
2011-04-19 20:09:59 +00:00
|
|
|
+++ b/include/xen/interface/io/vscsiif.h 2008-07-21 11:00:33.000000000 +0200
|
2010-07-07 11:12:45 +00:00
|
|
|
@@ -0,0 +1,105 @@
|
|
|
|
+/******************************************************************************
|
|
|
|
+ * 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"
|
|
|
|
+
|
|
|
|
+/* command between backend and frontend */
|
|
|
|
+#define VSCSIIF_ACT_SCSI_CDB 1 /* SCSI CDB command */
|
|
|
|
+#define VSCSIIF_ACT_SCSI_ABORT 2 /* SCSI Device(Lun) Abort*/
|
|
|
|
+#define VSCSIIF_ACT_SCSI_RESET 3 /* SCSI Device(Lun) Reset*/
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+#define VSCSIIF_BACK_MAX_PENDING_REQS 128
|
|
|
|
+
|
|
|
|
+/*
|
|
|
|
+ * Maximum scatter/gather segments per request.
|
|
|
|
+ *
|
|
|
|
+ * Considering balance between allocating al least 16 "vscsiif_request"
|
|
|
|
+ * structures on one page (4096bytes) and number of scatter gather
|
|
|
|
+ * needed, we decided to use 26 as a magic number.
|
|
|
|
+ */
|
|
|
|
+#define VSCSIIF_SG_TABLESIZE 26
|
|
|
|
+
|
|
|
|
+/*
|
|
|
|
+ * base on linux kernel 2.6.18
|
|
|
|
+ */
|
|
|
|
+#define VSCSIIF_MAX_COMMAND_SIZE 16
|
|
|
|
+#define VSCSIIF_SENSE_BUFFERSIZE 96
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+struct vscsiif_request {
|
|
|
|
+ uint16_t rqid; /* private guest value, echoed in resp */
|
|
|
|
+ uint8_t act; /* command between backend and frontend */
|
|
|
|
+ uint8_t cmd_len;
|
|
|
|
+
|
|
|
|
+ uint8_t cmnd[VSCSIIF_MAX_COMMAND_SIZE];
|
|
|
|
+ uint16_t timeout_per_command; /* The command is issued by twice
|
|
|
|
+ the value in Backend. */
|
|
|
|
+ uint16_t channel, id, lun;
|
|
|
|
+ uint16_t padding;
|
|
|
|
+ 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 */
|
|
|
|
+
|
|
|
|
+ struct scsiif_request_segment {
|
|
|
|
+ grant_ref_t gref;
|
|
|
|
+ uint16_t offset;
|
|
|
|
+ uint16_t length;
|
|
|
|
+ } seg[VSCSIIF_SG_TABLESIZE];
|
|
|
|
+ uint32_t reserved[3];
|
|
|
|
+};
|
|
|
|
+typedef struct vscsiif_request vscsiif_request_t;
|
|
|
|
+
|
|
|
|
+struct vscsiif_response {
|
|
|
|
+ uint16_t rqid;
|
|
|
|
+ uint8_t padding;
|
|
|
|
+ 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-set-style: "BSD"
|
|
|
|
+ * c-basic-offset: 4
|
|
|
|
+ * tab-width: 4
|
|
|
|
+ * indent-tabs-mode: nil
|
|
|
|
+ * End:
|
|
|
|
+ */
|
|
|
|
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
|
2011-04-19 20:09:59 +00:00
|
|
|
+++ b/include/xen/interface/kexec.h 2008-11-25 12:22:34.000000000 +0100
|
2010-07-07 11:12:45 +00:00
|
|
|
@@ -0,0 +1,168 @@
|
|
|
|
+/******************************************************************************
|
|
|
|
+ * 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
|
|
|
|
+#if defined(__ia64__)
|
|
|
|
+ unsigned long reboot_code_buffer;
|
|
|
|
+#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]
|
|
|
|
+ */
|
|
|
|
+#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 1
|
|
|
|
+#define KEXEC_CMD_kexec_unload 2
|
|
|
|
+typedef struct xen_kexec_load {
|
|
|
|
+ int type;
|
|
|
|
+ xen_kexec_image_t image;
|
|
|
|
+} xen_kexec_load_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 /* 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;
|
|
|
|
+
|
|
|
|
+#endif /* _XEN_PUBLIC_KEXEC_H */
|
|
|
|
+
|
|
|
|
+/*
|
|
|
|
+ * Local variables:
|
|
|
|
+ * mode: C
|
|
|
|
+ * c-set-style: "BSD"
|
|
|
|
+ * c-basic-offset: 4
|
|
|
|
+ * tab-width: 4
|
|
|
|
+ * indent-tabs-mode: nil
|
|
|
|
+ * End:
|
|
|
|
+ */
|
|
|
|
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
|
2011-04-19 20:09:59 +00:00
|
|
|
+++ b/include/xen/interface/mem_event.h 2011-03-17 13:50:24.000000000 +0100
|
|
|
|
@@ -0,0 +1,82 @@
|
2010-07-07 11:12:45 +00:00
|
|
|
+/******************************************************************************
|
|
|
|
+ * mem_event.h
|
|
|
|
+ *
|
|
|
|
+ * Memory event common structures.
|
|
|
|
+ *
|
|
|
|
+ * Copyright (c) 2009 by Citrix Systems, Inc. (Patrick Colp)
|
|
|
|
+ *
|
|
|
|
+ * This program is free software; you can redistribute it and/or modify
|
|
|
|
+ * it under the terms of the GNU General Public License as published by
|
|
|
|
+ * the Free Software Foundation; either version 2 of the License, or
|
|
|
|
+ * (at your option) any later version.
|
|
|
|
+ *
|
|
|
|
+ * This program is distributed in the hope that it will be useful,
|
|
|
|
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
+ * GNU General Public License for more details.
|
|
|
|
+ *
|
|
|
|
+ * You should have received a copy of the GNU General Public License
|
|
|
|
+ * along with this program; if not, write to the Free Software
|
|
|
|
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
|
|
+ */
|
|
|
|
+
|
|
|
|
+#ifndef _XEN_PUBLIC_MEM_EVENT_H
|
|
|
|
+#define _XEN_PUBLIC_MEM_EVENT_H
|
|
|
|
+
|
|
|
|
+#include "xen.h"
|
|
|
|
+#include "io/ring.h"
|
|
|
|
+
|
2011-04-19 20:09:59 +00:00
|
|
|
+/* Memory event type */
|
|
|
|
+#define MEM_EVENT_TYPE_SHARED 0
|
|
|
|
+#define MEM_EVENT_TYPE_PAGING 1
|
|
|
|
+#define MEM_EVENT_TYPE_ACCESS 2
|
2010-07-07 11:12:45 +00:00
|
|
|
+
|
|
|
|
+/* Memory event flags */
|
|
|
|
+#define MEM_EVENT_FLAG_VCPU_PAUSED (1 << 0)
|
2011-04-19 20:09:59 +00:00
|
|
|
+#define MEM_EVENT_FLAG_DROP_PAGE (1 << 1)
|
2010-07-07 11:12:45 +00:00
|
|
|
+
|
2011-04-19 20:09:59 +00:00
|
|
|
+/* Reasons for the memory event request */
|
|
|
|
+#define MEM_EVENT_REASON_UNKNOWN 0 /* typical reason */
|
|
|
|
+#define MEM_EVENT_REASON_VIOLATION 1 /* access violation, GFN is address */
|
|
|
|
+#define MEM_EVENT_REASON_CR0 2 /* CR0 was hit: gfn is CR0 value */
|
|
|
|
+#define MEM_EVENT_REASON_CR3 3 /* CR3 was hit: gfn is CR3 value */
|
|
|
|
+#define MEM_EVENT_REASON_CR4 4 /* CR4 was hit: gfn is CR4 value */
|
|
|
|
+#define MEM_EVENT_REASON_INT3 5 /* int3 was hit: gla/gfn are RIP */
|
2010-07-07 11:12:45 +00:00
|
|
|
+
|
|
|
|
+typedef struct mem_event_shared_page {
|
2011-04-19 20:09:59 +00:00
|
|
|
+ uint32_t port;
|
2010-07-07 11:12:45 +00:00
|
|
|
+} mem_event_shared_page_t;
|
|
|
|
+
|
|
|
|
+typedef struct mem_event_st {
|
2011-04-19 20:09:59 +00:00
|
|
|
+ uint16_t type;
|
|
|
|
+ uint16_t flags;
|
|
|
|
+ uint32_t vcpu_id;
|
2010-07-07 11:12:45 +00:00
|
|
|
+
|
2011-04-19 20:09:59 +00:00
|
|
|
+ uint64_t gfn;
|
|
|
|
+ uint64_t offset;
|
|
|
|
+ uint64_t gla; /* if gla_valid */
|
2010-07-07 11:12:45 +00:00
|
|
|
+
|
2011-04-19 20:09:59 +00:00
|
|
|
+ uint32_t p2mt;
|
2010-07-07 11:12:45 +00:00
|
|
|
+
|
2011-04-19 20:09:59 +00:00
|
|
|
+ uint16_t access_r:1;
|
|
|
|
+ uint16_t access_w:1;
|
|
|
|
+ uint16_t access_x:1;
|
|
|
|
+ uint16_t gla_valid:1;
|
|
|
|
+ uint16_t available:12;
|
2010-07-07 11:12:45 +00:00
|
|
|
+
|
2011-04-19 20:09:59 +00:00
|
|
|
+ uint16_t reason;
|
|
|
|
+} mem_event_request_t, mem_event_response_t;
|
|
|
|
+
|
|
|
|
+DEFINE_RING_TYPES(mem_event, mem_event_request_t, mem_event_response_t);
|
2010-07-07 11:12:45 +00:00
|
|
|
+
|
2011-04-19 20:09:59 +00:00
|
|
|
+#endif
|
2010-07-07 11:12:45 +00:00
|
|
|
+
|
|
|
|
+/*
|
|
|
|
+ * Local variables:
|
|
|
|
+ * mode: C
|
|
|
|
+ * c-set-style: "BSD"
|
|
|
|
+ * c-basic-offset: 4
|
|
|
|
+ * tab-width: 4
|
|
|
|
+ * indent-tabs-mode: nil
|
|
|
|
+ * End:
|
|
|
|
+ */
|
|
|
|
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
|
2011-04-19 20:09:59 +00:00
|
|
|
+++ b/include/xen/interface/nmi.h 2009-06-23 09:28:21.000000000 +0200
|
2010-07-07 11:12:45 +00:00
|
|
|
@@ -0,0 +1,80 @@
|
|
|
|
+/******************************************************************************
|
|
|
|
+ * 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)
|
|
|
|
+ /* 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)
|
|
|
|
+ /* 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-set-style: "BSD"
|
|
|
|
+ * c-basic-offset: 4
|
|
|
|
+ * tab-width: 4
|
|
|
|
+ * indent-tabs-mode: nil
|
|
|
|
+ * End:
|
|
|
|
+ */
|
|
|
|
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
|
2011-04-19 20:09:59 +00:00
|
|
|
+++ b/include/xen/interface/platform.h 2010-01-04 11:56:34.000000000 +0100
|
2010-07-07 11:12:45 +00:00
|
|
|
@@ -0,0 +1,393 @@
|
|
|
|
+/******************************************************************************
|
|
|
|
+ * 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_settime 17
|
|
|
|
+struct xenpf_settime {
|
|
|
|
+ /* IN variables. */
|
|
|
|
+ uint32_t secs;
|
|
|
|
+ uint32_t nsecs;
|
|
|
|
+ uint64_t system_time;
|
|
|
|
+};
|
|
|
|
+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_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 */
|
|
|
|
+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 */
|
|
|
|
+ } 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 */
|
|
|
|
+ uint16_t pm1a_cnt_val; /* PM1a control value. */
|
|
|
|
+ uint16_t pm1b_cnt_val; /* PM1b control value. */
|
|
|
|
+ uint32_t sleep_state; /* Which state to enter (Sn). */
|
|
|
|
+ uint32_t flags; /* Must be zero. */
|
|
|
|
+};
|
|
|
|
+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
|
|
|
|
+
|
|
|
|
+/* 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 */
|
|
|
|
+ } 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_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;
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+struct xen_platform_op {
|
|
|
|
+ uint32_t cmd;
|
|
|
|
+ uint32_t interface_version; /* XENPF_INTERFACE_VERSION */
|
|
|
|
+ union {
|
|
|
|
+ struct xenpf_settime settime;
|
|
|
|
+ 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_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_cpu_ol cpu_ol;
|
|
|
|
+ struct xenpf_cpu_hotadd cpu_add;
|
|
|
|
+ struct xenpf_mem_hotadd mem_add;
|
|
|
|
+ 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-set-style: "BSD"
|
|
|
|
+ * c-basic-offset: 4
|
|
|
|
+ * tab-width: 4
|
|
|
|
+ * indent-tabs-mode: nil
|
|
|
|
+ * End:
|
|
|
|
+ */
|
|
|
|
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
|
2011-04-19 20:09:59 +00:00
|
|
|
+++ b/include/xen/interface/sysctl.h 2011-03-17 13:50:24.000000000 +0100
|
|
|
|
@@ -0,0 +1,637 @@
|
2010-07-07 11:12:45 +00:00
|
|
|
+/******************************************************************************
|
|
|
|
+ * sysctl.h
|
|
|
|
+ *
|
|
|
|
+ * System management operations. For use by node control stack.
|
|
|
|
+ *
|
|
|
|
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
|
|
+ * of this software and associated documentation files (the "Software"), to
|
|
|
|
+ * deal in the Software without restriction, including without limitation the
|
|
|
|
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
|
|
|
+ * sell copies of the Software, and to permit persons to whom the Software is
|
|
|
|
+ * furnished to do so, subject to the following conditions:
|
|
|
|
+ *
|
|
|
|
+ * The above copyright notice and this permission notice shall be included in
|
|
|
|
+ * all copies or substantial portions of the Software.
|
|
|
|
+ *
|
|
|
|
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
|
|
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
|
|
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
|
|
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
|
|
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
|
|
|
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
|
|
|
+ * DEALINGS IN THE SOFTWARE.
|
|
|
|
+ *
|
|
|
|
+ * Copyright (c) 2002-2006, K Fraser
|
|
|
|
+ */
|
|
|
|
+
|
|
|
|
+#ifndef __XEN_PUBLIC_SYSCTL_H__
|
|
|
|
+#define __XEN_PUBLIC_SYSCTL_H__
|
|
|
|
+
|
|
|
|
+#if !defined(__XEN__) && !defined(__XEN_TOOLS__)
|
|
|
|
+#error "sysctl operations are intended for use by node control tools only"
|
|
|
|
+#endif
|
|
|
|
+
|
|
|
|
+#include "xen.h"
|
|
|
|
+#include "domctl.h"
|
|
|
|
+
|
|
|
|
+#define XEN_SYSCTL_INTERFACE_VERSION 0x00000008
|
|
|
|
+
|
|
|
|
+/*
|
|
|
|
+ * Read console content from Xen buffer ring.
|
|
|
|
+ */
|
|
|
|
+/* XEN_SYSCTL_readconsole */
|
|
|
|
+struct xen_sysctl_readconsole {
|
|
|
|
+ /* IN: Non-zero -> clear after reading. */
|
|
|
|
+ uint8_t clear;
|
|
|
|
+ /* IN: Non-zero -> start index specified by @index field. */
|
|
|
|
+ uint8_t incremental;
|
|
|
|
+ uint8_t pad0, pad1;
|
|
|
|
+ /*
|
|
|
|
+ * IN: Start index for consuming from ring buffer (if @incremental);
|
|
|
|
+ * OUT: End index after consuming from ring buffer.
|
|
|
|
+ */
|
|
|
|
+ uint32_t index;
|
|
|
|
+ /* IN: Virtual address to write console data. */
|
|
|
|
+ XEN_GUEST_HANDLE_64(char) buffer;
|
|
|
|
+ /* IN: Size of buffer; OUT: Bytes written to buffer. */
|
|
|
|
+ uint32_t count;
|
|
|
|
+};
|
|
|
|
+typedef struct xen_sysctl_readconsole xen_sysctl_readconsole_t;
|
|
|
|
+DEFINE_XEN_GUEST_HANDLE(xen_sysctl_readconsole_t);
|
|
|
|
+
|
|
|
|
+/* Get trace buffers machine base address */
|
|
|
|
+/* XEN_SYSCTL_tbuf_op */
|
|
|
|
+struct xen_sysctl_tbuf_op {
|
|
|
|
+ /* IN variables */
|
|
|
|
+#define XEN_SYSCTL_TBUFOP_get_info 0
|
|
|
|
+#define XEN_SYSCTL_TBUFOP_set_cpu_mask 1
|
|
|
|
+#define XEN_SYSCTL_TBUFOP_set_evt_mask 2
|
|
|
|
+#define XEN_SYSCTL_TBUFOP_set_size 3
|
|
|
|
+#define XEN_SYSCTL_TBUFOP_enable 4
|
|
|
|
+#define XEN_SYSCTL_TBUFOP_disable 5
|
|
|
|
+ uint32_t cmd;
|
|
|
|
+ /* IN/OUT variables */
|
|
|
|
+ struct xenctl_cpumap cpu_mask;
|
|
|
|
+ uint32_t evt_mask;
|
|
|
|
+ /* OUT variables */
|
|
|
|
+ uint64_aligned_t buffer_mfn;
|
|
|
|
+ uint32_t size; /* Also an IN variable! */
|
|
|
|
+};
|
|
|
|
+typedef struct xen_sysctl_tbuf_op xen_sysctl_tbuf_op_t;
|
|
|
|
+DEFINE_XEN_GUEST_HANDLE(xen_sysctl_tbuf_op_t);
|
|
|
|
+
|
|
|
|
+/*
|
|
|
|
+ * Get physical information about the host machine
|
|
|
|
+ */
|
|
|
|
+/* XEN_SYSCTL_physinfo */
|
|
|
|
+ /* (x86) The platform supports HVM guests. */
|
|
|
|
+#define _XEN_SYSCTL_PHYSCAP_hvm 0
|
|
|
|
+#define XEN_SYSCTL_PHYSCAP_hvm (1u<<_XEN_SYSCTL_PHYSCAP_hvm)
|
|
|
|
+ /* (x86) The platform supports HVM-guest direct access to I/O devices. */
|
|
|
|
+#define _XEN_SYSCTL_PHYSCAP_hvm_directio 1
|
|
|
|
+#define XEN_SYSCTL_PHYSCAP_hvm_directio (1u<<_XEN_SYSCTL_PHYSCAP_hvm_directio)
|
|
|
|
+struct xen_sysctl_physinfo {
|
|
|
|
+ uint32_t threads_per_core;
|
|
|
|
+ uint32_t cores_per_socket;
|
2011-04-19 20:09:59 +00:00
|
|
|
+ uint32_t nr_cpus; /* # CPUs currently online */
|
|
|
|
+ uint32_t max_cpu_id; /* Largest possible CPU ID on this host */
|
|
|
|
+ uint32_t nr_nodes; /* # nodes currently online */
|
|
|
|
+ uint32_t max_node_id; /* Largest possible node ID on this host */
|
2010-07-07 11:12:45 +00:00
|
|
|
+ uint32_t cpu_khz;
|
|
|
|
+ uint64_aligned_t total_pages;
|
|
|
|
+ uint64_aligned_t free_pages;
|
|
|
|
+ uint64_aligned_t scrub_pages;
|
|
|
|
+ uint32_t hw_cap[8];
|
|
|
|
+
|
|
|
|
+ /* XEN_SYSCTL_PHYSCAP_??? */
|
|
|
|
+ uint32_t capabilities;
|
|
|
|
+};
|
|
|
|
+typedef struct xen_sysctl_physinfo xen_sysctl_physinfo_t;
|
|
|
|
+DEFINE_XEN_GUEST_HANDLE(xen_sysctl_physinfo_t);
|
|
|
|
+
|
|
|
|
+/*
|
|
|
|
+ * Get the ID of the current scheduler.
|
|
|
|
+ */
|
|
|
|
+/* XEN_SYSCTL_sched_id */
|
|
|
|
+struct xen_sysctl_sched_id {
|
|
|
|
+ /* OUT variable */
|
|
|
|
+ uint32_t sched_id;
|
|
|
|
+};
|
|
|
|
+typedef struct xen_sysctl_sched_id xen_sysctl_sched_id_t;
|
|
|
|
+DEFINE_XEN_GUEST_HANDLE(xen_sysctl_sched_id_t);
|
|
|
|
+
|
|
|
|
+/* Interface for controlling Xen software performance counters. */
|
|
|
|
+/* XEN_SYSCTL_perfc_op */
|
|
|
|
+/* Sub-operations: */
|
|
|
|
+#define XEN_SYSCTL_PERFCOP_reset 1 /* Reset all counters to zero. */
|
|
|
|
+#define XEN_SYSCTL_PERFCOP_query 2 /* Get perfctr information. */
|
|
|
|
+struct xen_sysctl_perfc_desc {
|
|
|
|
+ char name[80]; /* name of perf counter */
|
|
|
|
+ uint32_t nr_vals; /* number of values for this counter */
|
|
|
|
+};
|
|
|
|
+typedef struct xen_sysctl_perfc_desc xen_sysctl_perfc_desc_t;
|
|
|
|
+DEFINE_XEN_GUEST_HANDLE(xen_sysctl_perfc_desc_t);
|
|
|
|
+typedef uint32_t xen_sysctl_perfc_val_t;
|
|
|
|
+DEFINE_XEN_GUEST_HANDLE(xen_sysctl_perfc_val_t);
|
|
|
|
+
|
|
|
|
+struct xen_sysctl_perfc_op {
|
|
|
|
+ /* IN variables. */
|
|
|
|
+ uint32_t cmd; /* XEN_SYSCTL_PERFCOP_??? */
|
|
|
|
+ /* OUT variables. */
|
|
|
|
+ uint32_t nr_counters; /* number of counters description */
|
|
|
|
+ uint32_t nr_vals; /* number of values */
|
|
|
|
+ /* counter information (or NULL) */
|
|
|
|
+ XEN_GUEST_HANDLE_64(xen_sysctl_perfc_desc_t) desc;
|
|
|
|
+ /* counter values (or NULL) */
|
|
|
|
+ XEN_GUEST_HANDLE_64(xen_sysctl_perfc_val_t) val;
|
|
|
|
+};
|
|
|
|
+typedef struct xen_sysctl_perfc_op xen_sysctl_perfc_op_t;
|
|
|
|
+DEFINE_XEN_GUEST_HANDLE(xen_sysctl_perfc_op_t);
|
|
|
|
+
|
|
|
|
+/* XEN_SYSCTL_getdomaininfolist */
|
|
|
|
+struct xen_sysctl_getdomaininfolist {
|
|
|
|
+ /* IN variables. */
|
|
|
|
+ domid_t first_domain;
|
|
|
|
+ uint32_t max_domains;
|
|
|
|
+ XEN_GUEST_HANDLE_64(xen_domctl_getdomaininfo_t) buffer;
|
|
|
|
+ /* OUT variables. */
|
|
|
|
+ uint32_t num_domains;
|
|
|
|
+};
|
|
|
|
+typedef struct xen_sysctl_getdomaininfolist xen_sysctl_getdomaininfolist_t;
|
|
|
|
+DEFINE_XEN_GUEST_HANDLE(xen_sysctl_getdomaininfolist_t);
|
|
|
|
+
|
|
|
|
+/* Inject debug keys into Xen. */
|
|
|
|
+/* XEN_SYSCTL_debug_keys */
|
|
|
|
+struct xen_sysctl_debug_keys {
|
|
|
|
+ /* IN variables. */
|
|
|
|
+ XEN_GUEST_HANDLE_64(char) keys;
|
|
|
|
+ uint32_t nr_keys;
|
|
|
|
+};
|
|
|
|
+typedef struct xen_sysctl_debug_keys xen_sysctl_debug_keys_t;
|
|
|
|
+DEFINE_XEN_GUEST_HANDLE(xen_sysctl_debug_keys_t);
|
|
|
|
+
|
|
|
|
+/* Get physical CPU information. */
|
|
|
|
+/* XEN_SYSCTL_getcpuinfo */
|
|
|
|
+struct xen_sysctl_cpuinfo {
|
|
|
|
+ uint64_aligned_t idletime;
|
|
|
|
+};
|
|
|
|
+typedef struct xen_sysctl_cpuinfo xen_sysctl_cpuinfo_t;
|
|
|
|
+DEFINE_XEN_GUEST_HANDLE(xen_sysctl_cpuinfo_t);
|
|
|
|
+struct xen_sysctl_getcpuinfo {
|
|
|
|
+ /* IN variables. */
|
|
|
|
+ uint32_t max_cpus;
|
|
|
|
+ XEN_GUEST_HANDLE_64(xen_sysctl_cpuinfo_t) info;
|
|
|
|
+ /* OUT variables. */
|
|
|
|
+ uint32_t nr_cpus;
|
|
|
|
+};
|
|
|
|
+typedef struct xen_sysctl_getcpuinfo xen_sysctl_getcpuinfo_t;
|
|
|
|
+DEFINE_XEN_GUEST_HANDLE(xen_sysctl_getcpuinfo_t);
|
|
|
|
+
|
|
|
|
+/* XEN_SYSCTL_availheap */
|
|
|
|
+struct xen_sysctl_availheap {
|
|
|
|
+ /* IN variables. */
|
|
|
|
+ uint32_t min_bitwidth; /* Smallest address width (zero if don't care). */
|
|
|
|
+ uint32_t max_bitwidth; /* Largest address width (zero if don't care). */
|
|
|
|
+ int32_t node; /* NUMA node of interest (-1 for all nodes). */
|
|
|
|
+ /* OUT variables. */
|
|
|
|
+ uint64_aligned_t avail_bytes;/* Bytes available in the specified region. */
|
|
|
|
+};
|
|
|
|
+typedef struct xen_sysctl_availheap xen_sysctl_availheap_t;
|
|
|
|
+DEFINE_XEN_GUEST_HANDLE(xen_sysctl_availheap_t);
|
|
|
|
+
|
|
|
|
+/* XEN_SYSCTL_get_pmstat */
|
|
|
|
+struct pm_px_val {
|
|
|
|
+ uint64_aligned_t freq; /* Px core frequency */
|
|
|
|
+ uint64_aligned_t residency; /* Px residency time */
|
|
|
|
+ uint64_aligned_t count; /* Px transition count */
|
|
|
|
+};
|
|
|
|
+typedef struct pm_px_val pm_px_val_t;
|
|
|
|
+DEFINE_XEN_GUEST_HANDLE(pm_px_val_t);
|
|
|
|
+
|
|
|
|
+struct pm_px_stat {
|
|
|
|
+ uint8_t total; /* total Px states */
|
|
|
|
+ uint8_t usable; /* usable Px states */
|
|
|
|
+ uint8_t last; /* last Px state */
|
|
|
|
+ uint8_t cur; /* current Px state */
|
|
|
|
+ XEN_GUEST_HANDLE_64(uint64) trans_pt; /* Px transition table */
|
|
|
|
+ XEN_GUEST_HANDLE_64(pm_px_val_t) pt;
|
|
|
|
+};
|
|
|
|
+typedef struct pm_px_stat pm_px_stat_t;
|
|
|
|
+DEFINE_XEN_GUEST_HANDLE(pm_px_stat_t);
|
|
|
|
+
|
|
|
|
+struct pm_cx_stat {
|
|
|
|
+ uint32_t nr; /* entry nr in triggers & residencies, including C0 */
|
|
|
|
+ uint32_t last; /* last Cx state */
|
|
|
|
+ uint64_aligned_t idle_time; /* idle time from boot */
|
|
|
|
+ XEN_GUEST_HANDLE_64(uint64) triggers; /* Cx trigger counts */
|
|
|
|
+ XEN_GUEST_HANDLE_64(uint64) residencies; /* Cx residencies */
|
2011-04-19 20:09:59 +00:00
|
|
|
+ uint64_aligned_t pc3;
|
|
|
|
+ uint64_aligned_t pc6;
|
|
|
|
+ uint64_aligned_t pc7;
|
|
|
|
+ uint64_aligned_t cc3;
|
|
|
|
+ uint64_aligned_t cc6;
|
2010-07-07 11:12:45 +00:00
|
|
|
+};
|
|
|
|
+
|
|
|
|
+struct xen_sysctl_get_pmstat {
|
|
|
|
+#define PMSTAT_CATEGORY_MASK 0xf0
|
|
|
|
+#define PMSTAT_PX 0x10
|
|
|
|
+#define PMSTAT_CX 0x20
|
|
|
|
+#define PMSTAT_get_max_px (PMSTAT_PX | 0x1)
|
|
|
|
+#define PMSTAT_get_pxstat (PMSTAT_PX | 0x2)
|
|
|
|
+#define PMSTAT_reset_pxstat (PMSTAT_PX | 0x3)
|
|
|
|
+#define PMSTAT_get_max_cx (PMSTAT_CX | 0x1)
|
|
|
|
+#define PMSTAT_get_cxstat (PMSTAT_CX | 0x2)
|
|
|
|
+#define PMSTAT_reset_cxstat (PMSTAT_CX | 0x3)
|
|
|
|
+ uint32_t type;
|
|
|
|
+ uint32_t cpuid;
|
|
|
|
+ union {
|
|
|
|
+ struct pm_px_stat getpx;
|
|
|
|
+ struct pm_cx_stat getcx;
|
|
|
|
+ /* other struct for tx, etc */
|
|
|
|
+ } u;
|
|
|
|
+};
|
|
|
|
+typedef struct xen_sysctl_get_pmstat xen_sysctl_get_pmstat_t;
|
|
|
|
+DEFINE_XEN_GUEST_HANDLE(xen_sysctl_get_pmstat_t);
|
|
|
|
+
|
|
|
|
+/* XEN_SYSCTL_cpu_hotplug */
|
|
|
|
+struct xen_sysctl_cpu_hotplug {
|
|
|
|
+ /* IN variables */
|
|
|
|
+ uint32_t cpu; /* Physical cpu. */
|
|
|
|
+#define XEN_SYSCTL_CPU_HOTPLUG_ONLINE 0
|
|
|
|
+#define XEN_SYSCTL_CPU_HOTPLUG_OFFLINE 1
|
|
|
|
+ uint32_t op; /* hotplug opcode */
|
|
|
|
+};
|
|
|
|
+typedef struct xen_sysctl_cpu_hotplug xen_sysctl_cpu_hotplug_t;
|
|
|
|
+DEFINE_XEN_GUEST_HANDLE(xen_sysctl_cpu_hotplug_t);
|
|
|
|
+
|
|
|
|
+/*
|
|
|
|
+ * Get/set xen power management, include
|
|
|
|
+ * 1. cpufreq governors and related parameters
|
|
|
|
+ */
|
|
|
|
+/* XEN_SYSCTL_pm_op */
|
|
|
|
+struct xen_userspace {
|
|
|
|
+ uint32_t scaling_setspeed;
|
|
|
|
+};
|
|
|
|
+typedef struct xen_userspace xen_userspace_t;
|
|
|
|
+
|
|
|
|
+struct xen_ondemand {
|
|
|
|
+ uint32_t sampling_rate_max;
|
|
|
|
+ uint32_t sampling_rate_min;
|
|
|
|
+
|
|
|
|
+ uint32_t sampling_rate;
|
|
|
|
+ uint32_t up_threshold;
|
|
|
|
+};
|
|
|
|
+typedef struct xen_ondemand xen_ondemand_t;
|
|
|
|
+
|
|
|
|
+/*
|
|
|
|
+ * cpufreq para name of this structure named
|
|
|
|
+ * same as sysfs file name of native linux
|
|
|
|
+ */
|
|
|
|
+#define CPUFREQ_NAME_LEN 16
|
|
|
|
+struct xen_get_cpufreq_para {
|
|
|
|
+ /* IN/OUT variable */
|
|
|
|
+ uint32_t cpu_num;
|
|
|
|
+ uint32_t freq_num;
|
|
|
|
+ uint32_t gov_num;
|
|
|
|
+
|
|
|
|
+ /* for all governors */
|
|
|
|
+ /* OUT variable */
|
|
|
|
+ XEN_GUEST_HANDLE_64(uint32) affected_cpus;
|
|
|
|
+ XEN_GUEST_HANDLE_64(uint32) scaling_available_frequencies;
|
|
|
|
+ XEN_GUEST_HANDLE_64(char) scaling_available_governors;
|
|
|
|
+ char scaling_driver[CPUFREQ_NAME_LEN];
|
|
|
|
+
|
|
|
|
+ uint32_t cpuinfo_cur_freq;
|
|
|
|
+ uint32_t cpuinfo_max_freq;
|
|
|
|
+ uint32_t cpuinfo_min_freq;
|
|
|
|
+ uint32_t scaling_cur_freq;
|
|
|
|
+
|
|
|
|
+ char scaling_governor[CPUFREQ_NAME_LEN];
|
|
|
|
+ uint32_t scaling_max_freq;
|
|
|
|
+ uint32_t scaling_min_freq;
|
|
|
|
+
|
|
|
|
+ /* for specific governor */
|
|
|
|
+ union {
|
|
|
|
+ struct xen_userspace userspace;
|
|
|
|
+ struct xen_ondemand ondemand;
|
|
|
|
+ } u;
|
|
|
|
+
|
|
|
|
+ int32_t turbo_enabled;
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+struct xen_set_cpufreq_gov {
|
|
|
|
+ char scaling_governor[CPUFREQ_NAME_LEN];
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+struct xen_set_cpufreq_para {
|
|
|
|
+ #define SCALING_MAX_FREQ 1
|
|
|
|
+ #define SCALING_MIN_FREQ 2
|
|
|
|
+ #define SCALING_SETSPEED 3
|
|
|
|
+ #define SAMPLING_RATE 4
|
|
|
|
+ #define UP_THRESHOLD 5
|
|
|
|
+
|
|
|
|
+ uint32_t ctrl_type;
|
|
|
|
+ uint32_t ctrl_value;
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+struct xen_sysctl_pm_op {
|
|
|
|
+ #define PM_PARA_CATEGORY_MASK 0xf0
|
|
|
|
+ #define CPUFREQ_PARA 0x10
|
|
|
|
+
|
|
|
|
+ /* cpufreq command type */
|
|
|
|
+ #define GET_CPUFREQ_PARA (CPUFREQ_PARA | 0x01)
|
|
|
|
+ #define SET_CPUFREQ_GOV (CPUFREQ_PARA | 0x02)
|
|
|
|
+ #define SET_CPUFREQ_PARA (CPUFREQ_PARA | 0x03)
|
|
|
|
+ #define GET_CPUFREQ_AVGFREQ (CPUFREQ_PARA | 0x04)
|
|
|
|
+
|
|
|
|
+ /* set/reset scheduler power saving option */
|
|
|
|
+ #define XEN_SYSCTL_pm_op_set_sched_opt_smt 0x21
|
|
|
|
+
|
|
|
|
+ /* cpuidle max_cstate access command */
|
|
|
|
+ #define XEN_SYSCTL_pm_op_get_max_cstate 0x22
|
|
|
|
+ #define XEN_SYSCTL_pm_op_set_max_cstate 0x23
|
|
|
|
+
|
|
|
|
+ /* set scheduler migration cost value */
|
|
|
|
+ #define XEN_SYSCTL_pm_op_set_vcpu_migration_delay 0x24
|
|
|
|
+ #define XEN_SYSCTL_pm_op_get_vcpu_migration_delay 0x25
|
|
|
|
+
|
|
|
|
+ /* enable/disable turbo mode when in dbs governor */
|
|
|
|
+ #define XEN_SYSCTL_pm_op_enable_turbo 0x26
|
|
|
|
+ #define XEN_SYSCTL_pm_op_disable_turbo 0x27
|
|
|
|
+
|
|
|
|
+ uint32_t cmd;
|
|
|
|
+ uint32_t cpuid;
|
|
|
|
+ union {
|
|
|
|
+ struct xen_get_cpufreq_para get_para;
|
|
|
|
+ struct xen_set_cpufreq_gov set_gov;
|
|
|
|
+ struct xen_set_cpufreq_para set_para;
|
|
|
|
+ uint64_aligned_t get_avgfreq;
|
|
|
|
+ uint32_t set_sched_opt_smt;
|
|
|
|
+ uint32_t get_max_cstate;
|
|
|
|
+ uint32_t set_max_cstate;
|
|
|
|
+ uint32_t get_vcpu_migration_delay;
|
|
|
|
+ uint32_t set_vcpu_migration_delay;
|
|
|
|
+ } u;
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+/* XEN_SYSCTL_page_offline_op */
|
|
|
|
+struct xen_sysctl_page_offline_op {
|
|
|
|
+ /* IN: range of page to be offlined */
|
|
|
|
+#define sysctl_page_offline 1
|
|
|
|
+#define sysctl_page_online 2
|
|
|
|
+#define sysctl_query_page_offline 3
|
|
|
|
+ uint32_t cmd;
|
|
|
|
+ uint32_t start;
|
|
|
|
+ uint32_t end;
|
|
|
|
+ /* OUT: result of page offline request */
|
|
|
|
+ /*
|
|
|
|
+ * bit 0~15: result flags
|
|
|
|
+ * bit 16~31: owner
|
|
|
|
+ */
|
|
|
|
+ XEN_GUEST_HANDLE(uint32) status;
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+#define PG_OFFLINE_STATUS_MASK (0xFFUL)
|
|
|
|
+
|
|
|
|
+/* The result is invalid, i.e. HV does not handle it */
|
|
|
|
+#define PG_OFFLINE_INVALID (0x1UL << 0)
|
|
|
|
+
|
|
|
|
+#define PG_OFFLINE_OFFLINED (0x1UL << 1)
|
|
|
|
+#define PG_OFFLINE_PENDING (0x1UL << 2)
|
|
|
|
+#define PG_OFFLINE_FAILED (0x1UL << 3)
|
|
|
|
+
|
|
|
|
+#define PG_ONLINE_FAILED PG_OFFLINE_FAILED
|
|
|
|
+#define PG_ONLINE_ONLINED PG_OFFLINE_OFFLINED
|
|
|
|
+
|
|
|
|
+#define PG_OFFLINE_STATUS_OFFLINED (0x1UL << 1)
|
|
|
|
+#define PG_OFFLINE_STATUS_ONLINE (0x1UL << 2)
|
|
|
|
+#define PG_OFFLINE_STATUS_OFFLINE_PENDING (0x1UL << 3)
|
|
|
|
+#define PG_OFFLINE_STATUS_BROKEN (0x1UL << 4)
|
|
|
|
+
|
|
|
|
+#define PG_OFFLINE_MISC_MASK (0xFFUL << 4)
|
|
|
|
+
|
|
|
|
+/* only valid when PG_OFFLINE_FAILED */
|
|
|
|
+#define PG_OFFLINE_XENPAGE (0x1UL << 8)
|
|
|
|
+#define PG_OFFLINE_DOM0PAGE (0x1UL << 9)
|
|
|
|
+#define PG_OFFLINE_ANONYMOUS (0x1UL << 10)
|
|
|
|
+#define PG_OFFLINE_NOT_CONV_RAM (0x1UL << 11)
|
|
|
|
+#define PG_OFFLINE_OWNED (0x1UL << 12)
|
|
|
|
+
|
|
|
|
+#define PG_OFFLINE_BROKEN (0x1UL << 13)
|
|
|
|
+#define PG_ONLINE_BROKEN PG_OFFLINE_BROKEN
|
|
|
|
+
|
|
|
|
+#define PG_OFFLINE_OWNER_SHIFT 16
|
|
|
|
+
|
|
|
|
+/* XEN_SYSCTL_lockprof_op */
|
|
|
|
+/* Sub-operations: */
|
|
|
|
+#define XEN_SYSCTL_LOCKPROF_reset 1 /* Reset all profile data to zero. */
|
|
|
|
+#define XEN_SYSCTL_LOCKPROF_query 2 /* Get lock profile information. */
|
|
|
|
+/* Record-type: */
|
|
|
|
+#define LOCKPROF_TYPE_GLOBAL 0 /* global lock, idx meaningless */
|
|
|
|
+#define LOCKPROF_TYPE_PERDOM 1 /* per-domain lock, idx is domid */
|
|
|
|
+#define LOCKPROF_TYPE_N 2 /* number of types */
|
|
|
|
+struct xen_sysctl_lockprof_data {
|
|
|
|
+ char name[40]; /* lock name (may include up to 2 %d specifiers) */
|
|
|
|
+ int32_t type; /* LOCKPROF_TYPE_??? */
|
|
|
|
+ int32_t idx; /* index (e.g. domain id) */
|
|
|
|
+ uint64_aligned_t lock_cnt; /* # of locking succeeded */
|
|
|
|
+ uint64_aligned_t block_cnt; /* # of wait for lock */
|
|
|
|
+ uint64_aligned_t lock_time; /* nsecs lock held */
|
|
|
|
+ uint64_aligned_t block_time; /* nsecs waited for lock */
|
|
|
|
+};
|
|
|
|
+typedef struct xen_sysctl_lockprof_data xen_sysctl_lockprof_data_t;
|
|
|
|
+DEFINE_XEN_GUEST_HANDLE(xen_sysctl_lockprof_data_t);
|
|
|
|
+struct xen_sysctl_lockprof_op {
|
|
|
|
+ /* IN variables. */
|
|
|
|
+ uint32_t cmd; /* XEN_SYSCTL_LOCKPROF_??? */
|
|
|
|
+ uint32_t max_elem; /* size of output buffer */
|
|
|
|
+ /* OUT variables (query only). */
|
|
|
|
+ uint32_t nr_elem; /* number of elements available */
|
|
|
|
+ uint64_aligned_t time; /* nsecs of profile measurement */
|
|
|
|
+ /* profile information (or NULL) */
|
|
|
|
+ XEN_GUEST_HANDLE_64(xen_sysctl_lockprof_data_t) data;
|
|
|
|
+};
|
|
|
|
+typedef struct xen_sysctl_lockprof_op xen_sysctl_lockprof_op_t;
|
|
|
|
+DEFINE_XEN_GUEST_HANDLE(xen_sysctl_lockprof_op_t);
|
|
|
|
+
|
|
|
|
+/* XEN_SYSCTL_topologyinfo */
|
|
|
|
+#define INVALID_TOPOLOGY_ID (~0U)
|
|
|
|
+struct xen_sysctl_topologyinfo {
|
|
|
|
+ /*
|
|
|
|
+ * IN: maximum addressable entry in the caller-provided arrays.
|
|
|
|
+ * OUT: largest cpu identifier in the system.
|
|
|
|
+ * If OUT is greater than IN then the arrays are truncated!
|
2011-04-19 20:09:59 +00:00
|
|
|
+ * If OUT is leass than IN then the array tails are not written by sysctl.
|
2010-07-07 11:12:45 +00:00
|
|
|
+ */
|
|
|
|
+ uint32_t max_cpu_index;
|
|
|
|
+
|
|
|
|
+ /*
|
2011-04-19 20:09:59 +00:00
|
|
|
+ * If not NULL, these arrays are filled with core/socket/node identifier
|
|
|
|
+ * for each cpu.
|
2010-07-07 11:12:45 +00:00
|
|
|
+ * If a cpu has no core/socket/node information (e.g., cpu not present)
|
2011-04-19 20:09:59 +00:00
|
|
|
+ * then the sentinel value ~0u is written to each array.
|
|
|
|
+ * The number of array elements written by the sysctl is:
|
|
|
|
+ * min(@max_cpu_index_IN,@max_cpu_index_OUT)+1
|
2010-07-07 11:12:45 +00:00
|
|
|
+ */
|
|
|
|
+ XEN_GUEST_HANDLE_64(uint32) cpu_to_core;
|
|
|
|
+ XEN_GUEST_HANDLE_64(uint32) cpu_to_socket;
|
|
|
|
+ XEN_GUEST_HANDLE_64(uint32) cpu_to_node;
|
|
|
|
+};
|
|
|
|
+typedef struct xen_sysctl_topologyinfo xen_sysctl_topologyinfo_t;
|
|
|
|
+DEFINE_XEN_GUEST_HANDLE(xen_sysctl_topologyinfo_t);
|
|
|
|
+
|
|
|
|
+/* XEN_SYSCTL_numainfo */
|
|
|
|
+struct xen_sysctl_numainfo {
|
|
|
|
+ /*
|
|
|
|
+ * IN: maximum addressable entry in the caller-provided arrays.
|
|
|
|
+ * OUT: largest node identifier in the system.
|
|
|
|
+ * If OUT is greater than IN then the arrays are truncated!
|
|
|
|
+ */
|
|
|
|
+ uint32_t max_node_index;
|
|
|
|
+
|
|
|
|
+ /* NB. Entries are 0 if node is not present. */
|
|
|
|
+ XEN_GUEST_HANDLE_64(uint64) node_to_memsize;
|
|
|
|
+ XEN_GUEST_HANDLE_64(uint64) node_to_memfree;
|
|
|
|
+
|
|
|
|
+ /*
|
|
|
|
+ * Array, of size (max_node_index+1)^2, listing memory access distances
|
|
|
|
+ * between nodes. If an entry has no node distance information (e.g., node
|
|
|
|
+ * not present) then the value ~0u is written.
|
|
|
|
+ *
|
|
|
|
+ * Note that the array rows must be indexed by multiplying by the minimum
|
|
|
|
+ * of the caller-provided max_node_index and the returned value of
|
|
|
|
+ * max_node_index. That is, if the largest node index in the system is
|
|
|
|
+ * smaller than the caller can handle, a smaller 2-d array is constructed
|
|
|
|
+ * within the space provided by the caller. When this occurs, trailing
|
|
|
|
+ * space provided by the caller is not modified. If the largest node index
|
|
|
|
+ * in the system is larger than the caller can handle, then a 2-d array of
|
|
|
|
+ * the maximum size handleable by the caller is constructed.
|
|
|
|
+ */
|
|
|
|
+ XEN_GUEST_HANDLE_64(uint32) node_to_node_distance;
|
|
|
|
+};
|
|
|
|
+typedef struct xen_sysctl_numainfo xen_sysctl_numainfo_t;
|
|
|
|
+DEFINE_XEN_GUEST_HANDLE(xen_sysctl_numainfo_t);
|
|
|
|
+
|
|
|
|
+/* XEN_SYSCTL_cpupool_op */
|
|
|
|
+#define XEN_SYSCTL_CPUPOOL_OP_CREATE 1 /* C */
|
|
|
|
+#define XEN_SYSCTL_CPUPOOL_OP_DESTROY 2 /* D */
|
|
|
|
+#define XEN_SYSCTL_CPUPOOL_OP_INFO 3 /* I */
|
|
|
|
+#define XEN_SYSCTL_CPUPOOL_OP_ADDCPU 4 /* A */
|
|
|
|
+#define XEN_SYSCTL_CPUPOOL_OP_RMCPU 5 /* R */
|
|
|
|
+#define XEN_SYSCTL_CPUPOOL_OP_MOVEDOMAIN 6 /* M */
|
|
|
|
+#define XEN_SYSCTL_CPUPOOL_OP_FREEINFO 7 /* F */
|
|
|
|
+#define XEN_SYSCTL_CPUPOOL_PAR_ANY 0xFFFFFFFF
|
|
|
|
+struct xen_sysctl_cpupool_op {
|
|
|
|
+ uint32_t op; /* IN */
|
|
|
|
+ uint32_t cpupool_id; /* IN: CDIARM OUT: CI */
|
|
|
|
+ uint32_t sched_id; /* IN: C OUT: I */
|
|
|
|
+ uint32_t domid; /* IN: M */
|
|
|
|
+ uint32_t cpu; /* IN: AR */
|
|
|
|
+ uint32_t n_dom; /* OUT: I */
|
|
|
|
+ struct xenctl_cpumap cpumap; /* OUT: IF */
|
|
|
|
+};
|
|
|
|
+typedef struct xen_sysctl_cpupool_op xen_sysctl_cpupool_op_t;
|
|
|
|
+DEFINE_XEN_GUEST_HANDLE(xen_sysctl_cpupool_op_t);
|
|
|
|
+
|
2011-04-19 20:09:59 +00:00
|
|
|
+#define ARINC653_MAX_DOMAINS_PER_SCHEDULE 64
|
|
|
|
+/*
|
|
|
|
+ * This structure is used to pass a new ARINC653 schedule from a
|
|
|
|
+ * privileged domain (ie dom0) to Xen.
|
|
|
|
+ */
|
|
|
|
+struct xen_sysctl_arinc653_schedule {
|
|
|
|
+ /* major_frame holds the time for the new schedule's major frame
|
|
|
|
+ * in nanoseconds. */
|
|
|
|
+ uint64_aligned_t major_frame;
|
|
|
|
+ /* num_sched_entries holds how many of the entries in the
|
|
|
|
+ * sched_entries[] array are valid. */
|
|
|
|
+ uint8_t num_sched_entries;
|
|
|
|
+ /* The sched_entries array holds the actual schedule entries. */
|
|
|
|
+ struct {
|
|
|
|
+ /* dom_handle must match a domain's UUID */
|
|
|
|
+ xen_domain_handle_t dom_handle;
|
|
|
|
+ /* If a domain has multiple VCPUs, vcpu_id specifies which one
|
|
|
|
+ * this schedule entry applies to. It should be set to 0 if
|
|
|
|
+ * there is only one VCPU for the domain. */
|
|
|
|
+ unsigned int vcpu_id;
|
|
|
|
+ /* runtime specifies the amount of time that should be allocated
|
|
|
|
+ * to this VCPU per major frame. It is specified in nanoseconds */
|
|
|
|
+ uint64_aligned_t runtime;
|
|
|
|
+ } sched_entries[ARINC653_MAX_DOMAINS_PER_SCHEDULE];
|
|
|
|
+};
|
|
|
|
+typedef struct xen_sysctl_arinc653_schedule xen_sysctl_arinc653_schedule_t;
|
|
|
|
+DEFINE_XEN_GUEST_HANDLE(xen_sysctl_arinc653_schedule_t);
|
|
|
|
+
|
2010-07-07 11:12:45 +00:00
|
|
|
+/* XEN_SYSCTL_scheduler_op */
|
|
|
|
+/* Set or get info? */
|
|
|
|
+#define XEN_SYSCTL_SCHEDOP_putinfo 0
|
|
|
|
+#define XEN_SYSCTL_SCHEDOP_getinfo 1
|
|
|
|
+struct xen_sysctl_scheduler_op {
|
2011-04-19 20:09:59 +00:00
|
|
|
+ uint32_t cpupool_id; /* Cpupool whose scheduler is to be targetted. */
|
|
|
|
+ uint32_t sched_id; /* XEN_SCHEDULER_* (domctl.h) */
|
|
|
|
+ uint32_t cmd; /* XEN_SYSCTL_SCHEDOP_* */
|
2010-07-07 11:12:45 +00:00
|
|
|
+ union {
|
2011-04-19 20:09:59 +00:00
|
|
|
+ struct xen_sysctl_sched_arinc653 {
|
|
|
|
+ XEN_GUEST_HANDLE_64(xen_sysctl_arinc653_schedule_t) schedule;
|
|
|
|
+ } sched_arinc653;
|
2010-07-07 11:12:45 +00:00
|
|
|
+ } u;
|
|
|
|
+};
|
|
|
|
+typedef struct xen_sysctl_scheduler_op xen_sysctl_scheduler_op_t;
|
|
|
|
+DEFINE_XEN_GUEST_HANDLE(xen_sysctl_scheduler_op_t);
|
|
|
|
+
|
|
|
|
+struct xen_sysctl {
|
|
|
|
+ uint32_t cmd;
|
|
|
|
+#define XEN_SYSCTL_readconsole 1
|
|
|
|
+#define XEN_SYSCTL_tbuf_op 2
|
|
|
|
+#define XEN_SYSCTL_physinfo 3
|
|
|
|
+#define XEN_SYSCTL_sched_id 4
|
|
|
|
+#define XEN_SYSCTL_perfc_op 5
|
|
|
|
+#define XEN_SYSCTL_getdomaininfolist 6
|
|
|
|
+#define XEN_SYSCTL_debug_keys 7
|
|
|
|
+#define XEN_SYSCTL_getcpuinfo 8
|
|
|
|
+#define XEN_SYSCTL_availheap 9
|
|
|
|
+#define XEN_SYSCTL_get_pmstat 10
|
|
|
|
+#define XEN_SYSCTL_cpu_hotplug 11
|
|
|
|
+#define XEN_SYSCTL_pm_op 12
|
|
|
|
+#define XEN_SYSCTL_page_offline_op 14
|
|
|
|
+#define XEN_SYSCTL_lockprof_op 15
|
|
|
|
+#define XEN_SYSCTL_topologyinfo 16
|
|
|
|
+#define XEN_SYSCTL_numainfo 17
|
|
|
|
+#define XEN_SYSCTL_cpupool_op 18
|
|
|
|
+#define XEN_SYSCTL_scheduler_op 19
|
|
|
|
+ uint32_t interface_version; /* XEN_SYSCTL_INTERFACE_VERSION */
|
|
|
|
+ union {
|
|
|
|
+ struct xen_sysctl_readconsole readconsole;
|
|
|
|
+ struct xen_sysctl_tbuf_op tbuf_op;
|
|
|
|
+ struct xen_sysctl_physinfo physinfo;
|
|
|
|
+ struct xen_sysctl_topologyinfo topologyinfo;
|
|
|
|
+ struct xen_sysctl_numainfo numainfo;
|
|
|
|
+ struct xen_sysctl_sched_id sched_id;
|
|
|
|
+ struct xen_sysctl_perfc_op perfc_op;
|
|
|
|
+ struct xen_sysctl_getdomaininfolist getdomaininfolist;
|
|
|
|
+ struct xen_sysctl_debug_keys debug_keys;
|
|
|
|
+ struct xen_sysctl_getcpuinfo getcpuinfo;
|
|
|
|
+ struct xen_sysctl_availheap availheap;
|
|
|
|
+ struct xen_sysctl_get_pmstat get_pmstat;
|
|
|
|
+ struct xen_sysctl_cpu_hotplug cpu_hotplug;
|
|
|
|
+ struct xen_sysctl_pm_op pm_op;
|
|
|
|
+ struct xen_sysctl_page_offline_op page_offline;
|
|
|
|
+ struct xen_sysctl_lockprof_op lockprof_op;
|
|
|
|
+ struct xen_sysctl_cpupool_op cpupool_op;
|
|
|
|
+ struct xen_sysctl_scheduler_op scheduler_op;
|
|
|
|
+ uint8_t pad[128];
|
|
|
|
+ } u;
|
|
|
|
+};
|
|
|
|
+typedef struct xen_sysctl xen_sysctl_t;
|
|
|
|
+DEFINE_XEN_GUEST_HANDLE(xen_sysctl_t);
|
|
|
|
+
|
|
|
|
+#endif /* __XEN_PUBLIC_SYSCTL_H__ */
|
|
|
|
+
|
|
|
|
+/*
|
|
|
|
+ * Local variables:
|
|
|
|
+ * mode: C
|
|
|
|
+ * c-set-style: "BSD"
|
|
|
|
+ * c-basic-offset: 4
|
|
|
|
+ * tab-width: 4
|
|
|
|
+ * indent-tabs-mode: nil
|
|
|
|
+ * End:
|
|
|
|
+ */
|
|
|
|
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
|
2011-04-19 20:09:59 +00:00
|
|
|
+++ b/include/xen/interface/tmem.h 2010-01-04 11:56:34.000000000 +0100
|
2010-07-07 11:12:45 +00:00
|
|
|
@@ -0,0 +1,144 @@
|
|
|
|
+/******************************************************************************
|
|
|
|
+ * 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"
|
|
|
|
+
|
|
|
|
+/* Commands to HYPERVISOR_tmem_op() */
|
|
|
|
+#define TMEM_CONTROL 0
|
|
|
|
+#define TMEM_NEW_POOL 1
|
|
|
|
+#define TMEM_DESTROY_POOL 2
|
|
|
|
+#define TMEM_NEW_PAGE 3
|
|
|
|
+#define TMEM_PUT_PAGE 4
|
|
|
|
+#define TMEM_GET_PAGE 5
|
|
|
|
+#define TMEM_FLUSH_PAGE 6
|
|
|
|
+#define TMEM_FLUSH_OBJECT 7
|
|
|
|
+#define TMEM_READ 8
|
|
|
|
+#define TMEM_WRITE 9
|
|
|
|
+#define TMEM_XCHG 10
|
|
|
|
+
|
|
|
|
+/* Privileged commands to HYPERVISOR_tmem_op() */
|
|
|
|
+#define TMEM_AUTH 101
|
|
|
|
+#define TMEM_RESTORE_NEW 102
|
|
|
|
+
|
|
|
|
+/* Subops for HYPERVISOR_tmem_op(TMEM_CONTROL) */
|
|
|
|
+#define TMEMC_THAW 0
|
|
|
|
+#define TMEMC_FREEZE 1
|
|
|
|
+#define TMEMC_FLUSH 2
|
|
|
|
+#define TMEMC_DESTROY 3
|
|
|
|
+#define TMEMC_LIST 4
|
|
|
|
+#define TMEMC_SET_WEIGHT 5
|
|
|
|
+#define TMEMC_SET_CAP 6
|
|
|
|
+#define TMEMC_SET_COMPRESS 7
|
|
|
|
+#define TMEMC_QUERY_FREEABLE_MB 8
|
|
|
|
+#define TMEMC_SAVE_BEGIN 10
|
|
|
|
+#define TMEMC_SAVE_GET_VERSION 11
|
|
|
|
+#define TMEMC_SAVE_GET_MAXPOOLS 12
|
|
|
|
+#define TMEMC_SAVE_GET_CLIENT_WEIGHT 13
|
|
|
|
+#define TMEMC_SAVE_GET_CLIENT_CAP 14
|
|
|
|
+#define TMEMC_SAVE_GET_CLIENT_FLAGS 15
|
|
|
|
+#define TMEMC_SAVE_GET_POOL_FLAGS 16
|
|
|
|
+#define TMEMC_SAVE_GET_POOL_NPAGES 17
|
|
|
|
+#define TMEMC_SAVE_GET_POOL_UUID 18
|
|
|
|
+#define TMEMC_SAVE_GET_NEXT_PAGE 19
|
|
|
|
+#define TMEMC_SAVE_GET_NEXT_INV 20
|
|
|
|
+#define TMEMC_SAVE_END 21
|
|
|
|
+#define TMEMC_RESTORE_BEGIN 30
|
|
|
|
+#define TMEMC_RESTORE_PUT_PAGE 32
|
|
|
|
+#define TMEMC_RESTORE_FLUSH_PAGE 33
|
|
|
|
+
|
|
|
|
+/* Bits for HYPERVISOR_tmem_op(TMEM_NEW_POOL) */
|
|
|
|
+#define TMEM_POOL_PERSIST 1
|
|
|
|
+#define TMEM_POOL_SHARED 2
|
|
|
|
+#define TMEM_POOL_PAGESIZE_SHIFT 4
|
|
|
|
+#define TMEM_POOL_PAGESIZE_MASK 0xf
|
|
|
|
+#define TMEM_POOL_VERSION_SHIFT 24
|
|
|
|
+#define TMEM_POOL_VERSION_MASK 0xff
|
|
|
|
+
|
|
|
|
+/* 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
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+#ifndef __ASSEMBLY__
|
|
|
|
+typedef xen_pfn_t tmem_cli_mfn_t;
|
|
|
|
+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;
|
|
|
|
+ } new; /* for cmd == TMEM_NEW_POOL, TMEM_AUTH, TMEM_RESTORE_NEW */
|
|
|
|
+ struct {
|
|
|
|
+ uint32_t subop;
|
|
|
|
+ uint32_t cli_id;
|
|
|
|
+ uint32_t arg1;
|
|
|
|
+ uint32_t arg2;
|
|
|
|
+ uint64_t arg3;
|
|
|
|
+ tmem_cli_va_t buf;
|
|
|
|
+ } ctrl; /* for cmd == TMEM_CONTROL */
|
|
|
|
+ struct {
|
|
|
|
+
|
|
|
|
+ uint64_t object;
|
|
|
|
+ uint32_t index;
|
|
|
|
+ uint32_t tmem_offset;
|
|
|
|
+ uint32_t pfn_offset;
|
|
|
|
+ uint32_t len;
|
|
|
|
+ tmem_cli_mfn_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);
|
|
|
|
+
|
|
|
|
+struct tmem_handle {
|
|
|
|
+ uint32_t pool_id;
|
|
|
|
+ uint32_t index;
|
|
|
|
+ uint64_t oid;
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+#endif
|
|
|
|
+
|
|
|
|
+#endif /* __XEN_PUBLIC_TMEM_H__ */
|
|
|
|
+
|
|
|
|
+/*
|
|
|
|
+ * Local variables:
|
|
|
|
+ * mode: C
|
|
|
|
+ * c-set-style: "BSD"
|
|
|
|
+ * c-basic-offset: 4
|
|
|
|
+ * tab-width: 4
|
|
|
|
+ * indent-tabs-mode: nil
|
|
|
|
+ * End:
|
|
|
|
+ */
|
|
|
|
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
|
2011-04-19 20:09:59 +00:00
|
|
|
+++ b/include/xen/interface/trace.h 2010-08-31 09:24:21.000000000 +0200
|
|
|
|
@@ -0,0 +1,230 @@
|
2010-07-07 11:12:45 +00:00
|
|
|
+/******************************************************************************
|
|
|
|
+ * 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_PM 0x0080f000 /* Xen power management trace */
|
2011-04-19 20:09:59 +00:00
|
|
|
+#define TRC_GUEST 0x0800f000 /* Guest-generated traces */
|
2010-07-07 11:12:45 +00:00
|
|
|
+#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_SCHED_MIN 0x00021000 /* Just runstate changes */
|
|
|
|
+#define TRC_SCHED_CLASS 0x00022000 /* Scheduler-specific */
|
|
|
|
+#define TRC_SCHED_VERBOSE 0x00028000 /* More inclusive scheduling */
|
|
|
|
+
|
|
|
|
+/* 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_TRACE_IRQ (TRC_GEN + 4)
|
|
|
|
+
|
|
|
|
+#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)
|
2011-04-19 20:09:59 +00:00
|
|
|
+#define TRC_SCHED_SHUTDOWN_CODE (TRC_SCHED_VERBOSE + 16)
|
2010-07-07 11:12:45 +00:00
|
|
|
+
|
|
|
|
+#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_HYPERCALL (TRC_PV + 1)
|
|
|
|
+#define TRC_PV_TRAP (TRC_PV + 3)
|
|
|
|
+#define TRC_PV_PAGE_FAULT (TRC_PV + 4)
|
|
|
|
+#define TRC_PV_FORCED_INVALID_OP (TRC_PV + 5)
|
|
|
|
+#define TRC_PV_EMULATE_PRIVOP (TRC_PV + 6)
|
|
|
|
+#define TRC_PV_EMULATE_4GB (TRC_PV + 7)
|
|
|
|
+#define TRC_PV_MATH_STATE_RESTORE (TRC_PV + 8)
|
|
|
|
+#define TRC_PV_PAGING_FIXUP (TRC_PV + 9)
|
|
|
|
+#define TRC_PV_GDT_LDT_MAPPING_FAULT (TRC_PV + 10)
|
|
|
|
+#define TRC_PV_PTWR_EMULATION (TRC_PV + 11)
|
|
|
|
+#define TRC_PV_PTWR_EMULATION_PAE (TRC_PV + 12)
|
|
|
|
+ /* Indicates that addresses in trace record are 64 bits */
|
|
|
|
+#define TRC_64_FLAG (0x100)
|
|
|
|
+
|
|
|
|
+#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_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)
|
2011-04-19 20:09:59 +00:00
|
|
|
+#define TRC_HVM_RDTSC (TRC_HVM_HANDLER + 0x1a)
|
2010-07-07 11:12:45 +00:00
|
|
|
+#define TRC_HVM_INTR_WINDOW (TRC_HVM_HANDLER + 0x20)
|
|
|
|
+#define TRC_HVM_NPF (TRC_HVM_HANDLER + 0x21)
|
|
|
|
+
|
|
|
|
+#define TRC_HVM_IOPORT_WRITE (TRC_HVM_HANDLER + 0x216)
|
|
|
|
+#define TRC_HVM_IOMEM_WRITE (TRC_HVM_HANDLER + 0x217)
|
|
|
|
+
|
|
|
|
+/* trace subclasses for power management */
|
|
|
|
+#define TRC_PM_FREQ 0x00801000 /* xen cpu freq events */
|
|
|
|
+#define TRC_PM_IDLE 0x00802000 /* xen cpu idle events */
|
|
|
|
+
|
|
|
|
+/* trace events for per class */
|
|
|
|
+#define TRC_PM_FREQ_CHANGE (TRC_PM_FREQ + 0x01)
|
|
|
|
+#define TRC_PM_IDLE_ENTRY (TRC_PM_IDLE + 0x01)
|
|
|
|
+#define TRC_PM_IDLE_EXIT (TRC_PM_IDLE + 0x02)
|
|
|
|
+
|
|
|
|
+/* 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-set-style: "BSD"
|
|
|
|
+ * c-basic-offset: 4
|
|
|
|
+ * tab-width: 4
|
|
|
|
+ * indent-tabs-mode: nil
|
|
|
|
+ * End:
|
|
|
|
+ */
|
|
|
|
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
|
2011-04-19 20:09:59 +00:00
|
|
|
+++ b/include/xen/interface/xen-compat.h 2010-01-04 11:56:34.000000000 +0100
|
2010-07-07 11:12:45 +00:00
|
|
|
@@ -0,0 +1,44 @@
|
|
|
|
+/******************************************************************************
|
|
|
|
+ * 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__ 0x0003020a
|
|
|
|
+
|
|
|
|
+#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
|
|
|
|
+
|
|
|
|
+#endif /* __XEN_PUBLIC_XEN_COMPAT_H__ */
|
|
|
|
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
|
2011-04-19 20:09:59 +00:00
|
|
|
+++ b/include/xen/interface/xenoprof.h 2010-08-31 09:24:21.000000000 +0200
|
|
|
|
@@ -0,0 +1,152 @@
|
2010-07-07 11:12:45 +00:00
|
|
|
+/******************************************************************************
|
|
|
|
+ * 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
|
2011-04-19 20:09:59 +00:00
|
|
|
+
|
|
|
|
+/* AMD IBS support */
|
|
|
|
+#define XENOPROF_get_ibs_caps 16
|
|
|
|
+#define XENOPROF_ibs_counter 17
|
|
|
|
+#define XENOPROF_last_op 17
|
2010-07-07 11:12:45 +00:00
|
|
|
+
|
|
|
|
+#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 ~0UL
|
|
|
|
+/* 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);
|
|
|
|
+
|
2011-04-19 20:09:59 +00:00
|
|
|
+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);
|
2010-07-07 11:12:45 +00:00
|
|
|
+
|
|
|
|
+#endif /* __XEN_PUBLIC_XENOPROF_H__ */
|
|
|
|
+
|
|
|
|
+/*
|
|
|
|
+ * Local variables:
|
|
|
|
+ * mode: C
|
|
|
|
+ * c-set-style: "BSD"
|
|
|
|
+ * c-basic-offset: 4
|
|
|
|
+ * tab-width: 4
|
|
|
|
+ * indent-tabs-mode: nil
|
|
|
|
+ * End:
|
|
|
|
+ */
|
|
|
|
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
|
2011-04-19 20:09:59 +00:00
|
|
|
+++ b/include/xen/interface/xsm/acm.h 2010-01-04 11:56:34.000000000 +0100
|
2010-07-07 11:12:45 +00:00
|
|
|
@@ -0,0 +1,223 @@
|
|
|
|
+/*
|
|
|
|
+ * acm.h: Xen access control module interface defintions
|
|
|
|
+ *
|
|
|
|
+ * 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.
|
|
|
|
+ *
|
|
|
|
+ * Reiner Sailer <sailer@watson.ibm.com>
|
|
|
|
+ * Copyright (c) 2005, International Business Machines Corporation.
|
|
|
|
+ */
|
|
|
|
+
|
|
|
|
+#ifndef _XEN_PUBLIC_ACM_H
|
|
|
|
+#define _XEN_PUBLIC_ACM_H
|
|
|
|
+
|
|
|
|
+#include "../xen.h"
|
|
|
|
+
|
|
|
|
+/* default ssid reference value if not supplied */
|
|
|
|
+#define ACM_DEFAULT_SSID 0x0
|
|
|
|
+#define ACM_DEFAULT_LOCAL_SSID 0x0
|
|
|
|
+
|
|
|
|
+/* Internal ACM ERROR types */
|
|
|
|
+#define ACM_OK 0
|
|
|
|
+#define ACM_UNDEF -1
|
|
|
|
+#define ACM_INIT_SSID_ERROR -2
|
|
|
|
+#define ACM_INIT_SOID_ERROR -3
|
|
|
|
+#define ACM_ERROR -4
|
|
|
|
+
|
|
|
|
+/* External ACCESS DECISIONS */
|
|
|
|
+#define ACM_ACCESS_PERMITTED 0
|
|
|
|
+#define ACM_ACCESS_DENIED -111
|
|
|
|
+#define ACM_NULL_POINTER_ERROR -200
|
|
|
|
+
|
|
|
|
+/*
|
|
|
|
+ Error codes reported in when trying to test for a new policy
|
|
|
|
+ These error codes are reported in an array of tuples where
|
|
|
|
+ each error code is followed by a parameter describing the error
|
|
|
|
+ more closely, such as a domain id.
|
|
|
|
+*/
|
|
|
|
+#define ACM_EVTCHN_SHARING_VIOLATION 0x100
|
|
|
|
+#define ACM_GNTTAB_SHARING_VIOLATION 0x101
|
|
|
|
+#define ACM_DOMAIN_LOOKUP 0x102
|
|
|
|
+#define ACM_CHWALL_CONFLICT 0x103
|
|
|
|
+#define ACM_SSIDREF_IN_USE 0x104
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+/* primary policy in lower 4 bits */
|
|
|
|
+#define ACM_NULL_POLICY 0
|
|
|
|
+#define ACM_CHINESE_WALL_POLICY 1
|
|
|
|
+#define ACM_SIMPLE_TYPE_ENFORCEMENT_POLICY 2
|
|
|
|
+#define ACM_POLICY_UNDEFINED 15
|
|
|
|
+
|
|
|
|
+/* combinations have secondary policy component in higher 4bit */
|
|
|
|
+#define ACM_CHINESE_WALL_AND_SIMPLE_TYPE_ENFORCEMENT_POLICY \
|
|
|
|
+ ((ACM_SIMPLE_TYPE_ENFORCEMENT_POLICY << 4) | ACM_CHINESE_WALL_POLICY)
|
|
|
|
+
|
|
|
|
+/* policy: */
|
|
|
|
+#define ACM_POLICY_NAME(X) \
|
|
|
|
+ ((X) == (ACM_NULL_POLICY)) ? "NULL" : \
|
|
|
|
+ ((X) == (ACM_CHINESE_WALL_POLICY)) ? "CHINESE WALL" : \
|
|
|
|
+ ((X) == (ACM_SIMPLE_TYPE_ENFORCEMENT_POLICY)) ? "SIMPLE TYPE ENFORCEMENT" : \
|
|
|
|
+ ((X) == (ACM_CHINESE_WALL_AND_SIMPLE_TYPE_ENFORCEMENT_POLICY)) ? "CHINESE WALL AND SIMPLE TYPE ENFORCEMENT" : \
|
|
|
|
+ "UNDEFINED"
|
|
|
|
+
|
|
|
|
+/* the following policy versions must be increased
|
|
|
|
+ * whenever the interpretation of the related
|
|
|
|
+ * policy's data structure changes
|
|
|
|
+ */
|
|
|
|
+#define ACM_POLICY_VERSION 4
|
|
|
|
+#define ACM_CHWALL_VERSION 1
|
|
|
|
+#define ACM_STE_VERSION 1
|
|
|
|
+
|
|
|
|
+/* defines a ssid reference used by xen */
|
|
|
|
+typedef uint32_t ssidref_t;
|
|
|
|
+
|
|
|
|
+/* hooks that are known to domains */
|
|
|
|
+#define ACMHOOK_none 0
|
|
|
|
+#define ACMHOOK_sharing 1
|
|
|
|
+#define ACMHOOK_authorization 2
|
|
|
|
+#define ACMHOOK_conflictset 3
|
|
|
|
+
|
|
|
|
+/* -------security policy relevant type definitions-------- */
|
|
|
|
+
|
|
|
|
+/* type identifier; compares to "equal" or "not equal" */
|
|
|
|
+typedef uint16_t domaintype_t;
|
|
|
|
+
|
|
|
|
+/* CHINESE WALL POLICY DATA STRUCTURES
|
|
|
|
+ *
|
|
|
|
+ * current accumulated conflict type set:
|
|
|
|
+ * When a domain is started and has a type that is in
|
|
|
|
+ * a conflict set, the conflicting types are incremented in
|
|
|
|
+ * the aggregate set. When a domain is destroyed, the
|
|
|
|
+ * conflicting types to its type are decremented.
|
|
|
|
+ * If a domain has multiple types, this procedure works over
|
|
|
|
+ * all those types.
|
|
|
|
+ *
|
|
|
|
+ * conflict_aggregate_set[i] holds the number of
|
|
|
|
+ * running domains that have a conflict with type i.
|
|
|
|
+ *
|
|
|
|
+ * running_types[i] holds the number of running domains
|
|
|
|
+ * that include type i in their ssidref-referenced type set
|
|
|
|
+ *
|
|
|
|
+ * conflict_sets[i][j] is "0" if type j has no conflict
|
|
|
|
+ * with type i and is "1" otherwise.
|
|
|
|
+ */
|
|
|
|
+/* high-16 = version, low-16 = check magic */
|
|
|
|
+#define ACM_MAGIC 0x0001debc
|
|
|
|
+
|
|
|
|
+/* size of the SHA1 hash identifying the XML policy from which the
|
|
|
|
+ binary policy was created */
|
|
|
|
+#define ACM_SHA1_HASH_SIZE 20
|
|
|
|
+
|
|
|
|
+/* each offset in bytes from start of the struct they
|
|
|
|
+ * are part of */
|
|
|
|
+
|
|
|
|
+/* V3 of the policy buffer aded a version structure */
|
|
|
|
+struct acm_policy_version
|
|
|
|
+{
|
|
|
|
+ uint32_t major;
|
|
|
|
+ uint32_t minor;
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+/* each buffer consists of all policy information for
|
|
|
|
+ * the respective policy given in the policy code
|
|
|
|
+ *
|
|
|
|
+ * acm_policy_buffer, acm_chwall_policy_buffer,
|
|
|
|
+ * and acm_ste_policy_buffer need to stay 32-bit aligned
|
|
|
|
+ * because we create binary policies also with external
|
|
|
|
+ * tools that assume packed representations (e.g. the java tool)
|
|
|
|
+ */
|
|
|
|
+struct acm_policy_buffer {
|
|
|
|
+ uint32_t magic;
|
|
|
|
+ uint32_t policy_version; /* ACM_POLICY_VERSION */
|
|
|
|
+ uint32_t len;
|
|
|
|
+ uint32_t policy_reference_offset;
|
|
|
|
+ uint32_t primary_policy_code;
|
|
|
|
+ uint32_t primary_buffer_offset;
|
|
|
|
+ uint32_t secondary_policy_code;
|
|
|
|
+ uint32_t secondary_buffer_offset;
|
|
|
|
+ struct acm_policy_version xml_pol_version; /* add in V3 */
|
|
|
|
+ uint8_t xml_policy_hash[ACM_SHA1_HASH_SIZE]; /* added in V4 */
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+struct acm_policy_reference_buffer {
|
|
|
|
+ uint32_t len;
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+struct acm_chwall_policy_buffer {
|
|
|
|
+ uint32_t policy_version; /* ACM_CHWALL_VERSION */
|
|
|
|
+ uint32_t policy_code;
|
|
|
|
+ uint32_t chwall_max_types;
|
|
|
|
+ uint32_t chwall_max_ssidrefs;
|
|
|
|
+ uint32_t chwall_max_conflictsets;
|
|
|
|
+ uint32_t chwall_ssid_offset;
|
|
|
|
+ uint32_t chwall_conflict_sets_offset;
|
|
|
|
+ uint32_t chwall_running_types_offset;
|
|
|
|
+ uint32_t chwall_conflict_aggregate_offset;
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+struct acm_ste_policy_buffer {
|
|
|
|
+ uint32_t policy_version; /* ACM_STE_VERSION */
|
|
|
|
+ uint32_t policy_code;
|
|
|
|
+ uint32_t ste_max_types;
|
|
|
|
+ uint32_t ste_max_ssidrefs;
|
|
|
|
+ uint32_t ste_ssid_offset;
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+struct acm_stats_buffer {
|
|
|
|
+ uint32_t magic;
|
|
|
|
+ uint32_t len;
|
|
|
|
+ uint32_t primary_policy_code;
|
|
|
|
+ uint32_t primary_stats_offset;
|
|
|
|
+ uint32_t secondary_policy_code;
|
|
|
|
+ uint32_t secondary_stats_offset;
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+struct acm_ste_stats_buffer {
|
|
|
|
+ uint32_t ec_eval_count;
|
|
|
|
+ uint32_t gt_eval_count;
|
|
|
|
+ uint32_t ec_denied_count;
|
|
|
|
+ uint32_t gt_denied_count;
|
|
|
|
+ uint32_t ec_cachehit_count;
|
|
|
|
+ uint32_t gt_cachehit_count;
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+struct acm_ssid_buffer {
|
|
|
|
+ uint32_t len;
|
|
|
|
+ ssidref_t ssidref;
|
|
|
|
+ uint32_t policy_reference_offset;
|
|
|
|
+ uint32_t primary_policy_code;
|
|
|
|
+ uint32_t primary_max_types;
|
|
|
|
+ uint32_t primary_types_offset;
|
|
|
|
+ uint32_t secondary_policy_code;
|
|
|
|
+ uint32_t secondary_max_types;
|
|
|
|
+ uint32_t secondary_types_offset;
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+#endif
|
|
|
|
+
|
|
|
|
+/*
|
|
|
|
+ * Local variables:
|
|
|
|
+ * mode: C
|
|
|
|
+ * c-set-style: "BSD"
|
|
|
|
+ * c-basic-offset: 4
|
|
|
|
+ * tab-width: 4
|
|
|
|
+ * indent-tabs-mode: nil
|
|
|
|
+ * End:
|
|
|
|
+ */
|
|
|
|
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
|
2011-04-19 20:09:59 +00:00
|
|
|
+++ b/include/xen/interface/xsm/acm_ops.h 2007-10-22 13:39:15.000000000 +0200
|
2010-07-07 11:12:45 +00:00
|
|
|
@@ -0,0 +1,159 @@
|
|
|
|
+/*
|
|
|
|
+ * acm_ops.h: Xen access control module hypervisor commands
|
|
|
|
+ *
|
|
|
|
+ * 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.
|
|
|
|
+ *
|
|
|
|
+ * Reiner Sailer <sailer@watson.ibm.com>
|
|
|
|
+ * Copyright (c) 2005,2006 International Business Machines Corporation.
|
|
|
|
+ */
|
|
|
|
+
|
|
|
|
+#ifndef __XEN_PUBLIC_ACM_OPS_H__
|
|
|
|
+#define __XEN_PUBLIC_ACM_OPS_H__
|
|
|
|
+
|
|
|
|
+#include "../xen.h"
|
|
|
|
+#include "acm.h"
|
|
|
|
+
|
|
|
|
+/*
|
|
|
|
+ * Make sure you increment the interface version whenever you modify this file!
|
|
|
|
+ * This makes sure that old versions of acm tools will stop working in a
|
|
|
|
+ * well-defined way (rather than crashing the machine, for instance).
|
|
|
|
+ */
|
|
|
|
+#define ACM_INTERFACE_VERSION 0xAAAA000A
|
|
|
|
+
|
|
|
|
+/************************************************************************/
|
|
|
|
+
|
|
|
|
+/*
|
|
|
|
+ * Prototype for this hypercall is:
|
|
|
|
+ * int acm_op(int cmd, void *args)
|
|
|
|
+ * @cmd == ACMOP_??? (access control module operation).
|
|
|
|
+ * @args == Operation-specific extra arguments (NULL if none).
|
|
|
|
+ */
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+#define ACMOP_setpolicy 1
|
|
|
|
+struct acm_setpolicy {
|
|
|
|
+ /* IN */
|
|
|
|
+ XEN_GUEST_HANDLE_64(void) pushcache;
|
|
|
|
+ uint32_t pushcache_size;
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+#define ACMOP_getpolicy 2
|
|
|
|
+struct acm_getpolicy {
|
|
|
|
+ /* IN */
|
|
|
|
+ XEN_GUEST_HANDLE_64(void) pullcache;
|
|
|
|
+ uint32_t pullcache_size;
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+#define ACMOP_dumpstats 3
|
|
|
|
+struct acm_dumpstats {
|
|
|
|
+ /* IN */
|
|
|
|
+ XEN_GUEST_HANDLE_64(void) pullcache;
|
|
|
|
+ uint32_t pullcache_size;
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+#define ACMOP_getssid 4
|
|
|
|
+#define ACM_GETBY_ssidref 1
|
|
|
|
+#define ACM_GETBY_domainid 2
|
|
|
|
+struct acm_getssid {
|
|
|
|
+ /* IN */
|
|
|
|
+ uint32_t get_ssid_by; /* ACM_GETBY_* */
|
|
|
|
+ union {
|
|
|
|
+ domaintype_t domainid;
|
|
|
|
+ ssidref_t ssidref;
|
|
|
|
+ } id;
|
|
|
|
+ XEN_GUEST_HANDLE_64(void) ssidbuf;
|
|
|
|
+ uint32_t ssidbuf_size;
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+#define ACMOP_getdecision 5
|
|
|
|
+struct acm_getdecision {
|
|
|
|
+ /* IN */
|
|
|
|
+ uint32_t get_decision_by1; /* ACM_GETBY_* */
|
|
|
|
+ uint32_t get_decision_by2; /* ACM_GETBY_* */
|
|
|
|
+ union {
|
|
|
|
+ domaintype_t domainid;
|
|
|
|
+ ssidref_t ssidref;
|
|
|
|
+ } id1;
|
|
|
|
+ union {
|
|
|
|
+ domaintype_t domainid;
|
|
|
|
+ ssidref_t ssidref;
|
|
|
|
+ } id2;
|
|
|
|
+ uint32_t hook;
|
|
|
|
+ /* OUT */
|
|
|
|
+ uint32_t acm_decision;
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+#define ACMOP_chgpolicy 6
|
|
|
|
+struct acm_change_policy {
|
|
|
|
+ /* IN */
|
|
|
|
+ XEN_GUEST_HANDLE_64(void) policy_pushcache;
|
|
|
|
+ uint32_t policy_pushcache_size;
|
|
|
|
+ XEN_GUEST_HANDLE_64(void) del_array;
|
|
|
|
+ uint32_t delarray_size;
|
|
|
|
+ XEN_GUEST_HANDLE_64(void) chg_array;
|
|
|
|
+ uint32_t chgarray_size;
|
|
|
|
+ /* OUT */
|
|
|
|
+ /* array with error code */
|
|
|
|
+ XEN_GUEST_HANDLE_64(void) err_array;
|
|
|
|
+ uint32_t errarray_size;
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+#define ACMOP_relabeldoms 7
|
|
|
|
+struct acm_relabel_doms {
|
|
|
|
+ /* IN */
|
|
|
|
+ XEN_GUEST_HANDLE_64(void) relabel_map;
|
|
|
|
+ uint32_t relabel_map_size;
|
|
|
|
+ /* OUT */
|
|
|
|
+ XEN_GUEST_HANDLE_64(void) err_array;
|
|
|
|
+ uint32_t errarray_size;
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+/* future interface to Xen */
|
|
|
|
+struct xen_acmctl {
|
|
|
|
+ uint32_t cmd;
|
|
|
|
+ uint32_t interface_version;
|
|
|
|
+ union {
|
|
|
|
+ struct acm_setpolicy setpolicy;
|
|
|
|
+ struct acm_getpolicy getpolicy;
|
|
|
|
+ struct acm_dumpstats dumpstats;
|
|
|
|
+ struct acm_getssid getssid;
|
|
|
|
+ struct acm_getdecision getdecision;
|
|
|
|
+ struct acm_change_policy change_policy;
|
|
|
|
+ struct acm_relabel_doms relabel_doms;
|
|
|
|
+ } u;
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+typedef struct xen_acmctl xen_acmctl_t;
|
|
|
|
+DEFINE_XEN_GUEST_HANDLE(xen_acmctl_t);
|
|
|
|
+
|
|
|
|
+#endif /* __XEN_PUBLIC_ACM_OPS_H__ */
|
|
|
|
+
|
|
|
|
+/*
|
|
|
|
+ * Local variables:
|
|
|
|
+ * mode: C
|
|
|
|
+ * c-set-style: "BSD"
|
|
|
|
+ * c-basic-offset: 4
|
|
|
|
+ * tab-width: 4
|
|
|
|
+ * indent-tabs-mode: nil
|
|
|
|
+ * End:
|
|
|
|
+ */
|
|
|
|
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
|
2011-04-19 20:09:59 +00:00
|
|
|
+++ b/include/xen/interface/xsm/flask_op.h 2010-01-04 11:56:34.000000000 +0100
|
2010-07-07 11:12:45 +00:00
|
|
|
@@ -0,0 +1,47 @@
|
|
|
|
+/*
|
|
|
|
+ * This file contains the flask_op hypercall commands and definitions.
|
|
|
|
+ *
|
|
|
|
+ * Author: George Coker, <gscoker@alpha.ncsc.mil>
|
|
|
|
+ *
|
|
|
|
+ * This program is free software; you can redistribute it and/or modify
|
|
|
|
+ * it under the terms of the GNU General Public License version 2,
|
|
|
|
+ * as published by the Free Software Foundation.
|
|
|
|
+ */
|
|
|
|
+
|
|
|
|
+#ifndef __FLASK_OP_H__
|
|
|
|
+#define __FLASK_OP_H__
|
|
|
|
+
|
|
|
|
+#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
|
|
|
|
+#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_LAST FLASK_DEL_OCONTEXT
|
|
|
|
+
|
|
|
|
+typedef struct flask_op {
|
|
|
|
+ uint32_t cmd;
|
|
|
|
+ uint32_t size;
|
|
|
|
+ char *buf;
|
|
|
|
+} flask_op_t;
|
|
|
|
+
|
|
|
|
+DEFINE_XEN_GUEST_HANDLE(flask_op_t);
|
|
|
|
+
|
|
|
|
+#endif
|