{
mfn_t mfn = _mfn(PFN_DOWN(addr));
unsigned int offs = PAGE_OFFSET(addr);
+ void *va;
if ( addr + len <= MB(1) )
return __va(addr);
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)
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;
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,