mirror of
https://github.com/xen-project/xen.git
synced 2026-10-28 10:11:27 +01:00
xen/arm64: head: Allow to use early printk while on 1:1 mapping
Take an example from commit 1ec3fe1f66 ("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>
This commit is contained in:
1 parent
d5a2ff06b1
commit
f3f6c500e2
4 files changed
+28
-20
No files matched your search
@@ -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); \
|
||||
|
||||