summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sys/arch/arm64/arm64/machdep.c49
-rw-r--r--sys/arch/arm64/arm64/pmap.c37
-rw-r--r--sys/arch/arm64/include/pmap.h3
3 files changed, 35 insertions, 54 deletions
diff --git a/sys/arch/arm64/arm64/machdep.c b/sys/arch/arm64/arm64/machdep.c
index 31b0e2f472c..36d5070b0a2 100644
--- a/sys/arch/arm64/arm64/machdep.c
+++ b/sys/arch/arm64/arm64/machdep.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: machdep.c,v 1.75 2022/10/30 17:43:39 guenther Exp $ */
+/* $OpenBSD: machdep.c,v 1.76 2022/11/21 20:19:21 kettenis Exp $ */
/*
* Copyright (c) 2014 Patrick Wildt <patrick@blueri.se>
* Copyright (c) 2021 Mark Kettenis <kettenis@openbsd.org>
@@ -781,7 +781,9 @@ initarm(struct arm64_bootparams *abp)
long kernbase = (long)_start & ~PAGE_MASK;
long kvo = abp->kern_delta;
paddr_t memstart, memend;
- vaddr_t vstart;
+ paddr_t startpa, endpa, pa;
+ vaddr_t vstart, va;
+ struct fdt_head *fh;
void *config = abp->arg2;
void *fdt = NULL;
struct fdt_reg reg;
@@ -798,10 +800,35 @@ initarm(struct arm64_bootparams *abp)
__asm volatile("mov x18, %0\n"
"msr tpidr_el1, %0" :: "r"(&cpu_info_primary));
- pmap_map_early((paddr_t)config, PAGE_SIZE);
- if (!fdt_init(config) || fdt_get_size(config) == 0)
- panic("initarm: no FDT");
- pmap_map_early((paddr_t)config, round_page(fdt_get_size(config)));
+ cache_setup();
+
+ /* The bootloader has loaded us into a 64MB block. */
+ memstart = KERNBASE + kvo;
+ memend = memstart + 64 * 1024 * 1024;
+
+ /* Bootstrap enough of pmap to enter the kernel proper. */
+ vstart = pmap_bootstrap(kvo, abp->kern_l1pt,
+ kernbase, esym, memstart, memend);
+
+ /* Map the FDT header to determine its size. */
+ va = vstart;
+ startpa = trunc_page((paddr_t)config);
+ endpa = round_page((paddr_t)config + sizeof(struct fdt_head));
+ for (pa = startpa; pa < endpa; pa += PAGE_SIZE, va += PAGE_SIZE)
+ pmap_kenter_cache(va, pa, PROT_READ, PMAP_CACHE_WB);
+ fh = (void *)(vstart + ((paddr_t)config - startpa));
+ if (betoh32(fh->fh_magic) != FDT_MAGIC || betoh32(fh->fh_size) == 0)
+ panic("%s: no FDT", __func__);
+
+ /* Map the remainder of the FDT. */
+ endpa = round_page((paddr_t)config + betoh32(fh->fh_size));
+ for (; pa < endpa; pa += PAGE_SIZE, va += PAGE_SIZE)
+ pmap_kenter_cache(va, pa, PROT_READ, PMAP_CACHE_WB);
+ config = (void *)(vstart + ((paddr_t)config - startpa));
+ vstart = va;
+
+ if (!fdt_init(config))
+ panic("%s: corrupt FDT", __func__);
node = fdt_find_node("/chosen");
if (node != NULL) {
@@ -867,18 +894,8 @@ initarm(struct arm64_bootparams *abp)
}
}
- cache_setup();
-
process_kernel_args();
- /* The bootloader has loaded us into a 64MB block. */
- memstart = KERNBASE + kvo;
- memend = memstart + 64 * 1024 * 1024;
-
- /* Bootstrap enough of pmap to enter the kernel proper. */
- vstart = pmap_bootstrap(kvo, abp->kern_l1pt,
- kernbase, esym, memstart, memend);
-
proc0paddr = (struct user *)abp->kern_stack;
msgbufaddr = (caddr_t)vstart;
diff --git a/sys/arch/arm64/arm64/pmap.c b/sys/arch/arm64/arm64/pmap.c
index ef823084b81..47be3f1e216 100644
--- a/sys/arch/arm64/arm64/pmap.c
+++ b/sys/arch/arm64/arm64/pmap.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: pmap.c,v 1.88 2022/11/12 12:58:34 kettenis Exp $ */
+/* $OpenBSD: pmap.c,v 1.89 2022/11/21 20:19:21 kettenis Exp $ */
/*
* Copyright (c) 2008-2009,2014-2016 Dale Rahn <drahn@dalerahn.com>
*
@@ -2260,41 +2260,6 @@ pmap_show_mapping(uint64_t va)
}
void
-pmap_map_early(paddr_t spa, psize_t len)
-{
- extern pd_entry_t pagetable_l0_ttbr0[];
- extern pd_entry_t pagetable_l1_ttbr0[];
- extern uint64_t pagetable_l1_ttbr0_idx[];
- extern uint64_t pagetable_l1_ttbr0_num;
- extern uint64_t pagetable_l1_ttbr0_pa;
- paddr_t pa, epa = spa + len;
- uint64_t i, idx = ~0;
-
- for (pa = spa & ~(L1_SIZE - 1); pa < epa; pa += L1_SIZE) {
- for (i = 0; i < pagetable_l1_ttbr0_num; i++) {
- if (pagetable_l1_ttbr0_idx[i] == ~0)
- break;
- if (pagetable_l1_ttbr0_idx[i] == VP_IDX0(pa))
- break;
- }
- if (i == pagetable_l1_ttbr0_num)
- panic("%s: outside existing L0 entries", __func__);
- if (pagetable_l1_ttbr0_idx[i] == ~0) {
- pagetable_l0_ttbr0[VP_IDX0(pa)] =
- (pagetable_l1_ttbr0_pa + i * PAGE_SIZE) | L0_TABLE;
- pagetable_l1_ttbr0_idx[i] = VP_IDX0(pa);
- }
-
- idx = i * (PAGE_SIZE / sizeof(uint64_t)) + VP_IDX1(pa);
- pagetable_l1_ttbr0[idx] = pa | L1_BLOCK |
- ATTR_IDX(PTE_ATTR_WB) | ATTR_SH(SH_INNER) |
- ATTR_nG | ATTR_UXN | ATTR_AF | ATTR_AP(0);
- }
- __asm volatile("dsb sy" ::: "memory");
- __asm volatile("isb");
-}
-
-void
pmap_setttb(struct proc *p)
{
struct cpu_info *ci = curcpu();
diff --git a/sys/arch/arm64/include/pmap.h b/sys/arch/arm64/include/pmap.h
index 73ce53b5ba0..cdb9685beb7 100644
--- a/sys/arch/arm64/include/pmap.h
+++ b/sys/arch/arm64/include/pmap.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: pmap.h,v 1.20 2022/11/07 09:43:04 mpi Exp $ */
+/* $OpenBSD: pmap.h,v 1.21 2022/11/21 20:19:21 kettenis Exp $ */
/*
* Copyright (c) 2008,2009,2014 Dale Rahn <drahn@dalerahn.com>
*
@@ -111,7 +111,6 @@ struct pv_entry;
#define pmap_unuse_final(p) do { /* nothing */ } while (0)
int pmap_fault_fixup(pmap_t, vaddr_t, vm_prot_t);
void pmap_postinit(void);
-void pmap_map_early(paddr_t, psize_t);
#define __HAVE_PMAP_MPSAFE_ENTER_COW