Module Name: src Committed By: riastradh Date: Wed Feb 16 23:31:13 UTC 2022
Modified Files: src/sys/arch/powerpc/conf: files.powerpc src/sys/arch/powerpc/include: pmap.h src/sys/arch/powerpc/include/oea: pmap.h src/sys/arch/powerpc/oea: pmap.c pmap_kernel.c Log Message: powerpc: Implement pv-tracking for unmanaged pages. Needed for drm. To generate a diff of this commit: cvs rdiff -u -r1.98 -r1.99 src/sys/arch/powerpc/conf/files.powerpc cvs rdiff -u -r1.40 -r1.41 src/sys/arch/powerpc/include/pmap.h cvs rdiff -u -r1.35 -r1.36 src/sys/arch/powerpc/include/oea/pmap.h cvs rdiff -u -r1.107 -r1.108 src/sys/arch/powerpc/oea/pmap.c cvs rdiff -u -r1.12 -r1.13 src/sys/arch/powerpc/oea/pmap_kernel.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/arch/powerpc/conf/files.powerpc diff -u src/sys/arch/powerpc/conf/files.powerpc:1.98 src/sys/arch/powerpc/conf/files.powerpc:1.99 --- src/sys/arch/powerpc/conf/files.powerpc:1.98 Fri Mar 5 06:06:34 2021 +++ src/sys/arch/powerpc/conf/files.powerpc Wed Feb 16 23:31:13 2022 @@ -1,4 +1,4 @@ -# $NetBSD: files.powerpc,v 1.98 2021/03/05 06:06:34 rin Exp $ +# $NetBSD: files.powerpc,v 1.99 2022/02/16 23:31:13 riastradh Exp $ defflag opt_altivec.h ALTIVEC K_ALTIVEC PPC_HAVE_SPE defflag opt_openpic.h OPENPIC_DISTRIBUTE @@ -51,6 +51,7 @@ file arch/powerpc/oea/pmap64.c ppc_oea file arch/powerpc/oea/pmap64_bridge.c ppc_oea64_bridge file arch/powerpc/oea/pmap_kernel.c ppc_oea | ppc_oea64 | ppc_oea64_bridge | ppc_oea601 file arch/powerpc/powerpc/trap.c ppc_oea | ppc_oea64 | ppc_oea64_bridge | ppc_oea601 +file uvm/pmap/pmap_pvt.c ppc_oea | ppc_oea601 | ppc_oea64 # PPC BookE (MPC85xx) Family files file arch/powerpc/booke/booke_machdep.c ppc_booke Index: src/sys/arch/powerpc/include/pmap.h diff -u src/sys/arch/powerpc/include/pmap.h:1.40 src/sys/arch/powerpc/include/pmap.h:1.41 --- src/sys/arch/powerpc/include/pmap.h:1.40 Mon Jul 6 08:17:01 2020 +++ src/sys/arch/powerpc/include/pmap.h Wed Feb 16 23:31:13 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: pmap.h,v 1.40 2020/07/06 08:17:01 rin Exp $ */ +/* $NetBSD: pmap.h,v 1.41 2022/02/16 23:31:13 riastradh Exp $ */ #ifndef _POWERPC_PMAP_H_ #define _POWERPC_PMAP_H_ @@ -22,6 +22,8 @@ #endif /* !_MODULE */ +#include <uvm/pmap/pmap_pvt.h> + #if !defined(_LOCORE) && (defined(MODULAR) || defined(_MODULE)) /* * Both BOOKE and OEA use __HAVE_VM_PAGE_MD but IBM4XX doesn't so define Index: src/sys/arch/powerpc/include/oea/pmap.h diff -u src/sys/arch/powerpc/include/oea/pmap.h:1.35 src/sys/arch/powerpc/include/oea/pmap.h:1.36 --- src/sys/arch/powerpc/include/oea/pmap.h:1.35 Fri Mar 12 04:57:42 2021 +++ src/sys/arch/powerpc/include/oea/pmap.h Wed Feb 16 23:31:13 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: pmap.h,v 1.35 2021/03/12 04:57:42 thorpej Exp $ */ +/* $NetBSD: pmap.h,v 1.36 2022/02/16 23:31:13 riastradh Exp $ */ /*- * Copyright (C) 1995, 1996 Wolfgang Solfrank. @@ -90,6 +90,7 @@ struct pmap_ops { void (*pmapop_protect)(pmap_t, vaddr_t, vaddr_t, vm_prot_t); void (*pmapop_unwire)(pmap_t, vaddr_t); void (*pmapop_page_protect)(struct vm_page *, vm_prot_t); + void (*pmapop_pv_protect)(paddr_t, vm_prot_t); bool (*pmapop_query_bit)(struct vm_page *, int); bool (*pmapop_clear_bit)(struct vm_page *, int); @@ -247,11 +248,20 @@ LIST_HEAD(pvo_head, pvo_entry); #define __HAVE_VM_PAGE_MD +struct pmap_page { + unsigned int pp_attrs; + struct pvo_head pp_pvoh; +#ifdef MODULAR + uintptr_t pp_dummy[3]; +#endif +}; + struct vm_page_md { - unsigned int mdpg_attrs; - struct pvo_head mdpg_pvoh; + struct pmap_page mdpg_pp; +#define mdpg_attrs mdpg_pp.pp_attrs +#define mdpg_pvoh mdpg_pp.pp_pvoh #ifdef MODULAR - uintptr_t mdpg_dummy[3]; +#define mdpg_dummy mdpg_pp.pp_dummy #endif }; Index: src/sys/arch/powerpc/oea/pmap.c diff -u src/sys/arch/powerpc/oea/pmap.c:1.107 src/sys/arch/powerpc/oea/pmap.c:1.108 --- src/sys/arch/powerpc/oea/pmap.c:1.107 Mon Jul 19 14:49:45 2021 +++ src/sys/arch/powerpc/oea/pmap.c Wed Feb 16 23:31:13 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: pmap.c,v 1.107 2021/07/19 14:49:45 chs Exp $ */ +/* $NetBSD: pmap.c,v 1.108 2022/02/16 23:31:13 riastradh Exp $ */ /*- * Copyright (c) 2001 The NetBSD Foundation, Inc. * All rights reserved. @@ -63,7 +63,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.107 2021/07/19 14:49:45 chs Exp $"); +__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.108 2022/02/16 23:31:13 riastradh Exp $"); #define PMAP_NOOPNAMES @@ -214,6 +214,7 @@ STATIC bool pmap_extract(pmap_t, vaddr_t STATIC void pmap_protect(pmap_t, vaddr_t, vaddr_t, vm_prot_t); STATIC void pmap_unwire(pmap_t, vaddr_t); STATIC void pmap_page_protect(struct vm_page *, vm_prot_t); +STATIC void pmap_pv_protect(paddr_t, vm_prot_t); STATIC bool pmap_query_bit(struct vm_page *, int); STATIC bool pmap_clear_bit(struct vm_page *, int); @@ -645,12 +646,16 @@ pa_to_pvoh(paddr_t pa, struct vm_page ** { struct vm_page *pg; struct vm_page_md *md; + struct pmap_page *pp; pg = PHYS_TO_VM_PAGE(pa); if (pg_p != NULL) *pg_p = pg; - if (pg == NULL) + if (pg == NULL) { + if ((pp = pmap_pv_tracked(pa)) != NULL) + return &pp->pp_pvoh; return NULL; + } md = VM_PAGE_TO_MD(pg); return &md->mdpg_pvoh; } @@ -663,13 +668,26 @@ vm_page_to_pvoh(struct vm_page *pg) return &md->mdpg_pvoh; } +static inline void +pmap_pp_attr_clear(struct pmap_page *pp, int ptebit) +{ + + pp->pp_attrs &= ptebit; +} static inline void pmap_attr_clear(struct vm_page *pg, int ptebit) { struct vm_page_md * const md = VM_PAGE_TO_MD(pg); - md->mdpg_attrs &= ~ptebit; + pmap_pp_attr_clear(&md->mdpg_pp, ptebit); +} + +static inline int +pmap_pp_attr_fetch(struct pmap_page *pp) +{ + + return pp->pp_attrs; } static inline int @@ -677,7 +695,7 @@ pmap_attr_fetch(struct vm_page *pg) { struct vm_page_md * const md = VM_PAGE_TO_MD(pg); - return md->mdpg_attrs; + return pmap_pp_attr_fetch(&md->mdpg_pp); } static inline void @@ -2274,11 +2292,8 @@ pmap_unwire(pmap_t pm, vaddr_t va) PMAP_UNLOCK(); } -/* - * Lower the protection on the specified physical page. - */ -void -pmap_page_protect(struct vm_page *pg, vm_prot_t prot) +static void +pmap_pp_protect(struct pmap_page *pp, paddr_t pa, vm_prot_t prot) { struct pvo_head *pvo_head, pvol; struct pvo_entry *pvo, *next_pvo; @@ -2298,14 +2313,14 @@ pmap_page_protect(struct vm_page *pg, vm */ if ((prot & VM_PROT_READ) == 0) { DPRINTFN(EXEC, "[pmap_page_protect: %#" _PRIxpa ": clear-exec]\n", - VM_PAGE_TO_PHYS(pg)); - if (pmap_attr_fetch(pg) & PTE_EXEC) { + pa); + if (pmap_pp_attr_fetch(pp) & PTE_EXEC) { PMAPCOUNT(exec_uncached_page_protect); - pmap_attr_clear(pg, PTE_EXEC); + pmap_pp_attr_clear(pp, PTE_EXEC); } } - pvo_head = vm_page_to_pvoh(pg); + pvo_head = &pp->pp_pvoh; for (pvo = LIST_FIRST(pvo_head); pvo != NULL; pvo = next_pvo) { next_pvo = LIST_NEXT(pvo, pvo_vlink); PMAP_PVO_CHECK(pvo); /* sanity check */ @@ -2356,6 +2371,32 @@ pmap_page_protect(struct vm_page *pg, vm } /* + * Lower the protection on the specified physical page. + */ +void +pmap_page_protect(struct vm_page *pg, vm_prot_t prot) +{ + struct vm_page_md *md = VM_PAGE_TO_MD(pg); + + pmap_pp_protect(&md->mdpg_pp, VM_PAGE_TO_PHYS(pg), prot); +} + +/* + * Lower the protection on the physical page at the specified physical + * address, which may not be managed and so may not have a struct + * vm_page. + */ +void +pmap_pv_protect(paddr_t pa, vm_prot_t prot) +{ + struct pmap_page *pp; + + if ((pp = pmap_pv_tracked(pa)) == NULL) + return; + pmap_pp_protect(pp, pa, prot); +} + +/* * Activate the address space for the specified process. If the process * is the current process, load the new MMU context. */ Index: src/sys/arch/powerpc/oea/pmap_kernel.c diff -u src/sys/arch/powerpc/oea/pmap_kernel.c:1.12 src/sys/arch/powerpc/oea/pmap_kernel.c:1.13 --- src/sys/arch/powerpc/oea/pmap_kernel.c:1.12 Tue Mar 2 01:47:44 2021 +++ src/sys/arch/powerpc/oea/pmap_kernel.c Wed Feb 16 23:31:13 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: pmap_kernel.c,v 1.12 2021/03/02 01:47:44 thorpej Exp $ */ +/* $NetBSD: pmap_kernel.c,v 1.13 2022/02/16 23:31:13 riastradh Exp $ */ /*- * Copyright (c) 2011 The NetBSD Foundation, Inc. * All rights reserved. @@ -30,7 +30,7 @@ #include <sys/cdefs.h> -__KERNEL_RCSID(1, "$NetBSD: pmap_kernel.c,v 1.12 2021/03/02 01:47:44 thorpej Exp $"); +__KERNEL_RCSID(1, "$NetBSD: pmap_kernel.c,v 1.13 2022/02/16 23:31:13 riastradh Exp $"); #ifdef _KERNEL_OPT #include "opt_altivec.h" @@ -215,6 +215,12 @@ pmap_page_protect(struct vm_page *pg, vm (*pmapops->pmapop_page_protect)(pg, prot); } +void +pmap_pv_protect(paddr_t pa, vm_prot_t prot) +{ + (*pmapops->pmapop_pv_protect)(pa, prot); +} + bool pmap_query_bit(struct vm_page *pg, int ptebit) {