aboutsummaryrefslogtreecommitdiff
path: root/sys/powerpc
diff options
context:
space:
mode:
authorAlan Cox <alc@FreeBSD.org>2004-07-26 18:10:10 +0000
committerAlan Cox <alc@FreeBSD.org>2004-07-26 18:10:10 +0000
commitab50a2623016ddca1fa4097f377872053a7f9e61 (patch)
treedb2a0571c6b2981264f8818e829fa305c92c3518 /sys/powerpc
parent1d723f1d518b79fdea655f82e5419ae4888ad78c (diff)
Notes
Diffstat (limited to 'sys/powerpc')
-rw-r--r--sys/powerpc/aim/mmu_oea.c9
-rw-r--r--sys/powerpc/powerpc/mmu_oea.c9
-rw-r--r--sys/powerpc/powerpc/pmap.c9
3 files changed, 18 insertions, 9 deletions
diff --git a/sys/powerpc/aim/mmu_oea.c b/sys/powerpc/aim/mmu_oea.c
index d9ad9661cf74..c0368605454c 100644
--- a/sys/powerpc/aim/mmu_oea.c
+++ b/sys/powerpc/aim/mmu_oea.c
@@ -1057,13 +1057,16 @@ pmap_extract(pmap_t pm, vm_offset_t va)
vm_page_t
pmap_extract_and_hold(pmap_t pmap, vm_offset_t va, vm_prot_t prot)
{
- vm_paddr_t pa;
+ struct pvo_entry *pvo;
vm_page_t m;
m = NULL;
mtx_lock(&Giant);
- if ((pa = pmap_extract(pmap, va)) != 0) {
- m = PHYS_TO_VM_PAGE(pa);
+ pvo = pmap_pvo_find_va(pmap, va & ~ADDR_POFF, NULL);
+ if (pvo != NULL && (pvo->pvo_pte.pte_hi & PTE_VALID) &&
+ ((pvo->pvo_pte.pte_lo & PTE_PP) == PTE_RW ||
+ (prot & VM_PROT_WRITE) == 0)) {
+ m = PHYS_TO_VM_PAGE(pvo->pvo_pte.pte_lo & PTE_RPGN);
vm_page_lock_queues();
vm_page_hold(m);
vm_page_unlock_queues();
diff --git a/sys/powerpc/powerpc/mmu_oea.c b/sys/powerpc/powerpc/mmu_oea.c
index d9ad9661cf74..c0368605454c 100644
--- a/sys/powerpc/powerpc/mmu_oea.c
+++ b/sys/powerpc/powerpc/mmu_oea.c
@@ -1057,13 +1057,16 @@ pmap_extract(pmap_t pm, vm_offset_t va)
vm_page_t
pmap_extract_and_hold(pmap_t pmap, vm_offset_t va, vm_prot_t prot)
{
- vm_paddr_t pa;
+ struct pvo_entry *pvo;
vm_page_t m;
m = NULL;
mtx_lock(&Giant);
- if ((pa = pmap_extract(pmap, va)) != 0) {
- m = PHYS_TO_VM_PAGE(pa);
+ pvo = pmap_pvo_find_va(pmap, va & ~ADDR_POFF, NULL);
+ if (pvo != NULL && (pvo->pvo_pte.pte_hi & PTE_VALID) &&
+ ((pvo->pvo_pte.pte_lo & PTE_PP) == PTE_RW ||
+ (prot & VM_PROT_WRITE) == 0)) {
+ m = PHYS_TO_VM_PAGE(pvo->pvo_pte.pte_lo & PTE_RPGN);
vm_page_lock_queues();
vm_page_hold(m);
vm_page_unlock_queues();
diff --git a/sys/powerpc/powerpc/pmap.c b/sys/powerpc/powerpc/pmap.c
index d9ad9661cf74..c0368605454c 100644
--- a/sys/powerpc/powerpc/pmap.c
+++ b/sys/powerpc/powerpc/pmap.c
@@ -1057,13 +1057,16 @@ pmap_extract(pmap_t pm, vm_offset_t va)
vm_page_t
pmap_extract_and_hold(pmap_t pmap, vm_offset_t va, vm_prot_t prot)
{
- vm_paddr_t pa;
+ struct pvo_entry *pvo;
vm_page_t m;
m = NULL;
mtx_lock(&Giant);
- if ((pa = pmap_extract(pmap, va)) != 0) {
- m = PHYS_TO_VM_PAGE(pa);
+ pvo = pmap_pvo_find_va(pmap, va & ~ADDR_POFF, NULL);
+ if (pvo != NULL && (pvo->pvo_pte.pte_hi & PTE_VALID) &&
+ ((pvo->pvo_pte.pte_lo & PTE_PP) == PTE_RW ||
+ (prot & VM_PROT_WRITE) == 0)) {
+ m = PHYS_TO_VM_PAGE(pvo->pvo_pte.pte_lo & PTE_RPGN);
vm_page_lock_queues();
vm_page_hold(m);
vm_page_unlock_queues();