Merge branch 'xenarm-for-linus' of git://xenbits.xen.org/people/sstabellini/linux-pvhvm into stable/for-linus-3.7
* 'xenarm-for-linus' of git://xenbits.xen.org/people/sstabellini/linux-pvhvm: arm: introduce a DTS for Xen unprivileged virtual machines MAINTAINERS: add myself as Xen ARM maintainer xen/arm: compile netback xen/arm: compile blkfront and blkback xen/arm: implement alloc/free_xenballooned_pages with alloc_pages/kfree xen/arm: receive Xen events on ARM xen/arm: initialize grant_table on ARM xen/arm: get privilege status xen/arm: introduce CONFIG_XEN on ARM xen: do not compile manage, balloon, pci, acpi, pcpu and cpu_hotplug on ARM xen/arm: Introduce xen_ulong_t for unsigned long xen/arm: Xen detection and shared_info page mapping docs: Xen ARM DT bindings xen/arm: empty implementation of grant_table arch specific functions xen/arm: sync_bitops xen/arm: page.h definitions xen/arm: hypercalls arm: initial Xen support Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
This commit is contained in:
commit
ae1659ee6b
35 changed files with 783 additions and 18 deletions
25
Documentation/devicetree/bindings/arm/xen.txt
Normal file
25
Documentation/devicetree/bindings/arm/xen.txt
Normal file
|
@ -0,0 +1,25 @@
|
|||
* Xen hypervisor device tree bindings
|
||||
|
||||
Xen ARM virtual platforms shall have a top-level "hypervisor" node with
|
||||
the following properties:
|
||||
|
||||
- compatible:
|
||||
compatible = "xen,xen-<version>", "xen,xen";
|
||||
where <version> is the version of the Xen ABI of the platform.
|
||||
|
||||
- reg: specifies the base physical address and size of a region in
|
||||
memory where the grant table should be mapped to, using an
|
||||
HYPERVISOR_memory_op hypercall. The memory region is large enough to map
|
||||
the whole grant table (it is larger or equal to gnttab_max_grant_frames()).
|
||||
|
||||
- interrupts: the interrupt used by Xen to inject event notifications.
|
||||
A GIC node is also required.
|
||||
|
||||
|
||||
Example (assuming #address-cells = <2> and #size-cells = <2>):
|
||||
|
||||
hypervisor {
|
||||
compatible = "xen,xen-4.3", "xen,xen";
|
||||
reg = <0 0xb0000000 0 0x20000>;
|
||||
interrupts = <1 15 0xf08>;
|
||||
};
|
|
@ -7752,6 +7752,13 @@ F: drivers/xen/
|
|||
F: arch/x86/include/asm/xen/
|
||||
F: include/xen/
|
||||
|
||||
XEN HYPERVISOR ARM
|
||||
M: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
|
||||
L: xen-devel@lists.xensource.com (moderated for non-subscribers)
|
||||
S: Supported
|
||||
F: arch/arm/xen/
|
||||
F: arch/arm/include/asm/xen/
|
||||
|
||||
XEN NETWORK BACKEND DRIVER
|
||||
M: Ian Campbell <ian.campbell@citrix.com>
|
||||
L: xen-devel@lists.xensource.com (moderated for non-subscribers)
|
||||
|
|
|
@ -1897,6 +1897,16 @@ config DEPRECATED_PARAM_STRUCT
|
|||
This was deprecated in 2001 and announced to live on for 5 years.
|
||||
Some old boot loaders still use this way.
|
||||
|
||||
config XEN_DOM0
|
||||
def_bool y
|
||||
depends on XEN
|
||||
|
||||
config XEN
|
||||
bool "Xen guest support on ARM (EXPERIMENTAL)"
|
||||
depends on EXPERIMENTAL && ARM && OF
|
||||
help
|
||||
Say Y if you want to run Linux in a Virtual Machine on Xen on ARM.
|
||||
|
||||
endmenu
|
||||
|
||||
menu "Boot options"
|
||||
|
|
|
@ -251,6 +251,7 @@ endif
|
|||
core-$(CONFIG_FPE_NWFPE) += arch/arm/nwfpe/
|
||||
core-$(CONFIG_FPE_FASTFPE) += $(FASTFPE_OBJ)
|
||||
core-$(CONFIG_VFP) += arch/arm/vfp/
|
||||
core-$(CONFIG_XEN) += arch/arm/xen/
|
||||
|
||||
# If we have a machine-specific directory, then include it in the build.
|
||||
core-y += arch/arm/kernel/ arch/arm/mm/ arch/arm/common/
|
||||
|
|
68
arch/arm/boot/dts/xenvm-4.2.dts
Normal file
68
arch/arm/boot/dts/xenvm-4.2.dts
Normal file
|
@ -0,0 +1,68 @@
|
|||
/*
|
||||
* Xen Virtual Machine for unprivileged guests
|
||||
*
|
||||
* Based on ARM Ltd. Versatile Express CoreTile Express (single CPU)
|
||||
* Cortex-A15 MPCore (V2P-CA15)
|
||||
*
|
||||
*/
|
||||
|
||||
/dts-v1/;
|
||||
|
||||
/ {
|
||||
model = "XENVM-4.2";
|
||||
compatible = "xen,xenvm-4.2", "xen,xenvm";
|
||||
interrupt-parent = <&gic>;
|
||||
#address-cells = <2>;
|
||||
#size-cells = <2>;
|
||||
|
||||
chosen {
|
||||
/* this field is going to be adjusted by the hypervisor */
|
||||
bootargs = "console=hvc0 root=/dev/xvda";
|
||||
};
|
||||
|
||||
cpus {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
||||
cpu@0 {
|
||||
device_type = "cpu";
|
||||
compatible = "arm,cortex-a15";
|
||||
reg = <0>;
|
||||
};
|
||||
};
|
||||
|
||||
memory@80000000 {
|
||||
device_type = "memory";
|
||||
/* this field is going to be adjusted by the hypervisor */
|
||||
reg = <0 0x80000000 0 0x08000000>;
|
||||
};
|
||||
|
||||
gic: interrupt-controller@2c001000 {
|
||||
compatible = "arm,cortex-a15-gic", "arm,cortex-a9-gic";
|
||||
#interrupt-cells = <3>;
|
||||
#address-cells = <0>;
|
||||
interrupt-controller;
|
||||
reg = <0 0x2c001000 0 0x1000>,
|
||||
<0 0x2c002000 0 0x100>;
|
||||
};
|
||||
|
||||
timer {
|
||||
compatible = "arm,armv7-timer";
|
||||
interrupts = <1 13 0xf08>,
|
||||
<1 14 0xf08>,
|
||||
<1 11 0xf08>,
|
||||
<1 10 0xf08>;
|
||||
};
|
||||
|
||||
hypervisor {
|
||||
compatible = "xen,xen-4.2", "xen,xen";
|
||||
/* this field is going to be adjusted by the hypervisor */
|
||||
reg = <0 0xb0000000 0 0x20000>;
|
||||
/* this field is going to be adjusted by the hypervisor */
|
||||
interrupts = <1 15 0xf08>;
|
||||
};
|
||||
|
||||
motherboard {
|
||||
arm,v2m-memory-map = "rs1";
|
||||
};
|
||||
};
|
6
arch/arm/include/asm/hypervisor.h
Normal file
6
arch/arm/include/asm/hypervisor.h
Normal file
|
@ -0,0 +1,6 @@
|
|||
#ifndef _ASM_ARM_HYPERVISOR_H
|
||||
#define _ASM_ARM_HYPERVISOR_H
|
||||
|
||||
#include <asm/xen/hypervisor.h>
|
||||
|
||||
#endif
|
27
arch/arm/include/asm/sync_bitops.h
Normal file
27
arch/arm/include/asm/sync_bitops.h
Normal file
|
@ -0,0 +1,27 @@
|
|||
#ifndef __ASM_SYNC_BITOPS_H__
|
||||
#define __ASM_SYNC_BITOPS_H__
|
||||
|
||||
#include <asm/bitops.h>
|
||||
#include <asm/system.h>
|
||||
|
||||
/* sync_bitops functions are equivalent to the SMP implementation of the
|
||||
* original functions, independently from CONFIG_SMP being defined.
|
||||
*
|
||||
* We need them because _set_bit etc are not SMP safe if !CONFIG_SMP. But
|
||||
* under Xen you might be communicating with a completely external entity
|
||||
* who might be on another CPU (e.g. two uniprocessor guests communicating
|
||||
* via event channels and grant tables). So we need a variant of the bit
|
||||
* ops which are SMP safe even on a UP kernel.
|
||||
*/
|
||||
|
||||
#define sync_set_bit(nr, p) _set_bit(nr, p)
|
||||
#define sync_clear_bit(nr, p) _clear_bit(nr, p)
|
||||
#define sync_change_bit(nr, p) _change_bit(nr, p)
|
||||
#define sync_test_and_set_bit(nr, p) _test_and_set_bit(nr, p)
|
||||
#define sync_test_and_clear_bit(nr, p) _test_and_clear_bit(nr, p)
|
||||
#define sync_test_and_change_bit(nr, p) _test_and_change_bit(nr, p)
|
||||
#define sync_test_bit(nr, addr) test_bit(nr, addr)
|
||||
#define sync_cmpxchg cmpxchg
|
||||
|
||||
|
||||
#endif
|
18
arch/arm/include/asm/xen/events.h
Normal file
18
arch/arm/include/asm/xen/events.h
Normal file
|
@ -0,0 +1,18 @@
|
|||
#ifndef _ASM_ARM_XEN_EVENTS_H
|
||||
#define _ASM_ARM_XEN_EVENTS_H
|
||||
|
||||
#include <asm/ptrace.h>
|
||||
|
||||
enum ipi_vector {
|
||||
XEN_PLACEHOLDER_VECTOR,
|
||||
|
||||
/* Xen IPIs go here */
|
||||
XEN_NR_IPIS,
|
||||
};
|
||||
|
||||
static inline int xen_irqs_disabled(struct pt_regs *regs)
|
||||
{
|
||||
return raw_irqs_disabled_flags(regs->ARM_cpsr);
|
||||
}
|
||||
|
||||
#endif /* _ASM_ARM_XEN_EVENTS_H */
|
69
arch/arm/include/asm/xen/hypercall.h
Normal file
69
arch/arm/include/asm/xen/hypercall.h
Normal file
|
@ -0,0 +1,69 @@
|
|||
/******************************************************************************
|
||||
* hypercall.h
|
||||
*
|
||||
* Linux-specific hypervisor handling.
|
||||
*
|
||||
* Stefano Stabellini <stefano.stabellini@eu.citrix.com>, Citrix, 2012
|
||||
*
|
||||
* 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; or, when distributed
|
||||
* separately from the Linux kernel or incorporated into other
|
||||
* software packages, subject to the following license:
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this source file (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 _ASM_ARM_XEN_HYPERCALL_H
|
||||
#define _ASM_ARM_XEN_HYPERCALL_H
|
||||
|
||||
#include <xen/interface/xen.h>
|
||||
|
||||
long privcmd_call(unsigned call, unsigned long a1,
|
||||
unsigned long a2, unsigned long a3,
|
||||
unsigned long a4, unsigned long a5);
|
||||
int HYPERVISOR_xen_version(int cmd, void *arg);
|
||||
int HYPERVISOR_console_io(int cmd, int count, char *str);
|
||||
int HYPERVISOR_grant_table_op(unsigned int cmd, void *uop, unsigned int count);
|
||||
int HYPERVISOR_sched_op(int cmd, void *arg);
|
||||
int HYPERVISOR_event_channel_op(int cmd, void *arg);
|
||||
unsigned long HYPERVISOR_hvm_op(int op, void *arg);
|
||||
int HYPERVISOR_memory_op(unsigned int cmd, void *arg);
|
||||
int HYPERVISOR_physdev_op(int cmd, void *arg);
|
||||
|
||||
static inline void
|
||||
MULTI_update_va_mapping(struct multicall_entry *mcl, unsigned long va,
|
||||
unsigned int new_val, unsigned long flags)
|
||||
{
|
||||
BUG();
|
||||
}
|
||||
|
||||
static inline void
|
||||
MULTI_mmu_update(struct multicall_entry *mcl, struct mmu_update *req,
|
||||
int count, int *success_count, domid_t domid)
|
||||
{
|
||||
BUG();
|
||||
}
|
||||
|
||||
static inline int
|
||||
HYPERVISOR_multicall(void *call_list, int nr_calls)
|
||||
{
|
||||
BUG();
|
||||
}
|
||||
#endif /* _ASM_ARM_XEN_HYPERCALL_H */
|
19
arch/arm/include/asm/xen/hypervisor.h
Normal file
19
arch/arm/include/asm/xen/hypervisor.h
Normal file
|
@ -0,0 +1,19 @@
|
|||
#ifndef _ASM_ARM_XEN_HYPERVISOR_H
|
||||
#define _ASM_ARM_XEN_HYPERVISOR_H
|
||||
|
||||
extern struct shared_info *HYPERVISOR_shared_info;
|
||||
extern struct start_info *xen_start_info;
|
||||
|
||||
/* Lazy mode for batching updates / context switch */
|
||||
enum paravirt_lazy_mode {
|
||||
PARAVIRT_LAZY_NONE,
|
||||
PARAVIRT_LAZY_MMU,
|
||||
PARAVIRT_LAZY_CPU,
|
||||
};
|
||||
|
||||
static inline enum paravirt_lazy_mode paravirt_get_lazy_mode(void)
|
||||
{
|
||||
return PARAVIRT_LAZY_NONE;
|
||||
}
|
||||
|
||||
#endif /* _ASM_ARM_XEN_HYPERVISOR_H */
|
73
arch/arm/include/asm/xen/interface.h
Normal file
73
arch/arm/include/asm/xen/interface.h
Normal file
|
@ -0,0 +1,73 @@
|
|||
/******************************************************************************
|
||||
* Guest OS interface to ARM Xen.
|
||||
*
|
||||
* Stefano Stabellini <stefano.stabellini@eu.citrix.com>, Citrix, 2012
|
||||
*/
|
||||
|
||||
#ifndef _ASM_ARM_XEN_INTERFACE_H
|
||||
#define _ASM_ARM_XEN_INTERFACE_H
|
||||
|
||||
#include <linux/types.h>
|
||||
|
||||
#define uint64_aligned_t uint64_t __attribute__((aligned(8)))
|
||||
|
||||
#define __DEFINE_GUEST_HANDLE(name, type) \
|
||||
typedef struct { union { type *p; uint64_aligned_t q; }; } \
|
||||
__guest_handle_ ## name
|
||||
|
||||
#define DEFINE_GUEST_HANDLE_STRUCT(name) \
|
||||
__DEFINE_GUEST_HANDLE(name, struct name)
|
||||
#define DEFINE_GUEST_HANDLE(name) __DEFINE_GUEST_HANDLE(name, name)
|
||||
#define GUEST_HANDLE(name) __guest_handle_ ## name
|
||||
|
||||
#define set_xen_guest_handle(hnd, val) \
|
||||
do { \
|
||||
if (sizeof(hnd) == 8) \
|
||||
*(uint64_t *)&(hnd) = 0; \
|
||||
(hnd).p = val; \
|
||||
} while (0)
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
/* Explicitly size integers that represent pfns in the interface with
|
||||
* Xen so that we can have one ABI that works for 32 and 64 bit guests. */
|
||||
typedef uint64_t xen_pfn_t;
|
||||
typedef uint64_t xen_ulong_t;
|
||||
/* Guest handles for primitive C types. */
|
||||
__DEFINE_GUEST_HANDLE(uchar, unsigned char);
|
||||
__DEFINE_GUEST_HANDLE(uint, unsigned int);
|
||||
__DEFINE_GUEST_HANDLE(ulong, unsigned long);
|
||||
DEFINE_GUEST_HANDLE(char);
|
||||
DEFINE_GUEST_HANDLE(int);
|
||||
DEFINE_GUEST_HANDLE(long);
|
||||
DEFINE_GUEST_HANDLE(void);
|
||||
DEFINE_GUEST_HANDLE(uint64_t);
|
||||
DEFINE_GUEST_HANDLE(uint32_t);
|
||||
DEFINE_GUEST_HANDLE(xen_pfn_t);
|
||||
|
||||
/* Maximum number of virtual CPUs in multi-processor guests. */
|
||||
#define MAX_VIRT_CPUS 1
|
||||
|
||||
struct arch_vcpu_info { };
|
||||
struct arch_shared_info { };
|
||||
|
||||
/* TODO: Move pvclock definitions some place arch independent */
|
||||
struct pvclock_vcpu_time_info {
|
||||
u32 version;
|
||||
u32 pad0;
|
||||
u64 tsc_timestamp;
|
||||
u64 system_time;
|
||||
u32 tsc_to_system_mul;
|
||||
s8 tsc_shift;
|
||||
u8 flags;
|
||||
u8 pad[2];
|
||||
} __attribute__((__packed__)); /* 32 bytes */
|
||||
|
||||
/* It is OK to have a 12 bytes struct with no padding because it is packed */
|
||||
struct pvclock_wall_clock {
|
||||
u32 version;
|
||||
u32 sec;
|
||||
u32 nsec;
|
||||
} __attribute__((__packed__));
|
||||
#endif
|
||||
|
||||
#endif /* _ASM_ARM_XEN_INTERFACE_H */
|
82
arch/arm/include/asm/xen/page.h
Normal file
82
arch/arm/include/asm/xen/page.h
Normal file
|
@ -0,0 +1,82 @@
|
|||
#ifndef _ASM_ARM_XEN_PAGE_H
|
||||
#define _ASM_ARM_XEN_PAGE_H
|
||||
|
||||
#include <asm/page.h>
|
||||
#include <asm/pgtable.h>
|
||||
|
||||
#include <linux/pfn.h>
|
||||
#include <linux/types.h>
|
||||
|
||||
#include <xen/interface/grant_table.h>
|
||||
|
||||
#define pfn_to_mfn(pfn) (pfn)
|
||||
#define phys_to_machine_mapping_valid (1)
|
||||
#define mfn_to_pfn(mfn) (mfn)
|
||||
#define mfn_to_virt(m) (__va(mfn_to_pfn(m) << PAGE_SHIFT))
|
||||
|
||||
#define pte_mfn pte_pfn
|
||||
#define mfn_pte pfn_pte
|
||||
|
||||
/* Xen machine address */
|
||||
typedef struct xmaddr {
|
||||
phys_addr_t maddr;
|
||||
} xmaddr_t;
|
||||
|
||||
/* Xen pseudo-physical address */
|
||||
typedef struct xpaddr {
|
||||
phys_addr_t paddr;
|
||||
} xpaddr_t;
|
||||
|
||||
#define XMADDR(x) ((xmaddr_t) { .maddr = (x) })
|
||||
#define XPADDR(x) ((xpaddr_t) { .paddr = (x) })
|
||||
|
||||
static inline xmaddr_t phys_to_machine(xpaddr_t phys)
|
||||
{
|
||||
unsigned offset = phys.paddr & ~PAGE_MASK;
|
||||
return XMADDR(PFN_PHYS(pfn_to_mfn(PFN_DOWN(phys.paddr))) | offset);
|
||||
}
|
||||
|
||||
static inline xpaddr_t machine_to_phys(xmaddr_t machine)
|
||||
{
|
||||
unsigned offset = machine.maddr & ~PAGE_MASK;
|
||||
return XPADDR(PFN_PHYS(mfn_to_pfn(PFN_DOWN(machine.maddr))) | offset);
|
||||
}
|
||||
/* VIRT <-> MACHINE conversion */
|
||||
#define virt_to_machine(v) (phys_to_machine(XPADDR(__pa(v))))
|
||||
#define virt_to_pfn(v) (PFN_DOWN(__pa(v)))
|
||||
#define virt_to_mfn(v) (pfn_to_mfn(virt_to_pfn(v)))
|
||||
#define mfn_to_virt(m) (__va(mfn_to_pfn(m) << PAGE_SHIFT))
|
||||
|
||||
static inline xmaddr_t arbitrary_virt_to_machine(void *vaddr)
|
||||
{
|
||||
/* TODO: assuming it is mapped in the kernel 1:1 */
|
||||
return virt_to_machine(vaddr);
|
||||
}
|
||||
|
||||
/* TODO: this shouldn't be here but it is because the frontend drivers
|
||||
* are using it (its rolled in headers) even though we won't hit the code path.
|
||||
* So for right now just punt with this.
|
||||
*/
|
||||
static inline pte_t *lookup_address(unsigned long address, unsigned int *level)
|
||||
{
|
||||
BUG();
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static inline int m2p_add_override(unsigned long mfn, struct page *page,
|
||||
struct gnttab_map_grant_ref *kmap_op)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int m2p_remove_override(struct page *page, bool clear_pte)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline bool set_phys_to_machine(unsigned long pfn, unsigned long mfn)
|
||||
{
|
||||
BUG();
|
||||
return false;
|
||||
}
|
||||
#endif /* _ASM_ARM_XEN_PAGE_H */
|
|
@ -7,4 +7,5 @@ initrd_phys-y := 0x60800000
|
|||
dtb-$(CONFIG_ARCH_VEXPRESS_DT) += vexpress-v2p-ca5s.dtb \
|
||||
vexpress-v2p-ca9.dtb \
|
||||
vexpress-v2p-ca15-tc1.dtb \
|
||||
vexpress-v2p-ca15_a7.dtb
|
||||
vexpress-v2p-ca15_a7.dtb \
|
||||
xenvm-4.2.dtb
|
||||
|
|
|
@ -658,6 +658,7 @@ static void __init v2m_dt_init(void)
|
|||
|
||||
const static char *v2m_dt_match[] __initconst = {
|
||||
"arm,vexpress",
|
||||
"xen,xenvm",
|
||||
NULL,
|
||||
};
|
||||
|
||||
|
|
1
arch/arm/xen/Makefile
Normal file
1
arch/arm/xen/Makefile
Normal file
|
@ -0,0 +1 @@
|
|||
obj-y := enlighten.o hypercall.o grant-table.o
|
168
arch/arm/xen/enlighten.c
Normal file
168
arch/arm/xen/enlighten.c
Normal file
|
@ -0,0 +1,168 @@
|
|||
#include <xen/xen.h>
|
||||
#include <xen/events.h>
|
||||
#include <xen/grant_table.h>
|
||||
#include <xen/hvm.h>
|
||||
#include <xen/interface/xen.h>
|
||||
#include <xen/interface/memory.h>
|
||||
#include <xen/interface/hvm/params.h>
|
||||
#include <xen/features.h>
|
||||
#include <xen/platform_pci.h>
|
||||
#include <xen/xenbus.h>
|
||||
#include <asm/xen/hypervisor.h>
|
||||
#include <asm/xen/hypercall.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/irqreturn.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/of_irq.h>
|
||||
#include <linux/of_address.h>
|
||||
|
||||
struct start_info _xen_start_info;
|
||||
struct start_info *xen_start_info = &_xen_start_info;
|
||||
EXPORT_SYMBOL_GPL(xen_start_info);
|
||||
|
||||
enum xen_domain_type xen_domain_type = XEN_NATIVE;
|
||||
EXPORT_SYMBOL_GPL(xen_domain_type);
|
||||
|
||||
struct shared_info xen_dummy_shared_info;
|
||||
struct shared_info *HYPERVISOR_shared_info = (void *)&xen_dummy_shared_info;
|
||||
|
||||
DEFINE_PER_CPU(struct vcpu_info *, xen_vcpu);
|
||||
|
||||
/* TODO: to be removed */
|
||||
__read_mostly int xen_have_vector_callback;
|
||||
EXPORT_SYMBOL_GPL(xen_have_vector_callback);
|
||||
|
||||
int xen_platform_pci_unplug = XEN_UNPLUG_ALL;
|
||||
EXPORT_SYMBOL_GPL(xen_platform_pci_unplug);
|
||||
|
||||
static __read_mostly int xen_events_irq = -1;
|
||||
|
||||
int xen_remap_domain_mfn_range(struct vm_area_struct *vma,
|
||||
unsigned long addr,
|
||||
unsigned long mfn, int nr,
|
||||
pgprot_t prot, unsigned domid)
|
||||
{
|
||||
return -ENOSYS;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(xen_remap_domain_mfn_range);
|
||||
|
||||
/*
|
||||
* see Documentation/devicetree/bindings/arm/xen.txt for the
|
||||
* documentation of the Xen Device Tree format.
|
||||
*/
|
||||
#define GRANT_TABLE_PHYSADDR 0
|
||||
static int __init xen_guest_init(void)
|
||||
{
|
||||
struct xen_add_to_physmap xatp;
|
||||
static struct shared_info *shared_info_page = 0;
|
||||
struct device_node *node;
|
||||
int len;
|
||||
const char *s = NULL;
|
||||
const char *version = NULL;
|
||||
const char *xen_prefix = "xen,xen-";
|
||||
struct resource res;
|
||||
|
||||
node = of_find_compatible_node(NULL, NULL, "xen,xen");
|
||||
if (!node) {
|
||||
pr_debug("No Xen support\n");
|
||||
return 0;
|
||||
}
|
||||
s = of_get_property(node, "compatible", &len);
|
||||
if (strlen(xen_prefix) + 3 < len &&
|
||||
!strncmp(xen_prefix, s, strlen(xen_prefix)))
|
||||
version = s + strlen(xen_prefix);
|
||||
if (version == NULL) {
|
||||
pr_debug("Xen version not found\n");
|
||||
return 0;
|
||||
}
|
||||
if (of_address_to_resource(node, GRANT_TABLE_PHYSADDR, &res))
|
||||
return 0;
|
||||
xen_hvm_resume_frames = res.start >> PAGE_SHIFT;
|
||||
xen_events_irq = irq_of_parse_and_map(node, 0);
|
||||
pr_info("Xen %s support found, events_irq=%d gnttab_frame_pfn=%lx\n",
|
||||
version, xen_events_irq, xen_hvm_resume_frames);
|
||||
xen_domain_type = XEN_HVM_DOMAIN;
|
||||
|
||||
xen_setup_features();
|
||||
if (xen_feature(XENFEAT_dom0))
|
||||
xen_start_info->flags |= SIF_INITDOMAIN|SIF_PRIVILEGED;
|
||||
else
|
||||
xen_start_info->flags &= ~(SIF_INITDOMAIN|SIF_PRIVILEGED);
|
||||
|
||||
if (!shared_info_page)
|
||||
shared_info_page = (struct shared_info *)
|
||||
get_zeroed_page(GFP_KERNEL);
|
||||
if (!shared_info_page) {
|
||||
pr_err("not enough memory\n");
|
||||
return -ENOMEM;
|
||||
}
|
||||
xatp.domid = DOMID_SELF;
|
||||
xatp.idx = 0;
|
||||
xatp.space = XENMAPSPACE_shared_info;
|
||||
xatp.gpfn = __pa(shared_info_page) >> PAGE_SHIFT;
|
||||
if (HYPERVISOR_memory_op(XENMEM_add_to_physmap, &xatp))
|
||||
BUG();
|
||||
|
||||
HYPERVISOR_shared_info = (struct shared_info *)shared_info_page;
|
||||
|
||||
/* xen_vcpu is a pointer to the vcpu_info struct in the shared_info
|
||||
* page, we use it in the event channel upcall and in some pvclock
|
||||
* related functions. We don't need the vcpu_info placement
|
||||
* optimizations because we don't use any pv_mmu or pv_irq op on
|
||||
* HVM.
|
||||
* The shared info contains exactly 1 CPU (the boot CPU). The guest
|
||||
* is required to use VCPUOP_register_vcpu_info to place vcpu info
|
||||
* for secondary CPUs as they are brought up. */
|
||||
per_cpu(xen_vcpu, 0) = &HYPERVISOR_shared_info->vcpu_info[0];
|
||||
|
||||
gnttab_init();
|
||||
if (!xen_initial_domain())
|
||||
xenbus_probe(NULL);
|
||||
|
||||
return 0;
|
||||
}
|
||||
core_initcall(xen_guest_init);
|
||||
|
||||
static irqreturn_t xen_arm_callback(int irq, void *arg)
|
||||
{
|
||||
xen_hvm_evtchn_do_upcall();
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
static int __init xen_init_events(void)
|
||||
{
|
||||
if (!xen_domain() || xen_events_irq < 0)
|
||||
return -ENODEV;
|
||||
|
||||
xen_init_IRQ();
|
||||
|
||||
if (request_percpu_irq(xen_events_irq, xen_arm_callback,
|
||||
"events", xen_vcpu)) {
|
||||
pr_err("Error requesting IRQ %d\n", xen_events_irq);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
enable_percpu_irq(xen_events_irq, 0);
|
||||
|
||||
return 0;
|
||||
}
|
||||
postcore_initcall(xen_init_events);
|
||||
|
||||
/* XXX: only until balloon is properly working */
|
||||
int alloc_xenballooned_pages(int nr_pages, struct page **pages, bool highmem)
|
||||
{
|
||||
*pages = alloc_pages(highmem ? GFP_HIGHUSER : GFP_KERNEL,
|
||||
get_order(nr_pages));
|
||||
if (*pages == NULL)
|
||||
return -ENOMEM;
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(alloc_xenballooned_pages);
|
||||
|
||||
void free_xenballooned_pages(int nr_pages, struct page **pages)
|
||||
{
|
||||
kfree(*pages);
|
||||
*pages = NULL;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(free_xenballooned_pages);
|
53
arch/arm/xen/grant-table.c
Normal file
53
arch/arm/xen/grant-table.c
Normal file
|
@ -0,0 +1,53 @@
|
|||
/******************************************************************************
|
||||
* grant_table.c
|
||||
* ARM specific part
|
||||
*
|
||||
* Granting foreign access to our memory reservation.
|
||||
*
|
||||
* 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; or, when distributed
|
||||
* separately from the Linux kernel or incorporated into other
|
||||
* software packages, subject to the following license:
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this source file (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.
|
||||
*/
|
||||
|
||||
#include <xen/interface/xen.h>
|
||||
#include <xen/page.h>
|
||||
#include <xen/grant_table.h>
|
||||
|
||||
int arch_gnttab_map_shared(unsigned long *frames, unsigned long nr_gframes,
|
||||
unsigned long max_nr_gframes,
|
||||
void **__shared)
|
||||
{
|
||||
return -ENOSYS;
|
||||
}
|
||||
|
||||
void arch_gnttab_unmap(void *shared, unsigned long nr_gframes)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
int arch_gnttab_map_status(uint64_t *frames, unsigned long nr_gframes,
|
||||
unsigned long max_nr_gframes,
|
||||
grant_status_t **__shared)
|
||||
{
|
||||
return -ENOSYS;
|
||||
}
|
106
arch/arm/xen/hypercall.S
Normal file
106
arch/arm/xen/hypercall.S
Normal file
|
@ -0,0 +1,106 @@
|
|||
/******************************************************************************
|
||||
* hypercall.S
|
||||
*
|
||||
* Xen hypercall wrappers
|
||||
*
|
||||
* Stefano Stabellini <stefano.stabellini@eu.citrix.com>, Citrix, 2012
|
||||
*
|
||||
* 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; or, when distributed
|
||||
* separately from the Linux kernel or incorporated into other
|
||||
* software packages, subject to the following license:
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this source file (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.
|
||||
*/
|
||||
|
||||
/*
|
||||
* The Xen hypercall calling convention is very similar to the ARM
|
||||
* procedure calling convention: the first paramter is passed in r0, the
|
||||
* second in r1, the third in r2 and the fourth in r3. Considering that
|
||||
* Xen hypercalls have 5 arguments at most, the fifth paramter is passed
|
||||
* in r4, differently from the procedure calling convention of using the
|
||||
* stack for that case.
|
||||
*
|
||||
* The hypercall number is passed in r12.
|
||||
*
|
||||
* The return value is in r0.
|
||||
*
|
||||
* The hvc ISS is required to be 0xEA1, that is the Xen specific ARM
|
||||
* hypercall tag.
|
||||
*/
|
||||
|
||||
#include <linux/linkage.h>
|
||||
#include <asm/assembler.h>
|
||||
#include <xen/interface/xen.h>
|
||||
|
||||
|
||||
/* HVC 0xEA1 */
|
||||
#ifdef CONFIG_THUMB2_KERNEL
|
||||
#define xen_hvc .word 0xf7e08ea1
|
||||
#else
|
||||
#define xen_hvc .word 0xe140ea71
|
||||
#endif
|
||||
|
||||
#define HYPERCALL_SIMPLE(hypercall) \
|
||||
ENTRY(HYPERVISOR_##hypercall) \
|
||||
mov r12, #__HYPERVISOR_##hypercall; \
|
||||
xen_hvc; \
|
||||
mov pc, lr; \
|
||||
ENDPROC(HYPERVISOR_##hypercall)
|
||||
|
||||
#define HYPERCALL0 HYPERCALL_SIMPLE
|
||||
#define HYPERCALL1 HYPERCALL_SIMPLE
|
||||
#define HYPERCALL2 HYPERCALL_SIMPLE
|
||||
#define HYPERCALL3 HYPERCALL_SIMPLE
|
||||
#define HYPERCALL4 HYPERCALL_SIMPLE
|
||||
|
||||
#define HYPERCALL5(hypercall) \
|
||||
ENTRY(HYPERVISOR_##hypercall) \
|
||||
stmdb sp!, {r4} \
|
||||
ldr r4, [sp, #4] \
|
||||
mov r12, #__HYPERVISOR_##hypercall; \
|
||||
xen_hvc \
|
||||
ldm sp!, {r4} \
|
||||
mov pc, lr \
|
||||
ENDPROC(HYPERVISOR_##hypercall)
|
||||
|
||||
.text
|
||||
|
||||
HYPERCALL2(xen_version);
|
||||
HYPERCALL3(console_io);
|
||||
HYPERCALL3(grant_table_op);
|
||||
HYPERCALL2(sched_op);
|
||||
HYPERCALL2(event_channel_op);
|
||||
HYPERCALL2(hvm_op);
|
||||
HYPERCALL2(memory_op);
|
||||
HYPERCALL2(physdev_op);
|
||||
|
||||
ENTRY(privcmd_call)
|
||||
stmdb sp!, {r4}
|
||||
mov r12, r0
|
||||
mov r0, r1
|
||||
mov r1, r2
|
||||
mov r2, r3
|
||||
ldr r3, [sp, #8]
|
||||
ldr r4, [sp, #4]
|
||||
xen_hvc
|
||||
ldm sp!, {r4}
|
||||
mov pc, lr
|
||||
ENDPROC(privcmd_call);
|
|
@ -71,6 +71,7 @@
|
|||
* with Xen so that we could have one ABI that works for 32 and 64 bit
|
||||
* guests. */
|
||||
typedef unsigned long xen_pfn_t;
|
||||
typedef unsigned long xen_ulong_t;
|
||||
/* Guest handles for primitive C types. */
|
||||
__DEFINE_GUEST_HANDLE(uchar, unsigned char);
|
||||
__DEFINE_GUEST_HANDLE(uint, unsigned int);
|
||||
|
|
|
@ -51,6 +51,7 @@
|
|||
* with Xen so that on ARM we can have one ABI that works for 32 and 64
|
||||
* bit guests. */
|
||||
typedef unsigned long xen_pfn_t;
|
||||
typedef unsigned long xen_ulong_t;
|
||||
/* Guest handles for primitive C types. */
|
||||
__DEFINE_GUEST_HANDLE(uchar, unsigned char);
|
||||
__DEFINE_GUEST_HANDLE(uint, unsigned int);
|
||||
|
|
|
@ -33,6 +33,7 @@
|
|||
#include <linux/memblock.h>
|
||||
|
||||
#include <xen/xen.h>
|
||||
#include <xen/events.h>
|
||||
#include <xen/interface/xen.h>
|
||||
#include <xen/interface/version.h>
|
||||
#include <xen/interface/physdev.h>
|
||||
|
|
|
@ -5,6 +5,7 @@
|
|||
#include <xen/interface/xen.h>
|
||||
#include <xen/interface/sched.h>
|
||||
#include <xen/interface/vcpu.h>
|
||||
#include <xen/events.h>
|
||||
|
||||
#include <asm/xen/hypercall.h>
|
||||
#include <asm/xen/hypervisor.h>
|
||||
|
|
|
@ -35,7 +35,6 @@ void xen_set_pat(u64);
|
|||
|
||||
char * __init xen_memory_setup(void);
|
||||
void __init xen_arch_setup(void);
|
||||
void __init xen_init_IRQ(void);
|
||||
void xen_enable_sysenter(void);
|
||||
void xen_enable_syscall(void);
|
||||
void xen_vcpu_restore(void);
|
||||
|
|
|
@ -42,6 +42,7 @@
|
|||
|
||||
#include <xen/events.h>
|
||||
#include <xen/page.h>
|
||||
#include <xen/xen.h>
|
||||
#include <asm/xen/hypervisor.h>
|
||||
#include <asm/xen/hypercall.h>
|
||||
#include "common.h"
|
||||
|
|
|
@ -40,6 +40,7 @@
|
|||
|
||||
#include <net/tcp.h>
|
||||
|
||||
#include <xen/xen.h>
|
||||
#include <xen/events.h>
|
||||
#include <xen/interface/memory.h>
|
||||
|
||||
|
|
|
@ -43,6 +43,7 @@
|
|||
#include <linux/slab.h>
|
||||
#include <net/ip.h>
|
||||
|
||||
#include <asm/xen/page.h>
|
||||
#include <xen/xen.h>
|
||||
#include <xen/xenbus.h>
|
||||
#include <xen/events.h>
|
||||
|
|
|
@ -1,11 +1,18 @@
|
|||
obj-y += grant-table.o features.o events.o manage.o balloon.o
|
||||
ifneq ($(CONFIG_ARM),y)
|
||||
obj-y += manage.o balloon.o
|
||||
obj-$(CONFIG_HOTPLUG_CPU) += cpu_hotplug.o
|
||||
endif
|
||||
obj-y += grant-table.o features.o events.o
|
||||
obj-y += xenbus/
|
||||
|
||||
nostackp := $(call cc-option, -fno-stack-protector)
|
||||
CFLAGS_features.o := $(nostackp)
|
||||
|
||||
obj-$(CONFIG_XEN_DOM0) += $(dom0-y)
|
||||
dom0-$(CONFIG_PCI) += pci.o
|
||||
dom0-$(CONFIG_ACPI) += acpi.o
|
||||
dom0-$(CONFIG_X86) += pcpu.o
|
||||
obj-$(CONFIG_BLOCK) += biomerge.o
|
||||
obj-$(CONFIG_HOTPLUG_CPU) += cpu_hotplug.o
|
||||
obj-$(CONFIG_XEN_XENCOMM) += xencomm.o
|
||||
obj-$(CONFIG_XEN_BALLOON) += xen-balloon.o
|
||||
obj-$(CONFIG_XEN_SELFBALLOONING) += xen-selfballoon.o
|
||||
|
@ -17,8 +24,6 @@ obj-$(CONFIG_XEN_SYS_HYPERVISOR) += sys-hypervisor.o
|
|||
obj-$(CONFIG_XEN_PVHVM) += platform-pci.o
|
||||
obj-$(CONFIG_XEN_TMEM) += tmem.o
|
||||
obj-$(CONFIG_SWIOTLB_XEN) += swiotlb-xen.o
|
||||
obj-$(CONFIG_XEN_DOM0) += pcpu.o
|
||||
obj-$(CONFIG_XEN_DOM0) += pci.o acpi.o
|
||||
obj-$(CONFIG_XEN_MCE_LOG) += mcelog.o
|
||||
obj-$(CONFIG_XEN_PCIDEV_BACKEND) += xen-pciback/
|
||||
obj-$(CONFIG_XEN_PRIVCMD) += xen-privcmd.o
|
||||
|
|
|
@ -31,14 +31,16 @@
|
|||
#include <linux/irqnr.h>
|
||||
#include <linux/pci.h>
|
||||
|
||||
#ifdef CONFIG_X86
|
||||
#include <asm/desc.h>
|
||||
#include <asm/ptrace.h>
|
||||
#include <asm/irq.h>
|
||||
#include <asm/idle.h>
|
||||
#include <asm/io_apic.h>
|
||||
#include <asm/sync_bitops.h>
|
||||
#include <asm/xen/page.h>
|
||||
#include <asm/xen/pci.h>
|
||||
#endif
|
||||
#include <asm/sync_bitops.h>
|
||||
#include <asm/xen/hypercall.h>
|
||||
#include <asm/xen/hypervisor.h>
|
||||
|
||||
|
@ -50,6 +52,9 @@
|
|||
#include <xen/interface/event_channel.h>
|
||||
#include <xen/interface/hvm/hvm_op.h>
|
||||
#include <xen/interface/hvm/params.h>
|
||||
#include <xen/interface/physdev.h>
|
||||
#include <xen/interface/sched.h>
|
||||
#include <asm/hw_irq.h>
|
||||
|
||||
/*
|
||||
* This lock protects updates to the following mapping and reference-count
|
||||
|
@ -1386,7 +1391,9 @@ void xen_evtchn_do_upcall(struct pt_regs *regs)
|
|||
{
|
||||
struct pt_regs *old_regs = set_irq_regs(regs);
|
||||
|
||||
#ifdef CONFIG_X86
|
||||
exit_idle();
|
||||
#endif
|
||||
irq_enter();
|
||||
|
||||
__xen_evtchn_do_upcall();
|
||||
|
@ -1795,9 +1802,9 @@ void xen_callback_vector(void)
|
|||
void xen_callback_vector(void) {}
|
||||
#endif
|
||||
|
||||
void __init xen_init_IRQ(void)
|
||||
void xen_init_IRQ(void)
|
||||
{
|
||||
int i, rc;
|
||||
int i;
|
||||
|
||||
evtchn_to_irq = kcalloc(NR_EVENT_CHANNELS, sizeof(*evtchn_to_irq),
|
||||
GFP_KERNEL);
|
||||
|
@ -1813,6 +1820,7 @@ void __init xen_init_IRQ(void)
|
|||
|
||||
pirq_needs_eoi = pirq_needs_eoi_flag;
|
||||
|
||||
#ifdef CONFIG_X86
|
||||
if (xen_hvm_domain()) {
|
||||
xen_callback_vector();
|
||||
native_init_IRQ();
|
||||
|
@ -1820,6 +1828,7 @@ void __init xen_init_IRQ(void)
|
|||
* __acpi_register_gsi can point at the right function */
|
||||
pci_xen_hvm_init();
|
||||
} else {
|
||||
int rc;
|
||||
struct physdev_pirq_eoi_gmfn eoi_gmfn;
|
||||
|
||||
irq_ctx_init(smp_processor_id());
|
||||
|
@ -1835,4 +1844,6 @@ void __init xen_init_IRQ(void)
|
|||
} else
|
||||
pirq_needs_eoi = pirq_check_eoi_map;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(xen_init_IRQ);
|
||||
|
|
|
@ -109,4 +109,6 @@ int xen_irq_from_gsi(unsigned gsi);
|
|||
/* Determine whether to ignore this IRQ if it is passed to a guest. */
|
||||
int xen_test_irq_shared(int irq);
|
||||
|
||||
/* initialize Xen IRQ subsystem */
|
||||
void xen_init_IRQ(void);
|
||||
#endif /* _XEN_EVENTS_H */
|
||||
|
|
|
@ -50,6 +50,9 @@
|
|||
/* x86: pirq can be used by HVM guests */
|
||||
#define XENFEAT_hvm_pirqs 10
|
||||
|
||||
/* operation as Dom0 is supported */
|
||||
#define XENFEAT_dom0 11
|
||||
|
||||
#define XENFEAT_NR_SUBMAPS 1
|
||||
|
||||
#endif /* __XEN_PUBLIC_FEATURES_H__ */
|
||||
|
|
|
@ -5,6 +5,7 @@
|
|||
#define XEN_IO_PROTO_ABI_X86_64 "x86_64-abi"
|
||||
#define XEN_IO_PROTO_ABI_IA64 "ia64-abi"
|
||||
#define XEN_IO_PROTO_ABI_POWERPC64 "powerpc64-abi"
|
||||
#define XEN_IO_PROTO_ABI_ARM "arm-abi"
|
||||
|
||||
#if defined(__i386__)
|
||||
# define XEN_IO_PROTO_ABI_NATIVE XEN_IO_PROTO_ABI_X86_32
|
||||
|
@ -14,6 +15,8 @@
|
|||
# define XEN_IO_PROTO_ABI_NATIVE XEN_IO_PROTO_ABI_IA64
|
||||
#elif defined(__powerpc64__)
|
||||
# define XEN_IO_PROTO_ABI_NATIVE XEN_IO_PROTO_ABI_POWERPC64
|
||||
#elif defined(__arm__)
|
||||
# define XEN_IO_PROTO_ABI_NATIVE XEN_IO_PROTO_ABI_ARM
|
||||
#else
|
||||
# error arch fixup needed here
|
||||
#endif
|
||||
|
|
|
@ -34,7 +34,7 @@ struct xen_memory_reservation {
|
|||
GUEST_HANDLE(xen_pfn_t) extent_start;
|
||||
|
||||
/* Number of extents, and size/alignment of each (2^extent_order pages). */
|
||||
unsigned long nr_extents;
|
||||
xen_ulong_t nr_extents;
|
||||
unsigned int extent_order;
|
||||
|
||||
/*
|
||||
|
@ -92,7 +92,7 @@ struct xen_memory_exchange {
|
|||
* command will be non-zero.
|
||||
* 5. THIS FIELD MUST BE INITIALISED TO ZERO BY THE CALLER!
|
||||
*/
|
||||
unsigned long nr_exchanged;
|
||||
xen_ulong_t nr_exchanged;
|
||||
};
|
||||
|
||||
DEFINE_GUEST_HANDLE_STRUCT(xen_memory_exchange);
|
||||
|
@ -148,8 +148,8 @@ DEFINE_GUEST_HANDLE_STRUCT(xen_machphys_mfn_list);
|
|||
*/
|
||||
#define XENMEM_machphys_mapping 12
|
||||
struct xen_machphys_mapping {
|
||||
unsigned long v_start, v_end; /* Start and end virtual addresses. */
|
||||
unsigned long max_mfn; /* Maximum MFN that can be looked up. */
|
||||
xen_ulong_t v_start, v_end; /* Start and end virtual addresses. */
|
||||
xen_ulong_t max_mfn; /* Maximum MFN that can be looked up. */
|
||||
};
|
||||
DEFINE_GUEST_HANDLE_STRUCT(xen_machphys_mapping_t);
|
||||
|
||||
|
@ -172,7 +172,7 @@ struct xen_add_to_physmap {
|
|||
unsigned int space;
|
||||
|
||||
/* Index into source mapping space. */
|
||||
unsigned long idx;
|
||||
xen_ulong_t idx;
|
||||
|
||||
/* GPFN where the source mapping page should appear. */
|
||||
xen_pfn_t gpfn;
|
||||
|
@ -189,7 +189,7 @@ struct xen_translate_gpfn_list {
|
|||
domid_t domid;
|
||||
|
||||
/* Length of list. */
|
||||
unsigned long nr_gpfns;
|
||||
xen_ulong_t nr_gpfns;
|
||||
|
||||
/* List of GPFNs to translate. */
|
||||
GUEST_HANDLE(ulong) gpfn_list;
|
||||
|
|
|
@ -56,7 +56,7 @@ struct physdev_eoi {
|
|||
#define PHYSDEVOP_pirq_eoi_gmfn_v2 28
|
||||
struct physdev_pirq_eoi_gmfn {
|
||||
/* IN */
|
||||
unsigned long gmfn;
|
||||
xen_ulong_t gmfn;
|
||||
};
|
||||
|
||||
/*
|
||||
|
|
|
@ -45,7 +45,7 @@ struct xen_changeset_info {
|
|||
|
||||
#define XENVER_platform_parameters 5
|
||||
struct xen_platform_parameters {
|
||||
unsigned long virt_start;
|
||||
xen_ulong_t virt_start;
|
||||
};
|
||||
|
||||
#define XENVER_get_features 6
|
||||
|
|
|
@ -23,7 +23,7 @@ extern enum xen_domain_type xen_domain_type;
|
|||
#include <xen/interface/xen.h>
|
||||
#include <asm/xen/hypervisor.h>
|
||||
|
||||
#define xen_initial_domain() (xen_pv_domain() && \
|
||||
#define xen_initial_domain() (xen_domain() && \
|
||||
xen_start_info->flags & SIF_INITDOMAIN)
|
||||
#else /* !CONFIG_XEN_DOM0 */
|
||||
#define xen_initial_domain() (0)
|
||||
|
|
Loading…
Reference in a new issue