@@ -256,10 +256,6 @@ real_start_efi:
b enable_boot_cpu_mm
primary_switched:
-#ifdef CONFIG_EARLY_PRINTK
- /* 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 */
@@ -304,10 +300,6 @@ GLOBAL(init_secondary)
b enable_secondary_cpu_mm
secondary_switched:
-#ifdef CONFIG_EARLY_PRINTK
- /* Use a virtual address to access the UART. */
- ldr x23, =EARLY_UART_VIRTUAL_ADDRESS
-#endif
PRINT("- Ready -\r\n")
/* Jump to C world */
ldr x2, =start_secondary
@@ -480,7 +472,7 @@ ENDPROC(asm_puts)
* Clobbers x0-x3
*/
ENTRY(asm_putn)
- adr x1, hex
+ adr_l x1, hex
mov x3, #16
1:
early_uart_ready x23, 2
@@ -494,8 +486,7 @@ ENTRY(asm_putn)
ret
ENDPROC(asm_putn)
-hex: .ascii "0123456789abcdef"
- .align 2
+RODATA_SECT(.rodata.idmap, hex, "0123456789abcdef")
#endif /* CONFIG_EARLY_PRINTK */
@@ -295,6 +295,14 @@ enable_mmu:
dsb sy /* Flush PTE writes and finish reads */
msr SCTLR_EL2, x0 /* now paging is enabled */
isb /* Now, flush the icache */
+
+#ifdef CONFIG_EARLY_PRINTK
+ /* Use a virtual address to access the UART. */
+ ldr x23, =EARLY_UART_VIRTUAL_ADDRESS
+#endif
+
+ PRINT_ID("- Paging turned on -\r\n")
+
ret
ENDPROC(enable_mmu)
@@ -34,16 +34,26 @@
#ifdef CONFIG_EARLY_PRINTK
/*
- * Macro to print a string to the UART, if there is one.
+ * Macros to print a string to the UART, if there is one.
+ *
+ * There are multiple flavors:
+ * - PRINT_SECT(section, string): The @string will be located in @section
+ * - PRINT(): The string will be located in .rodata.str.
+ * - PRINT_ID(): When Xen is running on the Identity Mapping, it is
+ * only possible to have a limited amount of Xen. This will create
+ * the string in .rodata.idmap which will always be mapped.
*
* Clobbers x0 - x3
*/
-#define PRINT(_s) \
- mov x3, lr ; \
- adr_l x0, 98f ; \
- bl asm_puts ; \
- mov lr, x3 ; \
- RODATA_STR(98, _s)
+#define PRINT_SECT(section, string) \
+ mov x3, lr ;\
+ adr_l x0, 98f ;\
+ bl asm_puts ;\
+ mov lr, x3 ;\
+ RODATA_SECT(section, 98, string)
+
+#define PRINT(string) PRINT_SECT(.rodata.str, string)
+#define PRINT_ID(string) PRINT_SECT(.rodata.idmap, string)
/*
* Macro to print the value of register \xb
@@ -59,6 +69,7 @@
#else /* CONFIG_EARLY_PRINTK */
#define PRINT(s)
+#define PRINT_ID(s)
.macro print_reg xb
.endm
@@ -27,8 +27,6 @@
label: .asciz msg; \
.popsection
-#define RODATA_STR(label, msg) RODATA_SECT(.rodata.str, label, msg)
-
#define ASM_INT(label, val) \
.p2align 2; \
label: .long (val); \
Take an example from commit 1ec3fe1f664f ("xen/arm32: head: Improve logging in head.S") to add support for printing early boot messages while running on identity mapping: - define PRINT_SECT() macro to be able to specify a section for storing a string. PRINT() will use .rodata.str and PRINT_ID() - .rodata.idmap. This is necessary, because when running on identity mapping, the strings need to be part of the first page that is mapped, - move loading a runtime virtual UART address right after enabling MMU (the corresponding steps repeated in {primary,secondary}_switched are now consolidated in a single place), - move early printk 'hex' string into .rodata.idmap and replace 'adr' instruction in asm_putn with 'adr_l' to extend the addressable range, - remove RODATA_STR() macro given no use. Signed-off-by: Michal Orzel <michal.orzel@amd.com> --- xen/arch/arm/arm64/head.S | 13 ++----------- xen/arch/arm/arm64/mmu/head.S | 8 ++++++++ xen/arch/arm/include/asm/arm64/macros.h | 25 ++++++++++++++++++------- xen/arch/arm/include/asm/asm_defns.h | 2 -- 4 files changed, 28 insertions(+), 20 deletions(-)