>From 3d7f79f7601c312d47245141185bea7defffffa4 Mon Sep 17 00:00:00 2001 From: Nathan Chancellor Date: Sat, 20 Jul 2019 23:37:55 -0700 Subject: [PATCH] powerpc: Test broken dcbz Signed-off-by: Nathan Chancellor --- arch/powerpc/include/asm/cache.h | 2 +- arch/powerpc/include/asm/page_32.h | 13 +++++++++++++ arch/powerpc/mm/mem.c | 2 +- 3 files changed, 15 insertions(+), 2 deletions(-) diff --git a/arch/powerpc/include/asm/cache.h b/arch/powerpc/include/asm/cache.h index b3388d95f451..ba76291b4d4d 100644 --- a/arch/powerpc/include/asm/cache.h +++ b/arch/powerpc/include/asm/cache.h @@ -107,7 +107,7 @@ extern void _set_L3CR(unsigned long); static inline void dcbz(void *addr) { - __asm__ __volatile__ ("dcbz %y0" : : "Z"(*(u8 *)addr) : "memory"); + __asm__ __volatile__ ("dcbz 0, %0" : : "r"(addr) : "memory"); } static inline void dcbi(void *addr) diff --git a/arch/powerpc/include/asm/page_32.h b/arch/powerpc/include/asm/page_32.h index 683dfbc67ca8..125c2ba7cd79 100644 --- a/arch/powerpc/include/asm/page_32.h +++ b/arch/powerpc/include/asm/page_32.h @@ -40,6 +40,19 @@ typedef unsigned long long pte_basic_t; typedef unsigned long pte_basic_t; #endif +static inline void broken_dcbz(void *addr) +{ + __asm__ __volatile__ ("dcbz %y0" : : "Z"(*(u8 *)addr) : "memory"); +} + +static inline void broken_clear_page(void *addr) +{ + unsigned int i; + + for (i = 0; i < PAGE_SIZE / L1_CACHE_BYTES; i++, addr += L1_CACHE_BYTES) + broken_dcbz(addr); +} + /* * Clear page using the dcbz instruction, which doesn't cause any * memory traffic (except to write out any cache lines which get diff --git a/arch/powerpc/mm/mem.c b/arch/powerpc/mm/mem.c index 9259337d7374..7bb88e7a2e4c 100644 --- a/arch/powerpc/mm/mem.c +++ b/arch/powerpc/mm/mem.c @@ -361,7 +361,7 @@ EXPORT_SYMBOL(flush_dcache_icache_page); void clear_user_page(void *page, unsigned long vaddr, struct page *pg) { - clear_page(page); + broken_clear_page(page); /* * We shouldn't have to do this, but some versions of glibc -- 2.22.0