Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 28 Nov 2017 09:34:43 +0000 (UTC)
From:      Konstantin Belousov <kib@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r326311 - in head/sys: amd64/amd64 arm64/arm64
Message-ID:  <201711280934.vAS9YhY0087183@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: kib
Date: Tue Nov 28 09:34:43 2017
New Revision: 326311
URL: https://svnweb.freebsd.org/changeset/base/326311

Log:
  Fix index calculation for the page table pages for efirt 1:1 map.
  
  Stop issuing pre-assigned number to enumerate all page table pages,
  the assignment is incorrect.  Instead automatically calculate the next
  unused index. This index in fact does not serve any purpose except to
  be unique to satisfy vm_page_grab() interface, we do not look up the
  page by the index later.
  
  Reported and tested by:	emaste
  Reviewed by:	andrew
  Sponsored by:	The FreeBSD Foundation
  MFC after:	2 weeks
  PR:	223906
  Differential revision:	https://reviews.freebsd.org/D13273

Modified:
  head/sys/amd64/amd64/efirt_machdep.c
  head/sys/arm64/arm64/efirt_machdep.c

Modified: head/sys/amd64/amd64/efirt_machdep.c
==============================================================================
--- head/sys/amd64/amd64/efirt_machdep.c	Tue Nov 28 06:31:39 2017	(r326310)
+++ head/sys/amd64/amd64/efirt_machdep.c	Tue Nov 28 09:34:43 2017	(r326311)
@@ -63,6 +63,7 @@ __FBSDID("$FreeBSD$");
 static pml4_entry_t *efi_pml4;
 static vm_object_t obj_1t1_pt;
 static vm_page_t efi_pml4_page;
+static vm_pindex_t efi_1t1_idx;
 
 void
 efi_destroy_1t1_map(void)
@@ -85,10 +86,10 @@ efi_destroy_1t1_map(void)
 }
 
 static vm_page_t
-efi_1t1_page(vm_pindex_t idx)
+efi_1t1_page(void)
 {
 
-	return (vm_page_grab(obj_1t1_pt, idx, VM_ALLOC_NOBUSY |
+	return (vm_page_grab(obj_1t1_pt, efi_1t1_idx++, VM_ALLOC_NOBUSY |
 	    VM_ALLOC_WIRED | VM_ALLOC_ZERO));
 }
 
@@ -106,7 +107,7 @@ efi_1t1_pte(vm_offset_t va)
 	pml4_idx = pmap_pml4e_index(va);
 	pml4e = &efi_pml4[pml4_idx];
 	if (*pml4e == 0) {
-		m = efi_1t1_page(1 + pml4_idx);
+		m = efi_1t1_page();
 		mphys =  VM_PAGE_TO_PHYS(m);
 		*pml4e = mphys | X86_PG_RW | X86_PG_V;
 	} else {
@@ -117,7 +118,7 @@ efi_1t1_pte(vm_offset_t va)
 	pdp_idx = pmap_pdpe_index(va);
 	pdpe += pdp_idx;
 	if (*pdpe == 0) {
-		m = efi_1t1_page(1 + NPML4EPG + (pml4_idx + 1) * (pdp_idx + 1));
+		m = efi_1t1_page();
 		mphys =  VM_PAGE_TO_PHYS(m);
 		*pdpe = mphys | X86_PG_RW | X86_PG_V;
 	} else {
@@ -128,8 +129,7 @@ efi_1t1_pte(vm_offset_t va)
 	pd_idx = pmap_pde_index(va);
 	pde += pd_idx;
 	if (*pde == 0) {
-		m = efi_1t1_page(1 + NPML4EPG + NPML4EPG * NPDPEPG +
-		    (pml4_idx + 1) * (pdp_idx + 1) * (pd_idx + 1));
+		m = efi_1t1_page();
 		mphys = VM_PAGE_TO_PHYS(m);
 		*pde = mphys | X86_PG_RW | X86_PG_V;
 	} else {
@@ -155,8 +155,9 @@ efi_create_1t1_map(struct efi_md *map, int ndesc, int 
 	obj_1t1_pt = vm_pager_allocate(OBJT_PHYS, NULL, ptoa(1 +
 	    NPML4EPG + NPML4EPG * NPDPEPG + NPML4EPG * NPDPEPG * NPDEPG),
 	    VM_PROT_ALL, 0, NULL);
+	efi_1t1_idx = 0;
 	VM_OBJECT_WLOCK(obj_1t1_pt);
-	efi_pml4_page = efi_1t1_page(0);
+	efi_pml4_page = efi_1t1_page();
 	VM_OBJECT_WUNLOCK(obj_1t1_pt);
 	efi_pml4 = (pml4_entry_t *)PHYS_TO_DMAP(VM_PAGE_TO_PHYS(efi_pml4_page));
 	pmap_pinit_pml4(efi_pml4_page);

Modified: head/sys/arm64/arm64/efirt_machdep.c
==============================================================================
--- head/sys/arm64/arm64/efirt_machdep.c	Tue Nov 28 06:31:39 2017	(r326310)
+++ head/sys/arm64/arm64/efirt_machdep.c	Tue Nov 28 09:34:43 2017	(r326311)
@@ -64,6 +64,7 @@ __FBSDID("$FreeBSD$");
 static vm_object_t obj_1t1_pt;
 static vm_page_t efi_l0_page;
 static pd_entry_t *efi_l0;
+static vm_pindex_t efi_1t1_idx;
 
 void
 efi_destroy_1t1_map(void)
@@ -86,10 +87,10 @@ efi_destroy_1t1_map(void)
 }
 
 static vm_page_t
-efi_1t1_page(vm_pindex_t idx)
+efi_1t1_page(void)
 {
 
-	return (vm_page_grab(obj_1t1_pt, idx, VM_ALLOC_NOBUSY |
+	return (vm_page_grab(obj_1t1_pt, efi_1t1_idx++, VM_ALLOC_NOBUSY |
 	    VM_ALLOC_WIRED | VM_ALLOC_ZERO));
 }
 
@@ -105,7 +106,7 @@ efi_1t1_l3(vm_offset_t va)
 	l0_idx = pmap_l0_index(va);
 	l0 = &efi_l0[l0_idx];
 	if (*l0 == 0) {
-		m = efi_1t1_page(1 + l0_idx);
+		m = efi_1t1_page();
 		mphys = VM_PAGE_TO_PHYS(m);
 		*l0 = mphys | L0_TABLE;
 	} else {
@@ -116,7 +117,7 @@ efi_1t1_l3(vm_offset_t va)
 	l1_idx = pmap_l1_index(va);
 	l1 += l1_idx;
 	if (*l1 == 0) {
-		m = efi_1t1_page(1 + L0_ENTRIES + (l0_idx + 1) * (l1_idx + 1));
+		m = efi_1t1_page();
 		mphys = VM_PAGE_TO_PHYS(m);
 		*l1 = mphys | L1_TABLE;
 	} else {
@@ -127,8 +128,7 @@ efi_1t1_l3(vm_offset_t va)
 	l2_idx = pmap_l2_index(va);
 	l2 += l2_idx;
 	if (*l2 == 0) {
-		m = efi_1t1_page(1 + L0_ENTRIES + L0_ENTRIES * Ln_ENTRIES +
-		    (l0_idx + 1) * (l1_idx + 1) * (l2_idx + 1));
+		m = efi_1t1_page();
 		mphys = VM_PAGE_TO_PHYS(m);
 		*l2 = mphys | L2_TABLE;
 	} else {
@@ -160,7 +160,8 @@ efi_create_1t1_map(struct efi_md *map, int ndesc, int 
 	    L0_ENTRIES * Ln_ENTRIES * Ln_ENTRIES * Ln_ENTRIES,
 	    VM_PROT_ALL, 0, NULL);
 	VM_OBJECT_WLOCK(obj_1t1_pt);
-	efi_l0_page = efi_1t1_page(0);
+	efi_1t1_idx = 0;
+	efi_l0_page = efi_1t1_page();
 	VM_OBJECT_WUNLOCK(obj_1t1_pt);
 	efi_l0 = (pd_entry_t *)PHYS_TO_DMAP(VM_PAGE_TO_PHYS(efi_l0_page));
 	bzero(efi_l0, L0_ENTRIES * sizeof(*efi_l0));



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201711280934.vAS9YhY0087183>