pmap.c (270439) | pmap.c (270920) |
---|---|
1/* From: $NetBSD: pmap.c,v 1.148 2004/04/03 04:35:48 bsh Exp $ */ 2/*- 3 * Copyright 2004 Olivier Houchard. 4 * Copyright 2003 Wasabi Systems, Inc. 5 * All rights reserved. 6 * 7 * Written by Steve C. Woodford for Wasabi Systems, Inc. 8 * --- 128 unchanged lines hidden (view full) --- 137 * 138 * Note that pmap_mapdev() and pmap_unmapdev() are implemented in arm/devmap.c 139 */ 140/* Include header files */ 141 142#include "opt_vm.h" 143 144#include <sys/cdefs.h> | 1/* From: $NetBSD: pmap.c,v 1.148 2004/04/03 04:35:48 bsh Exp $ */ 2/*- 3 * Copyright 2004 Olivier Houchard. 4 * Copyright 2003 Wasabi Systems, Inc. 5 * All rights reserved. 6 * 7 * Written by Steve C. Woodford for Wasabi Systems, Inc. 8 * --- 128 unchanged lines hidden (view full) --- 137 * 138 * Note that pmap_mapdev() and pmap_unmapdev() are implemented in arm/devmap.c 139 */ 140/* Include header files */ 141 142#include "opt_vm.h" 143 144#include <sys/cdefs.h> |
145__FBSDID("$FreeBSD: stable/10/sys/arm/arm/pmap.c 270439 2014-08-24 07:53:15Z kib $"); | 145__FBSDID("$FreeBSD: stable/10/sys/arm/arm/pmap.c 270920 2014-09-01 07:58:15Z kib $"); |
146#include <sys/param.h> 147#include <sys/systm.h> 148#include <sys/kernel.h> 149#include <sys/ktr.h> 150#include <sys/lock.h> 151#include <sys/proc.h> 152#include <sys/malloc.h> 153#include <sys/msgbuf.h> --- 3383 unchanged lines hidden (view full) --- 3537 PMAP_LOCK(pmap); 3538 pmap_enter_locked(pmap, va, m, prot & (VM_PROT_READ | VM_PROT_EXECUTE), 3539 PMAP_ENTER_NOSLEEP); 3540 rw_wunlock(&pvh_global_lock); 3541 PMAP_UNLOCK(pmap); 3542} 3543 3544/* | 146#include <sys/param.h> 147#include <sys/systm.h> 148#include <sys/kernel.h> 149#include <sys/ktr.h> 150#include <sys/lock.h> 151#include <sys/proc.h> 152#include <sys/malloc.h> 153#include <sys/msgbuf.h> --- 3383 unchanged lines hidden (view full) --- 3537 PMAP_LOCK(pmap); 3538 pmap_enter_locked(pmap, va, m, prot & (VM_PROT_READ | VM_PROT_EXECUTE), 3539 PMAP_ENTER_NOSLEEP); 3540 rw_wunlock(&pvh_global_lock); 3541 PMAP_UNLOCK(pmap); 3542} 3543 3544/* |
3545 * Routine: pmap_change_wiring 3546 * Function: Change the wiring attribute for a map/virtual-address 3547 * pair. 3548 * In/out conditions: 3549 * The mapping must already exist in the pmap. | 3545 * Clear the wired attribute from the mappings for the specified range of 3546 * addresses in the given pmap. Every valid mapping within that range 3547 * must have the wired attribute set. In contrast, invalid mappings 3548 * cannot have the wired attribute set, so they are ignored. 3549 * 3550 * XXX Wired mappings of unmanaged pages cannot be counted by this pmap 3551 * implementation. |
3550 */ 3551void | 3552 */ 3553void |
3552pmap_change_wiring(pmap_t pmap, vm_offset_t va, boolean_t wired) | 3554pmap_unwire(pmap_t pmap, vm_offset_t sva, vm_offset_t eva) |
3553{ 3554 struct l2_bucket *l2b; 3555 pt_entry_t *ptep, pte; | 3555{ 3556 struct l2_bucket *l2b; 3557 pt_entry_t *ptep, pte; |
3556 vm_page_t pg; 3557 | 3558 pv_entry_t pv; 3559 vm_offset_t next_bucket; 3560 vm_page_t m; 3561 |
3558 rw_wlock(&pvh_global_lock); | 3562 rw_wlock(&pvh_global_lock); |
3559 PMAP_LOCK(pmap); 3560 l2b = pmap_get_l2_bucket(pmap, va); 3561 KASSERT(l2b, ("No l2b bucket in pmap_change_wiring")); 3562 ptep = &l2b->l2b_kva[l2pte_index(va)]; 3563 pte = *ptep; 3564 pg = PHYS_TO_VM_PAGE(l2pte_pa(pte)); 3565 if (pg) 3566 pmap_modify_pv(pg, pmap, va, PVF_WIRED, wired ? PVF_WIRED : 0); | 3563 PMAP_LOCK(pmap); 3564 while (sva < eva) { 3565 next_bucket = L2_NEXT_BUCKET(sva); 3566 if (next_bucket > eva) 3567 next_bucket = eva; 3568 l2b = pmap_get_l2_bucket(pmap, sva); 3569 if (l2b == NULL) { 3570 sva = next_bucket; 3571 continue; 3572 } 3573 for (ptep = &l2b->l2b_kva[l2pte_index(sva)]; sva < next_bucket; 3574 sva += PAGE_SIZE, ptep++) { 3575 if ((pte = *ptep) == 0 || 3576 (m = PHYS_TO_VM_PAGE(l2pte_pa(pte))) == NULL || 3577 (m->oflags & VPO_UNMANAGED) != 0) 3578 continue; 3579 pv = pmap_find_pv(m, pmap, sva); 3580 if ((pv->pv_flags & PVF_WIRED) == 0) 3581 panic("pmap_unwire: pv %p isn't wired", pv); 3582 pv->pv_flags &= ~PVF_WIRED; 3583 pmap->pm_stats.wired_count--; 3584 } 3585 } |
3567 rw_wunlock(&pvh_global_lock); 3568 PMAP_UNLOCK(pmap); 3569} 3570 3571 3572/* 3573 * Copy the range specified by src_addr/len 3574 * from the source map to the range dst_addr/len --- 1228 unchanged lines hidden --- | 3586 rw_wunlock(&pvh_global_lock); 3587 PMAP_UNLOCK(pmap); 3588} 3589 3590 3591/* 3592 * Copy the range specified by src_addr/len 3593 * from the source map to the range dst_addr/len --- 1228 unchanged lines hidden --- |