Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 29 Oct 2015 19:07:00 +0000 (UTC)
From:      "Conrad E. Meyer" <cem@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r290156 - head/sys/amd64/amd64
Message-ID:  <201510291907.t9TJ70UN004616@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: cem
Date: Thu Oct 29 19:07:00 2015
New Revision: 290156
URL: https://svnweb.freebsd.org/changeset/base/290156

Log:
  pmap_change_attr: Only fixup DMAP for DMAPed ranges
  
  pmap_change_attr must change the memory type of both the requested KVA
  and the corresponding DMAP mappings (if such mappings exist), to satisfy
  an Intel requirement that two or more mappings to the same physical
  pages must have the same memory type.
  
  However, not all kernel mapped pages have corresponding DMAP mappings --
  for example, 64-bit BARs.  Skip fixing up the DMAP for out-of-bounds
  addresses.
  
  Submitted by:	Steve Wahl <steve_wahl@dell.com>
  Reviewed by:	alc, jhb
  Sponsored by:	Dell Compellent
  Differential Revision:	https://reviews.freebsd.org/D4030

Modified:
  head/sys/amd64/amd64/pmap.c

Modified: head/sys/amd64/amd64/pmap.c
==============================================================================
--- head/sys/amd64/amd64/pmap.c	Thu Oct 29 19:02:24 2015	(r290155)
+++ head/sys/amd64/amd64/pmap.c	Thu Oct 29 19:07:00 2015	(r290156)
@@ -6411,7 +6411,7 @@ pmap_change_attr_locked(vm_offset_t va, 
 	 */
 	for (tmpva = base; tmpva < base + size; ) {
 		pdpe = pmap_pdpe(kernel_pmap, tmpva);
-		if (*pdpe == 0)
+		if (pdpe == NULL || *pdpe == 0)
 			return (EINVAL);
 		if (*pdpe & PG_PS) {
 			/*
@@ -6484,7 +6484,8 @@ pmap_change_attr_locked(vm_offset_t va, 
 				    X86_PG_PDE_CACHE);
 				changed = TRUE;
 			}
-			if (tmpva >= VM_MIN_KERNEL_ADDRESS) {
+			if (tmpva >= VM_MIN_KERNEL_ADDRESS &&
+			    (*pdpe & PG_PS_FRAME) < dmaplimit) {
 				if (pa_start == pa_end) {
 					/* Start physical address run. */
 					pa_start = *pdpe & PG_PS_FRAME;
@@ -6513,7 +6514,8 @@ pmap_change_attr_locked(vm_offset_t va, 
 				    X86_PG_PDE_CACHE);
 				changed = TRUE;
 			}
-			if (tmpva >= VM_MIN_KERNEL_ADDRESS) {
+			if (tmpva >= VM_MIN_KERNEL_ADDRESS &&
+			    (*pde & PG_PS_FRAME) < dmaplimit) {
 				if (pa_start == pa_end) {
 					/* Start physical address run. */
 					pa_start = *pde & PG_PS_FRAME;
@@ -6540,7 +6542,8 @@ pmap_change_attr_locked(vm_offset_t va, 
 				    X86_PG_PTE_CACHE);
 				changed = TRUE;
 			}
-			if (tmpva >= VM_MIN_KERNEL_ADDRESS) {
+			if (tmpva >= VM_MIN_KERNEL_ADDRESS &&
+			    (*pte & PG_PS_FRAME) < dmaplimit) {
 				if (pa_start == pa_end) {
 					/* Start physical address run. */
 					pa_start = *pte & PG_FRAME;



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