Module Name: src Committed By: martin Date: Fri Jan 1 12:54:08 UTC 2021
Modified Files: src/sys/arch/aarch64/aarch64 [netbsd-9]: pmap.c Log Message: Pull up following revision(s) (requested by rin in ticket #1171): sys/arch/aarch64/aarch64/pmap.c: revision 1.82 sys/arch/aarch64/aarch64/pmap.c: revision 1.83 pmap_procwr(): sync icache even if p != curproc. This fixes applications like GDB for arm32, that rewrite text of other process. Thanks to ryo@ for discussion. Use tlen for temporary length variable instead of l, which is usually used for struct lwp *. No binary changes. To generate a diff of this commit: cvs rdiff -u -r1.41.2.7 -r1.41.2.8 src/sys/arch/aarch64/aarch64/pmap.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/aarch64/aarch64/pmap.c diff -u src/sys/arch/aarch64/aarch64/pmap.c:1.41.2.7 src/sys/arch/aarch64/aarch64/pmap.c:1.41.2.8 --- src/sys/arch/aarch64/aarch64/pmap.c:1.41.2.7 Fri Jan 1 12:38:49 2021 +++ src/sys/arch/aarch64/aarch64/pmap.c Fri Jan 1 12:54:07 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: pmap.c,v 1.41.2.7 2021/01/01 12:38:49 martin Exp $ */ +/* $NetBSD: pmap.c,v 1.41.2.8 2021/01/01 12:54:07 martin Exp $ */ /* * Copyright (c) 2017 Ryo Shimizu <r...@nerv.org> @@ -27,7 +27,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.41.2.7 2021/01/01 12:38:49 martin Exp $"); +__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.41.2.8 2021/01/01 12:54:07 martin Exp $"); #include "opt_arm_debug.h" #include "opt_ddb.h" @@ -879,12 +879,26 @@ pmap_icache_sync_range(pmap_t pm, vaddr_ * */ void -pmap_procwr(struct proc *p, vaddr_t va, int len) +pmap_procwr(struct proc *p, vaddr_t sva, int len) { - /* We only need to do anything if it is the current process. */ - if (p == curproc) - cpu_icache_sync_range(va, len); + if (__predict_true(p == curproc)) + cpu_icache_sync_range(sva, len); + else { + struct pmap *pm = p->p_vmspace->vm_map.pmap; + paddr_t pa; + vaddr_t va, eva; + int tlen; + + for (va = sva; len > 0; va = eva, len -= tlen) { + eva = uimin(va + len, trunc_page(va + PAGE_SIZE)); + tlen = eva - va; + if (!pmap_extract(pm, va, &pa)) + continue; + va = AARCH64_PA_TO_KVA(pa); + cpu_icache_sync_range(va, tlen); + } + } } static pt_entry_t