diff --git a/xen/arch/x86/dmi_scan.c b/xen/arch/x86/dmi_scan.c index 81f80c053a..b517c068b8 100644 --- a/xen/arch/x86/dmi_scan.c +++ b/xen/arch/x86/dmi_scan.c @@ -113,6 +113,7 @@ static const void *__init bt_ioremap(paddr_t addr, unsigned int len) { mfn_t mfn = _mfn(PFN_DOWN(addr)); unsigned int offs = PAGE_OFFSET(addr); + void *va; if ( addr + len <= MB(1) ) return __va(addr); @@ -120,8 +121,10 @@ static const void *__init bt_ioremap(paddr_t addr, unsigned int len) if ( system_state < SYS_STATE_boot ) return __acpi_map_table(addr, len); - return __vmap(&mfn, PFN_UP(offs + len), 1, 1, PAGE_HYPERVISOR_RO, - VMAP_DEFAULT) + offs; + va = __vmap(&mfn, PFN_UP(offs + len), 1, 1, PAGE_HYPERVISOR_RO, + VMAP_DEFAULT); + + return va ? va + offs : NULL; } static void __init bt_iounmap(const void *ptr, unsigned int len) diff --git a/xen/arch/x86/mm.c b/xen/arch/x86/mm.c index 2f0e586463..1454a18fc2 100644 --- a/xen/arch/x86/mm.c +++ b/xen/arch/x86/mm.c @@ -5994,7 +5994,9 @@ void __iomem *ioremap(paddr_t pa, size_t len) unsigned int offs = pa & (PAGE_SIZE - 1); unsigned int nr = PFN_UP(offs + len); - va = __vmap(&mfn, nr, 1, 1, PAGE_HYPERVISOR_UCMINUS, VMAP_DEFAULT) + offs; + va = __vmap(&mfn, nr, 1, 1, PAGE_HYPERVISOR_UCMINUS, VMAP_DEFAULT); + if ( va ) + va += offs; } return (void __force __iomem *)va; @@ -6011,7 +6013,7 @@ void __iomem *__init ioremap_wc(paddr_t pa, size_t len) va = __vmap(&mfn, nr, 1, 1, PAGE_HYPERVISOR_WC, VMAP_DEFAULT); - return (void __force __iomem *)(va + offs); + return (void __force __iomem *)(va ? va + offs : NULL); } int create_perdomain_mapping(struct domain *d, unsigned long va,