Module Name:    src
Committed By:   matt
Date:           Mon Mar  3 14:03:14 UTC 2014

Modified Files:
        src/sys/arch/arm/arm32: arm32_kvminit.c

Log Message:
If we are going to map all of physical memory, we don't need to allocate
l2 page tables for the kernel.


To generate a diff of this commit:
cvs rdiff -u -r1.22 -r1.23 src/sys/arch/arm/arm32/arm32_kvminit.c

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/arm/arm32/arm32_kvminit.c
diff -u src/sys/arch/arm/arm32/arm32_kvminit.c:1.22 src/sys/arch/arm/arm32/arm32_kvminit.c:1.23
--- src/sys/arch/arm/arm32/arm32_kvminit.c:1.22	Thu Aug 29 15:46:17 2013
+++ src/sys/arch/arm/arm32/arm32_kvminit.c	Mon Mar  3 14:03:14 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: arm32_kvminit.c,v 1.22 2013/08/29 15:46:17 riz Exp $	*/
+/*	$NetBSD: arm32_kvminit.c,v 1.23 2014/03/03 14:03:14 matt Exp $	*/
 
 /*
  * Copyright (c) 2002, 2003, 2005  Genetec Corporation.  All rights reserved.
@@ -122,7 +122,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: arm32_kvminit.c,v 1.22 2013/08/29 15:46:17 riz Exp $");
+__KERNEL_RCSID(0, "$NetBSD: arm32_kvminit.c,v 1.23 2014/03/03 14:03:14 matt Exp $");
 
 #include <sys/param.h>
 #include <sys/device.h>
@@ -302,6 +302,8 @@ valloc_pages(struct bootmem_info *bmi, p
 	size_t free_idx = 0;
 	static bool l1pt_found;
 
+	KASSERT(npages > 0);
+
 	/*
 	 * If we haven't allocated the kernel L1 page table and we are aligned
 	 * at a L1 table boundary, alloc the memory for it.
@@ -392,21 +394,31 @@ arm32_kernel_vm_init(vaddr_t kernel_vm_b
 	 */
 	size_t kernel_size = bmi->bmi_kernelend;
 	kernel_size -= (bmi->bmi_kernelstart & -L2_S_SEGSIZE);
-	kernel_size += L1_TABLE_SIZE;
-	kernel_size += L2_TABLE_SIZE * (2 + 1 + KERNEL_L2PT_VMDATA_NUM + 1);
+	kernel_size += L1_TABLE_SIZE_REAL;
+	kernel_size += PAGE_SIZE * KERNEL_L2PT_VMDATA_NUM;
+	if (map_vectors_p) {
+		kernel_size += PAGE_SIZE;	/* L2PT for VECTORS */
+	}
+	if (iovbase) {
+		kernel_size += PAGE_SIZE;	/* L2PT for IO */
+	}
 	kernel_size +=
 	    cpu_num * (ABT_STACK_SIZE + FIQ_STACK_SIZE + IRQ_STACK_SIZE
 	    + UND_STACK_SIZE + UPAGES) * PAGE_SIZE;
 	kernel_size += round_page(MSGBUFSIZE);
 	kernel_size += 0x10000;	/* slop */
-	kernel_size += PAGE_SIZE * (kernel_size + L2_S_SEGSIZE - 1) / L2_S_SEGSIZE;
+	if (!mapallmem_p) {
+		kernel_size += PAGE_SIZE
+		    * ((kernel_size + L2_S_SEGSIZE - 1) / L2_S_SEGSIZE);
+	}
 	kernel_size = round_page(kernel_size);
 
 	/*
-	 * Now we know how many L2 pages it will take.
+	 * Now we know how many L2 pages it will take.  If we've mapped
+	 * all of memory, then it won't take any.
 	 */
-	const size_t KERNEL_L2PT_KERNEL_NUM =
-	    (kernel_size + L2_S_SEGSIZE - 1) / L2_S_SEGSIZE;
+	const size_t KERNEL_L2PT_KERNEL_NUM = mapallmem_p
+	    ? 0 : round_page(kernel_size + L2_S_SEGSIZE - 1) / L2_S_SEGSIZE;
 
 #ifdef VERBOSE_INIT_ARM
 	printf("%s: %zu L2 pages are needed to map %#zx kernel bytes\n",
@@ -463,9 +475,8 @@ arm32_kernel_vm_init(vaddr_t kernel_vm_b
 #ifdef VERBOSE_INIT_ARM
 		printf(" vector");
 #endif
-		valloc_pages(bmi, &bmi->bmi_vector_l2pt,
-		    L2_TABLE_SIZE / PAGE_SIZE, VM_PROT_READ|VM_PROT_WRITE,
-		    PTE_PAGETABLE, true);
+		valloc_pages(bmi, &bmi->bmi_vector_l2pt, 1,
+		    VM_PROT_READ|VM_PROT_WRITE, PTE_PAGETABLE, true);
 		add_pages(bmi, &bmi->bmi_vector_l2pt);
 	}
 
@@ -475,8 +486,10 @@ arm32_kernel_vm_init(vaddr_t kernel_vm_b
 #ifdef VERBOSE_INIT_ARM
 	printf(" kernel");
 #endif
+	KASSERT(mapallmem_p || KERNEL_L2PT_KERNEL_NUM > 0);
+	KASSERT(!mapallmem_p || KERNEL_L2PT_KERNEL_NUM == 0);
 	for (size_t idx = 0; idx < KERNEL_L2PT_KERNEL_NUM; ++idx) {
-		valloc_pages(bmi, &kernel_l2pt[idx], L2_TABLE_SIZE / PAGE_SIZE,
+		valloc_pages(bmi, &kernel_l2pt[idx], 1,
 		    VM_PROT_READ|VM_PROT_WRITE, PTE_PAGETABLE, true);
 		add_pages(bmi, &kernel_l2pt[idx]);
 	}
@@ -488,7 +501,7 @@ arm32_kernel_vm_init(vaddr_t kernel_vm_b
 	printf(" vm");
 #endif
 	for (size_t idx = 0; idx < KERNEL_L2PT_VMDATA_NUM; ++idx) {
-		valloc_pages(bmi, &vmdata_l2pt[idx], L2_TABLE_SIZE / PAGE_SIZE,
+		valloc_pages(bmi, &vmdata_l2pt[idx], 1,
 		    VM_PROT_READ|VM_PROT_WRITE, PTE_PAGETABLE, true);
 		add_pages(bmi, &vmdata_l2pt[idx]);
 	}
@@ -496,11 +509,11 @@ arm32_kernel_vm_init(vaddr_t kernel_vm_b
 	/*
 	 * If someone wanted a L2 page for I/O, allocate it now.
 	 */
-	if (iovbase != 0) {
+	if (iovbase) {
 #ifdef VERBOSE_INIT_ARM
 		printf(" io");
 #endif
-		valloc_pages(bmi, &bmi->bmi_io_l2pt, L2_TABLE_SIZE / PAGE_SIZE,
+		valloc_pages(bmi, &bmi->bmi_io_l2pt, 1,
 		    VM_PROT_READ|VM_PROT_WRITE, PTE_PAGETABLE, true);
 		add_pages(bmi, &bmi->bmi_io_l2pt);
 	}
@@ -600,8 +613,8 @@ arm32_kernel_vm_init(vaddr_t kernel_vm_b
 		    &kernel_l2pt[idx]);
 #ifdef VERBOSE_INIT_ARM
 		printf("%s: adding L2 pt (VA %#lx, PA %#lx) for VA %#lx (kernel)\n",
-		    __func__, kernel_l2pt[idx].pv_va, kernel_l2pt[idx].pv_pa,
-		    kernel_base + idx * L2_S_SEGSIZE);
+		    __func__, kernel_l2pt[idx].pv_va,
+		    kernel_l2pt[idx].pv_pa, kernel_base + idx * L2_S_SEGSIZE);
 #endif
 	}
 
@@ -903,17 +916,36 @@ arm32_kernel_vm_init(vaddr_t kernel_vm_b
 	printf("switching to new L1 page table @%#lx...", l1pt_pa);
 #endif
 
+#ifdef ARM_MMU_EXTENDED
+	cpu_domains((DOMAIN_CLIENT << (PMAP_DOMAIN_KERNEL*2))
+	    | (DOMAIN_CLIENT << (PMAP_DOMAIN_USER*2)));
+#else
 	cpu_domains((DOMAIN_CLIENT << (PMAP_DOMAIN_KERNEL*2)) | DOMAIN_CLIENT);
+#endif
 	cpu_idcache_wbinv_all();
+#ifdef VERBOSE_INIT_ARM
+	printf(" ttb");
+#endif
 #ifdef ARM_MMU_EXTENDED
+	/*
+	 * TTBCR should have been initialized by the MD start code.
+	 */
+	KASSERT(armreg_ttbcr_read() == __SHIFTIN(1, TTBCR_S_N));
 	cpu_setttb(l1pt_pa, KERNEL_PID);
 #else
 	cpu_setttb(l1pt_pa, true);
+	cpu_domains(DOMAIN_CLIENT << (PMAP_DOMAIN_KERNEL*2));
 #endif
 	cpu_tlb_flushID();
-	cpu_domains(DOMAIN_CLIENT << (PMAP_DOMAIN_KERNEL*2));
 
 #ifdef VERBOSE_INIT_ARM
+#ifdef ARM_MMU_EXTENDED
+	printf("TTBCR=%#x TTBR0=%#x TTBR1=%#x OK\n",
+	    armreg_ttbcr_read(),
+	    armreg_ttbr_read(),
+	    armreg_ttbr1_read());
+#else
 	printf("TTBR0=%#x OK\n", armreg_ttbr_read());
 #endif
+#endif
 }

Reply via email to