View | Details | Raw Unified | Return to bug 242137 | Differences between
and this patch

Collapse All | Expand All

(-)sys/amd64/amd64/pmap.c (-10 / +9 lines)
Lines 5214-5221 Link Here
5214
pmap_protect_pde(pmap_t pmap, pd_entry_t *pde, vm_offset_t sva, vm_prot_t prot)
5214
pmap_protect_pde(pmap_t pmap, pd_entry_t *pde, vm_offset_t sva, vm_prot_t prot)
5215
{
5215
{
5216
	pd_entry_t newpde, oldpde;
5216
	pd_entry_t newpde, oldpde;
5217
	vm_offset_t eva, va;
5217
	vm_page_t m, mt;
5218
	vm_page_t m;
5219
	boolean_t anychanged;
5218
	boolean_t anychanged;
5220
	pt_entry_t PG_G, PG_M, PG_RW;
5219
	pt_entry_t PG_G, PG_M, PG_RW;
5221
5220
Lines 5229-5243 Link Here
5229
	anychanged = FALSE;
5228
	anychanged = FALSE;
5230
retry:
5229
retry:
5231
	oldpde = newpde = *pde;
5230
	oldpde = newpde = *pde;
5232
	if ((oldpde & (PG_MANAGED | PG_M | PG_RW)) ==
5231
	if ((prot & VM_PROT_WRITE) == 0) {
5233
	    (PG_MANAGED | PG_M | PG_RW)) {
5232
		if ((oldpde & (PG_MANAGED | PG_M | PG_RW)) ==
5234
		eva = sva + NBPDR;
5233
		    (PG_MANAGED | PG_M | PG_RW)) {
5235
		for (va = sva, m = PHYS_TO_VM_PAGE(oldpde & PG_PS_FRAME);
5234
			m = PHYS_TO_VM_PAGE(oldpde & PG_PS_FRAME);
5236
		    va < eva; va += PAGE_SIZE, m++)
5235
			for (mt = m; mt < &m[NBPDR / PAGE_SIZE]; mt++)
5237
			vm_page_dirty(m);
5236
				vm_page_dirty(mt);
5237
		}
5238
		newpde &= ~(PG_RW | PG_M);
5238
	}
5239
	}
5239
	if ((prot & VM_PROT_WRITE) == 0)
5240
		newpde &= ~(PG_RW | PG_M);
5241
	if ((prot & VM_PROT_EXECUTE) == 0)
5240
	if ((prot & VM_PROT_EXECUTE) == 0)
5242
		newpde |= pg_nx;
5241
		newpde |= pg_nx;
5243
	if (newpde != oldpde) {
5242
	if (newpde != oldpde) {
(-)sys/i386/i386/pmap.c (-10 / +9 lines)
Lines 3332-3339 Link Here
3332
pmap_protect_pde(pmap_t pmap, pd_entry_t *pde, vm_offset_t sva, vm_prot_t prot)
3332
pmap_protect_pde(pmap_t pmap, pd_entry_t *pde, vm_offset_t sva, vm_prot_t prot)
3333
{
3333
{
3334
	pd_entry_t newpde, oldpde;
3334
	pd_entry_t newpde, oldpde;
3335
	vm_offset_t eva, va;
3335
	vm_page_t m, mt;
3336
	vm_page_t m;
3337
	boolean_t anychanged;
3336
	boolean_t anychanged;
3338
3337
3339
	PMAP_LOCK_ASSERT(pmap, MA_OWNED);
3338
	PMAP_LOCK_ASSERT(pmap, MA_OWNED);
Lines 3342-3356 Link Here
3342
	anychanged = FALSE;
3341
	anychanged = FALSE;
3343
retry:
3342
retry:
3344
	oldpde = newpde = *pde;
3343
	oldpde = newpde = *pde;
3345
	if ((oldpde & (PG_MANAGED | PG_M | PG_RW)) ==
3344
	if ((prot & VM_PROT_WRITE) == 0) {
3346
	    (PG_MANAGED | PG_M | PG_RW)) {
3345
		if ((oldpde & (PG_MANAGED | PG_M | PG_RW)) ==
3347
		eva = sva + NBPDR;
3346
		    (PG_MANAGED | PG_M | PG_RW)) {
3348
		for (va = sva, m = PHYS_TO_VM_PAGE(oldpde & PG_PS_FRAME);
3347
			m = PHYS_TO_VM_PAGE(oldpde & PG_PS_FRAME);
3349
		    va < eva; va += PAGE_SIZE, m++)
3348
			for (mt = m; mt < &m[NBPDR / PAGE_SIZE]; mt++)
3350
			vm_page_dirty(m);
3349
				vm_page_dirty(mt);
3350
		}
3351
		newpde &= ~(PG_RW | PG_M);
3351
	}
3352
	}
3352
	if ((prot & VM_PROT_WRITE) == 0)
3353
		newpde &= ~(PG_RW | PG_M);
3354
#if defined(PAE) || defined(PAE_TABLES)
3353
#if defined(PAE) || defined(PAE_TABLES)
3355
	if ((prot & VM_PROT_EXECUTE) == 0)
3354
	if ((prot & VM_PROT_EXECUTE) == 0)
3356
		newpde |= pg_nx;
3355
		newpde |= pg_nx;

Return to bug 242137