Hi,

I'm very much wondering if this feature is worth maintaining. Is it so useful 
that it's worth the considerable additional complexity for keeping the caches 
coherent? Flushing the caches is a very invasive action by a debugger and will 
considerably change the context under debug. If there isn't a compelling 
argument to keep it I'm much more in favor of removing it completely instead 
of trying fixing it.

BR.
Matthias

On Mittwoch, 1. August 2018 15:01:31 CEST gerrit wrote:
> This is an automated email from Gerrit.
> 
> Antonio Borneo (borneo.anto...@gmail.com) just uploaded a new patch set to
> Gerrit, which you can find at http://openocd.zylin.com/4625
> 
> -- gerrit
> 
> commit 8d73f142311fbf8c1d4624eafb93299a8061ddb4
> Author: Antonio Borneo <borneo.anto...@gmail.com>
> Date:   Thu Jul 26 17:53:25 2018 +0200
> 
>     target/cortex_a: fix cache coherency with AHB read/write
> 
>     Some device uses AXI Coherency Extensions (ACE) to implement in HW
>     the coherency between the data caches of the cores and the memory
>     accesses through the DAP AHB/AXI port.
>     Unfortunately this setup is not common yet. For all the other
>     devices, it is important to guarantee the data cache coherency by
>     proper flush and invalidate SW calls.
>     In any case, the instruction cache has to be invalidated by SW,
>     also when ACE is available.
> 
>     Add instruction cache invalidate during AHB write and optional
>     (through auto_cache_enable) flush/invalidate of data cache during
>     AHB read/write.
> 
>     Change-Id: I18678d0495486a3cfae9454432e837b3eac6e64d
>     Signed-off-by: Antonio Borneo <borneo.anto...@gmail.com>
> 
> diff --git a/src/target/cortex_a.c b/src/target/cortex_a.c
> index bc4aa33..409da15 100644
> --- a/src/target/cortex_a.c
> +++ b/src/target/cortex_a.c
> @@ -2749,6 +2749,10 @@ static int cortex_a_read_memory_ahb(struct target
> *target, target_addr_t address LOG_DEBUG("Reading memory at address "
> TARGET_ADDR_FMT "; size %" PRId32 "; count %" PRId32, address, size,
> count);
> 
> +     /* flush the data cache */
> +     if (armv7a->armv7a_mmu.armv7a_cache.auto_cache_enabled)
> +             armv7a_l1_d_cache_clean_virt(target, address, size * count);
> +
>       /* determine if MMU was enabled on target stop */
>       if (!armv7a->is_armv7r) {
>               retval = cortex_a_mmu(target, &mmu_enabled);
> @@ -2837,6 +2841,12 @@ static int cortex_a_write_memory_ahb(struct target
> *target, target_addr_t addres LOG_DEBUG("Writing memory at address "
> TARGET_ADDR_FMT "; size %" PRId32 "; count %" PRId32, address, size,
> count);
> 
> +     /* flush and invalidate the data cache */
> +     if (armv7a->armv7a_mmu.armv7a_cache.auto_cache_enabled)
> +             armv7a_cache_flush_virt(target, address, size * count);
> +     /* invalidate instruction cache */
> +     armv7a_l1_i_cache_inval_virt(target, address, size * count);
> +
>       /* determine if MMU was enabled on target stop */
>       if (!armv7a->is_armv7r) {
>               retval = cortex_a_mmu(target, &mmu_enabled);



------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot
_______________________________________________
OpenOCD-devel mailing list
OpenOCD-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/openocd-devel

Reply via email to