|
Lines 7599-7605
Link Here
|
| 7599 |
pmap_t pmap; |
7599 |
pmap_t pmap; |
| 7600 |
pv_entry_t next_pv, pv; |
7600 |
pv_entry_t next_pv, pv; |
| 7601 |
pd_entry_t oldpde, *pde; |
7601 |
pd_entry_t oldpde, *pde; |
| 7602 |
pt_entry_t oldpte, *pte, PG_M, PG_RW, PG_V; |
7602 |
pt_entry_t *pte, PG_M, PG_RW; |
| 7603 |
struct rwlock *lock; |
7603 |
struct rwlock *lock; |
| 7604 |
vm_offset_t va; |
7604 |
vm_offset_t va; |
| 7605 |
int md_gen, pvh_gen; |
7605 |
int md_gen, pvh_gen; |
|
Lines 7635-7667
Link Here
|
| 7635 |
} |
7635 |
} |
| 7636 |
} |
7636 |
} |
| 7637 |
PG_M = pmap_modified_bit(pmap); |
7637 |
PG_M = pmap_modified_bit(pmap); |
| 7638 |
PG_V = pmap_valid_bit(pmap); |
|
|
| 7639 |
PG_RW = pmap_rw_bit(pmap); |
7638 |
PG_RW = pmap_rw_bit(pmap); |
| 7640 |
va = pv->pv_va; |
7639 |
va = pv->pv_va; |
| 7641 |
pde = pmap_pde(pmap, va); |
7640 |
pde = pmap_pde(pmap, va); |
| 7642 |
oldpde = *pde; |
7641 |
oldpde = *pde; |
| 7643 |
if ((oldpde & PG_RW) != 0) { |
7642 |
/* If oldpde has PG_RW set, then it also has PG_M set. */ |
| 7644 |
if (pmap_demote_pde_locked(pmap, pde, va, &lock)) { |
7643 |
if ((oldpde & PG_RW) != 0 && |
| 7645 |
if ((oldpde & PG_W) == 0) { |
7644 |
pmap_demote_pde_locked(pmap, pde, va, &lock) && |
| 7646 |
/* |
7645 |
(oldpde & PG_W) == 0) { |
| 7647 |
* Write protect the mapping to a |
7646 |
/* |
| 7648 |
* single page so that a subsequent |
7647 |
* Write protect the mapping to a single page so that |
| 7649 |
* write access may repromote. |
7648 |
* a subsequent write access may repromote. |
| 7650 |
*/ |
7649 |
*/ |
| 7651 |
va += VM_PAGE_TO_PHYS(m) - (oldpde & |
7650 |
va += VM_PAGE_TO_PHYS(m) - (oldpde & PG_PS_FRAME); |
| 7652 |
PG_PS_FRAME); |
7651 |
pte = pmap_pde_to_pte(pde, va); |
| 7653 |
pte = pmap_pde_to_pte(pde, va); |
7652 |
atomic_clear_long(pte, PG_M | PG_RW); |
| 7654 |
oldpte = *pte; |
7653 |
vm_page_dirty(m); |
| 7655 |
if ((oldpte & PG_V) != 0) { |
7654 |
pmap_invalidate_page(pmap, va); |
| 7656 |
while (!atomic_cmpset_long(pte, |
|
|
| 7657 |
oldpte, |
| 7658 |
oldpte & ~(PG_M | PG_RW))) |
| 7659 |
oldpte = *pte; |
| 7660 |
vm_page_dirty(m); |
| 7661 |
pmap_invalidate_page(pmap, va); |
| 7662 |
} |
| 7663 |
} |
| 7664 |
} |
| 7665 |
} |
7655 |
} |
| 7666 |
PMAP_UNLOCK(pmap); |
7656 |
PMAP_UNLOCK(pmap); |
| 7667 |
} |
7657 |
} |