Date: Mon, 8 Jun 2009 12:15:39 +0000 (UTC) From: Rafal Jaworowski <raj@FreeBSD.org> To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r193712 - head/sys/arm/arm Message-ID: <200906081215.n58CFdOl029049@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: raj Date: Mon Jun 8 12:15:39 2009 New Revision: 193712 URL: http://svn.freebsd.org/changeset/base/193712 Log: Invalidate cache in pmap_remove_all() on ARM. When pages are removed from virtual address space by calling pmap_remove_all() CPU caches were not invalidated, which led to read corruption when another page got mapped at this same virtual address at later time (the CPU was retrieving stale contents). Submitted by: Piotr Ziecik Obtained from: Semihalf Modified: head/sys/arm/arm/pmap.c Modified: head/sys/arm/arm/pmap.c ============================================================================== --- head/sys/arm/arm/pmap.c Mon Jun 8 12:10:42 2009 (r193711) +++ head/sys/arm/arm/pmap.c Mon Jun 8 12:15:39 2009 (r193712) @@ -3124,7 +3124,19 @@ pmap_remove_all(vm_page_t m) if (flush == FALSE && (pv->pv_pmap == curpm || pv->pv_pmap == pmap_kernel())) flush = TRUE; + PMAP_LOCK(pv->pv_pmap); + /* + * Cached contents were written-back in pmap_remove_write(), + * but we still have to invalidate the cache entry to make + * sure stale data are not retrieved when another page will be + * mapped under this virtual address. + */ + if (pmap_is_current(pv->pv_pmap)) { + cpu_dcache_inv_range(pv->pv_va, PAGE_SIZE); + cpu_l2cache_inv_range(pv->pv_va, PAGE_SIZE); + } + l2b = pmap_get_l2_bucket(pv->pv_pmap, pv->pv_va); KASSERT(l2b != NULL, ("No l2 bucket")); ptep = &l2b->l2b_kva[l2pte_index(pv->pv_va)];
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200906081215.n58CFdOl029049>