xen/arm: Reserve FDT via early module mechanism
authorIan Campbell <ian.campbell@citrix.com>
Thu, 26 Sep 2013 11:35:36 +0000 (12:35 +0100)
committerIan Campbell <ian.campbell@citrix.com>
Thu, 26 Sep 2013 15:21:27 +0000 (16:21 +0100)
This will stop us putting any heaps or relocating Xen itself over the FDT.

The devicetree will be copied to allocated memory in setup_mm and the
original copy will be freed by discard_initial_modules.

Signed-off-by: Ian Campbell <ian.campbell@citrix.com>
Acked-by: Tim Deegan <tim@xen.org>
xen/arch/arm/setup.c
xen/common/device_tree.c
xen/include/xen/device_tree.h

index 24bbc7392168df0355b5be63361d1d7689a3ce8a..b5c2b1779b05ef2332e6de379aec82f59075c552 100644 (file)
@@ -622,9 +622,10 @@ void __init start_xen(unsigned long boot_phys_offset,
 
     smp_clear_cpu_maps();
 
+    /* This is mapped by head.S */
     device_tree_flattened = (void *)BOOT_MISC_VIRT_START
         + (fdt_paddr & ((1 << SECOND_SHIFT) - 1));
-    fdt_size = device_tree_early_init(device_tree_flattened);
+    fdt_size = device_tree_early_init(device_tree_flattened, fdt_paddr);
 
     cmdline_parse(device_tree_bootargs(device_tree_flattened));
 
index 9a16650ee1728221f9b7f5cbc3a961b708e7b7e5..793e9a8056b78ceb10af0ca6381cd312fd4f32f6 100644 (file)
@@ -420,14 +420,21 @@ static void __init early_print_info(void)
  *
  * Returns the size of the DTB.
  */
-size_t __init device_tree_early_init(const void *fdt)
+size_t __init device_tree_early_init(const void *fdt, paddr_t paddr)
 {
+    struct dt_mb_module *mod;
     int ret;
 
     ret = fdt_check_header(fdt);
     if ( ret < 0 )
         early_panic("No valid device tree\n");
 
+    mod = &early_info.modules.module[MOD_FDT];
+    mod->start = paddr;
+    mod->size = fdt_totalsize(fdt);
+
+    early_info.modules.nr_mods = max(MOD_FDT, early_info.modules.nr_mods);
+
     device_tree_for_each_node((void *)fdt, early_scan_node, NULL);
     early_print_info();
 
index 7810f53b662ac6d1f836e4c7a9f2ec8511acdeea..a665c9760e208c648549d942a05275209b1d3dbf 100644 (file)
 
 #define NR_MEM_BANKS 8
 
-#define MOD_XEN 0
-#define MOD_KERNEL 1
-#define MOD_INITRD 2
-#define NR_MODULES 3
+#define MOD_XEN    0
+#define MOD_FDT    1
+#define MOD_KERNEL 2
+#define MOD_INITRD 3
+#define NR_MODULES 4
 
-#define MOD_DISCARD_FIRST MOD_KERNEL
+#define MOD_DISCARD_FIRST MOD_FDT
 
 struct membank {
     paddr_t start;
@@ -179,7 +180,7 @@ typedef int (*device_tree_node_func)(const void *fdt,
 extern struct dt_early_info early_info;
 extern const void *device_tree_flattened;
 
-size_t __init device_tree_early_init(const void *fdt);
+size_t __init device_tree_early_init(const void *fdt, paddr_t paddr);
 
 const char __init *device_tree_bootargs(const void *fdt);
 void __init device_tree_dump(const void *fdt);