aboutsummaryrefslogtreecommitdiff
path: root/sys/amd64/amd64/pmap.c
diff options
context:
space:
mode:
authorAlan Cox <alc@FreeBSD.org>2010-10-15 15:23:34 +0000
committerAlan Cox <alc@FreeBSD.org>2010-10-15 15:23:34 +0000
commit353b642ced4f51cd5699b014427d591da5176bcd (patch)
tree31522eacc81e9788f2fdcb664151fb61236a7d3a /sys/amd64/amd64/pmap.c
parentb56f1ea9d4f07a7767e21202c73a8b31c264baf0 (diff)
downloadsrc-353b642ced4f51cd5699b014427d591da5176bcd.tar.gz
src-353b642ced4f51cd5699b014427d591da5176bcd.zip
Update pmap_extract() to handle 1GB page mappings. Some device drivers
use pmap_extract() rather than pmap_kextract() on direct map addresses. Thus, pmap_extract() needs to be able to deal with 1GB page mappings if we are to use 1GB page mappings for the direct map. (See r197580.)
Notes
Notes: svn path=/head/; revision=213897
Diffstat (limited to 'sys/amd64/amd64/pmap.c')
-rw-r--r--sys/amd64/amd64/pmap.c33
1 files changed, 20 insertions, 13 deletions
diff --git a/sys/amd64/amd64/pmap.c b/sys/amd64/amd64/pmap.c
index 665c625d844a..020391756d87 100644
--- a/sys/amd64/amd64/pmap.c
+++ b/sys/amd64/amd64/pmap.c
@@ -1163,26 +1163,33 @@ pmap_is_current(pmap_t pmap)
vm_paddr_t
pmap_extract(pmap_t pmap, vm_offset_t va)
{
- vm_paddr_t rtval;
+ pdp_entry_t *pdpe;
+ pd_entry_t *pde;
pt_entry_t *pte;
- pd_entry_t pde, *pdep;
+ vm_paddr_t pa;
- rtval = 0;
+ pa = 0;
PMAP_LOCK(pmap);
- pdep = pmap_pde(pmap, va);
- if (pdep != NULL) {
- pde = *pdep;
- if (pde) {
- if ((pde & PG_PS) != 0)
- rtval = (pde & PG_PS_FRAME) | (va & PDRMASK);
- else {
- pte = pmap_pde_to_pte(pdep, va);
- rtval = (*pte & PG_FRAME) | (va & PAGE_MASK);
+ pdpe = pmap_pdpe(pmap, va);
+ if (pdpe != NULL && (*pdpe & PG_V) != 0) {
+ if ((*pdpe & PG_PS) != 0)
+ pa = (*pdpe & PG_PS_FRAME) | (va & PDPMASK);
+ else {
+ pde = pmap_pdpe_to_pde(pdpe, va);
+ if ((*pde & PG_V) != 0) {
+ if ((*pde & PG_PS) != 0) {
+ pa = (*pde & PG_PS_FRAME) |
+ (va & PDRMASK);
+ } else {
+ pte = pmap_pde_to_pte(pde, va);
+ pa = (*pte & PG_FRAME) |
+ (va & PAGE_MASK);
+ }
}
}
}
PMAP_UNLOCK(pmap);
- return (rtval);
+ return (pa);
}
/*