Skip to content

Commit

Permalink
xen/arm64: Fold setup_fixmap() to create_page_tables()
Browse files Browse the repository at this point in the history
The original assembly setup_fixmap() is actually doing two seperate
tasks, one is enabling the early UART when earlyprintk on, and the
other is to set up the fixmap (even when earlyprintk is off).

Per discussion in [1], since commit
9d267c0 ("xen/arm64: Rework the memory layout"), there is no
chance that the fixmap and the mapping of early UART will clash with
the 1:1 mapping. Therefore the mapping of both the fixmap and the
early UART can be moved to the end of create_pagetables().

[1] https://lore.kernel.org/xen-devel/[email protected]/

Signed-off-by: Henry Wang <[email protected]>
Reviewed-by: Julien Grall <[email protected]>
  • Loading branch information
MrXinWang authored and sstabellini committed Sep 8, 2023
1 parent db5ad6d commit 49b2d6a
Show file tree
Hide file tree
Showing 2 changed files with 10 additions and 39 deletions.
1 change: 0 additions & 1 deletion xen/arch/arm/arm64/head.S
Original file line number Diff line number Diff line change
Expand Up @@ -275,7 +275,6 @@ real_start_efi:
b enable_boot_cpu_mm

primary_switched:
bl setup_fixmap
#ifdef CONFIG_EARLY_PRINTK
/* Use a virtual address to access the UART. */
ldr x23, =EARLY_UART_VIRTUAL_ADDRESS
Expand Down
48 changes: 10 additions & 38 deletions xen/arch/arm/arm64/mmu/head.S
Original file line number Diff line number Diff line change
Expand Up @@ -126,11 +126,6 @@
* Rebuild the boot pagetable's first-level entries. The structure
* is described in mm.c.
*
* After the CPU enables paging it will add the fixmap mapping
* to these page tables, however this may clash with the 1:1
* mapping. So each CPU must rebuild the page tables here with
* the 1:1 in place.
*
* Inputs:
* x19: paddr(start)
* x20: phys offset
Expand Down Expand Up @@ -243,6 +238,16 @@ link_from_second_id:
create_table_entry boot_second_id, boot_third_id, x19, 2, x0, x1, x2
link_from_third_id:
create_mapping_entry boot_third_id, x19, x19, x0, x1, x2

#ifdef CONFIG_EARLY_PRINTK
/* Add UART to the fixmap table */
ldr x0, =EARLY_UART_VIRTUAL_ADDRESS
/* x23: Early UART base physical address */
create_mapping_entry xen_fixmap, x0, x23, x1, x2, x3, type=PT_DEV_L3
#endif
/* Map fixmap into boot_second */
ldr x0, =FIXMAP_ADDR(0)
create_table_entry boot_second, xen_fixmap, x0, 2, x1, x2, x3
ret

virtphys_clash:
Expand Down Expand Up @@ -402,39 +407,6 @@ identity_mapping_removed:
ret
ENDPROC(remove_identity_mapping)

/*
* Map the UART in the fixmap (when earlyprintk is used) and hook the
* fixmap table in the page tables.
*
* The fixmap cannot be mapped in create_page_tables because it may
* clash with the 1:1 mapping.
*
* Inputs:
* x20: Physical offset
* x23: Early UART base physical address
*
* Clobbers x0 - x3
*/
ENTRY(setup_fixmap)
#ifdef CONFIG_EARLY_PRINTK
/* Add UART to the fixmap table */
ldr x0, =EARLY_UART_VIRTUAL_ADDRESS
create_mapping_entry xen_fixmap, x0, x23, x1, x2, x3, type=PT_DEV_L3
#endif
/* Map fixmap into boot_second */
ldr x0, =FIXMAP_ADDR(0)
create_table_entry boot_second, xen_fixmap, x0, 2, x1, x2, x3
/* Ensure any page table updates made above have occurred. */
dsb nshst
/*
* The fixmap area will be used soon after. So ensure no hardware
* translation happens before the dsb completes.
*/
isb

ret
ENDPROC(setup_fixmap)

/* Fail-stop */
fail: PRINT("- Boot failed -\r\n")
1: wfe
Expand Down

0 comments on commit 49b2d6a

Please sign in to comment.