mirror of
https://github.com/xen-project/xen.git
synced 2026-10-28 10:11:27 +01:00
xen/arm: Move the code to map FDT in the boot tables from assembly to C
The FDT will not be accessed before start_xen (begining of C code) is called and it will be easier to maintain as the code could be common between AArch32 and AArch64. A new function early_fdt_map is introduced to map the FDT in the boot page table. Signed-off-by: Julien Grall <julien.grall@arm.com> Reviewed-by: Stefano Stabellini <sstabellini@kernel.org>
This commit is contained in:
1 parent
caa4742f2f
commit
f7d93cee11
5 files changed
+16
-30
No files matched your search
@@ -389,20 +389,6 @@ paging:
|
||||
/* Use a virtual address to access the UART. */
|
||||
ldr r11, =EARLY_UART_VIRTUAL_ADDRESS
|
||||
#endif
|
||||
/* Map the DTB in the boot misc slot */
|
||||
teq r12, #0 /* Only on boot CPU */
|
||||
bne 1f
|
||||
|
||||
ldr r1, =boot_second
|
||||
mov r3, #0x0
|
||||
lsr r2, r8, #SECOND_SHIFT
|
||||
lsl r2, r2, #SECOND_SHIFT /* r2: 2MB-aligned paddr of DTB */
|
||||
orr r2, r2, #PT_UPPER(MEM)
|
||||
orr r2, r2, #PT_LOWER(MEM) /* r2:r3 := 2MB RAM incl. DTB */
|
||||
ldr r4, =BOOT_FDT_VIRT_START
|
||||
mov r4, r4, lsr #(SECOND_SHIFT - 3) /* Slot for BOOT_FDT_VIRT_START */
|
||||
strd r2, r3, [r1, r4] /* Map it in the early fdt slot */
|
||||
1:
|
||||
|
||||
/*
|
||||
* Flush the TLB in case the 1:1 mapping happens to clash with
|
||||
|
||||
@@ -550,19 +550,6 @@ paging:
|
||||
ldr x23, =EARLY_UART_VIRTUAL_ADDRESS
|
||||
#endif
|
||||
|
||||
/* Map the DTB in the boot misc slot */
|
||||
cbnz x22, 1f /* Only on boot CPU */
|
||||
|
||||
ldr x4, =boot_second /* x4 := vaddr (boot_second) */
|
||||
lsr x2, x21, #SECOND_SHIFT
|
||||
lsl x2, x2, #SECOND_SHIFT /* x2 := 2MB-aligned paddr of DTB */
|
||||
mov x3, #PT_MEM /* x2 := 2MB RAM incl. DTB */
|
||||
orr x2, x2, x3
|
||||
ldr x1, =BOOT_FDT_VIRT_START
|
||||
lsr x1, x1, #(SECOND_SHIFT - 3) /* x4 := Slot for BOOT_FDT_VIRT_START */
|
||||
str x2, [x4, x1] /* Map it in the early fdt slot */
|
||||
1:
|
||||
|
||||
/*
|
||||
* Flush the TLB in case the 1:1 mapping happens to clash with
|
||||
* the virtual addresses used by the fixmap or DTB.
|
||||
|
||||
@@ -38,6 +38,7 @@
|
||||
#include <xen/vmap.h>
|
||||
#include <xsm/xsm.h>
|
||||
#include <xen/pfn.h>
|
||||
#include <xen/sizes.h>
|
||||
|
||||
struct domain *dom_xen, *dom_io, *dom_cow;
|
||||
|
||||
@@ -468,6 +469,18 @@ static inline lpae_t pte_of_xenaddr(vaddr_t va)
|
||||
return mfn_to_xen_entry(mfn, WRITEALLOC);
|
||||
}
|
||||
|
||||
/* Map the FDT in the early boot page table */
|
||||
void * __init early_fdt_map(paddr_t fdt_paddr)
|
||||
{
|
||||
/* We are using 2MB superpage for mapping the FDT */
|
||||
paddr_t base_paddr = fdt_paddr & SECOND_MASK;
|
||||
|
||||
create_mappings(boot_second, BOOT_FDT_VIRT_START, paddr_to_pfn(base_paddr),
|
||||
SZ_2M >> PAGE_SHIFT, SZ_2M);
|
||||
|
||||
return (void *)BOOT_FDT_VIRT_START + (fdt_paddr % SECOND_SIZE);
|
||||
}
|
||||
|
||||
void __init remove_early_mappings(void)
|
||||
{
|
||||
lpae_t pte = {0};
|
||||
|
||||
@@ -724,9 +724,7 @@ void __init start_xen(unsigned long boot_phys_offset,
|
||||
|
||||
smp_clear_cpu_maps();
|
||||
|
||||
/* This is mapped by head.S */
|
||||
device_tree_flattened = (void *)BOOT_FDT_VIRT_START
|
||||
+ (fdt_paddr & ((1 << SECOND_SHIFT) - 1));
|
||||
device_tree_flattened = early_fdt_map(fdt_paddr);
|
||||
fdt_size = boot_fdt_info(device_tree_flattened, fdt_paddr);
|
||||
|
||||
cmdline = boot_fdt_cmdline(device_tree_flattened);
|
||||
|
||||
@@ -160,6 +160,8 @@ extern unsigned long total_pages;
|
||||
|
||||
/* Boot-time pagetable setup */
|
||||
extern void setup_pagetables(unsigned long boot_phys_offset, paddr_t xen_paddr);
|
||||
/* Map FDT in boot pagetable */
|
||||
extern void *early_fdt_map(paddr_t fdt_paddr);
|
||||
/* Remove early mappings */
|
||||
extern void remove_early_mappings(void);
|
||||
/* Allocate and initialise pagetables for a secondary CPU. Sets init_ttbr to the
|
||||
|
||||