@@ -153,7 +153,6 @@ past_zImage:
mov r12, #0 /* r12 := is_secondary_cpu */
bl check_cpu_mode
- bl zero_bss
bl cpu_init
bl create_page_tables
bl enable_mmu
@@ -174,6 +173,7 @@ primary_switched:
/* Use a virtual address to access the UART. */
mov_w r11, EARLY_UART_VIRTUAL_ADDRESS
#endif
+ bl zero_bss
PRINT("- Ready -\r\n")
/* Setup the arguments for start_xen and jump to C world */
mov r0, r10 /* r0 := Physical offset */
@@ -284,17 +284,12 @@ ENDPROC(check_cpu_mode)
/*
* Zero BSS
*
- * Inputs:
- * r10: Physical offset
- *
* Clobbers r0 - r3
*/
zero_bss:
PRINT("- Zero BSS -\r\n")
- ldr r0, =__bss_start /* Load start & end of bss */
- ldr r1, =__bss_end
- add r0, r0, r10 /* Apply physical offset */
- add r1, r1, r10
+ ldr r0, =__bss_start /* r0 := vaddr(__bss_start) */
+ ldr r1, =__bss_end /* r1 := vaddr(__bss_start) */
mov r2, #0
1: str r2, [r0], #4
@@ -309,7 +309,6 @@ real_start_efi:
mov x22, #0 /* x22 := is_secondary_cpu */
bl check_cpu_mode
- bl zero_bss
bl cpu_init
bl create_page_tables
bl enable_mmu
@@ -330,6 +329,7 @@ primary_switched:
/* Use a virtual address to access the UART. */
ldr x23, =EARLY_UART_VIRTUAL_ADDRESS
#endif
+ bl zero_bss
PRINT("- Ready -\r\n")
/* Setup the arguments for start_xen and jump to C world */
mov x0, x20 /* x0 := Physical offset */
@@ -432,7 +432,6 @@ ENDPROC(check_cpu_mode)
* Zero BSS
*
* Inputs:
- * x20: Physical offset
* x26: Do we need to zero BSS?
*
* Clobbers x0 - x3
@@ -442,8 +441,8 @@ zero_bss:
cbnz x26, skip_bss
PRINT("- Zero BSS -\r\n")
- load_paddr x0, __bss_start /* Load paddr of start & end of bss */
- load_paddr x1, __bss_end
+ ldr x0, =__bss_start /* x0 := vaddr(__bss_start) */
+ ldr x1, =__bss_end /* x1 := vaddr(__bss_start) */
1: str xzr, [x0], #8
cmp x0, x1
@@ -62,6 +62,17 @@ mm_printk(const char *fmt, ...) {}
} while (0);
#endif
+/*
+ * Macros to define page-tables:
+ * - DEFINE_BOOT_PAGE_TABLE is used to define page-table that are used
+ * in assembly code before BSS is zeroed.
+ * - DEFINE_PAGE_TABLE{,S} are used to define one or multiple
+ * page-tables to be used after BSS is zeroed (typically they are only used
+ * in C).
+ */
+#define DEFINE_BOOT_PAGE_TABLE(name) \
+lpae_t __aligned(PAGE_SIZE) __section(".data.page_aligned") name[LPAE_ENTRIES]
+
#define DEFINE_PAGE_TABLES(name, nr) \
lpae_t __aligned(PAGE_SIZE) name[LPAE_ENTRIES * (nr)]
@@ -90,13 +101,13 @@ lpae_t __aligned(PAGE_SIZE) name[LPAE_ENTRIES * (nr)]
* Finally, if EARLY_PRINTK is enabled then xen_fixmap will be mapped
* by the CPU once it has moved off the 1:1 mapping.
*/
-DEFINE_PAGE_TABLE(boot_pgtable);
+DEFINE_BOOT_PAGE_TABLE(boot_pgtable);
#ifdef CONFIG_ARM_64
-DEFINE_PAGE_TABLE(boot_first);
-DEFINE_PAGE_TABLE(boot_first_id);
+DEFINE_BOOT_PAGE_TABLE(boot_first);
+DEFINE_BOOT_PAGE_TABLE(boot_first_id);
#endif
-DEFINE_PAGE_TABLE(boot_second);
-DEFINE_PAGE_TABLE(boot_third);
+DEFINE_BOOT_PAGE_TABLE(boot_second);
+DEFINE_BOOT_PAGE_TABLE(boot_third);
/* Main runtime page tables */
@@ -149,7 +160,7 @@ static __initdata int xenheap_first_first_slot = -1;
*/
static DEFINE_PAGE_TABLES(xen_second, 2);
/* First level page table used for fixmap */
-DEFINE_PAGE_TABLE(xen_fixmap);
+DEFINE_BOOT_PAGE_TABLE(xen_fixmap);
/* First level page table used to map Xen itself with the XN bit set
* as appropriate. */
static DEFINE_PAGE_TABLE(xen_xenmap);