[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[RFC PATCH v1 8/9] arm64: Add unsafe_copy_from_user()



At the time being, x86 and arm64 are missing unsafe_copy_from_user().

Add it.

Signed-off-by: Christophe Leroy (CS GROUP) <chleroy@xxxxxxxxxx>
---
 arch/arm64/include/asm/uaccess.h | 29 ++++++++++++++++++++++++-----
 1 file changed, 24 insertions(+), 5 deletions(-)

diff --git a/arch/arm64/include/asm/uaccess.h b/arch/arm64/include/asm/uaccess.h
index 1e20ec91b56f..adfdb52cd82b 100644
--- a/arch/arm64/include/asm/uaccess.h
+++ b/arch/arm64/include/asm/uaccess.h
@@ -437,7 +437,7 @@ static inline void user_access_restore(unsigned long 
enabled) { }
  * We want the unsafe accessors to always be inlined and use
  * the error labels - thus the macro games.
  */
-#define unsafe_copy_loop(dst, src, len, type, label)                           
\
+#define unsafe_put_loop(dst, src, len, type, label)                            
\
        while (len >= sizeof(type)) {                                           
\
                unsafe_put_user(*(type *)(src),(type __user *)(dst),label);     
\
                dst += sizeof(type);                                            
\
@@ -450,10 +450,29 @@ do {                                                      
                \
        char __user *__ucu_dst = (_dst);                                \
        const char *__ucu_src = (_src);                                 \
        size_t __ucu_len = (_len);                                      \
-       unsafe_copy_loop(__ucu_dst, __ucu_src, __ucu_len, u64, label);  \
-       unsafe_copy_loop(__ucu_dst, __ucu_src, __ucu_len, u32, label);  \
-       unsafe_copy_loop(__ucu_dst, __ucu_src, __ucu_len, u16, label);  \
-       unsafe_copy_loop(__ucu_dst, __ucu_src, __ucu_len, u8, label);   \
+       unsafe_put_loop(__ucu_dst, __ucu_src, __ucu_len, u64, label);   \
+       unsafe_put_loop(__ucu_dst, __ucu_src, __ucu_len, u32, label);   \
+       unsafe_put_loop(__ucu_dst, __ucu_src, __ucu_len, u16, label);   \
+       unsafe_put_loop(__ucu_dst, __ucu_src, __ucu_len, u8, label);    \
+} while (0)
+
+#define unsafe_get_loop(dst, src, len, type, label)                            
\
+       while (len >= sizeof(type)) {                                           
\
+               unsafe_get_user(*(type __user *)(src),(type *)(dst),label);     
\
+               dst += sizeof(type);                                            
\
+               src += sizeof(type);                                            
\
+               len -= sizeof(type);                                            
\
+       }
+
+#define unsafe_copy_from_user(_dst,_src,_len,label)                    \
+do {                                                                   \
+       char *__ucu_dst = (_dst);                                       \
+       const char __user *__ucu_src = (_src);                          \
+       size_t __ucu_len = (_len);                                      \
+       unsafe_get_loop(__ucu_dst, __ucu_src, __ucu_len, u64, label);   \
+       unsafe_get_loop(__ucu_dst, __ucu_src, __ucu_len, u32, label);   \
+       unsafe_get_loop(__ucu_dst, __ucu_src, __ucu_len, u16, label);   \
+       unsafe_get_loop(__ucu_dst, __ucu_src, __ucu_len, u8, label);    \
 } while (0)
 
 extern unsigned long __must_check __arch_clear_user(void __user *to, unsigned 
long n);
-- 
2.49.0




 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.