aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--xen/arch/arm/head.S9
-rw-r--r--xen/arch/arm/mm.c5
-rw-r--r--xen/include/asm-arm/config.h6
3 files changed, 18 insertions, 2 deletions
diff --git a/xen/arch/arm/head.S b/xen/arch/arm/head.S
index ea557c21cf..8b2342465c 100644
--- a/xen/arch/arm/head.S
+++ b/xen/arch/arm/head.S
@@ -202,7 +202,16 @@ hyp:
orr r2, r2, #0x071 /* r2:r3 := 2MB dev map including UART */
add r4, r4, #8
strd r2, r3, [r1, r4] /* Map it in the fixmap's slot */
+#else
+ add r4, r4, #8 /* Skip over unused fixmap slot */
#endif
+ mov r3, #0x0
+ lsr r2, r8, #21
+ lsl r2, r2, #21 /* 2MB-aligned paddr of DTB */
+ orr r2, r2, #0xf00
+ orr r2, r2, #0x07d /* r2:r3 := 2MB RAM incl. DTB */
+ add r4, r4, #8
+ strd r2, r3, [r1, r4] /* Map it in the early boot slot */
PRINT("- Turning on paging -\r\n")
diff --git a/xen/arch/arm/mm.c b/xen/arch/arm/mm.c
index c8635072d2..f1fe4ba4fd 100644
--- a/xen/arch/arm/mm.c
+++ b/xen/arch/arm/mm.c
@@ -161,10 +161,11 @@ void __init setup_pagetables(unsigned long boot_phys_offset)
xen_paddr = XEN_PADDR;
- /* Map the destination in the empty L2 above the fixmap */
- dest_va = FIXMAP_ADDR(0) + (1u << SECOND_SHIFT);
+ /* Map the destination in the boot misc area. */
+ dest_va = BOOT_MISC_VIRT_START;
pte = mfn_to_xen_entry(xen_paddr >> PAGE_SHIFT);
write_pte(xen_second + second_table_offset(dest_va), pte);
+ flush_xen_data_tlb_va(dest_va);
/* Calculate virt-to-phys offset for the new location */
phys_offset = xen_paddr - (unsigned long) _start;
diff --git a/xen/include/asm-arm/config.h b/xen/include/asm-arm/config.h
index 9294f8f71f..c2ab0a21a2 100644
--- a/xen/include/asm-arm/config.h
+++ b/xen/include/asm-arm/config.h
@@ -55,15 +55,21 @@
* 0 - 2M Unmapped
* 2M - 4M Xen text, data, bss
* 4M - 6M Fixmap: special-purpose 4K mapping slots
+ * 6M - 8M Early boot misc (see below)
*
* 32M - 128M Frametable: 24 bytes per page for 16GB of RAM
*
* 1G - 2G Xenheap: always-mapped memory
* 2G - 4G Domheap: on-demand-mapped
+ *
+ * The early boot misc area is used:
+ * - in head.S for the DTB for device_tree_early_init().
+ * - in setup_pagetables() when relocating Xen.
*/
#define XEN_VIRT_START 0x00200000
#define FIXMAP_ADDR(n) (0x00400000 + (n) * PAGE_SIZE)
+#define BOOT_MISC_VIRT_START 0x00600000
#define FRAMETABLE_VIRT_START 0x02000000
#define XENHEAP_VIRT_START 0x40000000
#define DOMHEAP_VIRT_START 0x80000000