Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

[POWERPC] Add inatomic versions of __get_user and __put_user

Those are needed by things like alignment exception fixup handlers
since those can now be triggered by copy_tofrom_user_inatomic.

Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Signed-off-by: Paul Mackerras <paulus@samba.org>

authored by

Benjamin Herrenschmidt and committed by
Paul Mackerras
e68c825b 06533e28

+28
+28
include/asm-powerpc/uaccess.h
··· 110 110 __get_user_nocheck((x), (ptr), sizeof(*(ptr))) 111 111 #define __put_user(x, ptr) \ 112 112 __put_user_nocheck((__typeof__(*(ptr)))(x), (ptr), sizeof(*(ptr))) 113 + 113 114 #ifndef __powerpc64__ 114 115 #define __get_user64(x, ptr) \ 115 116 __get_user64_nocheck((x), (ptr), sizeof(*(ptr))) 116 117 #define __put_user64(x, ptr) __put_user(x, ptr) 117 118 #endif 119 + 120 + #define __get_user_inatomic(x, ptr) \ 121 + __get_user_nosleep((x), (ptr), sizeof(*(ptr))) 122 + #define __put_user_inatomic(x, ptr) \ 123 + __put_user_nosleep((__typeof__(*(ptr)))(x), (ptr), sizeof(*(ptr))) 118 124 119 125 #define __get_user_unaligned __get_user 120 126 #define __put_user_unaligned __put_user ··· 203 197 __put_user_size((x), __pu_addr, (size), __pu_err); \ 204 198 __pu_err; \ 205 199 }) 200 + 201 + #define __put_user_nosleep(x, ptr, size) \ 202 + ({ \ 203 + long __pu_err; \ 204 + __typeof__(*(ptr)) __user *__pu_addr = (ptr); \ 205 + __chk_user_ptr(ptr); \ 206 + __put_user_size((x), __pu_addr, (size), __pu_err); \ 207 + __pu_err; \ 208 + }) 209 + 206 210 207 211 extern long __get_user_bad(void); 208 212 ··· 312 296 (x) = (__typeof__(*(ptr)))__gu_val; \ 313 297 __gu_err; \ 314 298 }) 299 + 300 + #define __get_user_nosleep(x, ptr, size) \ 301 + ({ \ 302 + long __gu_err; \ 303 + unsigned long __gu_val; \ 304 + const __typeof__(*(ptr)) __user *__gu_addr = (ptr); \ 305 + __chk_user_ptr(ptr); \ 306 + __get_user_size(__gu_val, __gu_addr, (size), __gu_err); \ 307 + (x) = (__typeof__(*(ptr)))__gu_val; \ 308 + __gu_err; \ 309 + }) 310 + 315 311 316 312 /* more complex routines */ 317 313