From: Luca Fancellu <[email protected]> Implement the function copy_from_paddr variant for MPU systems, using the map_pages_to_xen/destroy_xen_mappings to temporarily map the memory range to be copied.
Signed-off-by: Luca Fancellu <[email protected]> Signed-off-by: Hari Limaye <[email protected]> Signed-off-by: Harry Ramsey <[email protected]> --- xen/arch/arm/mpu/setup.c | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/xen/arch/arm/mpu/setup.c b/xen/arch/arm/mpu/setup.c index 163573b932..ec264f54f2 100644 --- a/xen/arch/arm/mpu/setup.c +++ b/xen/arch/arm/mpu/setup.c @@ -91,7 +91,19 @@ void * __init early_fdt_map(paddr_t fdt_paddr) */ void __init copy_from_paddr(void *dst, paddr_t paddr, unsigned long len) { - BUG_ON("unimplemented"); + paddr_t start_pg = round_pgdown(paddr); + paddr_t end_pg = round_pgup(paddr + len); + unsigned long nr_mfns = (end_pg - start_pg) >> PAGE_SHIFT; + mfn_t mfn = maddr_to_mfn(start_pg); + + if ( map_pages_to_xen(start_pg, mfn, nr_mfns, PAGE_HYPERVISOR_WC) ) + panic("Unable to map range for copy_from_paddr\n"); + + memcpy(dst, maddr_to_virt(paddr), len); + clean_dcache_va_range(dst, len); + + if ( destroy_xen_mappings(start_pg, end_pg) ) + panic("Unable to unmap range for copy_from_paddr\n"); } void __init remove_early_mappings(void) -- 2.43.0
