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 <r...@nerv.org>
@@ -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));

Reply via email to