[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [xen master] xen/arm64: head: Allow to use early printk while on 1:1 mapping
commit f3f6c500e2dbd23af77c207e2cf4b496fffa1b0d Author: Michal Orzel <michal.orzel@xxxxxxx> AuthorDate: Mon Jan 15 13:48:59 2024 +0100 Commit: Julien Grall <jgrall@xxxxxxxxxx> CommitDate: Mon Jan 15 19:30:58 2024 +0000 xen/arm64: head: Allow to use early printk while on 1:1 mapping 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@xxxxxxx> --- 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(-) 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); \ -- generated by git-patchbot for /home/xen/git/xen.git#master
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |