diff --git a/xen/arch/arm/arm64/head.S b/xen/arch/arm/arm64/head.S index 9d7d83a5ed..cfc04c7554 100644 --- a/xen/arch/arm/arm64/head.S +++ b/xen/arch/arm/arm64/head.S @@ -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 */ diff --git a/xen/arch/arm/arm64/mmu/head.S b/xen/arch/arm/arm64/mmu/head.S index 10774f30e4..92b62ae94c 100644 --- a/xen/arch/arm/arm64/mmu/head.S +++ b/xen/arch/arm/arm64/mmu/head.S @@ -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) diff --git a/xen/arch/arm/include/asm/arm64/macros.h b/xen/arch/arm/include/asm/arm64/macros.h index d108dc3a3a..10e652041f 100644 --- a/xen/arch/arm/include/asm/arm64/macros.h +++ b/xen/arch/arm/include/asm/arm64/macros.h @@ -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 diff --git a/xen/arch/arm/include/asm/asm_defns.h b/xen/arch/arm/include/asm/asm_defns.h index ec803c0a37..eecafd3b39 100644 --- a/xen/arch/arm/include/asm/asm_defns.h +++ b/xen/arch/arm/include/asm/asm_defns.h @@ -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); \