diff options
| -rw-r--r-- | arch/x86/xen/enlighten_hvm.c | 16 |
1 files changed, 14 insertions, 2 deletions
diff --git a/arch/x86/xen/enlighten_hvm.c b/arch/x86/xen/enlighten_hvm.c index d23531f5f17e..de503c225ae1 100644 --- a/arch/x86/xen/enlighten_hvm.c +++ b/arch/x86/xen/enlighten_hvm.c | |||
| @@ -12,6 +12,7 @@ | |||
| 12 | #include <asm/setup.h> | 12 | #include <asm/setup.h> |
| 13 | #include <asm/hypervisor.h> | 13 | #include <asm/hypervisor.h> |
| 14 | #include <asm/e820/api.h> | 14 | #include <asm/e820/api.h> |
| 15 | #include <asm/early_ioremap.h> | ||
| 15 | 16 | ||
| 16 | #include <asm/xen/cpuid.h> | 17 | #include <asm/xen/cpuid.h> |
| 17 | #include <asm/xen/hypervisor.h> | 18 | #include <asm/xen/hypervisor.h> |
| @@ -21,6 +22,8 @@ | |||
| 21 | #include "mmu.h" | 22 | #include "mmu.h" |
| 22 | #include "smp.h" | 23 | #include "smp.h" |
| 23 | 24 | ||
| 25 | static unsigned long shared_info_pfn; | ||
| 26 | |||
| 24 | void xen_hvm_init_shared_info(void) | 27 | void xen_hvm_init_shared_info(void) |
| 25 | { | 28 | { |
| 26 | struct xen_add_to_physmap xatp; | 29 | struct xen_add_to_physmap xatp; |
| @@ -28,7 +31,7 @@ void xen_hvm_init_shared_info(void) | |||
| 28 | xatp.domid = DOMID_SELF; | 31 | xatp.domid = DOMID_SELF; |
| 29 | xatp.idx = 0; | 32 | xatp.idx = 0; |
| 30 | xatp.space = XENMAPSPACE_shared_info; | 33 | xatp.space = XENMAPSPACE_shared_info; |
| 31 | xatp.gpfn = virt_to_pfn(HYPERVISOR_shared_info); | 34 | xatp.gpfn = shared_info_pfn; |
| 32 | if (HYPERVISOR_memory_op(XENMEM_add_to_physmap, &xatp)) | 35 | if (HYPERVISOR_memory_op(XENMEM_add_to_physmap, &xatp)) |
| 33 | BUG(); | 36 | BUG(); |
| 34 | } | 37 | } |
| @@ -51,8 +54,16 @@ static void __init reserve_shared_info(void) | |||
| 51 | pa += PAGE_SIZE) | 54 | pa += PAGE_SIZE) |
| 52 | ; | 55 | ; |
| 53 | 56 | ||
| 57 | shared_info_pfn = PHYS_PFN(pa); | ||
| 58 | |||
| 54 | memblock_reserve(pa, PAGE_SIZE); | 59 | memblock_reserve(pa, PAGE_SIZE); |
| 55 | HYPERVISOR_shared_info = __va(pa); | 60 | HYPERVISOR_shared_info = early_memremap(pa, PAGE_SIZE); |
| 61 | } | ||
| 62 | |||
| 63 | static void __init xen_hvm_init_mem_mapping(void) | ||
| 64 | { | ||
| 65 | early_memunmap(HYPERVISOR_shared_info, PAGE_SIZE); | ||
| 66 | HYPERVISOR_shared_info = __va(PFN_PHYS(shared_info_pfn)); | ||
| 56 | } | 67 | } |
| 57 | 68 | ||
| 58 | static void __init init_hvm_pv_info(void) | 69 | static void __init init_hvm_pv_info(void) |
| @@ -221,5 +232,6 @@ const struct hypervisor_x86 x86_hyper_xen_hvm = { | |||
| 221 | .init_platform = xen_hvm_guest_init, | 232 | .init_platform = xen_hvm_guest_init, |
| 222 | .pin_vcpu = xen_pin_vcpu, | 233 | .pin_vcpu = xen_pin_vcpu, |
| 223 | .x2apic_available = xen_x2apic_para_available, | 234 | .x2apic_available = xen_x2apic_para_available, |
| 235 | .init_mem_mapping = xen_hvm_init_mem_mapping, | ||
| 224 | }; | 236 | }; |
| 225 | EXPORT_SYMBOL(x86_hyper_xen_hvm); | 237 | EXPORT_SYMBOL(x86_hyper_xen_hvm); |
