mirror of
https://github.com/opnsense/src.git
synced 2026-05-28 04:12:45 -04:00
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.)
This commit is contained in:
parent
b56f1ea9d4
commit
353b642ced
1 changed files with 20 additions and 13 deletions
|
|
@ -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);
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
|||
Loading…
Reference in a new issue