diff options
| -rw-r--r-- | arch/nds32/include/asm/uaccess.h | 80 |
1 files changed, 41 insertions, 39 deletions
diff --git a/arch/nds32/include/asm/uaccess.h b/arch/nds32/include/asm/uaccess.h index e1a2b5b749b9..362a32d9bd16 100644 --- a/arch/nds32/include/asm/uaccess.h +++ b/arch/nds32/include/asm/uaccess.h | |||
| @@ -75,54 +75,54 @@ static inline void set_fs(mm_segment_t fs) | |||
| 75 | * versions are void (ie, don't return a value as such). | 75 | * versions are void (ie, don't return a value as such). |
| 76 | */ | 76 | */ |
| 77 | 77 | ||
| 78 | #define get_user(x, ptr) \ | 78 | #define get_user __get_user \ |
| 79 | ({ \ | ||
| 80 | long __e = -EFAULT; \ | ||
| 81 | const __typeof__(*(ptr)) __user *__p = (ptr); \ | ||
| 82 | if (likely(access_ok(VERIFY_READ, __p, sizeof(*__p)))) { \ | ||
| 83 | __e = __get_user(x, __p); \ | ||
| 84 | } else { \ | ||
| 85 | (x) = 0; \ | ||
| 86 | } \ | ||
| 87 | __e; \ | ||
| 88 | }) | ||
| 89 | 79 | ||
| 90 | #define __get_user(x, ptr) \ | 80 | #define __get_user(x, ptr) \ |
| 91 | ({ \ | 81 | ({ \ |
| 92 | long __gu_err = 0; \ | 82 | long __gu_err = 0; \ |
| 93 | __get_user_err((x), (ptr), __gu_err); \ | 83 | __get_user_check((x), (ptr), __gu_err); \ |
| 94 | __gu_err; \ | 84 | __gu_err; \ |
| 95 | }) | 85 | }) |
| 96 | 86 | ||
| 97 | #define __get_user_error(x, ptr, err) \ | 87 | #define __get_user_error(x, ptr, err) \ |
| 98 | ({ \ | 88 | ({ \ |
| 99 | __get_user_err((x), (ptr), err); \ | 89 | __get_user_check((x), (ptr), (err)); \ |
| 100 | (void)0; \ | 90 | (void)0; \ |
| 101 | }) | 91 | }) |
| 102 | 92 | ||
| 93 | #define __get_user_check(x, ptr, err) \ | ||
| 94 | ({ \ | ||
| 95 | const __typeof__(*(ptr)) __user *__p = (ptr); \ | ||
| 96 | might_fault(); \ | ||
| 97 | if (access_ok(VERIFY_READ, __p, sizeof(*__p))) { \ | ||
| 98 | __get_user_err((x), __p, (err)); \ | ||
| 99 | } else { \ | ||
| 100 | (x) = 0; (err) = -EFAULT; \ | ||
| 101 | } \ | ||
| 102 | }) | ||
| 103 | |||
| 103 | #define __get_user_err(x, ptr, err) \ | 104 | #define __get_user_err(x, ptr, err) \ |
| 104 | do { \ | 105 | do { \ |
| 105 | const __typeof__(*(ptr)) __user *__gu_addr = (ptr); \ | ||
| 106 | unsigned long __gu_val; \ | 106 | unsigned long __gu_val; \ |
| 107 | __chk_user_ptr(__gu_addr); \ | 107 | __chk_user_ptr(ptr); \ |
| 108 | switch (sizeof(*(__gu_addr))) { \ | 108 | switch (sizeof(*(ptr))) { \ |
| 109 | case 1: \ | 109 | case 1: \ |
| 110 | __get_user_asm("lbi", __gu_val, __gu_addr, (err)); \ | 110 | __get_user_asm("lbi", __gu_val, (ptr), (err)); \ |
| 111 | break; \ | 111 | break; \ |
| 112 | case 2: \ | 112 | case 2: \ |
| 113 | __get_user_asm("lhi", __gu_val, __gu_addr, (err)); \ | 113 | __get_user_asm("lhi", __gu_val, (ptr), (err)); \ |
| 114 | break; \ | 114 | break; \ |
| 115 | case 4: \ | 115 | case 4: \ |
| 116 | __get_user_asm("lwi", __gu_val, __gu_addr, (err)); \ | 116 | __get_user_asm("lwi", __gu_val, (ptr), (err)); \ |
| 117 | break; \ | 117 | break; \ |
| 118 | case 8: \ | 118 | case 8: \ |
| 119 | __get_user_asm_dword(__gu_val, __gu_addr, (err)); \ | 119 | __get_user_asm_dword(__gu_val, (ptr), (err)); \ |
| 120 | break; \ | 120 | break; \ |
| 121 | default: \ | 121 | default: \ |
| 122 | BUILD_BUG(); \ | 122 | BUILD_BUG(); \ |
| 123 | break; \ | 123 | break; \ |
| 124 | } \ | 124 | } \ |
| 125 | (x) = (__typeof__(*(__gu_addr)))__gu_val; \ | 125 | (x) = (__force __typeof__(*(ptr)))__gu_val; \ |
| 126 | } while (0) | 126 | } while (0) |
| 127 | 127 | ||
| 128 | #define __get_user_asm(inst, x, addr, err) \ | 128 | #define __get_user_asm(inst, x, addr, err) \ |
| @@ -170,15 +170,7 @@ do { \ | |||
| 170 | : "r"(addr), "i"(-EFAULT) \ | 170 | : "r"(addr), "i"(-EFAULT) \ |
| 171 | : "cc") | 171 | : "cc") |
| 172 | 172 | ||
| 173 | #define put_user(x, ptr) \ | 173 | #define put_user __put_user \ |
| 174 | ({ \ | ||
| 175 | long __e = -EFAULT; \ | ||
| 176 | __typeof__(*(ptr)) __user *__p = (ptr); \ | ||
| 177 | if (likely(access_ok(VERIFY_WRITE, __p, sizeof(*__p)))) { \ | ||
| 178 | __e = __put_user(x, __p); \ | ||
| 179 | } \ | ||
| 180 | __e; \ | ||
| 181 | }) | ||
| 182 | 174 | ||
| 183 | #define __put_user(x, ptr) \ | 175 | #define __put_user(x, ptr) \ |
| 184 | ({ \ | 176 | ({ \ |
| @@ -189,27 +181,37 @@ do { \ | |||
| 189 | 181 | ||
| 190 | #define __put_user_error(x, ptr, err) \ | 182 | #define __put_user_error(x, ptr, err) \ |
| 191 | ({ \ | 183 | ({ \ |
| 192 | __put_user_err((x), (ptr), err); \ | 184 | __put_user_err((x), (ptr), (err)); \ |
| 193 | (void)0; \ | 185 | (void)0; \ |
| 194 | }) | 186 | }) |
| 195 | 187 | ||
| 188 | #define __put_user_check(x, ptr, err) \ | ||
| 189 | ({ \ | ||
| 190 | __typeof__(*(ptr)) __user *__p = (ptr); \ | ||
| 191 | might_fault(); \ | ||
| 192 | if (access_ok(VERIFY_WRITE, __p, sizeof(*__p))) { \ | ||
| 193 | __put_user_err((x), __p, (err)); \ | ||
| 194 | } else { \ | ||
| 195 | (err) = -EFAULT; \ | ||
| 196 | } \ | ||
| 197 | }) | ||
| 198 | |||
| 196 | #define __put_user_err(x, ptr, err) \ | 199 | #define __put_user_err(x, ptr, err) \ |
| 197 | do { \ | 200 | do { \ |
| 198 | __typeof__(*(ptr)) __user *__pu_addr = (ptr); \ | 201 | __typeof__(*(ptr)) __pu_val = (x); \ |
| 199 | __typeof__(*(__pu_addr)) __pu_val = (x); \ | 202 | __chk_user_ptr(ptr); \ |
| 200 | __chk_user_ptr(__pu_addr); \ | 203 | switch (sizeof(*(ptr))) { \ |
| 201 | switch (sizeof(*(__pu_addr))) { \ | ||
| 202 | case 1: \ | 204 | case 1: \ |
| 203 | __put_user_asm("sbi", __pu_val, __pu_addr, (err)); \ | 205 | __put_user_asm("sbi", __pu_val, (ptr), (err)); \ |
| 204 | break; \ | 206 | break; \ |
| 205 | case 2: \ | 207 | case 2: \ |
| 206 | __put_user_asm("shi", __pu_val, __pu_addr, (err)); \ | 208 | __put_user_asm("shi", __pu_val, (ptr), (err)); \ |
| 207 | break; \ | 209 | break; \ |
| 208 | case 4: \ | 210 | case 4: \ |
| 209 | __put_user_asm("swi", __pu_val, __pu_addr, (err)); \ | 211 | __put_user_asm("swi", __pu_val, (ptr), (err)); \ |
| 210 | break; \ | 212 | break; \ |
| 211 | case 8: \ | 213 | case 8: \ |
| 212 | __put_user_asm_dword(__pu_val, __pu_addr, (err)); \ | 214 | __put_user_asm_dword(__pu_val, (ptr), (err)); \ |
| 213 | break; \ | 215 | break; \ |
| 214 | default: \ | 216 | default: \ |
| 215 | BUILD_BUG(); \ | 217 | BUILD_BUG(); \ |
