diff options
Diffstat (limited to 'include/asm-mips/uaccess.h')
-rw-r--r-- | include/asm-mips/uaccess.h | 10 |
1 files changed, 8 insertions, 2 deletions
diff --git a/include/asm-mips/uaccess.h b/include/asm-mips/uaccess.h index 825fcbd9eabd..3eff8d8fe28a 100644 --- a/include/asm-mips/uaccess.h +++ b/include/asm-mips/uaccess.h | |||
@@ -265,10 +265,14 @@ do { \ | |||
265 | */ | 265 | */ |
266 | #define __get_user_asm_ll32(val, addr) \ | 266 | #define __get_user_asm_ll32(val, addr) \ |
267 | { \ | 267 | { \ |
268 | union { \ | ||
269 | unsigned long long l; \ | ||
270 | __typeof__(*(addr)) t; \ | ||
271 | } __gu_tmp; \ | ||
272 | \ | ||
268 | __asm__ __volatile__( \ | 273 | __asm__ __volatile__( \ |
269 | "1: lw %1, (%3) \n" \ | 274 | "1: lw %1, (%3) \n" \ |
270 | "2: lw %D1, 4(%3) \n" \ | 275 | "2: lw %D1, 4(%3) \n" \ |
271 | " move %0, $0 \n" \ | ||
272 | "3: .section .fixup,\"ax\" \n" \ | 276 | "3: .section .fixup,\"ax\" \n" \ |
273 | "4: li %0, %4 \n" \ | 277 | "4: li %0, %4 \n" \ |
274 | " move %1, $0 \n" \ | 278 | " move %1, $0 \n" \ |
@@ -279,8 +283,10 @@ do { \ | |||
279 | " " __UA_ADDR " 1b, 4b \n" \ | 283 | " " __UA_ADDR " 1b, 4b \n" \ |
280 | " " __UA_ADDR " 2b, 4b \n" \ | 284 | " " __UA_ADDR " 2b, 4b \n" \ |
281 | " .previous \n" \ | 285 | " .previous \n" \ |
282 | : "=r" (__gu_err), "=&r" (val) \ | 286 | : "=r" (__gu_err), "=&r" (__gu_tmp.l) \ |
283 | : "0" (0), "r" (addr), "i" (-EFAULT)); \ | 287 | : "0" (0), "r" (addr), "i" (-EFAULT)); \ |
288 | \ | ||
289 | (val) = __gu_tmp.t; \ | ||
284 | } | 290 | } |
285 | 291 | ||
286 | /* | 292 | /* |