@@ -209,7 +209,7 @@ extern bool flags_has_rwx(unsigned int flags);
/* Map FDT in boot pagetable */
extern void *early_fdt_map(paddr_t fdt_paddr);
/* Remove early mappings */
-extern void remove_early_mappings(void);
+extern void remove_early_mappings(paddr_t dtb_paddr);
/*
* Allocate and initialise memory mapping for a secondary CPU.
* Sets init_mm to the new memory mapping table
@@ -361,7 +361,7 @@ lpae_t pte_of_xenaddr(vaddr_t va)
return mfn_to_xen_entry(maddr_to_mfn(ma), MT_NORMAL);
}
-void __init remove_early_mappings(void)
+void __init remove_early_mappings(paddr_t dtb_paddr)
{
int rc;
@@ -20,9 +20,11 @@
*/
#include <xen/init.h>
+#include <xen/libfdt/libfdt.h>
#include <xen/mm.h>
#include <xen/page-size.h>
#include <xen/pfn.h>
+#include <xen/sizes.h>
#include <asm/arm64/mpu.h>
#include <asm/page.h>
#include <asm/setup.h>
@@ -857,6 +859,19 @@ bool is_mm_range_mapped_transient(paddr_t pa, paddr_t len)
return false;
}
+void __init remove_early_mappings(paddr_t dtb_paddr)
+{
+ paddr_t pa = dtb_paddr & PAGE_MASK, offset = dtb_paddr % PAGE_SIZE;
+ uint32_t size = fdt_totalsize(maddr_to_virt(dtb_paddr));
+
+ if ( xen_mpumap_update(pa, pa + SZ_2M, 0) )
+ panic("Unable to destroy early Device-Tree mapping.\n");
+
+ if ( (offset + size) > SZ_2M )
+ if ( xen_mpumap_update(pa + SZ_2M, pa + SZ_2M + SZ_2M, 0) )
+ panic("Unable to destroy early Device-Tree mapping.\n");
+}
+
/*
* Local variables:
* mode: C
@@ -529,8 +529,6 @@ void __init discard_initial_modules(void)
mi->nr_mods = 0;
}
-
- remove_early_mappings();
}
/* Relocate the FDT in Xen heap */
@@ -973,6 +971,7 @@ void __init start_xen(unsigned long boot_phys_offset,
* will be scrubbed (unless suppressed).
*/
discard_initial_modules();
+ remove_early_mappings(fdt_paddr);
heap_init_late();