diff options
-rw-r--r-- | sys/amd64/amd64/pmap.c | 8 | ||||
-rw-r--r-- | sys/i386/i386/pmap.c | 8 |
2 files changed, 14 insertions, 2 deletions
diff --git a/sys/amd64/amd64/pmap.c b/sys/amd64/amd64/pmap.c index 9434ce5..760539d 100644 --- a/sys/amd64/amd64/pmap.c +++ b/sys/amd64/amd64/pmap.c @@ -1731,7 +1731,13 @@ pmap_remove(pmap_t pmap, vm_offset_t sva, vm_offset_t eva) sva += PAGE_SIZE) { if (*pte == 0) continue; - anyvalid = 1; + + /* + * The TLB entry for a PG_G mapping is invalidated + * by pmap_remove_pte(). + */ + if ((*pte & PG_G) == 0) + anyvalid = 1; if (pmap_remove_pte(pmap, pte, sva, ptpaddr)) break; } diff --git a/sys/i386/i386/pmap.c b/sys/i386/i386/pmap.c index 143881c..b4c9027 100644 --- a/sys/i386/i386/pmap.c +++ b/sys/i386/i386/pmap.c @@ -1719,7 +1719,13 @@ pmap_remove(pmap_t pmap, vm_offset_t sva, vm_offset_t eva) sva += PAGE_SIZE) { if (*pte == 0) continue; - anyvalid = 1; + + /* + * The TLB entry for a PG_G mapping is invalidated + * by pmap_remove_pte(). + */ + if ((*pte & PG_G) == 0) + anyvalid = 1; if (pmap_remove_pte(pmap, pte, sva)) break; } |