Implement unsafe_clear_user() for powerpc.
It's a copy/paste of unsafe_copy_to_user() with value 0 as source.

It may be improved in a later patch by using 'dcbz' instruction
to zeroize full cache lines at once.

Signed-off-by: Christophe Leroy <christophe.le...@csgroup.eu>
---
 arch/powerpc/include/asm/uaccess.h | 20 ++++++++++++++++++++
 1 file changed, 20 insertions(+)

diff --git a/arch/powerpc/include/asm/uaccess.h 
b/arch/powerpc/include/asm/uaccess.h
index 22c79ab40006..962b675485ff 100644
--- a/arch/powerpc/include/asm/uaccess.h
+++ b/arch/powerpc/include/asm/uaccess.h
@@ -467,6 +467,26 @@ do {                                                       
                \
                unsafe_put_user(*(u8*)(_src + _i), (u8 __user *)(_dst + _i), 
e); \
 } while (0)
 
+#define unsafe_clear_user(d, l, e)                                     \
+do {                                                                   \
+       u8 __user *_dst = (u8 __user *)(d);                             \
+       size_t _len = (l);                                              \
+       int _i;                                                         \
+                                                                       \
+       for (_i = 0; _i < (_len & ~(sizeof(u64) - 1)); _i += sizeof(u64)) \
+               unsafe_put_user(0, (u64 __user *)(_dst + _i), e);       \
+       if (_len & 4) {                                                 \
+               unsafe_put_user(0, (u32 __user *)(_dst + _i), e);       \
+               _i += 4;                                                \
+       }                                                               \
+       if (_len & 2) {                                                 \
+               unsafe_put_user(0, (u16 __user *)(_dst + _i), e);       \
+               _i += 2;                                                \
+       }                                                               \
+       if (_len & 1)                                                   \
+               unsafe_put_user(0, (u8 __user *)(_dst + _i), e);        \
+} while (0)
+
 #define HAVE_GET_KERNEL_NOFAULT
 
 #define __get_kernel_nofault(dst, src, type, err_label)                        
\
-- 
2.25.0

Reply via email to