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

[PATCH] frv: __user infrastructure

Add general annotations to the FRV arch for sparse.

Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Signed-off-by: David Howells <dhowells@redhat.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>

authored by

Al Viro and committed by
Linus Torvalds
a8a77573 86c3a764

+40 -30
+3 -3
arch/frv/kernel/uaccess.c
··· 17 17 /* 18 18 * copy a null terminated string from userspace 19 19 */ 20 - long strncpy_from_user(char *dst, const char *src, long count) 20 + long strncpy_from_user(char *dst, const char __user *src, long count) 21 21 { 22 22 unsigned long max; 23 23 char *p, ch; ··· 70 70 * 71 71 * Return 0 on exception, a value greater than N if too long 72 72 */ 73 - long strnlen_user(const char *src, long count) 73 + long strnlen_user(const char __user *src, long count) 74 74 { 75 - const char *p; 75 + const char __user *p; 76 76 long err = 0; 77 77 char ch; 78 78
+37 -27
include/asm-frv/uaccess.h
··· 22 22 23 23 #define HAVE_ARCH_UNMAPPED_AREA /* we decide where to put mmaps */ 24 24 25 - #define __ptr(x) ((unsigned long *)(x)) 25 + #define __ptr(x) ((unsigned long __force *)(x)) 26 26 27 27 #define VERIFY_READ 0 28 28 #define VERIFY_WRITE 1 ··· 64 64 65 65 #define __range_ok(addr,size) ___range_ok((unsigned long) (addr), (unsigned long) (size)) 66 66 67 - #define access_ok(type,addr,size) (__range_ok((addr), (size)) == 0) 67 + #define access_ok(type,addr,size) (__range_ok((void __user *)(addr), (size)) == 0) 68 68 #define __access_ok(addr,size) (__range_ok((addr), (size)) == 0) 69 69 70 70 /* ··· 97 97 int __pu_err = 0; \ 98 98 \ 99 99 typeof(*(ptr)) __pu_val = (x); \ 100 + __chk_user_ptr(ptr); \ 100 101 \ 101 102 switch (sizeof (*(ptr))) { \ 102 103 case 1: \ ··· 121 120 122 121 #define put_user(x, ptr) \ 123 122 ({ \ 124 - typeof(&*ptr) _p = (ptr); \ 123 + typeof(*(ptr)) __user *_p = (ptr); \ 125 124 int _e; \ 126 125 \ 127 126 _e = __range_ok(_p, sizeof(*_p)); \ ··· 176 175 */ 177 176 #define __get_user(x, ptr) \ 178 177 ({ \ 179 - typeof(*(ptr)) __gu_val = 0; \ 180 178 int __gu_err = 0; \ 179 + __chk_user_ptr(ptr); \ 181 180 \ 182 181 switch (sizeof(*(ptr))) { \ 183 - case 1: \ 184 - __get_user_asm(__gu_err, *(u8*)&__gu_val, ptr, "ub", "=r"); \ 182 + case 1: { \ 183 + unsigned char __gu_val; \ 184 + __get_user_asm(__gu_err, __gu_val, ptr, "ub", "=r"); \ 185 + (x) = *(__force __typeof__(*(ptr)) *) &__gu_val; \ 185 186 break; \ 186 - case 2: \ 187 - __get_user_asm(__gu_err, *(u16*)&__gu_val, ptr, "uh", "=r"); \ 187 + } \ 188 + case 2: { \ 189 + unsigned short __gu_val; \ 190 + __get_user_asm(__gu_err, __gu_val, ptr, "uh", "=r"); \ 191 + (x) = *(__force __typeof__(*(ptr)) *) &__gu_val; \ 188 192 break; \ 189 - case 4: \ 190 - __get_user_asm(__gu_err, *(u32*)&__gu_val, ptr, "", "=r"); \ 193 + } \ 194 + case 4: { \ 195 + unsigned int __gu_val; \ 196 + __get_user_asm(__gu_err, __gu_val, ptr, "", "=r"); \ 197 + (x) = *(__force __typeof__(*(ptr)) *) &__gu_val; \ 191 198 break; \ 192 - case 8: \ 193 - __get_user_asm(__gu_err, *(u64*)&__gu_val, ptr, "d", "=e"); \ 199 + } \ 200 + case 8: { \ 201 + unsigned long long __gu_val; \ 202 + __get_user_asm(__gu_err, __gu_val, ptr, "d", "=e"); \ 203 + (x) = *(__force __typeof__(*(ptr)) *) &__gu_val; \ 194 204 break; \ 205 + } \ 195 206 default: \ 196 207 __gu_err = __get_user_bad(); \ 197 208 break; \ 198 209 } \ 199 - (x) = __gu_val; \ 200 210 __gu_err; \ 201 211 }) 202 212 203 213 #define get_user(x, ptr) \ 204 214 ({ \ 205 - typeof(&*ptr) _p = (ptr); \ 215 + const typeof(*(ptr)) __user *_p = (ptr);\ 206 216 int _e; \ 207 217 \ 208 218 _e = __range_ok(_p, sizeof(*_p)); \ ··· 260 248 /* 261 249 * 262 250 */ 251 + #define ____force(x) (__force void *)(void __user *)(x) 263 252 #ifdef CONFIG_MMU 264 253 extern long __memset_user(void *dst, unsigned long count); 265 254 extern long __memcpy_user(void *dst, const void *src, unsigned long count); 266 255 267 - #define clear_user(dst,count) __memset_user((dst), (count)) 268 - #define __copy_from_user_inatomic(to, from, n) __memcpy_user((to), (from), (n)) 269 - #define __copy_to_user_inatomic(to, from, n) __memcpy_user((to), (from), (n)) 256 + #define clear_user(dst,count) __memset_user(____force(dst), (count)) 257 + #define __copy_from_user_inatomic(to, from, n) __memcpy_user((to), ____force(from), (n)) 258 + #define __copy_to_user_inatomic(to, from, n) __memcpy_user(____force(to), (from), (n)) 270 259 271 260 #else 272 261 273 - #define clear_user(dst,count) (memset((dst), 0, (count)), 0) 274 - #define __copy_from_user_inatomic(to, from, n) (memcpy((to), (from), (n)), 0) 275 - #define __copy_to_user_inatomic(to, from, n) (memcpy((to), (from), (n)), 0) 262 + #define clear_user(dst,count) (memset(____force(dst), 0, (count)), 0) 263 + #define __copy_from_user_inatomic(to, from, n) (memcpy((to), ____force(from), (n)), 0) 264 + #define __copy_to_user_inatomic(to, from, n) (memcpy(____force(to), (from), (n)), 0) 276 265 277 266 #endif 278 267 ··· 291 278 return __copy_from_user_inatomic(to, from, n); 292 279 } 293 280 294 - static inline long copy_from_user(void *to, const void *from, unsigned long n) 281 + static inline long copy_from_user(void *to, const void __user *from, unsigned long n) 295 282 { 296 283 unsigned long ret = n; 297 284 ··· 304 291 return ret; 305 292 } 306 293 307 - static inline long copy_to_user(void *to, const void *from, unsigned long n) 294 + static inline long copy_to_user(void __user *to, const void *from, unsigned long n) 308 295 { 309 296 return likely(__access_ok(to, n)) ? __copy_to_user(to, from, n) : n; 310 297 } 311 298 312 - #define copy_to_user_ret(to,from,n,retval) ({ if (copy_to_user(to,from,n)) return retval; }) 313 - #define copy_from_user_ret(to,from,n,retval) ({ if (copy_from_user(to,from,n)) return retval; }) 314 - 315 - extern long strncpy_from_user(char *dst, const char *src, long count); 316 - extern long strnlen_user(const char *src, long count); 299 + extern long strncpy_from_user(char *dst, const char __user *src, long count); 300 + extern long strnlen_user(const char __user *src, long count); 317 301 318 302 #define strlen_user(str) strnlen_user(str, 32767) 319 303