diff options
35 files changed, 783 insertions, 18 deletions
diff --git a/Documentation/devicetree/bindings/arm/xen.txt b/Documentation/devicetree/bindings/arm/xen.txt new file mode 100644 index 000000000000..0f7b9c2109f8 --- /dev/null +++ b/Documentation/devicetree/bindings/arm/xen.txt | |||
| @@ -0,0 +1,25 @@ | |||
| 1 | * Xen hypervisor device tree bindings | ||
| 2 | |||
| 3 | Xen ARM virtual platforms shall have a top-level "hypervisor" node with | ||
| 4 | the following properties: | ||
| 5 | |||
| 6 | - compatible: | ||
| 7 | compatible = "xen,xen-<version>", "xen,xen"; | ||
| 8 | where <version> is the version of the Xen ABI of the platform. | ||
| 9 | |||
| 10 | - reg: specifies the base physical address and size of a region in | ||
| 11 | memory where the grant table should be mapped to, using an | ||
| 12 | HYPERVISOR_memory_op hypercall. The memory region is large enough to map | ||
| 13 | the whole grant table (it is larger or equal to gnttab_max_grant_frames()). | ||
| 14 | |||
| 15 | - interrupts: the interrupt used by Xen to inject event notifications. | ||
| 16 | A GIC node is also required. | ||
| 17 | |||
| 18 | |||
| 19 | Example (assuming #address-cells = <2> and #size-cells = <2>): | ||
| 20 | |||
| 21 | hypervisor { | ||
| 22 | compatible = "xen,xen-4.3", "xen,xen"; | ||
| 23 | reg = <0 0xb0000000 0 0x20000>; | ||
| 24 | interrupts = <1 15 0xf08>; | ||
| 25 | }; | ||
diff --git a/MAINTAINERS b/MAINTAINERS index fdc0119963e7..3d38291a402f 100644 --- a/MAINTAINERS +++ b/MAINTAINERS | |||
| @@ -7752,6 +7752,13 @@ F: drivers/xen/ | |||
| 7752 | F: arch/x86/include/asm/xen/ | 7752 | F: arch/x86/include/asm/xen/ |
| 7753 | F: include/xen/ | 7753 | F: include/xen/ |
| 7754 | 7754 | ||
| 7755 | XEN HYPERVISOR ARM | ||
| 7756 | M: Stefano Stabellini <stefano.stabellini@eu.citrix.com> | ||
| 7757 | L: xen-devel@lists.xensource.com (moderated for non-subscribers) | ||
| 7758 | S: Supported | ||
| 7759 | F: arch/arm/xen/ | ||
| 7760 | F: arch/arm/include/asm/xen/ | ||
| 7761 | |||
| 7755 | XEN NETWORK BACKEND DRIVER | 7762 | XEN NETWORK BACKEND DRIVER |
| 7756 | M: Ian Campbell <ian.campbell@citrix.com> | 7763 | M: Ian Campbell <ian.campbell@citrix.com> |
| 7757 | L: xen-devel@lists.xensource.com (moderated for non-subscribers) | 7764 | L: xen-devel@lists.xensource.com (moderated for non-subscribers) |
diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig index 2f88d8d97701..33614669a9a0 100644 --- a/arch/arm/Kconfig +++ b/arch/arm/Kconfig | |||
| @@ -1897,6 +1897,16 @@ config DEPRECATED_PARAM_STRUCT | |||
| 1897 | This was deprecated in 2001 and announced to live on for 5 years. | 1897 | This was deprecated in 2001 and announced to live on for 5 years. |
| 1898 | Some old boot loaders still use this way. | 1898 | Some old boot loaders still use this way. |
| 1899 | 1899 | ||
| 1900 | config XEN_DOM0 | ||
| 1901 | def_bool y | ||
| 1902 | depends on XEN | ||
| 1903 | |||
| 1904 | config XEN | ||
| 1905 | bool "Xen guest support on ARM (EXPERIMENTAL)" | ||
| 1906 | depends on EXPERIMENTAL && ARM && OF | ||
| 1907 | help | ||
| 1908 | Say Y if you want to run Linux in a Virtual Machine on Xen on ARM. | ||
| 1909 | |||
| 1900 | endmenu | 1910 | endmenu |
| 1901 | 1911 | ||
| 1902 | menu "Boot options" | 1912 | menu "Boot options" |
diff --git a/arch/arm/Makefile b/arch/arm/Makefile index 30eae87ead6d..f42968a9fca3 100644 --- a/arch/arm/Makefile +++ b/arch/arm/Makefile | |||
| @@ -251,6 +251,7 @@ endif | |||
| 251 | core-$(CONFIG_FPE_NWFPE) += arch/arm/nwfpe/ | 251 | core-$(CONFIG_FPE_NWFPE) += arch/arm/nwfpe/ |
| 252 | core-$(CONFIG_FPE_FASTFPE) += $(FASTFPE_OBJ) | 252 | core-$(CONFIG_FPE_FASTFPE) += $(FASTFPE_OBJ) |
| 253 | core-$(CONFIG_VFP) += arch/arm/vfp/ | 253 | core-$(CONFIG_VFP) += arch/arm/vfp/ |
| 254 | core-$(CONFIG_XEN) += arch/arm/xen/ | ||
| 254 | 255 | ||
| 255 | # If we have a machine-specific directory, then include it in the build. | 256 | # If we have a machine-specific directory, then include it in the build. |
| 256 | core-y += arch/arm/kernel/ arch/arm/mm/ arch/arm/common/ | 257 | core-y += arch/arm/kernel/ arch/arm/mm/ arch/arm/common/ |
diff --git a/arch/arm/boot/dts/xenvm-4.2.dts b/arch/arm/boot/dts/xenvm-4.2.dts new file mode 100644 index 000000000000..ec3f9528e180 --- /dev/null +++ b/arch/arm/boot/dts/xenvm-4.2.dts | |||
| @@ -0,0 +1,68 @@ | |||
| 1 | /* | ||
| 2 | * Xen Virtual Machine for unprivileged guests | ||
| 3 | * | ||
| 4 | * Based on ARM Ltd. Versatile Express CoreTile Express (single CPU) | ||
| 5 | * Cortex-A15 MPCore (V2P-CA15) | ||
| 6 | * | ||
| 7 | */ | ||
| 8 | |||
| 9 | /dts-v1/; | ||
| 10 | |||
| 11 | / { | ||
| 12 | model = "XENVM-4.2"; | ||
| 13 | compatible = "xen,xenvm-4.2", "xen,xenvm"; | ||
| 14 | interrupt-parent = <&gic>; | ||
| 15 | #address-cells = <2>; | ||
| 16 | #size-cells = <2>; | ||
| 17 | |||
| 18 | chosen { | ||
| 19 | /* this field is going to be adjusted by the hypervisor */ | ||
| 20 | bootargs = "console=hvc0 root=/dev/xvda"; | ||
| 21 | }; | ||
| 22 | |||
| 23 | cpus { | ||
| 24 | #address-cells = <1>; | ||
| 25 | #size-cells = <0>; | ||
| 26 | |||
| 27 | cpu@0 { | ||
| 28 | device_type = "cpu"; | ||
| 29 | compatible = "arm,cortex-a15"; | ||
| 30 | reg = <0>; | ||
| 31 | }; | ||
| 32 | }; | ||
| 33 | |||
| 34 | memory@80000000 { | ||
| 35 | device_type = "memory"; | ||
| 36 | /* this field is going to be adjusted by the hypervisor */ | ||
| 37 | reg = <0 0x80000000 0 0x08000000>; | ||
| 38 | }; | ||
| 39 | |||
| 40 | gic: interrupt-controller@2c001000 { | ||
| 41 | compatible = "arm,cortex-a15-gic", "arm,cortex-a9-gic"; | ||
| 42 | #interrupt-cells = <3>; | ||
| 43 | #address-cells = <0>; | ||
| 44 | interrupt-controller; | ||
| 45 | reg = <0 0x2c001000 0 0x1000>, | ||
| 46 | <0 0x2c002000 0 0x100>; | ||
| 47 | }; | ||
| 48 | |||
| 49 | timer { | ||
| 50 | compatible = "arm,armv7-timer"; | ||
| 51 | interrupts = <1 13 0xf08>, | ||
| 52 | <1 14 0xf08>, | ||
| 53 | <1 11 0xf08>, | ||
| 54 | <1 10 0xf08>; | ||
| 55 | }; | ||
| 56 | |||
| 57 | hypervisor { | ||
| 58 | compatible = "xen,xen-4.2", "xen,xen"; | ||
| 59 | /* this field is going to be adjusted by the hypervisor */ | ||
| 60 | reg = <0 0xb0000000 0 0x20000>; | ||
| 61 | /* this field is going to be adjusted by the hypervisor */ | ||
| 62 | interrupts = <1 15 0xf08>; | ||
| 63 | }; | ||
| 64 | |||
| 65 | motherboard { | ||
| 66 | arm,v2m-memory-map = "rs1"; | ||
| 67 | }; | ||
| 68 | }; | ||
diff --git a/arch/arm/include/asm/hypervisor.h b/arch/arm/include/asm/hypervisor.h new file mode 100644 index 000000000000..b90d9e523d6f --- /dev/null +++ b/arch/arm/include/asm/hypervisor.h | |||
| @@ -0,0 +1,6 @@ | |||
| 1 | #ifndef _ASM_ARM_HYPERVISOR_H | ||
| 2 | #define _ASM_ARM_HYPERVISOR_H | ||
| 3 | |||
| 4 | #include <asm/xen/hypervisor.h> | ||
| 5 | |||
| 6 | #endif | ||
diff --git a/arch/arm/include/asm/sync_bitops.h b/arch/arm/include/asm/sync_bitops.h new file mode 100644 index 000000000000..63479eecbf76 --- /dev/null +++ b/arch/arm/include/asm/sync_bitops.h | |||
| @@ -0,0 +1,27 @@ | |||
| 1 | #ifndef __ASM_SYNC_BITOPS_H__ | ||
| 2 | #define __ASM_SYNC_BITOPS_H__ | ||
| 3 | |||
| 4 | #include <asm/bitops.h> | ||
| 5 | #include <asm/system.h> | ||
| 6 | |||
| 7 | /* sync_bitops functions are equivalent to the SMP implementation of the | ||
| 8 | * original functions, independently from CONFIG_SMP being defined. | ||
| 9 | * | ||
| 10 | * We need them because _set_bit etc are not SMP safe if !CONFIG_SMP. But | ||
| 11 | * under Xen you might be communicating with a completely external entity | ||
| 12 | * who might be on another CPU (e.g. two uniprocessor guests communicating | ||
| 13 | * via event channels and grant tables). So we need a variant of the bit | ||
| 14 | * ops which are SMP safe even on a UP kernel. | ||
| 15 | */ | ||
| 16 | |||
| 17 | #define sync_set_bit(nr, p) _set_bit(nr, p) | ||
| 18 | #define sync_clear_bit(nr, p) _clear_bit(nr, p) | ||
| 19 | #define sync_change_bit(nr, p) _change_bit(nr, p) | ||
| 20 | #define sync_test_and_set_bit(nr, p) _test_and_set_bit(nr, p) | ||
| 21 | #define sync_test_and_clear_bit(nr, p) _test_and_clear_bit(nr, p) | ||
| 22 | #define sync_test_and_change_bit(nr, p) _test_and_change_bit(nr, p) | ||
| 23 | #define sync_test_bit(nr, addr) test_bit(nr, addr) | ||
| 24 | #define sync_cmpxchg cmpxchg | ||
| 25 | |||
| 26 | |||
| 27 | #endif | ||
diff --git a/arch/arm/include/asm/xen/events.h b/arch/arm/include/asm/xen/events.h new file mode 100644 index 000000000000..94b4e9020b02 --- /dev/null +++ b/arch/arm/include/asm/xen/events.h | |||
| @@ -0,0 +1,18 @@ | |||
| 1 | #ifndef _ASM_ARM_XEN_EVENTS_H | ||
| 2 | #define _ASM_ARM_XEN_EVENTS_H | ||
| 3 | |||
| 4 | #include <asm/ptrace.h> | ||
| 5 | |||
| 6 | enum ipi_vector { | ||
| 7 | XEN_PLACEHOLDER_VECTOR, | ||
| 8 | |||
| 9 | /* Xen IPIs go here */ | ||
| 10 | XEN_NR_IPIS, | ||
| 11 | }; | ||
| 12 | |||
| 13 | static inline int xen_irqs_disabled(struct pt_regs *regs) | ||
| 14 | { | ||
| 15 | return raw_irqs_disabled_flags(regs->ARM_cpsr); | ||
| 16 | } | ||
| 17 | |||
| 18 | #endif /* _ASM_ARM_XEN_EVENTS_H */ | ||
diff --git a/arch/arm/include/asm/xen/hypercall.h b/arch/arm/include/asm/xen/hypercall.h new file mode 100644 index 000000000000..8a823253d775 --- /dev/null +++ b/arch/arm/include/asm/xen/hypercall.h | |||
| @@ -0,0 +1,69 @@ | |||
| 1 | /****************************************************************************** | ||
| 2 | * hypercall.h | ||
| 3 | * | ||
| 4 | * Linux-specific hypervisor handling. | ||
| 5 | * | ||
| 6 | * Stefano Stabellini <stefano.stabellini@eu.citrix.com>, Citrix, 2012 | ||
| 7 | * | ||
| 8 | * This program is free software; you can redistribute it and/or | ||
| 9 | * modify it under the terms of the GNU General Public License version 2 | ||
| 10 | * as published by the Free Software Foundation; or, when distributed | ||
| 11 | * separately from the Linux kernel or incorporated into other | ||
| 12 | * software packages, subject to the following license: | ||
| 13 | * | ||
| 14 | * Permission is hereby granted, free of charge, to any person obtaining a copy | ||
| 15 | * of this source file (the "Software"), to deal in the Software without | ||
| 16 | * restriction, including without limitation the rights to use, copy, modify, | ||
| 17 | * merge, publish, distribute, sublicense, and/or sell copies of the Software, | ||
| 18 | * and to permit persons to whom the Software is furnished to do so, subject to | ||
| 19 | * the following conditions: | ||
| 20 | * | ||
| 21 | * The above copyright notice and this permission notice shall be included in | ||
| 22 | * all copies or substantial portions of the Software. | ||
| 23 | * | ||
| 24 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||
| 25 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||
| 26 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||
| 27 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||
| 28 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING | ||
| 29 | * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS | ||
| 30 | * IN THE SOFTWARE. | ||
| 31 | */ | ||
| 32 | |||
| 33 | #ifndef _ASM_ARM_XEN_HYPERCALL_H | ||
| 34 | #define _ASM_ARM_XEN_HYPERCALL_H | ||
| 35 | |||
| 36 | #include <xen/interface/xen.h> | ||
| 37 | |||
| 38 | long privcmd_call(unsigned call, unsigned long a1, | ||
| 39 | unsigned long a2, unsigned long a3, | ||
| 40 | unsigned long a4, unsigned long a5); | ||
| 41 | int HYPERVISOR_xen_version(int cmd, void *arg); | ||
| 42 | int HYPERVISOR_console_io(int cmd, int count, char *str); | ||
| 43 | int HYPERVISOR_grant_table_op(unsigned int cmd, void *uop, unsigned int count); | ||
| 44 | int HYPERVISOR_sched_op(int cmd, void *arg); | ||
| 45 | int HYPERVISOR_event_channel_op(int cmd, void *arg); | ||
| 46 | unsigned long HYPERVISOR_hvm_op(int op, void *arg); | ||
| 47 | int HYPERVISOR_memory_op(unsigned int cmd, void *arg); | ||
| 48 | int HYPERVISOR_physdev_op(int cmd, void *arg); | ||
| 49 | |||
| 50 | static inline void | ||
| 51 | MULTI_update_va_mapping(struct multicall_entry *mcl, unsigned long va, | ||
| 52 | unsigned int new_val, unsigned long flags) | ||
| 53 | { | ||
| 54 | BUG(); | ||
| 55 | } | ||
| 56 | |||
| 57 | static inline void | ||
| 58 | MULTI_mmu_update(struct multicall_entry *mcl, struct mmu_update *req, | ||
| 59 | int count, int *success_count, domid_t domid) | ||
| 60 | { | ||
| 61 | BUG(); | ||
| 62 | } | ||
| 63 | |||
| 64 | static inline int | ||
| 65 | HYPERVISOR_multicall(void *call_list, int nr_calls) | ||
| 66 | { | ||
| 67 | BUG(); | ||
| 68 | } | ||
| 69 | #endif /* _ASM_ARM_XEN_HYPERCALL_H */ | ||
diff --git a/arch/arm/include/asm/xen/hypervisor.h b/arch/arm/include/asm/xen/hypervisor.h new file mode 100644 index 000000000000..d7ab99a0c9eb --- /dev/null +++ b/arch/arm/include/asm/xen/hypervisor.h | |||
| @@ -0,0 +1,19 @@ | |||
| 1 | #ifndef _ASM_ARM_XEN_HYPERVISOR_H | ||
| 2 | #define _ASM_ARM_XEN_HYPERVISOR_H | ||
| 3 | |||
| 4 | extern struct shared_info *HYPERVISOR_shared_info; | ||
| 5 | extern struct start_info *xen_start_info; | ||
| 6 | |||
| 7 | /* Lazy mode for batching updates / context switch */ | ||
| 8 | enum paravirt_lazy_mode { | ||
| 9 | PARAVIRT_LAZY_NONE, | ||
| 10 | PARAVIRT_LAZY_MMU, | ||
| 11 | PARAVIRT_LAZY_CPU, | ||
| 12 | }; | ||
| 13 | |||
| 14 | static inline enum paravirt_lazy_mode paravirt_get_lazy_mode(void) | ||
| 15 | { | ||
| 16 | return PARAVIRT_LAZY_NONE; | ||
| 17 | } | ||
| 18 | |||
| 19 | #endif /* _ASM_ARM_XEN_HYPERVISOR_H */ | ||
diff --git a/arch/arm/include/asm/xen/interface.h b/arch/arm/include/asm/xen/interface.h new file mode 100644 index 000000000000..ae05e56dd17d --- /dev/null +++ b/arch/arm/include/asm/xen/interface.h | |||
| @@ -0,0 +1,73 @@ | |||
| 1 | /****************************************************************************** | ||
| 2 | * Guest OS interface to ARM Xen. | ||
| 3 | * | ||
| 4 | * Stefano Stabellini <stefano.stabellini@eu.citrix.com>, Citrix, 2012 | ||
| 5 | */ | ||
| 6 | |||
| 7 | #ifndef _ASM_ARM_XEN_INTERFACE_H | ||
| 8 | #define _ASM_ARM_XEN_INTERFACE_H | ||
| 9 | |||
| 10 | #include <linux/types.h> | ||
| 11 | |||
| 12 | #define uint64_aligned_t uint64_t __attribute__((aligned(8))) | ||
| 13 | |||
| 14 | #define __DEFINE_GUEST_HANDLE(name, type) \ | ||
| 15 | typedef struct { union { type *p; uint64_aligned_t q; }; } \ | ||
| 16 | __guest_handle_ ## name | ||
| 17 | |||
| 18 | #define DEFINE_GUEST_HANDLE_STRUCT(name) \ | ||
| 19 | __DEFINE_GUEST_HANDLE(name, struct name) | ||
| 20 | #define DEFINE_GUEST_HANDLE(name) __DEFINE_GUEST_HANDLE(name, name) | ||
| 21 | #define GUEST_HANDLE(name) __guest_handle_ ## name | ||
| 22 | |||
| 23 | #define set_xen_guest_handle(hnd, val) \ | ||
| 24 | do { \ | ||
| 25 | if (sizeof(hnd) == 8) \ | ||
| 26 | *(uint64_t *)&(hnd) = 0; \ | ||
| 27 | (hnd).p = val; \ | ||
| 28 | } while (0) | ||
| 29 | |||
| 30 | #ifndef __ASSEMBLY__ | ||
| 31 | /* Explicitly size integers that represent pfns in the interface with | ||
| 32 | * Xen so that we can have one ABI that works for 32 and 64 bit guests. */ | ||
| 33 | typedef uint64_t xen_pfn_t; | ||
| 34 | typedef uint64_t xen_ulong_t; | ||
| 35 | /* Guest handles for primitive C types. */ | ||
| 36 | __DEFINE_GUEST_HANDLE(uchar, unsigned char); | ||
| 37 | __DEFINE_GUEST_HANDLE(uint, unsigned int); | ||
| 38 | __DEFINE_GUEST_HANDLE(ulong, unsigned long); | ||
| 39 | DEFINE_GUEST_HANDLE(char); | ||
| 40 | DEFINE_GUEST_HANDLE(int); | ||
| 41 | DEFINE_GUEST_HANDLE(long); | ||
| 42 | DEFINE_GUEST_HANDLE(void); | ||
| 43 | DEFINE_GUEST_HANDLE(uint64_t); | ||
| 44 | DEFINE_GUEST_HANDLE(uint32_t); | ||
| 45 | DEFINE_GUEST_HANDLE(xen_pfn_t); | ||
| 46 | |||
| 47 | /* Maximum number of virtual CPUs in multi-processor guests. */ | ||
| 48 | #define MAX_VIRT_CPUS 1 | ||
| 49 | |||
| 50 | struct arch_vcpu_info { }; | ||
| 51 | struct arch_shared_info { }; | ||
| 52 | |||
| 53 | /* TODO: Move pvclock definitions some place arch independent */ | ||
| 54 | struct pvclock_vcpu_time_info { | ||
| 55 | u32 version; | ||
| 56 | u32 pad0; | ||
| 57 | u64 tsc_timestamp; | ||
| 58 | u64 system_time; | ||
| 59 | u32 tsc_to_system_mul; | ||
| 60 | s8 tsc_shift; | ||
| 61 | u8 flags; | ||
| 62 | u8 pad[2]; | ||
| 63 | } __attribute__((__packed__)); /* 32 bytes */ | ||
| 64 | |||
| 65 | /* It is OK to have a 12 bytes struct with no padding because it is packed */ | ||
| 66 | struct pvclock_wall_clock { | ||
| 67 | u32 version; | ||
| 68 | u32 sec; | ||
| 69 | u32 nsec; | ||
| 70 | } __attribute__((__packed__)); | ||
| 71 | #endif | ||
| 72 | |||
| 73 | #endif /* _ASM_ARM_XEN_INTERFACE_H */ | ||
diff --git a/arch/arm/include/asm/xen/page.h b/arch/arm/include/asm/xen/page.h new file mode 100644 index 000000000000..174202318dff --- /dev/null +++ b/arch/arm/include/asm/xen/page.h | |||
| @@ -0,0 +1,82 @@ | |||
| 1 | #ifndef _ASM_ARM_XEN_PAGE_H | ||
| 2 | #define _ASM_ARM_XEN_PAGE_H | ||
| 3 | |||
| 4 | #include <asm/page.h> | ||
| 5 | #include <asm/pgtable.h> | ||
| 6 | |||
| 7 | #include <linux/pfn.h> | ||
| 8 | #include <linux/types.h> | ||
| 9 | |||
| 10 | #include <xen/interface/grant_table.h> | ||
| 11 | |||
| 12 | #define pfn_to_mfn(pfn) (pfn) | ||
| 13 | #define phys_to_machine_mapping_valid (1) | ||
| 14 | #define mfn_to_pfn(mfn) (mfn) | ||
| 15 | #define mfn_to_virt(m) (__va(mfn_to_pfn(m) << PAGE_SHIFT)) | ||
| 16 | |||
| 17 | #define pte_mfn pte_pfn | ||
| 18 | #define mfn_pte pfn_pte | ||
| 19 | |||
| 20 | /* Xen machine address */ | ||
| 21 | typedef struct xmaddr { | ||
| 22 | phys_addr_t maddr; | ||
| 23 | } xmaddr_t; | ||
| 24 | |||
| 25 | /* Xen pseudo-physical address */ | ||
| 26 | typedef struct xpaddr { | ||
| 27 | phys_addr_t paddr; | ||
| 28 | } xpaddr_t; | ||
| 29 | |||
| 30 | #define XMADDR(x) ((xmaddr_t) { .maddr = (x) }) | ||
| 31 | #define XPADDR(x) ((xpaddr_t) { .paddr = (x) }) | ||
| 32 | |||
| 33 | static inline xmaddr_t phys_to_machine(xpaddr_t phys) | ||
| 34 | { | ||
| 35 | unsigned offset = phys.paddr & ~PAGE_MASK; | ||
| 36 | return XMADDR(PFN_PHYS(pfn_to_mfn(PFN_DOWN(phys.paddr))) | offset); | ||
| 37 | } | ||
| 38 | |||
| 39 | static inline xpaddr_t machine_to_phys(xmaddr_t machine) | ||
| 40 | { | ||
| 41 | unsigned offset = machine.maddr & ~PAGE_MASK; | ||
| 42 | return XPADDR(PFN_PHYS(mfn_to_pfn(PFN_DOWN(machine.maddr))) | offset); | ||
| 43 | } | ||
| 44 | /* VIRT <-> MACHINE conversion */ | ||
| 45 | #define virt_to_machine(v) (phys_to_machine(XPADDR(__pa(v)))) | ||
| 46 | #define virt_to_pfn(v) (PFN_DOWN(__pa(v))) | ||
| 47 | #define virt_to_mfn(v) (pfn_to_mfn(virt_to_pfn(v))) | ||
| 48 | #define mfn_to_virt(m) (__va(mfn_to_pfn(m) << PAGE_SHIFT)) | ||
| 49 | |||
| 50 | static inline xmaddr_t arbitrary_virt_to_machine(void *vaddr) | ||
| 51 | { | ||
| 52 | /* TODO: assuming it is mapped in the kernel 1:1 */ | ||
| 53 | return virt_to_machine(vaddr); | ||
| 54 | } | ||
| 55 | |||
| 56 | /* TODO: this shouldn't be here but it is because the frontend drivers | ||
| 57 | * are using it (its rolled in headers) even though we won't hit the code path. | ||
| 58 | * So for right now just punt with this. | ||
| 59 | */ | ||
| 60 | static inline pte_t *lookup_address(unsigned long address, unsigned int *level) | ||
| 61 | { | ||
| 62 | BUG(); | ||
| 63 | return NULL; | ||
| 64 | } | ||
| 65 | |||
| 66 | static inline int m2p_add_override(unsigned long mfn, struct page *page, | ||
| 67 | struct gnttab_map_grant_ref *kmap_op) | ||
| 68 | { | ||
| 69 | return 0; | ||
| 70 | } | ||
| 71 | |||
| 72 | static inline int m2p_remove_override(struct page *page, bool clear_pte) | ||
| 73 | { | ||
| 74 | return 0; | ||
| 75 | } | ||
| 76 | |||
| 77 | static inline bool set_phys_to_machine(unsigned long pfn, unsigned long mfn) | ||
| 78 | { | ||
| 79 | BUG(); | ||
| 80 | return false; | ||
| 81 | } | ||
| 82 | #endif /* _ASM_ARM_XEN_PAGE_H */ | ||
diff --git a/arch/arm/mach-vexpress/Makefile.boot b/arch/arm/mach-vexpress/Makefile.boot index 318d308dfb93..38dbaac63349 100644 --- a/arch/arm/mach-vexpress/Makefile.boot +++ b/arch/arm/mach-vexpress/Makefile.boot | |||
| @@ -7,4 +7,5 @@ initrd_phys-y := 0x60800000 | |||
| 7 | dtb-$(CONFIG_ARCH_VEXPRESS_DT) += vexpress-v2p-ca5s.dtb \ | 7 | dtb-$(CONFIG_ARCH_VEXPRESS_DT) += vexpress-v2p-ca5s.dtb \ |
| 8 | vexpress-v2p-ca9.dtb \ | 8 | vexpress-v2p-ca9.dtb \ |
| 9 | vexpress-v2p-ca15-tc1.dtb \ | 9 | vexpress-v2p-ca15-tc1.dtb \ |
| 10 | vexpress-v2p-ca15_a7.dtb | 10 | vexpress-v2p-ca15_a7.dtb \ |
| 11 | xenvm-4.2.dtb | ||
diff --git a/arch/arm/mach-vexpress/v2m.c b/arch/arm/mach-vexpress/v2m.c index 37608f22ee31..0a79b085ceaf 100644 --- a/arch/arm/mach-vexpress/v2m.c +++ b/arch/arm/mach-vexpress/v2m.c | |||
| @@ -658,6 +658,7 @@ static void __init v2m_dt_init(void) | |||
| 658 | 658 | ||
| 659 | const static char *v2m_dt_match[] __initconst = { | 659 | const static char *v2m_dt_match[] __initconst = { |
| 660 | "arm,vexpress", | 660 | "arm,vexpress", |
| 661 | "xen,xenvm", | ||
| 661 | NULL, | 662 | NULL, |
| 662 | }; | 663 | }; |
| 663 | 664 | ||
diff --git a/arch/arm/xen/Makefile b/arch/arm/xen/Makefile new file mode 100644 index 000000000000..43841033afd3 --- /dev/null +++ b/arch/arm/xen/Makefile | |||
| @@ -0,0 +1 @@ | |||
| obj-y := enlighten.o hypercall.o grant-table.o | |||
diff --git a/arch/arm/xen/enlighten.c b/arch/arm/xen/enlighten.c new file mode 100644 index 000000000000..59bcb96ac369 --- /dev/null +++ b/arch/arm/xen/enlighten.c | |||
| @@ -0,0 +1,168 @@ | |||
| 1 | #include <xen/xen.h> | ||
| 2 | #include <xen/events.h> | ||
| 3 | #include <xen/grant_table.h> | ||
| 4 | #include <xen/hvm.h> | ||
| 5 | #include <xen/interface/xen.h> | ||
| 6 | #include <xen/interface/memory.h> | ||
| 7 | #include <xen/interface/hvm/params.h> | ||
| 8 | #include <xen/features.h> | ||
| 9 | #include <xen/platform_pci.h> | ||
| 10 | #include <xen/xenbus.h> | ||
| 11 | #include <asm/xen/hypervisor.h> | ||
| 12 | #include <asm/xen/hypercall.h> | ||
| 13 | #include <linux/interrupt.h> | ||
| 14 | #include <linux/irqreturn.h> | ||
| 15 | #include <linux/module.h> | ||
| 16 | #include <linux/of.h> | ||
| 17 | #include <linux/of_irq.h> | ||
| 18 | #include <linux/of_address.h> | ||
| 19 | |||
| 20 | struct start_info _xen_start_info; | ||
| 21 | struct start_info *xen_start_info = &_xen_start_info; | ||
| 22 | EXPORT_SYMBOL_GPL(xen_start_info); | ||
| 23 | |||
| 24 | enum xen_domain_type xen_domain_type = XEN_NATIVE; | ||
| 25 | EXPORT_SYMBOL_GPL(xen_domain_type); | ||
| 26 | |||
| 27 | struct shared_info xen_dummy_shared_info; | ||
| 28 | struct shared_info *HYPERVISOR_shared_info = (void *)&xen_dummy_shared_info; | ||
| 29 | |||
| 30 | DEFINE_PER_CPU(struct vcpu_info *, xen_vcpu); | ||
| 31 | |||
| 32 | /* TODO: to be removed */ | ||
| 33 | __read_mostly int xen_have_vector_callback; | ||
| 34 | EXPORT_SYMBOL_GPL(xen_have_vector_callback); | ||
| 35 | |||
| 36 | int xen_platform_pci_unplug = XEN_UNPLUG_ALL; | ||
| 37 | EXPORT_SYMBOL_GPL(xen_platform_pci_unplug); | ||
| 38 | |||
| 39 | static __read_mostly int xen_events_irq = -1; | ||
| 40 | |||
| 41 | int xen_remap_domain_mfn_range(struct vm_area_struct *vma, | ||
| 42 | unsigned long addr, | ||
| 43 | unsigned long mfn, int nr, | ||
| 44 | pgprot_t prot, unsigned domid) | ||
| 45 | { | ||
| 46 | return -ENOSYS; | ||
| 47 | } | ||
| 48 | EXPORT_SYMBOL_GPL(xen_remap_domain_mfn_range); | ||
| 49 | |||
| 50 | /* | ||
| 51 | * see Documentation/devicetree/bindings/arm/xen.txt for the | ||
| 52 | * documentation of the Xen Device Tree format. | ||
| 53 | */ | ||
| 54 | #define GRANT_TABLE_PHYSADDR 0 | ||
| 55 | static int __init xen_guest_init(void) | ||
| 56 | { | ||
| 57 | struct xen_add_to_physmap xatp; | ||
| 58 | static struct shared_info *shared_info_page = 0; | ||
| 59 | struct device_node *node; | ||
| 60 | int len; | ||
| 61 | const char *s = NULL; | ||
| 62 | const char *version = NULL; | ||
| 63 | const char *xen_prefix = "xen,xen-"; | ||
| 64 | struct resource res; | ||
| 65 | |||
| 66 | node = of_find_compatible_node(NULL, NULL, "xen,xen"); | ||
| 67 | if (!node) { | ||
| 68 | pr_debug("No Xen support\n"); | ||
| 69 | return 0; | ||
| 70 | } | ||
| 71 | s = of_get_property(node, "compatible", &len); | ||
| 72 | if (strlen(xen_prefix) + 3 < len && | ||
| 73 | !strncmp(xen_prefix, s, strlen(xen_prefix))) | ||
| 74 | version = s + strlen(xen_prefix); | ||
| 75 | if (version == NULL) { | ||
| 76 | pr_debug("Xen version not found\n"); | ||
| 77 | return 0; | ||
| 78 | } | ||
| 79 | if (of_address_to_resource(node, GRANT_TABLE_PHYSADDR, &res)) | ||
| 80 | return 0; | ||
| 81 | xen_hvm_resume_frames = res.start >> PAGE_SHIFT; | ||
| 82 | xen_events_irq = irq_of_parse_and_map(node, 0); | ||
| 83 | pr_info("Xen %s support found, events_irq=%d gnttab_frame_pfn=%lx\n", | ||
| 84 | version, xen_events_irq, xen_hvm_resume_frames); | ||
| 85 | xen_domain_type = XEN_HVM_DOMAIN; | ||
| 86 | |||
| 87 | xen_setup_features(); | ||
| 88 | if (xen_feature(XENFEAT_dom0)) | ||
| 89 | xen_start_info->flags |= SIF_INITDOMAIN|SIF_PRIVILEGED; | ||
| 90 | else | ||
| 91 | xen_start_info->flags &= ~(SIF_INITDOMAIN|SIF_PRIVILEGED); | ||
| 92 | |||
| 93 | if (!shared_info_page) | ||
| 94 | shared_info_page = (struct shared_info *) | ||
| 95 | get_zeroed_page(GFP_KERNEL); | ||
| 96 | if (!shared_info_page) { | ||
| 97 | pr_err("not enough memory\n"); | ||
| 98 | return -ENOMEM; | ||
| 99 | } | ||
| 100 | xatp.domid = DOMID_SELF; | ||
| 101 | xatp.idx = 0; | ||
| 102 | xatp.space = XENMAPSPACE_shared_info; | ||
| 103 | xatp.gpfn = __pa(shared_info_page) >> PAGE_SHIFT; | ||
| 104 | if (HYPERVISOR_memory_op(XENMEM_add_to_physmap, &xatp)) | ||
| 105 | BUG(); | ||
| 106 | |||
| 107 | HYPERVISOR_shared_info = (struct shared_info *)shared_info_page; | ||
| 108 | |||
| 109 | /* xen_vcpu is a pointer to the vcpu_info struct in the shared_info | ||
| 110 | * page, we use it in the event channel upcall and in some pvclock | ||
| 111 | * related functions. We don't need the vcpu_info placement | ||
| 112 | * optimizations because we don't use any pv_mmu or pv_irq op on | ||
| 113 | * HVM. | ||
| 114 | * The shared info contains exactly 1 CPU (the boot CPU). The guest | ||
| 115 | * is required to use VCPUOP_register_vcpu_info to place vcpu info | ||
| 116 | * for secondary CPUs as they are brought up. */ | ||
| 117 | per_cpu(xen_vcpu, 0) = &HYPERVISOR_shared_info->vcpu_info[0]; | ||
| 118 | |||
| 119 | gnttab_init(); | ||
| 120 | if (!xen_initial_domain()) | ||
| 121 | xenbus_probe(NULL); | ||
| 122 | |||
| 123 | return 0; | ||
| 124 | } | ||
| 125 | core_initcall(xen_guest_init); | ||
| 126 | |||
| 127 | static irqreturn_t xen_arm_callback(int irq, void *arg) | ||
| 128 | { | ||
| 129 | xen_hvm_evtchn_do_upcall(); | ||
| 130 | return IRQ_HANDLED; | ||
| 131 | } | ||
| 132 | |||
| 133 | static int __init xen_init_events(void) | ||
| 134 | { | ||
| 135 | if (!xen_domain() || xen_events_irq < 0) | ||
| 136 | return -ENODEV; | ||
| 137 | |||
| 138 | xen_init_IRQ(); | ||
| 139 | |||
| 140 | if (request_percpu_irq(xen_events_irq, xen_arm_callback, | ||
| 141 | "events", xen_vcpu)) { | ||
| 142 | pr_err("Error requesting IRQ %d\n", xen_events_irq); | ||
| 143 | return -EINVAL; | ||
| 144 | } | ||
| 145 | |||
| 146 | enable_percpu_irq(xen_events_irq, 0); | ||
| 147 | |||
| 148 | return 0; | ||
| 149 | } | ||
| 150 | postcore_initcall(xen_init_events); | ||
| 151 | |||
| 152 | /* XXX: only until balloon is properly working */ | ||
| 153 | int alloc_xenballooned_pages(int nr_pages, struct page **pages, bool highmem) | ||
| 154 | { | ||
| 155 | *pages = alloc_pages(highmem ? GFP_HIGHUSER : GFP_KERNEL, | ||
| 156 | get_order(nr_pages)); | ||
| 157 | if (*pages == NULL) | ||
| 158 | return -ENOMEM; | ||
| 159 | return 0; | ||
| 160 | } | ||
| 161 | EXPORT_SYMBOL_GPL(alloc_xenballooned_pages); | ||
| 162 | |||
| 163 | void free_xenballooned_pages(int nr_pages, struct page **pages) | ||
| 164 | { | ||
| 165 | kfree(*pages); | ||
| 166 | *pages = NULL; | ||
| 167 | } | ||
| 168 | EXPORT_SYMBOL_GPL(free_xenballooned_pages); | ||
diff --git a/arch/arm/xen/grant-table.c b/arch/arm/xen/grant-table.c new file mode 100644 index 000000000000..dbd1330c0196 --- /dev/null +++ b/arch/arm/xen/grant-table.c | |||
| @@ -0,0 +1,53 @@ | |||
| 1 | /****************************************************************************** | ||
| 2 | * grant_table.c | ||
| 3 | * ARM specific part | ||
| 4 | * | ||
| 5 | * Granting foreign access to our memory reservation. | ||
| 6 | * | ||
| 7 | * This program is free software; you can redistribute it and/or | ||
| 8 | * modify it under the terms of the GNU General Public License version 2 | ||
| 9 | * as published by the Free Software Foundation; or, when distributed | ||
| 10 | * separately from the Linux kernel or incorporated into other | ||
| 11 | * software packages, subject to the following license: | ||
| 12 | * | ||
| 13 | * Permission is hereby granted, free of charge, to any person obtaining a copy | ||
| 14 | * of this source file (the "Software"), to deal in the Software without | ||
| 15 | * restriction, including without limitation the rights to use, copy, modify, | ||
| 16 | * merge, publish, distribute, sublicense, and/or sell copies of the Software, | ||
| 17 | * and to permit persons to whom the Software is furnished to do so, subject to | ||
| 18 | * the following conditions: | ||
| 19 | * | ||
| 20 | * The above copyright notice and this permission notice shall be included in | ||
| 21 | * all copies or substantial portions of the Software. | ||
| 22 | * | ||
| 23 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||
| 24 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||
| 25 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||
| 26 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||
| 27 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING | ||
| 28 | * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS | ||
| 29 | * IN THE SOFTWARE. | ||
| 30 | */ | ||
| 31 | |||
| 32 | #include <xen/interface/xen.h> | ||
| 33 | #include <xen/page.h> | ||
| 34 | #include <xen/grant_table.h> | ||
| 35 | |||
| 36 | int arch_gnttab_map_shared(unsigned long *frames, unsigned long nr_gframes, | ||
| 37 | unsigned long max_nr_gframes, | ||
| 38 | void **__shared) | ||
| 39 | { | ||
| 40 | return -ENOSYS; | ||
| 41 | } | ||
| 42 | |||
| 43 | void arch_gnttab_unmap(void *shared, unsigned long nr_gframes) | ||
| 44 | { | ||
| 45 | return; | ||
| 46 | } | ||
| 47 | |||
| 48 | int arch_gnttab_map_status(uint64_t *frames, unsigned long nr_gframes, | ||
| 49 | unsigned long max_nr_gframes, | ||
| 50 | grant_status_t **__shared) | ||
| 51 | { | ||
| 52 | return -ENOSYS; | ||
| 53 | } | ||
diff --git a/arch/arm/xen/hypercall.S b/arch/arm/xen/hypercall.S new file mode 100644 index 000000000000..074f5ed101b9 --- /dev/null +++ b/arch/arm/xen/hypercall.S | |||
| @@ -0,0 +1,106 @@ | |||
| 1 | /****************************************************************************** | ||
| 2 | * hypercall.S | ||
| 3 | * | ||
| 4 | * Xen hypercall wrappers | ||
| 5 | * | ||
| 6 | * Stefano Stabellini <stefano.stabellini@eu.citrix.com>, Citrix, 2012 | ||
| 7 | * | ||
| 8 | * This program is free software; you can redistribute it and/or | ||
| 9 | * modify it under the terms of the GNU General Public License version 2 | ||
| 10 | * as published by the Free Software Foundation; or, when distributed | ||
| 11 | * separately from the Linux kernel or incorporated into other | ||
| 12 | * software packages, subject to the following license: | ||
| 13 | * | ||
| 14 | * Permission is hereby granted, free of charge, to any person obtaining a copy | ||
| 15 | * of this source file (the "Software"), to deal in the Software without | ||
| 16 | * restriction, including without limitation the rights to use, copy, modify, | ||
| 17 | * merge, publish, distribute, sublicense, and/or sell copies of the Software, | ||
| 18 | * and to permit persons to whom the Software is furnished to do so, subject to | ||
| 19 | * the following conditions: | ||
| 20 | * | ||
| 21 | * The above copyright notice and this permission notice shall be included in | ||
| 22 | * all copies or substantial portions of the Software. | ||
| 23 | * | ||
| 24 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||
| 25 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||
| 26 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||
| 27 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||
| 28 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING | ||
| 29 | * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS | ||
| 30 | * IN THE SOFTWARE. | ||
| 31 | */ | ||
| 32 | |||
| 33 | /* | ||
| 34 | * The Xen hypercall calling convention is very similar to the ARM | ||
| 35 | * procedure calling convention: the first paramter is passed in r0, the | ||
| 36 | * second in r1, the third in r2 and the fourth in r3. Considering that | ||
| 37 | * Xen hypercalls have 5 arguments at most, the fifth paramter is passed | ||
| 38 | * in r4, differently from the procedure calling convention of using the | ||
| 39 | * stack for that case. | ||
| 40 | * | ||
| 41 | * The hypercall number is passed in r12. | ||
| 42 | * | ||
| 43 | * The return value is in r0. | ||
| 44 | * | ||
| 45 | * The hvc ISS is required to be 0xEA1, that is the Xen specific ARM | ||
| 46 | * hypercall tag. | ||
| 47 | */ | ||
| 48 | |||
| 49 | #include <linux/linkage.h> | ||
| 50 | #include <asm/assembler.h> | ||
| 51 | #include <xen/interface/xen.h> | ||
| 52 | |||
| 53 | |||
| 54 | /* HVC 0xEA1 */ | ||
| 55 | #ifdef CONFIG_THUMB2_KERNEL | ||
| 56 | #define xen_hvc .word 0xf7e08ea1 | ||
| 57 | #else | ||
| 58 | #define xen_hvc .word 0xe140ea71 | ||
| 59 | #endif | ||
| 60 | |||
| 61 | #define HYPERCALL_SIMPLE(hypercall) \ | ||
| 62 | ENTRY(HYPERVISOR_##hypercall) \ | ||
| 63 | mov r12, #__HYPERVISOR_##hypercall; \ | ||
| 64 | xen_hvc; \ | ||
| 65 | mov pc, lr; \ | ||
| 66 | ENDPROC(HYPERVISOR_##hypercall) | ||
| 67 | |||
| 68 | #define HYPERCALL0 HYPERCALL_SIMPLE | ||
| 69 | #define HYPERCALL1 HYPERCALL_SIMPLE | ||
| 70 | #define HYPERCALL2 HYPERCALL_SIMPLE | ||
| 71 | #define HYPERCALL3 HYPERCALL_SIMPLE | ||
| 72 | #define HYPERCALL4 HYPERCALL_SIMPLE | ||
| 73 | |||
| 74 | #define HYPERCALL5(hypercall) \ | ||
| 75 | ENTRY(HYPERVISOR_##hypercall) \ | ||
| 76 | stmdb sp!, {r4} \ | ||
| 77 | ldr r4, [sp, #4] \ | ||
| 78 | mov r12, #__HYPERVISOR_##hypercall; \ | ||
| 79 | xen_hvc \ | ||
| 80 | ldm sp!, {r4} \ | ||
| 81 | mov pc, lr \ | ||
| 82 | ENDPROC(HYPERVISOR_##hypercall) | ||
| 83 | |||
| 84 | .text | ||
| 85 | |||
| 86 | HYPERCALL2(xen_version); | ||
| 87 | HYPERCALL3(console_io); | ||
| 88 | HYPERCALL3(grant_table_op); | ||
| 89 | HYPERCALL2(sched_op); | ||
| 90 | HYPERCALL2(event_channel_op); | ||
| 91 | HYPERCALL2(hvm_op); | ||
| 92 | HYPERCALL2(memory_op); | ||
| 93 | HYPERCALL2(physdev_op); | ||
| 94 | |||
| 95 | ENTRY(privcmd_call) | ||
| 96 | stmdb sp!, {r4} | ||
| 97 | mov r12, r0 | ||
| 98 | mov r0, r1 | ||
| 99 | mov r1, r2 | ||
| 100 | mov r2, r3 | ||
| 101 | ldr r3, [sp, #8] | ||
| 102 | ldr r4, [sp, #4] | ||
| 103 | xen_hvc | ||
| 104 | ldm sp!, {r4} | ||
| 105 | mov pc, lr | ||
| 106 | ENDPROC(privcmd_call); | ||
diff --git a/arch/ia64/include/asm/xen/interface.h b/arch/ia64/include/asm/xen/interface.h index 3d52a5bbd857..e88c5de27410 100644 --- a/arch/ia64/include/asm/xen/interface.h +++ b/arch/ia64/include/asm/xen/interface.h | |||
| @@ -71,6 +71,7 @@ | |||
| 71 | * with Xen so that we could have one ABI that works for 32 and 64 bit | 71 | * with Xen so that we could have one ABI that works for 32 and 64 bit |
| 72 | * guests. */ | 72 | * guests. */ |
| 73 | typedef unsigned long xen_pfn_t; | 73 | typedef unsigned long xen_pfn_t; |
| 74 | typedef unsigned long xen_ulong_t; | ||
| 74 | /* Guest handles for primitive C types. */ | 75 | /* Guest handles for primitive C types. */ |
| 75 | __DEFINE_GUEST_HANDLE(uchar, unsigned char); | 76 | __DEFINE_GUEST_HANDLE(uchar, unsigned char); |
| 76 | __DEFINE_GUEST_HANDLE(uint, unsigned int); | 77 | __DEFINE_GUEST_HANDLE(uint, unsigned int); |
diff --git a/arch/x86/include/asm/xen/interface.h b/arch/x86/include/asm/xen/interface.h index 555f94d3637b..28fc6211a79a 100644 --- a/arch/x86/include/asm/xen/interface.h +++ b/arch/x86/include/asm/xen/interface.h | |||
| @@ -51,6 +51,7 @@ | |||
| 51 | * with Xen so that on ARM we can have one ABI that works for 32 and 64 | 51 | * with Xen so that on ARM we can have one ABI that works for 32 and 64 |
| 52 | * bit guests. */ | 52 | * bit guests. */ |
| 53 | typedef unsigned long xen_pfn_t; | 53 | typedef unsigned long xen_pfn_t; |
| 54 | typedef unsigned long xen_ulong_t; | ||
| 54 | /* Guest handles for primitive C types. */ | 55 | /* Guest handles for primitive C types. */ |
| 55 | __DEFINE_GUEST_HANDLE(uchar, unsigned char); | 56 | __DEFINE_GUEST_HANDLE(uchar, unsigned char); |
| 56 | __DEFINE_GUEST_HANDLE(uint, unsigned int); | 57 | __DEFINE_GUEST_HANDLE(uint, unsigned int); |
diff --git a/arch/x86/xen/enlighten.c b/arch/x86/xen/enlighten.c index 67897152237c..70f140447a28 100644 --- a/arch/x86/xen/enlighten.c +++ b/arch/x86/xen/enlighten.c | |||
| @@ -33,6 +33,7 @@ | |||
| 33 | #include <linux/memblock.h> | 33 | #include <linux/memblock.h> |
| 34 | 34 | ||
| 35 | #include <xen/xen.h> | 35 | #include <xen/xen.h> |
| 36 | #include <xen/events.h> | ||
| 36 | #include <xen/interface/xen.h> | 37 | #include <xen/interface/xen.h> |
| 37 | #include <xen/interface/version.h> | 38 | #include <xen/interface/version.h> |
| 38 | #include <xen/interface/physdev.h> | 39 | #include <xen/interface/physdev.h> |
diff --git a/arch/x86/xen/irq.c b/arch/x86/xen/irq.c index 157337657971..01a4dc015ae1 100644 --- a/arch/x86/xen/irq.c +++ b/arch/x86/xen/irq.c | |||
| @@ -5,6 +5,7 @@ | |||
| 5 | #include <xen/interface/xen.h> | 5 | #include <xen/interface/xen.h> |
| 6 | #include <xen/interface/sched.h> | 6 | #include <xen/interface/sched.h> |
| 7 | #include <xen/interface/vcpu.h> | 7 | #include <xen/interface/vcpu.h> |
| 8 | #include <xen/events.h> | ||
| 8 | 9 | ||
| 9 | #include <asm/xen/hypercall.h> | 10 | #include <asm/xen/hypercall.h> |
| 10 | #include <asm/xen/hypervisor.h> | 11 | #include <asm/xen/hypervisor.h> |
diff --git a/arch/x86/xen/xen-ops.h b/arch/x86/xen/xen-ops.h index bb5a8105ea86..a95b41744ad0 100644 --- a/arch/x86/xen/xen-ops.h +++ b/arch/x86/xen/xen-ops.h | |||
| @@ -35,7 +35,6 @@ void xen_set_pat(u64); | |||
| 35 | 35 | ||
| 36 | char * __init xen_memory_setup(void); | 36 | char * __init xen_memory_setup(void); |
| 37 | void __init xen_arch_setup(void); | 37 | void __init xen_arch_setup(void); |
| 38 | void __init xen_init_IRQ(void); | ||
| 39 | void xen_enable_sysenter(void); | 38 | void xen_enable_sysenter(void); |
| 40 | void xen_enable_syscall(void); | 39 | void xen_enable_syscall(void); |
| 41 | void xen_vcpu_restore(void); | 40 | void xen_vcpu_restore(void); |
diff --git a/drivers/block/xen-blkback/blkback.c b/drivers/block/xen-blkback/blkback.c index 73f196ca713f..63dd5b96b65a 100644 --- a/drivers/block/xen-blkback/blkback.c +++ b/drivers/block/xen-blkback/blkback.c | |||
| @@ -42,6 +42,7 @@ | |||
| 42 | 42 | ||
| 43 | #include <xen/events.h> | 43 | #include <xen/events.h> |
| 44 | #include <xen/page.h> | 44 | #include <xen/page.h> |
| 45 | #include <xen/xen.h> | ||
| 45 | #include <asm/xen/hypervisor.h> | 46 | #include <asm/xen/hypervisor.h> |
| 46 | #include <asm/xen/hypercall.h> | 47 | #include <asm/xen/hypercall.h> |
| 47 | #include "common.h" | 48 | #include "common.h" |
diff --git a/drivers/net/xen-netback/netback.c b/drivers/net/xen-netback/netback.c index 05593d882023..4ebfcf3d8a3b 100644 --- a/drivers/net/xen-netback/netback.c +++ b/drivers/net/xen-netback/netback.c | |||
| @@ -40,6 +40,7 @@ | |||
| 40 | 40 | ||
| 41 | #include <net/tcp.h> | 41 | #include <net/tcp.h> |
| 42 | 42 | ||
| 43 | #include <xen/xen.h> | ||
| 43 | #include <xen/events.h> | 44 | #include <xen/events.h> |
| 44 | #include <xen/interface/memory.h> | 45 | #include <xen/interface/memory.h> |
| 45 | 46 | ||
diff --git a/drivers/net/xen-netfront.c b/drivers/net/xen-netfront.c index 650f79a1f2bd..24d968ddb543 100644 --- a/drivers/net/xen-netfront.c +++ b/drivers/net/xen-netfront.c | |||
| @@ -43,6 +43,7 @@ | |||
| 43 | #include <linux/slab.h> | 43 | #include <linux/slab.h> |
| 44 | #include <net/ip.h> | 44 | #include <net/ip.h> |
| 45 | 45 | ||
| 46 | #include <asm/xen/page.h> | ||
| 46 | #include <xen/xen.h> | 47 | #include <xen/xen.h> |
| 47 | #include <xen/xenbus.h> | 48 | #include <xen/xenbus.h> |
| 48 | #include <xen/events.h> | 49 | #include <xen/events.h> |
diff --git a/drivers/xen/Makefile b/drivers/xen/Makefile index d80bea5535a2..cd28aae575dd 100644 --- a/drivers/xen/Makefile +++ b/drivers/xen/Makefile | |||
| @@ -1,11 +1,18 @@ | |||
| 1 | obj-y += grant-table.o features.o events.o manage.o balloon.o | 1 | ifneq ($(CONFIG_ARM),y) |
| 2 | obj-y += manage.o balloon.o | ||
| 3 | obj-$(CONFIG_HOTPLUG_CPU) += cpu_hotplug.o | ||
| 4 | endif | ||
| 5 | obj-y += grant-table.o features.o events.o | ||
| 2 | obj-y += xenbus/ | 6 | obj-y += xenbus/ |
| 3 | 7 | ||
| 4 | nostackp := $(call cc-option, -fno-stack-protector) | 8 | nostackp := $(call cc-option, -fno-stack-protector) |
| 5 | CFLAGS_features.o := $(nostackp) | 9 | CFLAGS_features.o := $(nostackp) |
| 6 | 10 | ||
| 11 | obj-$(CONFIG_XEN_DOM0) += $(dom0-y) | ||
| 12 | dom0-$(CONFIG_PCI) += pci.o | ||
| 13 | dom0-$(CONFIG_ACPI) += acpi.o | ||
| 14 | dom0-$(CONFIG_X86) += pcpu.o | ||
| 7 | obj-$(CONFIG_BLOCK) += biomerge.o | 15 | obj-$(CONFIG_BLOCK) += biomerge.o |
| 8 | obj-$(CONFIG_HOTPLUG_CPU) += cpu_hotplug.o | ||
| 9 | obj-$(CONFIG_XEN_XENCOMM) += xencomm.o | 16 | obj-$(CONFIG_XEN_XENCOMM) += xencomm.o |
| 10 | obj-$(CONFIG_XEN_BALLOON) += xen-balloon.o | 17 | obj-$(CONFIG_XEN_BALLOON) += xen-balloon.o |
| 11 | obj-$(CONFIG_XEN_SELFBALLOONING) += xen-selfballoon.o | 18 | obj-$(CONFIG_XEN_SELFBALLOONING) += xen-selfballoon.o |
| @@ -17,8 +24,6 @@ obj-$(CONFIG_XEN_SYS_HYPERVISOR) += sys-hypervisor.o | |||
| 17 | obj-$(CONFIG_XEN_PVHVM) += platform-pci.o | 24 | obj-$(CONFIG_XEN_PVHVM) += platform-pci.o |
| 18 | obj-$(CONFIG_XEN_TMEM) += tmem.o | 25 | obj-$(CONFIG_XEN_TMEM) += tmem.o |
| 19 | obj-$(CONFIG_SWIOTLB_XEN) += swiotlb-xen.o | 26 | obj-$(CONFIG_SWIOTLB_XEN) += swiotlb-xen.o |
| 20 | obj-$(CONFIG_XEN_DOM0) += pcpu.o | ||
| 21 | obj-$(CONFIG_XEN_DOM0) += pci.o acpi.o | ||
| 22 | obj-$(CONFIG_XEN_MCE_LOG) += mcelog.o | 27 | obj-$(CONFIG_XEN_MCE_LOG) += mcelog.o |
| 23 | obj-$(CONFIG_XEN_PCIDEV_BACKEND) += xen-pciback/ | 28 | obj-$(CONFIG_XEN_PCIDEV_BACKEND) += xen-pciback/ |
| 24 | obj-$(CONFIG_XEN_PRIVCMD) += xen-privcmd.o | 29 | obj-$(CONFIG_XEN_PRIVCMD) += xen-privcmd.o |
diff --git a/drivers/xen/events.c b/drivers/xen/events.c index c60d1629c916..8672211555bb 100644 --- a/drivers/xen/events.c +++ b/drivers/xen/events.c | |||
| @@ -31,14 +31,16 @@ | |||
| 31 | #include <linux/irqnr.h> | 31 | #include <linux/irqnr.h> |
| 32 | #include <linux/pci.h> | 32 | #include <linux/pci.h> |
| 33 | 33 | ||
| 34 | #ifdef CONFIG_X86 | ||
| 34 | #include <asm/desc.h> | 35 | #include <asm/desc.h> |
| 35 | #include <asm/ptrace.h> | 36 | #include <asm/ptrace.h> |
| 36 | #include <asm/irq.h> | 37 | #include <asm/irq.h> |
| 37 | #include <asm/idle.h> | 38 | #include <asm/idle.h> |
| 38 | #include <asm/io_apic.h> | 39 | #include <asm/io_apic.h> |
| 39 | #include <asm/sync_bitops.h> | ||
| 40 | #include <asm/xen/page.h> | 40 | #include <asm/xen/page.h> |
| 41 | #include <asm/xen/pci.h> | 41 | #include <asm/xen/pci.h> |
| 42 | #endif | ||
| 43 | #include <asm/sync_bitops.h> | ||
| 42 | #include <asm/xen/hypercall.h> | 44 | #include <asm/xen/hypercall.h> |
| 43 | #include <asm/xen/hypervisor.h> | 45 | #include <asm/xen/hypervisor.h> |
| 44 | 46 | ||
| @@ -50,6 +52,9 @@ | |||
| 50 | #include <xen/interface/event_channel.h> | 52 | #include <xen/interface/event_channel.h> |
| 51 | #include <xen/interface/hvm/hvm_op.h> | 53 | #include <xen/interface/hvm/hvm_op.h> |
| 52 | #include <xen/interface/hvm/params.h> | 54 | #include <xen/interface/hvm/params.h> |
| 55 | #include <xen/interface/physdev.h> | ||
| 56 | #include <xen/interface/sched.h> | ||
| 57 | #include <asm/hw_irq.h> | ||
| 53 | 58 | ||
| 54 | /* | 59 | /* |
| 55 | * This lock protects updates to the following mapping and reference-count | 60 | * This lock protects updates to the following mapping and reference-count |
| @@ -1386,7 +1391,9 @@ void xen_evtchn_do_upcall(struct pt_regs *regs) | |||
| 1386 | { | 1391 | { |
| 1387 | struct pt_regs *old_regs = set_irq_regs(regs); | 1392 | struct pt_regs *old_regs = set_irq_regs(regs); |
| 1388 | 1393 | ||
| 1394 | #ifdef CONFIG_X86 | ||
| 1389 | exit_idle(); | 1395 | exit_idle(); |
| 1396 | #endif | ||
| 1390 | irq_enter(); | 1397 | irq_enter(); |
| 1391 | 1398 | ||
| 1392 | __xen_evtchn_do_upcall(); | 1399 | __xen_evtchn_do_upcall(); |
| @@ -1795,9 +1802,9 @@ void xen_callback_vector(void) | |||
| 1795 | void xen_callback_vector(void) {} | 1802 | void xen_callback_vector(void) {} |
| 1796 | #endif | 1803 | #endif |
| 1797 | 1804 | ||
| 1798 | void __init xen_init_IRQ(void) | 1805 | void xen_init_IRQ(void) |
| 1799 | { | 1806 | { |
| 1800 | int i, rc; | 1807 | int i; |
| 1801 | 1808 | ||
| 1802 | evtchn_to_irq = kcalloc(NR_EVENT_CHANNELS, sizeof(*evtchn_to_irq), | 1809 | evtchn_to_irq = kcalloc(NR_EVENT_CHANNELS, sizeof(*evtchn_to_irq), |
| 1803 | GFP_KERNEL); | 1810 | GFP_KERNEL); |
| @@ -1813,6 +1820,7 @@ void __init xen_init_IRQ(void) | |||
| 1813 | 1820 | ||
| 1814 | pirq_needs_eoi = pirq_needs_eoi_flag; | 1821 | pirq_needs_eoi = pirq_needs_eoi_flag; |
| 1815 | 1822 | ||
| 1823 | #ifdef CONFIG_X86 | ||
| 1816 | if (xen_hvm_domain()) { | 1824 | if (xen_hvm_domain()) { |
| 1817 | xen_callback_vector(); | 1825 | xen_callback_vector(); |
| 1818 | native_init_IRQ(); | 1826 | native_init_IRQ(); |
| @@ -1820,6 +1828,7 @@ void __init xen_init_IRQ(void) | |||
| 1820 | * __acpi_register_gsi can point at the right function */ | 1828 | * __acpi_register_gsi can point at the right function */ |
| 1821 | pci_xen_hvm_init(); | 1829 | pci_xen_hvm_init(); |
| 1822 | } else { | 1830 | } else { |
| 1831 | int rc; | ||
| 1823 | struct physdev_pirq_eoi_gmfn eoi_gmfn; | 1832 | struct physdev_pirq_eoi_gmfn eoi_gmfn; |
| 1824 | 1833 | ||
| 1825 | irq_ctx_init(smp_processor_id()); | 1834 | irq_ctx_init(smp_processor_id()); |
| @@ -1835,4 +1844,6 @@ void __init xen_init_IRQ(void) | |||
| 1835 | } else | 1844 | } else |
| 1836 | pirq_needs_eoi = pirq_check_eoi_map; | 1845 | pirq_needs_eoi = pirq_check_eoi_map; |
| 1837 | } | 1846 | } |
| 1847 | #endif | ||
| 1838 | } | 1848 | } |
| 1849 | EXPORT_SYMBOL_GPL(xen_init_IRQ); | ||
diff --git a/include/xen/events.h b/include/xen/events.h index 04399b28e821..c6bfe01acf6b 100644 --- a/include/xen/events.h +++ b/include/xen/events.h | |||
| @@ -109,4 +109,6 @@ int xen_irq_from_gsi(unsigned gsi); | |||
| 109 | /* Determine whether to ignore this IRQ if it is passed to a guest. */ | 109 | /* Determine whether to ignore this IRQ if it is passed to a guest. */ |
| 110 | int xen_test_irq_shared(int irq); | 110 | int xen_test_irq_shared(int irq); |
| 111 | 111 | ||
| 112 | /* initialize Xen IRQ subsystem */ | ||
| 113 | void xen_init_IRQ(void); | ||
| 112 | #endif /* _XEN_EVENTS_H */ | 114 | #endif /* _XEN_EVENTS_H */ |
diff --git a/include/xen/interface/features.h b/include/xen/interface/features.h index b6ca39a069d8..131a6ccdba25 100644 --- a/include/xen/interface/features.h +++ b/include/xen/interface/features.h | |||
| @@ -50,6 +50,9 @@ | |||
| 50 | /* x86: pirq can be used by HVM guests */ | 50 | /* x86: pirq can be used by HVM guests */ |
| 51 | #define XENFEAT_hvm_pirqs 10 | 51 | #define XENFEAT_hvm_pirqs 10 |
| 52 | 52 | ||
| 53 | /* operation as Dom0 is supported */ | ||
| 54 | #define XENFEAT_dom0 11 | ||
| 55 | |||
| 53 | #define XENFEAT_NR_SUBMAPS 1 | 56 | #define XENFEAT_NR_SUBMAPS 1 |
| 54 | 57 | ||
| 55 | #endif /* __XEN_PUBLIC_FEATURES_H__ */ | 58 | #endif /* __XEN_PUBLIC_FEATURES_H__ */ |
diff --git a/include/xen/interface/io/protocols.h b/include/xen/interface/io/protocols.h index 01fc8ae5f0b0..0eafaf254fff 100644 --- a/include/xen/interface/io/protocols.h +++ b/include/xen/interface/io/protocols.h | |||
| @@ -5,6 +5,7 @@ | |||
| 5 | #define XEN_IO_PROTO_ABI_X86_64 "x86_64-abi" | 5 | #define XEN_IO_PROTO_ABI_X86_64 "x86_64-abi" |
| 6 | #define XEN_IO_PROTO_ABI_IA64 "ia64-abi" | 6 | #define XEN_IO_PROTO_ABI_IA64 "ia64-abi" |
| 7 | #define XEN_IO_PROTO_ABI_POWERPC64 "powerpc64-abi" | 7 | #define XEN_IO_PROTO_ABI_POWERPC64 "powerpc64-abi" |
| 8 | #define XEN_IO_PROTO_ABI_ARM "arm-abi" | ||
| 8 | 9 | ||
| 9 | #if defined(__i386__) | 10 | #if defined(__i386__) |
| 10 | # define XEN_IO_PROTO_ABI_NATIVE XEN_IO_PROTO_ABI_X86_32 | 11 | # define XEN_IO_PROTO_ABI_NATIVE XEN_IO_PROTO_ABI_X86_32 |
| @@ -14,6 +15,8 @@ | |||
| 14 | # define XEN_IO_PROTO_ABI_NATIVE XEN_IO_PROTO_ABI_IA64 | 15 | # define XEN_IO_PROTO_ABI_NATIVE XEN_IO_PROTO_ABI_IA64 |
| 15 | #elif defined(__powerpc64__) | 16 | #elif defined(__powerpc64__) |
| 16 | # define XEN_IO_PROTO_ABI_NATIVE XEN_IO_PROTO_ABI_POWERPC64 | 17 | # define XEN_IO_PROTO_ABI_NATIVE XEN_IO_PROTO_ABI_POWERPC64 |
| 18 | #elif defined(__arm__) | ||
| 19 | # define XEN_IO_PROTO_ABI_NATIVE XEN_IO_PROTO_ABI_ARM | ||
| 17 | #else | 20 | #else |
| 18 | # error arch fixup needed here | 21 | # error arch fixup needed here |
| 19 | #endif | 22 | #endif |
diff --git a/include/xen/interface/memory.h b/include/xen/interface/memory.h index d8e33a93ea4d..b66d04ce6957 100644 --- a/include/xen/interface/memory.h +++ b/include/xen/interface/memory.h | |||
| @@ -34,7 +34,7 @@ struct xen_memory_reservation { | |||
| 34 | GUEST_HANDLE(xen_pfn_t) extent_start; | 34 | GUEST_HANDLE(xen_pfn_t) extent_start; |
| 35 | 35 | ||
| 36 | /* Number of extents, and size/alignment of each (2^extent_order pages). */ | 36 | /* Number of extents, and size/alignment of each (2^extent_order pages). */ |
| 37 | unsigned long nr_extents; | 37 | xen_ulong_t nr_extents; |
| 38 | unsigned int extent_order; | 38 | unsigned int extent_order; |
| 39 | 39 | ||
| 40 | /* | 40 | /* |
| @@ -92,7 +92,7 @@ struct xen_memory_exchange { | |||
| 92 | * command will be non-zero. | 92 | * command will be non-zero. |
| 93 | * 5. THIS FIELD MUST BE INITIALISED TO ZERO BY THE CALLER! | 93 | * 5. THIS FIELD MUST BE INITIALISED TO ZERO BY THE CALLER! |
| 94 | */ | 94 | */ |
| 95 | unsigned long nr_exchanged; | 95 | xen_ulong_t nr_exchanged; |
| 96 | }; | 96 | }; |
| 97 | 97 | ||
| 98 | DEFINE_GUEST_HANDLE_STRUCT(xen_memory_exchange); | 98 | DEFINE_GUEST_HANDLE_STRUCT(xen_memory_exchange); |
| @@ -148,8 +148,8 @@ DEFINE_GUEST_HANDLE_STRUCT(xen_machphys_mfn_list); | |||
| 148 | */ | 148 | */ |
| 149 | #define XENMEM_machphys_mapping 12 | 149 | #define XENMEM_machphys_mapping 12 |
| 150 | struct xen_machphys_mapping { | 150 | struct xen_machphys_mapping { |
| 151 | unsigned long v_start, v_end; /* Start and end virtual addresses. */ | 151 | xen_ulong_t v_start, v_end; /* Start and end virtual addresses. */ |
| 152 | unsigned long max_mfn; /* Maximum MFN that can be looked up. */ | 152 | xen_ulong_t max_mfn; /* Maximum MFN that can be looked up. */ |
| 153 | }; | 153 | }; |
| 154 | DEFINE_GUEST_HANDLE_STRUCT(xen_machphys_mapping_t); | 154 | DEFINE_GUEST_HANDLE_STRUCT(xen_machphys_mapping_t); |
| 155 | 155 | ||
| @@ -172,7 +172,7 @@ struct xen_add_to_physmap { | |||
| 172 | unsigned int space; | 172 | unsigned int space; |
| 173 | 173 | ||
| 174 | /* Index into source mapping space. */ | 174 | /* Index into source mapping space. */ |
| 175 | unsigned long idx; | 175 | xen_ulong_t idx; |
| 176 | 176 | ||
| 177 | /* GPFN where the source mapping page should appear. */ | 177 | /* GPFN where the source mapping page should appear. */ |
| 178 | xen_pfn_t gpfn; | 178 | xen_pfn_t gpfn; |
| @@ -189,7 +189,7 @@ struct xen_translate_gpfn_list { | |||
| 189 | domid_t domid; | 189 | domid_t domid; |
| 190 | 190 | ||
| 191 | /* Length of list. */ | 191 | /* Length of list. */ |
| 192 | unsigned long nr_gpfns; | 192 | xen_ulong_t nr_gpfns; |
| 193 | 193 | ||
| 194 | /* List of GPFNs to translate. */ | 194 | /* List of GPFNs to translate. */ |
| 195 | GUEST_HANDLE(ulong) gpfn_list; | 195 | GUEST_HANDLE(ulong) gpfn_list; |
diff --git a/include/xen/interface/physdev.h b/include/xen/interface/physdev.h index 9ce788d8cf49..f616514f781b 100644 --- a/include/xen/interface/physdev.h +++ b/include/xen/interface/physdev.h | |||
| @@ -56,7 +56,7 @@ struct physdev_eoi { | |||
| 56 | #define PHYSDEVOP_pirq_eoi_gmfn_v2 28 | 56 | #define PHYSDEVOP_pirq_eoi_gmfn_v2 28 |
| 57 | struct physdev_pirq_eoi_gmfn { | 57 | struct physdev_pirq_eoi_gmfn { |
| 58 | /* IN */ | 58 | /* IN */ |
| 59 | unsigned long gmfn; | 59 | xen_ulong_t gmfn; |
| 60 | }; | 60 | }; |
| 61 | 61 | ||
| 62 | /* | 62 | /* |
diff --git a/include/xen/interface/version.h b/include/xen/interface/version.h index dd58cf5ea3e4..3030c81c09ce 100644 --- a/include/xen/interface/version.h +++ b/include/xen/interface/version.h | |||
| @@ -45,7 +45,7 @@ struct xen_changeset_info { | |||
| 45 | 45 | ||
| 46 | #define XENVER_platform_parameters 5 | 46 | #define XENVER_platform_parameters 5 |
| 47 | struct xen_platform_parameters { | 47 | struct xen_platform_parameters { |
| 48 | unsigned long virt_start; | 48 | xen_ulong_t virt_start; |
| 49 | }; | 49 | }; |
| 50 | 50 | ||
| 51 | #define XENVER_get_features 6 | 51 | #define XENVER_get_features 6 |
diff --git a/include/xen/xen.h b/include/xen/xen.h index a16402418d31..2c0d3a56c749 100644 --- a/include/xen/xen.h +++ b/include/xen/xen.h | |||
| @@ -23,7 +23,7 @@ extern enum xen_domain_type xen_domain_type; | |||
| 23 | #include <xen/interface/xen.h> | 23 | #include <xen/interface/xen.h> |
| 24 | #include <asm/xen/hypervisor.h> | 24 | #include <asm/xen/hypervisor.h> |
| 25 | 25 | ||
| 26 | #define xen_initial_domain() (xen_pv_domain() && \ | 26 | #define xen_initial_domain() (xen_domain() && \ |
| 27 | xen_start_info->flags & SIF_INITDOMAIN) | 27 | xen_start_info->flags & SIF_INITDOMAIN) |
| 28 | #else /* !CONFIG_XEN_DOM0 */ | 28 | #else /* !CONFIG_XEN_DOM0 */ |
| 29 | #define xen_initial_domain() (0) | 29 | #define xen_initial_domain() (0) |
