Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/sys/arch Refactor code to split aarch{32, 64} kernel page tab...
details: https://anonhg.NetBSD.org/src/rev/8b465ba59001
branches: trunk
changeset: 365188:8b465ba59001
user: skrll <skrll%NetBSD.org@localhost>
date: Sun Aug 05 06:48:50 2018 +0000
description:
Refactor code to split aarch{32,64} kernel page tables and VM setup. This
will help re-build the kernel page tables on aarch64 with correct section
mappings.
diffstat:
sys/arch/aarch64/aarch64/aarch64_machdep.c | 41 +++++++++++++++++--
sys/arch/aarch64/include/machdep.h | 3 +-
sys/arch/arm/arm32/arm32_machdep.c | 62 ++++++++++++++++++++++++++++-
sys/arch/arm/include/arm32/machdep.h | 4 +-
sys/arch/evbarm/fdt/fdt_machdep.c | 54 ++-----------------------
5 files changed, 105 insertions(+), 59 deletions(-)
diffs (truncated from 303 to 300 lines):
diff -r aa40d233d0e6 -r 8b465ba59001 sys/arch/aarch64/aarch64/aarch64_machdep.c
--- a/sys/arch/aarch64/aarch64/aarch64_machdep.c Sun Aug 05 06:18:05 2018 +0000
+++ b/sys/arch/aarch64/aarch64/aarch64_machdep.c Sun Aug 05 06:48:50 2018 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: aarch64_machdep.c,v 1.7 2018/07/17 12:40:00 christos Exp $ */
+/* $NetBSD: aarch64_machdep.c,v 1.8 2018/08/05 06:48:50 skrll Exp $ */
/*-
* Copyright (c) 2014 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(1, "$NetBSD: aarch64_machdep.c,v 1.7 2018/07/17 12:40:00 christos Exp $");
+__KERNEL_RCSID(1, "$NetBSD: aarch64_machdep.c,v 1.8 2018/08/05 06:48:50 skrll Exp $");
#include "opt_arm_debug.h"
#include "opt_ddb.h"
@@ -60,6 +60,14 @@
#include <aarch64/pte.h>
#include <aarch64/vmparam.h>
+#include <arch/evbarm/fdt/platform.h>
+
+#ifdef VERBOSE_INIT_ARM
+#define VPRINTF(...) printf(__VA_ARGS__)
+#else
+#define VPRINTF(...) do { } while (/* CONSTCOND */ 0)
+#endif
+
char cpu_model[32];
char machine[] = MACHINE;
char machine_arch[] = MACHINE_ARCH;
@@ -85,6 +93,31 @@
/* filled in before cleaning bss. keep in .data */
u_long kern_vtopdiff __attribute__((__section__(".data")));
+void
+cpu_kernel_vm_init(uint64_t memory_start, uint64_t memory_size)
+{
+
+ extern char __kernel_text[];
+ extern char _end[];
+
+ vaddr_t kernstart = trunc_page((vaddr_t)__kernel_text);
+ vaddr_t kernend = round_page((vaddr_t)_end);
+
+ paddr_t kernstart_phys = KERN_VTOPHYS(kernstart);
+ paddr_t kernend_phys = KERN_VTOPHYS(kernend);
+
+ VPRINTF("%s: kernel phys start %lx end %lx\n", __func__,
+ kernstart_phys, kernend_phys);
+
+ fdt_add_reserved_memory_range(kernstart_phys,
+ kernend_phys - kernstart_phys);
+
+ /*
+ * XXX whole bunch of stuff to map kernel correctly
+ */
+}
+
+
/*
* Upper region: 0xffff_ffff_ffff_ffff Top of virtual memory
@@ -143,8 +176,7 @@
physical_start = bootconfig.dram[0].address;
physical_end = physical_start + ptoa(bootconfig.dram[0].pages);
-#ifdef VERBOSE_INIT_ARM
- printf(
+ VPRINTF(
"------------------------------------------\n"
"kern_vtopdiff = 0x%016lx\n"
"physical_start = 0x%016lx\n"
@@ -171,7 +203,6 @@
kernend,
kernend_l2,
VM_MAX_KERNEL_ADDRESS);
-#endif
/*
* msgbuf is always allocated from bottom of 1st memory block.
diff -r aa40d233d0e6 -r 8b465ba59001 sys/arch/aarch64/include/machdep.h
--- a/sys/arch/aarch64/include/machdep.h Sun Aug 05 06:18:05 2018 +0000
+++ b/sys/arch/aarch64/include/machdep.h Sun Aug 05 06:48:50 2018 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: machdep.h,v 1.3 2018/07/19 18:27:26 christos Exp $ */
+/* $NetBSD: machdep.h,v 1.4 2018/08/05 06:48:50 skrll Exp $ */
/*
* Copyright (c) 2017 Ryo Shimizu <ryo%nerv.org@localhost>
@@ -70,6 +70,7 @@
#endif
vaddr_t initarm_common(vaddr_t, vsize_t, const struct boot_physmem *, size_t);
+void cpu_kernel_vm_init(paddr_t, psize_t);
void parse_mi_bootargs(char *);
void dumpsys(void);
diff -r aa40d233d0e6 -r 8b465ba59001 sys/arch/arm/arm32/arm32_machdep.c
--- a/sys/arch/arm/arm32/arm32_machdep.c Sun Aug 05 06:18:05 2018 +0000
+++ b/sys/arch/arm/arm32/arm32_machdep.c Sun Aug 05 06:48:50 2018 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: arm32_machdep.c,v 1.116 2018/07/31 07:00:48 skrll Exp $ */
+/* $NetBSD: arm32_machdep.c,v 1.117 2018/08/05 06:48:50 skrll Exp $ */
/*
* Copyright (c) 1994-1998 Mark Brinicombe.
@@ -42,9 +42,10 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: arm32_machdep.c,v 1.116 2018/07/31 07:00:48 skrll Exp $");
+__KERNEL_RCSID(0, "$NetBSD: arm32_machdep.c,v 1.117 2018/08/05 06:48:50 skrll Exp $");
#include "opt_arm_debug.h"
+#include "opt_fdt.h"
#include "opt_modular.h"
#include "opt_md.h"
#include "opt_pmap_debug.h"
@@ -81,13 +82,17 @@
#include <machine/bootconfig.h>
#include <machine/pcb.h>
+#if defined(FDT)
+#include <arm/fdt/arm_fdtvar.h>
+#include <arch/evbarm/fdt/platform.h>
+#endif
+
#ifdef VERBOSE_INIT_ARM
#define VPRINTF(...) printf(__VA_ARGS__)
#else
#define VPRINTF(...) do { } while (/* CONSTCOND */ 0)
#endif
-
void (*cpu_reset_address)(void); /* Used by locore */
paddr_t cpu_reset_address_paddr; /* Used by locore */
@@ -763,3 +768,54 @@
return true;
#endif
}
+
+#if defined(FDT)
+extern char KERNEL_BASE_phys[];
+#define KERNEL_BASE_PHYS ((paddr_t)KERNEL_BASE_phys)
+
+void
+cpu_kernel_vm_init(paddr_t memory_start, psize_t memory_size)
+{
+ const struct arm_platform *plat = arm_fdt_platform();
+
+#ifdef VERBOSE_INIT_ARM
+ extern char _end[];
+
+ const vaddr_t kernend = round_page((vaddr_t)_end);
+
+ const paddr_t kernstart_phys = KERNEL_BASE_PHYS;
+ const paddr_t kernend_phys = KERN_VTOPHYS(kernend);
+#endif
+
+ VPRINTF("KERNEL_BASE=0x%x, "
+ "KERNEL_VM_BASE=0x%x, "
+ "KERNEL_VM_BASE - KERNEL_BASE=0x%x, "
+ "KERNEL_BASE_VOFFSET=0x%x\n",
+ KERNEL_BASE,
+ KERNEL_VM_BASE,
+ KERNEL_VM_BASE - KERNEL_BASE,
+ KERNEL_BASE_VOFFSET);
+
+ VPRINTF("%s: kernel phys start %lx end %lx\n", __func__,
+ kernstart_phys, kernend_phys);
+
+#ifdef __HAVE_MM_MD_DIRECT_MAPPED_PHYS
+ const bool mapallmem_p = true;
+#ifndef PMAP_NEED_ALLOC_POOLPAGE
+ if (memory_size > KERNEL_VM_BASE - KERNEL_BASE) {
+ VPRINTF("%s: dropping RAM size from %luMB to %uMB\n",
+ __func__, (unsigned long) (memory_size >> 20),
+ (KERNEL_VM_BASE - KERNEL_BASE) >> 20);
+ memory_size = KERNEL_VM_BASE - KERNEL_BASE;
+ }
+#endif
+#else
+ const bool mapallmem_p = false;
+#endif
+
+ arm32_bootmem_init(memory_start, memory_size, KERNEL_BASE_PHYS);
+ arm32_kernel_vm_init(KERNEL_VM_BASE, ARM_VECTORS_HIGH, 0,
+ plat->devmap(), mapallmem_p);
+}
+#endif
+
diff -r aa40d233d0e6 -r 8b465ba59001 sys/arch/arm/include/arm32/machdep.h
--- a/sys/arch/arm/include/arm32/machdep.h Sun Aug 05 06:18:05 2018 +0000
+++ b/sys/arch/arm/include/arm32/machdep.h Sun Aug 05 06:48:50 2018 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: machdep.h,v 1.25 2018/08/05 06:18:05 skrll Exp $ */
+/* $NetBSD: machdep.h,v 1.26 2018/08/05 06:48:50 skrll Exp $ */
#ifndef _ARM32_MACHDEP_H_
#define _ARM32_MACHDEP_H_
@@ -88,6 +88,8 @@
#define KERN_VTOPHYS(va) aarch32_kern_vtophys(va)
#define KERN_PHYSTOV(pa) aarch32_kern_phystov(pa)
+void cpu_kernel_vm_init(paddr_t, psize_t);
+
void arm32_bootmem_init(paddr_t memstart, psize_t memsize, paddr_t kernelstart);
void arm32_kernel_vm_init(vaddr_t kvm_base, vaddr_t vectors,
vaddr_t iovbase /* (can be zero) */,
diff -r aa40d233d0e6 -r 8b465ba59001 sys/arch/evbarm/fdt/fdt_machdep.c
--- a/sys/arch/evbarm/fdt/fdt_machdep.c Sun Aug 05 06:18:05 2018 +0000
+++ b/sys/arch/evbarm/fdt/fdt_machdep.c Sun Aug 05 06:48:50 2018 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: fdt_machdep.c,v 1.30 2018/08/03 13:48:24 skrll Exp $ */
+/* $NetBSD: fdt_machdep.c,v 1.31 2018/08/05 06:48:50 skrll Exp $ */
/*-
* Copyright (c) 2015-2017 Jared McNeill <jmcneill%invisible.ca@localhost>
@@ -27,7 +27,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: fdt_machdep.c,v 1.30 2018/08/03 13:48:24 skrll Exp $");
+__KERNEL_RCSID(0, "$NetBSD: fdt_machdep.c,v 1.31 2018/08/05 06:48:50 skrll Exp $");
#include "opt_machdep.h"
#include "opt_bootconfig.h"
@@ -419,17 +419,6 @@
parse_mi_bootargs(mi_bootargs);
#endif
-#ifndef __aarch64__
- VPRINTF("KERNEL_BASE=0x%x, "
- "KERNEL_VM_BASE=0x%x, "
- "KERNEL_VM_BASE - KERNEL_BASE=0x%x, "
- "KERNEL_BASE_VOFFSET=0x%x\n",
- KERNEL_BASE,
- KERNEL_VM_BASE,
- KERNEL_VM_BASE - KERNEL_BASE,
- KERNEL_BASE_VOFFSET);
-#endif
-
fdt_get_memory(&memory_start, &memory_end);
#if !defined(_LP64)
@@ -437,24 +426,8 @@
if (memory_end >= 0x100000000ULL)
memory_end = 0x100000000ULL - PAGE_SIZE;
+#endif
uint64_t memory_size = memory_end - memory_start;
-#endif
-
-#ifndef __aarch64__
-#ifdef __HAVE_MM_MD_DIRECT_MAPPED_PHYS
- const bool mapallmem_p = true;
-#ifndef PMAP_NEED_ALLOC_POOLPAGE
- if (memory_size > KERNEL_VM_BASE - KERNEL_BASE) {
- VPRINTF("%s: dropping RAM size from %luMB to %uMB\n",
- __func__, (unsigned long) (memory_size >> 20),
- (KERNEL_VM_BASE - KERNEL_BASE) >> 20);
- memory_size = KERNEL_VM_BASE - KERNEL_BASE;
- }
-#endif
-#else
- const bool mapallmem_p = false;
-#endif
-#endif
/* Parse ramdisk info */
fdt_probe_initrd(&initrd_start, &initrd_end);
@@ -465,25 +438,8 @@
*/
fdt_build_bootconfig(memory_start, memory_end);
-#ifdef __aarch64__
- extern char __kernel_text[];
- extern char _end[];
-
- vaddr_t kernstart = trunc_page((vaddr_t)__kernel_text);
- vaddr_t kernend = round_page((vaddr_t)_end);
-
- paddr_t kernstart_phys = KERN_VTOPHYS(kernstart);
- paddr_t kernend_phys = KERN_VTOPHYS(kernend);
-
- VPRINTF("%s: kernel phys start %lx end %lx\n", __func__, kernstart_phys, kernend_phys);
-
- fdt_add_reserved_memory_range(kernstart_phys,
- kernend_phys - kernstart_phys);
-#else
- arm32_bootmem_init(memory_start, memory_size, KERNEL_BASE_PHYS);
- arm32_kernel_vm_init(KERNEL_VM_BASE, ARM_VECTORS_HIGH, 0,
- plat->devmap(), mapallmem_p);
-#endif
+ /* Perform PT build and VM init */
+ cpu_kernel_vm_init(memory_start, memory_size);
Home |
Main Index |
Thread Index |
Old Index