diff options
| -rw-r--r-- | arch/microblaze/include/asm/uaccess.h | 87 |
1 files changed, 69 insertions, 18 deletions
diff --git a/arch/microblaze/include/asm/uaccess.h b/arch/microblaze/include/asm/uaccess.h index 446bec29b142..26460d15b338 100644 --- a/arch/microblaze/include/asm/uaccess.h +++ b/arch/microblaze/include/asm/uaccess.h | |||
| @@ -182,6 +182,39 @@ extern long __user_bad(void); | |||
| 182 | * Returns zero on success, or -EFAULT on error. | 182 | * Returns zero on success, or -EFAULT on error. |
| 183 | * On error, the variable @x is set to zero. | 183 | * On error, the variable @x is set to zero. |
| 184 | */ | 184 | */ |
| 185 | #define get_user(x, ptr) \ | ||
| 186 | __get_user_check((x), (ptr), sizeof(*(ptr))) | ||
| 187 | |||
| 188 | #define __get_user_check(x, ptr, size) \ | ||
| 189 | ({ \ | ||
| 190 | unsigned long __gu_val = 0; \ | ||
| 191 | const typeof(*(ptr)) __user *__gu_addr = (ptr); \ | ||
| 192 | int __gu_err = 0; \ | ||
| 193 | \ | ||
| 194 | if (access_ok(VERIFY_READ, __gu_addr, size)) { \ | ||
| 195 | switch (size) { \ | ||
| 196 | case 1: \ | ||
| 197 | __get_user_asm("lbu", __gu_addr, __gu_val, \ | ||
| 198 | __gu_err); \ | ||
| 199 | break; \ | ||
| 200 | case 2: \ | ||
| 201 | __get_user_asm("lhu", __gu_addr, __gu_val, \ | ||
| 202 | __gu_err); \ | ||
| 203 | break; \ | ||
| 204 | case 4: \ | ||
| 205 | __get_user_asm("lw", __gu_addr, __gu_val, \ | ||
| 206 | __gu_err); \ | ||
| 207 | break; \ | ||
| 208 | default: \ | ||
| 209 | __gu_err = __user_bad(); \ | ||
| 210 | break; \ | ||
| 211 | } \ | ||
| 212 | } else { \ | ||
| 213 | __gu_err = -EFAULT; \ | ||
| 214 | } \ | ||
| 215 | x = (typeof(*(ptr)))__gu_val; \ | ||
| 216 | __gu_err; \ | ||
| 217 | }) | ||
| 185 | 218 | ||
| 186 | #define __get_user(x, ptr) \ | 219 | #define __get_user(x, ptr) \ |
| 187 | ({ \ | 220 | ({ \ |
| @@ -206,12 +239,6 @@ extern long __user_bad(void); | |||
| 206 | }) | 239 | }) |
| 207 | 240 | ||
| 208 | 241 | ||
| 209 | #define get_user(x, ptr) \ | ||
| 210 | ({ \ | ||
| 211 | access_ok(VERIFY_READ, (ptr), sizeof(*(ptr))) \ | ||
| 212 | ? __get_user((x), (ptr)) : -EFAULT; \ | ||
| 213 | }) | ||
| 214 | |||
| 215 | #define __put_user_asm(insn, __gu_ptr, __gu_val, __gu_err) \ | 242 | #define __put_user_asm(insn, __gu_ptr, __gu_val, __gu_err) \ |
| 216 | ({ \ | 243 | ({ \ |
| 217 | __asm__ __volatile__ ( \ | 244 | __asm__ __volatile__ ( \ |
| @@ -266,6 +293,42 @@ extern long __user_bad(void); | |||
| 266 | * | 293 | * |
| 267 | * Returns zero on success, or -EFAULT on error. | 294 | * Returns zero on success, or -EFAULT on error. |
| 268 | */ | 295 | */ |
| 296 | #define put_user(x, ptr) \ | ||
| 297 | __put_user_check((x), (ptr), sizeof(*(ptr))) | ||
| 298 | |||
| 299 | #define __put_user_check(x, ptr, size) \ | ||
| 300 | ({ \ | ||
| 301 | typeof(*(ptr)) __pu_val; \ | ||
| 302 | typeof(*(ptr)) __user *__pu_addr = (ptr); \ | ||
| 303 | int __pu_err = 0; \ | ||
| 304 | \ | ||
| 305 | __pu_val = (x); \ | ||
| 306 | if (access_ok(VERIFY_WRITE, __pu_addr, size)) { \ | ||
| 307 | switch (size) { \ | ||
| 308 | case 1: \ | ||
| 309 | __put_user_asm("sb", __pu_addr, __pu_val, \ | ||
| 310 | __pu_err); \ | ||
| 311 | break; \ | ||
| 312 | case 2: \ | ||
| 313 | __put_user_asm("sh", __pu_addr, __pu_val, \ | ||
| 314 | __pu_err); \ | ||
| 315 | break; \ | ||
| 316 | case 4: \ | ||
| 317 | __put_user_asm("sw", __pu_addr, __pu_val, \ | ||
| 318 | __pu_err); \ | ||
| 319 | break; \ | ||
| 320 | case 8: \ | ||
| 321 | __put_user_asm_8(__pu_addr, __pu_val, __pu_err);\ | ||
| 322 | break; \ | ||
| 323 | default: \ | ||
| 324 | __pu_err = __user_bad(); \ | ||
| 325 | break; \ | ||
| 326 | } \ | ||
| 327 | } else { \ | ||
| 328 | __pu_err = -EFAULT; \ | ||
| 329 | } \ | ||
| 330 | __pu_err; \ | ||
| 331 | }) | ||
| 269 | 332 | ||
| 270 | #define __put_user(x, ptr) \ | 333 | #define __put_user(x, ptr) \ |
| 271 | ({ \ | 334 | ({ \ |
| @@ -290,18 +353,6 @@ extern long __user_bad(void); | |||
| 290 | __gu_err; \ | 353 | __gu_err; \ |
| 291 | }) | 354 | }) |
| 292 | 355 | ||
| 293 | #ifndef CONFIG_MMU | ||
| 294 | |||
| 295 | #define put_user(x, ptr) __put_user((x), (ptr)) | ||
| 296 | |||
| 297 | #else /* CONFIG_MMU */ | ||
| 298 | |||
| 299 | #define put_user(x, ptr) \ | ||
| 300 | ({ \ | ||
| 301 | access_ok(VERIFY_WRITE, (ptr), sizeof(*(ptr))) \ | ||
| 302 | ? __put_user((x), (ptr)) : -EFAULT; \ | ||
| 303 | }) | ||
| 304 | #endif /* CONFIG_MMU */ | ||
| 305 | 356 | ||
| 306 | /* copy_to_from_user */ | 357 | /* copy_to_from_user */ |
| 307 | #define __copy_from_user(to, from, n) \ | 358 | #define __copy_from_user(to, from, n) \ |
