
On Mon, Apr 04, 2016 at 08:31:48PM +0200, Hans de Goede wrote:
v7_maint_dcache_all() does not work reliable when build with gcc6, see: https://bugzilla.redhat.com/show_bug.cgi?id=1318788
While debugging this I learned that v7_maint_dcache_all() is unreliable when build with gcc5 too when it is marked as noinline.
This commit fixes the reliability issues by replacing the C-code with the ready to use asm implementation from the kernel.
Given that this code when written as C-code clearly is quite fragile (also see the existing comments about the C-code being the way it is to get optimal assembly) and that we have a proven asm alternative, I believe that this is the best solution.
Note that we actually already have a copy of the kernel's v7_flush_dcache_all() in arch/arm/mach-uniphier/arm32/lowlevel_init.S.
We should replace that implementation with a call to this one, but I'm leaving this up to people with access to actual unifier hw. With this replacement in mind I've kept the original function as is, only renamed it to __v7_flush_dcache_all and v7_flush_dcache_all is a wrapper saving the registered clobbered by the core __v7_flush_dcache_all code
Signed-off-by: Hans de Goede hdegoede@redhat.com
So I was able to talk with a few people and this is the right approach. The cache routines we're doing here in C must not in fact be done in C. That things work today with some compilers is not by design. This is at least a minimally correct thing to do and a more correct thing to do would be to leverage more of the code from the kernel for cache functions (and not just for v7).