svn commit: r193712 - head/sys/arm/arm

Stanislav Sedov stas at FreeBSD.org
Mon Jun 8 12:56:54 UTC 2009


On Mon, 8 Jun 2009 12:15:39 +0000 (UTC)
Rafal Jaworowski <raj at FreeBSD.org> mentioned:

> 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);
> +		}
> +

Hi, Rafal!

What about calling the pmap_dcache_wb_range function for each mapping in
the cycle instead of calling cpu_XXX_inv_range functions directly?  I think
something like this would do the trick:
% pmap_dcache_wb_range(pv->pv_pmap, pv->pv_va, PAGE_SIZE, FALSE,
%     (pv->pv_flags & PVF_WRITE) == 0)

This will also take care of the writeback cache.  I don't know if it is really
needed, though.

-- 
Stanislav Sedov
ST4096-RIPE
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 801 bytes
Desc: not available
Url : http://lists.freebsd.org/pipermail/svn-src-all/attachments/20090608/4346370b/attachment.pgp


More information about the svn-src-all mailing list