Module Name: src
Committed By: ryo
Date: Sat Feb 29 21:09:11 UTC 2020
Modified Files:
src/sys/arch/aarch64/aarch64: aarch64_machdep.c pmapboot.c
src/sys/arch/aarch64/include: pmap.h
Log Message:
replace KSEG pages mapping code with generic function pmapboot_enter_range()
To generate a diff of this commit:
cvs rdiff -u -r1.38 -r1.39 src/sys/arch/aarch64/aarch64/aarch64_machdep.c
cvs rdiff -u -r1.4 -r1.5 src/sys/arch/aarch64/aarch64/pmapboot.c
cvs rdiff -u -r1.34 -r1.35 src/sys/arch/aarch64/include/pmap.h
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/arch/aarch64/aarch64/aarch64_machdep.c
diff -u src/sys/arch/aarch64/aarch64/aarch64_machdep.c:1.38 src/sys/arch/aarch64/aarch64/aarch64_machdep.c:1.39
--- src/sys/arch/aarch64/aarch64/aarch64_machdep.c:1.38 Wed Jan 22 17:15:53 2020
+++ src/sys/arch/aarch64/aarch64/aarch64_machdep.c Sat Feb 29 21:09:11 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: aarch64_machdep.c,v 1.38 2020/01/22 17:15:53 skrll Exp $ */
+/* $NetBSD: aarch64_machdep.c,v 1.39 2020/02/29 21:09:11 ryo 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.38 2020/01/22 17:15:53 skrll Exp $");
+__KERNEL_RCSID(1, "$NetBSD: aarch64_machdep.c,v 1.39 2020/02/29 21:09:11 ryo Exp $");
#include "opt_arm_debug.h"
#include "opt_ddb.h"
@@ -134,77 +134,14 @@ cpu_kernel_vm_init(uint64_t memory_start
LX_BLKPAG_PXN |
LX_BLKPAG_UXN;
for (blk = 0; blk < bootconfig.dramblocks; blk++) {
- uint64_t start, end, left, mapsize, nblocks;
+ uint64_t start, end;
start = trunc_page(bootconfig.dram[blk].address);
end = round_page(bootconfig.dram[blk].address +
(uint64_t)bootconfig.dram[blk].pages * PAGE_SIZE);
- left = end - start;
-
- /* align the start address to L2 blocksize */
- nblocks = ulmin(left / L3_SIZE,
- Ln_ENTRIES - __SHIFTOUT(start, L3_ADDR_BITS));
- if (((start & L3_ADDR_BITS) != 0) && (nblocks > 0)) {
- mapsize = nblocks * L3_SIZE;
- VPRINTF("Creating KSEG tables for %016lx-%016lx (L3)\n",
- start, start + mapsize - 1);
- pmapboot_enter(AARCH64_PA_TO_KVA(start), start,
- mapsize, L3_SIZE, ksegattr,
- PMAPBOOT_ENTER_NOOVERWRITE, bootpage_alloc, NULL);
-
- start += mapsize;
- left -= mapsize;
- }
-
- /* align the start address to L1 blocksize */
- nblocks = ulmin(left / L2_SIZE,
- Ln_ENTRIES - __SHIFTOUT(start, L2_ADDR_BITS));
- if (((start & L2_ADDR_BITS) != 0) && (nblocks > 0)) {
- mapsize = nblocks * L2_SIZE;
- VPRINTF("Creating KSEG tables for %016lx-%016lx (L2)\n",
- start, start + mapsize - 1);
- pmapboot_enter(AARCH64_PA_TO_KVA(start), start,
- mapsize, L2_SIZE, ksegattr,
- PMAPBOOT_ENTER_NOOVERWRITE, bootpage_alloc, NULL);
- start += mapsize;
- left -= mapsize;
- }
-
- nblocks = left / L1_SIZE;
- if (nblocks > 0) {
- mapsize = nblocks * L1_SIZE;
- VPRINTF("Creating KSEG tables for %016lx-%016lx (L1)\n",
- start, start + mapsize - 1);
- pmapboot_enter(AARCH64_PA_TO_KVA(start), start,
- mapsize, L1_SIZE, ksegattr,
- PMAPBOOT_ENTER_NOOVERWRITE, bootpage_alloc, NULL);
- start += mapsize;
- left -= mapsize;
- }
-
- if ((left & L2_ADDR_BITS) != 0) {
- nblocks = left / L2_SIZE;
- mapsize = nblocks * L2_SIZE;
- VPRINTF("Creating KSEG tables for %016lx-%016lx (L2)\n",
- start, start + mapsize - 1);
- pmapboot_enter(AARCH64_PA_TO_KVA(start), start,
- mapsize, L2_SIZE, ksegattr,
- PMAPBOOT_ENTER_NOOVERWRITE, bootpage_alloc, NULL);
- start += mapsize;
- left -= mapsize;
- }
-
- if ((left & L3_ADDR_BITS) != 0) {
- nblocks = left / L3_SIZE;
- mapsize = nblocks * L3_SIZE;
- VPRINTF("Creating KSEG tables for %016lx-%016lx (L3)\n",
- start, start + mapsize - 1);
- pmapboot_enter(AARCH64_PA_TO_KVA(start), start,
- mapsize, L3_SIZE, ksegattr,
- PMAPBOOT_ENTER_NOOVERWRITE, bootpage_alloc, NULL);
- start += mapsize;
- left -= mapsize;
- }
+ pmapboot_enter_range(AARCH64_PA_TO_KVA(start), start,
+ end - start, ksegattr, PMAPBOOT_ENTER_NOOVERWRITE,
+ bootpage_alloc, printf);
}
aarch64_dcache_wbinv_all();
Index: src/sys/arch/aarch64/aarch64/pmapboot.c
diff -u src/sys/arch/aarch64/aarch64/pmapboot.c:1.4 src/sys/arch/aarch64/aarch64/pmapboot.c:1.5
--- src/sys/arch/aarch64/aarch64/pmapboot.c:1.4 Thu Jul 18 06:47:36 2019
+++ src/sys/arch/aarch64/aarch64/pmapboot.c Sat Feb 29 21:09:11 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: pmapboot.c,v 1.4 2019/07/18 06:47:36 skrll Exp $ */
+/* $NetBSD: pmapboot.c,v 1.5 2020/02/29 21:09:11 ryo Exp $ */
/*
* Copyright (c) 2018 Ryo Shimizu <[email protected]>
@@ -27,7 +27,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: pmapboot.c,v 1.4 2019/07/18 06:47:36 skrll Exp $");
+__KERNEL_RCSID(0, "$NetBSD: pmapboot.c,v 1.5 2020/02/29 21:09:11 ryo Exp $");
#include "opt_arm_debug.h"
#include "opt_ddb.h"
@@ -422,3 +422,83 @@ pmapboot_enter(vaddr_t va, paddr_t pa, p
return nskip;
}
+
+int
+pmapboot_enter_range(vaddr_t va, paddr_t pa, psize_t size, pt_entry_t attr,
+ uint64_t flags, pd_entry_t *(*physpage_allocator)(void),
+ void (*pr)(const char *, ...) __printflike(1, 2))
+{
+ vaddr_t vend;
+ vsize_t left, mapsize, nblocks;
+ int nskip = 0;
+
+ va = trunc_page(va);
+ vend = round_page(va + size);
+ left = vend - va;
+
+ /* align the start address to L2 blocksize */
+ nblocks = ulmin(left / L3_SIZE,
+ Ln_ENTRIES - __SHIFTOUT(va, L3_ADDR_BITS));
+ if (((va & L3_ADDR_BITS) != 0) && (nblocks > 0)) {
+ mapsize = nblocks * L3_SIZE;
+ VPRINTF("Creating L3 tables: %016lx-%016lx : %016lx-%016lx\n",
+ va, va + mapsize - 1, pa, pa + mapsize - 1);
+ nskip += pmapboot_enter(va, pa, mapsize, L3_SIZE, attr, flags,
+ physpage_allocator, NULL);
+ va += mapsize;
+ pa += mapsize;
+ left -= mapsize;
+ }
+
+ /* align the start address to L1 blocksize */
+ nblocks = ulmin(left / L2_SIZE,
+ Ln_ENTRIES - __SHIFTOUT(va, L2_ADDR_BITS));
+ if (((va & L2_ADDR_BITS) != 0) && (nblocks > 0)) {
+ mapsize = nblocks * L2_SIZE;
+ VPRINTF("Creating L2 tables: %016lx-%016lx : %016lx-%016lx\n",
+ va, va + mapsize - 1, pa, pa + mapsize - 1);
+ nskip += pmapboot_enter(va, pa, mapsize, L2_SIZE, attr, flags,
+ physpage_allocator, NULL);
+ va += mapsize;
+ pa += mapsize;
+ left -= mapsize;
+ }
+
+ nblocks = left / L1_SIZE;
+ if (nblocks > 0) {
+ mapsize = nblocks * L1_SIZE;
+ VPRINTF("Creating L1 tables: %016lx-%016lx : %016lx-%016lx\n",
+ va, va + mapsize - 1, pa, pa + mapsize - 1);
+ nskip += pmapboot_enter(va, pa, mapsize, L1_SIZE, attr, flags,
+ physpage_allocator, NULL);
+ va += mapsize;
+ pa += mapsize;
+ left -= mapsize;
+ }
+
+ if ((left & L2_ADDR_BITS) != 0) {
+ nblocks = left / L2_SIZE;
+ mapsize = nblocks * L2_SIZE;
+ VPRINTF("Creating L2 tables: %016lx-%016lx : %016lx-%016lx\n",
+ va, va + mapsize - 1, pa, pa + mapsize - 1);
+ nskip += pmapboot_enter(va, pa, mapsize, L2_SIZE, attr, flags,
+ physpage_allocator, NULL);
+ va += mapsize;
+ pa += mapsize;
+ left -= mapsize;
+ }
+
+ if ((left & L3_ADDR_BITS) != 0) {
+ nblocks = left / L3_SIZE;
+ mapsize = nblocks * L3_SIZE;
+ VPRINTF("Creating L3 tables: %016lx-%016lx : %016lx-%016lx\n",
+ va, va + mapsize - 1, pa, pa + mapsize - 1);
+ nskip += pmapboot_enter(va, pa, mapsize, L3_SIZE, attr, flags,
+ physpage_allocator, NULL);
+ va += mapsize;
+ pa += mapsize;
+ left -= mapsize;
+ }
+
+ return nskip;
+}
Index: src/sys/arch/aarch64/include/pmap.h
diff -u src/sys/arch/aarch64/include/pmap.h:1.34 src/sys/arch/aarch64/include/pmap.h:1.35
--- src/sys/arch/aarch64/include/pmap.h:1.34 Mon Feb 10 19:04:01 2020
+++ src/sys/arch/aarch64/include/pmap.h Sat Feb 29 21:09:11 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: pmap.h,v 1.34 2020/02/10 19:04:01 ryo Exp $ */
+/* $NetBSD: pmap.h,v 1.35 2020/02/29 21:09:11 ryo Exp $ */
/*-
* Copyright (c) 2014 The NetBSD Foundation, Inc.
@@ -173,6 +173,8 @@ int pmapboot_enter(vaddr_t, paddr_t, psi
void (*pr)(const char *, ...) __printflike(1, 2));
#define PMAPBOOT_ENTER_NOBLOCK 0x00000001
#define PMAPBOOT_ENTER_NOOVERWRITE 0x00000002
+int pmapboot_enter_range(vaddr_t, paddr_t, psize_t, pt_entry_t, uint64_t,
+ pd_entry_t *(*)(void), void (*)(const char *, ...) __printflike(1, 2));
int pmapboot_protect(vaddr_t, vaddr_t, vm_prot_t);
void pmap_db_pte_print(pt_entry_t, int,
void (*pr)(const char *, ...) __printflike(1, 2));