summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authordrahn <drahn@openbsd.org>2002-07-15 17:01:25 +0000
committerdrahn <drahn@openbsd.org>2002-07-15 17:01:25 +0000
commitbd1efb5af6ff83ef06adb6febbc8239c50f4b6c2 (patch)
treea5773ae02aceb4bb1b622c8092b2f538f8b154d6
parentcosmetics/consolidations to manpage in yyerror()s (diff)
downloadwireguard-openbsd-bd1efb5af6ff83ef06adb6febbc8239c50f4b6c2.tar.xz
wireguard-openbsd-bd1efb5af6ff83ef06adb6febbc8239c50f4b6c2.zip
Perform accounting for executable pages on powerpc, prepare for
non-executeable stack.
-rw-r--r--sys/arch/powerpc/include/pmap.h3
-rw-r--r--sys/arch/powerpc/powerpc/pmap.c31
2 files changed, 28 insertions, 6 deletions
diff --git a/sys/arch/powerpc/include/pmap.h b/sys/arch/powerpc/include/pmap.h
index 7762e98f6de..3e3066c8632 100644
--- a/sys/arch/powerpc/include/pmap.h
+++ b/sys/arch/powerpc/include/pmap.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: pmap.h,v 1.26 2002/07/12 20:28:55 drahn Exp $ */
+/* $OpenBSD: pmap.h,v 1.27 2002/07/15 17:01:26 drahn Exp $ */
/* $NetBSD: pmap.h,v 1.1 1996/09/30 16:34:29 ws Exp $ */
/*-
@@ -84,6 +84,7 @@ void pmap_kenter_cache( vaddr_t va, paddr_t pa, vm_prot_t prot, int cacheable);
struct pmap {
sr_t pm_sr[16]; /* segments used in this pmap */
struct pmapvp *pm_vp[VP_SR_SIZE]; /* virtual to physical table */
+ u_int32_t pm_exec[16]; /* segments used in this pmap */
int pm_refs; /* ref count */
struct pmap_statistics pm_stats; /* pmap statistics */
};
diff --git a/sys/arch/powerpc/powerpc/pmap.c b/sys/arch/powerpc/powerpc/pmap.c
index 9cf70c14b19..be9e5d169d1 100644
--- a/sys/arch/powerpc/powerpc/pmap.c
+++ b/sys/arch/powerpc/powerpc/pmap.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: pmap.c,v 1.71 2002/07/12 20:28:55 drahn Exp $ */
+/* $OpenBSD: pmap.c,v 1.72 2002/07/15 17:01:25 drahn Exp $ */
/*
* Copyright (c) 2001, 2002 Dale Rahn. All rights reserved.
@@ -344,10 +344,11 @@ pteidx(sr_t sr, vaddr_t va)
return hash & pmap_ptab_mask;
}
-#define PTED_VA_PTEGIDX_M 0x07
-#define PTED_VA_HID_M 0x08
-#define PTED_VA_MANAGED_M 0x10
-#define PTED_VA_WIRED_M 0x20
+#define PTED_VA_PTEGIDX_M 0x07
+#define PTED_VA_HID_M 0x08
+#define PTED_VA_MANAGED_M 0x10
+#define PTED_VA_WIRED_M 0x20
+#define PTED_VA_EXEC_M 0x40
static inline u_int32_t
PTED_HID(struct pte_desc *pted)
@@ -496,6 +497,9 @@ pmap_enter(pm, va, pa, prot, flags)
*/
pte_insert(pted);
+ if (prot & VM_PROT_EXECUTE)
+ pm->pm_exec[va >> ADDR_SR_SHIFT]++;
+
splx(s);
/* only instruction sync executable pages */
@@ -598,6 +602,11 @@ pmap_remove_pg(pmap_t pm, vaddr_t va)
pmap_hash_remove(pted);
+ if (pted->pted_va & PTED_VA_EXEC_M) {
+ pm->pm_exec[pted->pted_va >> ADDR_SR_SHIFT]--;
+ pted->pted_va &= ~PTED_VA_EXEC_M;
+ }
+
pted->pted_pte.pte_hi &= ~PTE_VALID;
if (PTED_MANAGED(pted))
@@ -666,6 +675,9 @@ _pmap_kenter_pa(vaddr_t va, paddr_t pa, vm_prot_t prot, int flags, int cache)
pte_insert(pted);
pted->pted_va |= PTED_VA_WIRED_M;
+ if (prot & VM_PROT_EXECUTE)
+ pm->pm_exec[va >> ADDR_SR_SHIFT]++;
+
splx(s);
}
@@ -712,6 +724,11 @@ pmap_kremove_pg(vaddr_t va)
*/
pmap_hash_remove(pted);
+ if (pted->pted_va & PTED_VA_EXEC_M) {
+ pm->pm_exec[pted->pted_va >> ADDR_SR_SHIFT]--;
+ pted->pted_va &= ~PTED_VA_EXEC_M;
+ }
+
if (PTED_MANAGED(pted))
pmap_remove_pv(pted);
@@ -807,6 +824,10 @@ pmap_fill_pte(pmap_t pm, vaddr_t va, paddr_t pa, struct pte_desc *pted,
pte->pte_lo |= PTE_RO;
pted->pted_va = va & ~PAGE_MASK;
+
+ if (prot & VM_PROT_EXECUTE)
+ pted->pted_va |= PTED_VA_EXEC_M;
+
pted->pted_pmap = pm;
}