diff options
author | Ralf Baechle <ralf@linux-mips.org> | 1997-07-01 08:43:49 +0000 |
---|---|---|
committer | Ralf Baechle <ralf@linux-mips.org> | 1997-07-01 08:43:49 +0000 |
commit | cc32ff645cc4c7a2fb88c11bdb35604e279df04b (patch) | |
tree | d38adf4503a62cd32fbd4b50e78abe9ddb2b8b2e /include | |
parent | ccc82a1e267548fd4d7281788c63628c4c84600d (diff) |
More bugfixes and some cleanup.
Diffstat (limited to 'include')
-rw-r--r-- | include/asm-mips/uaccess.h | 185 |
1 files changed, 43 insertions, 142 deletions
diff --git a/include/asm-mips/uaccess.h b/include/asm-mips/uaccess.h index d0afc5b3d..608d86834 100644 --- a/include/asm-mips/uaccess.h +++ b/include/asm-mips/uaccess.h @@ -7,7 +7,7 @@ * * Copyright (C) 1996, 1997 by Ralf Baechle * - * $Id: uaccess.h,v 1.2 1997/06/25 14:27:16 ralf Exp $ + * $Id: uaccess.h,v 1.2 1997/06/25 20:18:19 ralf Exp $ */ #ifndef __ASM_MIPS_UACCESS_H #define __ASM_MIPS_UACCESS_H @@ -131,9 +131,9 @@ extern size_t __copy_user(void *__to, const void *__from, size_t __n); * for 32 bit mode and old iron. */ #ifdef __mips64 -#define __GET_USER_NOCHECK_DW __get_user_nocheck_asm("ld") +#define __GET_USER_DW __get_user_asm("ld") #else -#define __GET_USER_NOCHECK_DW __get_user_nocheck_asm_ll32 +#define __GET_USER_DW __get_user_asm_ll32 #endif #define __get_user_nocheck(x,ptr,size) ({ \ @@ -142,85 +142,32 @@ __typeof(*(ptr)) __gu_val; \ long __gu_addr; \ __asm__("":"=r" (__gu_val)); \ __gu_addr = (long) (ptr); \ -__gu_err = 0; \ +__asm__("":"=r" (__gu_err)); \ switch (size) { \ -case 1: __get_user_nocheck_asm("lb"); break; \ -case 2: __get_user_nocheck_asm("lh"); break; \ -case 4: __get_user_nocheck_asm("lw"); break; \ -case 8: __GET_USER_NOCHECK_DW; break; \ +case 1: __get_user_asm("lb"); break; \ +case 2: __get_user_asm("lh"); break; \ +case 4: __get_user_asm("lw"); break; \ +case 8: __GET_USER_DW; break; \ default: __get_user_unknown(); break; \ } x = (__typeof__(*(ptr))) __gu_val; __gu_err; }) -#define __get_user_nocheck_asm(insn) \ -({ \ -__asm__ __volatile__( \ - "1:\t" insn "\t%1,%3\n" \ - "2:\n\t" \ - ".section\t.fixup,\"ax\"\n" \ - "3:\t.set\tnoat\n\t" \ - "la\t$1,2b\n\t" \ - "li\t%0,%4\n\t" \ - "jr\t$1\n\t" \ - ".set\tat\n\t" \ - ".previous\n\t" \ - ".section\t__ex_table,\"a\"\n\t" \ - STR(PTR)"\t1b,3b\n\t" \ - ".previous" \ - :"=r" (__gu_err), "=r" (__gu_val) \ - :"0" (__gu_err), "o" (__m(__gu_addr)), "i" (-EFAULT) \ - :"$1"); }) - -/* - * Get a long long 64 using 32 bit registers. - */ -#define __get_user_nocheck_asm_ll32 \ -({ \ -__asm__ __volatile__( \ - "1:\tlw\t%1,%3\n" \ - "2:\tlw\t%D1,%4\n" \ - "3:\t.section\t.fixup,\"ax\"\n" \ - "4:\t.set\tnoat\n\t" \ - "la\t$1,3b\n\t" \ - "li\t%0,%5\n\t" \ - "jr\t$1\n\t" \ - ".set\tat\n\t" \ - ".previous\n\t" \ - ".section\t__ex_table,\"a\"\n\t" \ - STR(PTR)"\t1b,4b\n\t" \ - STR(PTR)"\t2b,4b\n\t" \ - ".previous" \ - :"=r" (__gu_err), "=r" (__gu_val) \ - :"0" (__gu_err), "o" (__m(__gu_addr)), "o" (__m(__gu_addr + 4)), \ - "i" (-EFAULT) \ - :"$1"); }) - -/* - * Yuck. We need two variants, one for 64bit operation and one - * for 32 bit mode and old iron. - */ -#ifdef __mips64 -#define __GET_USER_CHECK_DW __get_user_check_asm("ld") -#else -#define __GET_USER_CHECK_DW __get_user_check_asm_ll32 -#endif - #define __get_user_check(x,ptr,size,mask) ({ \ long __gu_err; \ __typeof__(*(ptr)) __gu_val; \ long __gu_addr; \ __asm__("":"=r" (__gu_val)); \ __gu_addr = (long) (ptr); \ -__gu_err = -EFAULT; \ +__asm__("":"=r" (__gu_err)); \ if (__access_ok(__gu_addr,size,mask)) { \ switch (size) { \ -case 1: __get_user_check_asm("lb"); break; \ -case 2: __get_user_check_asm("lh"); break; \ -case 4: __get_user_check_asm("lw"); break; \ -case 8: __GET_USER_CHECK_DW; break; \ +case 1: __get_user_asm("lb"); break; \ +case 2: __get_user_asm("lh"); break; \ +case 4: __get_user_asm("lw"); break; \ +case 8: __GET_USER_DW; break; \ default: __get_user_unknown(); break; \ } } x = (__typeof__(*(ptr))) __gu_val; __gu_err; }) -#define __get_user_check_asm(insn) \ +#define __get_user_asm(insn) \ ({ \ __asm__ __volatile__( \ "1:\t" insn "\t%1,%2\n\t" \ @@ -229,6 +176,7 @@ __asm__ __volatile__( \ ".section\t.fixup,\"ax\"\n" \ "3:\t.set\tnoat\n\t" \ "la\t$1,2b\n\t" \ + "li\t%0,%3\n\t" \ "jr\t$1\n\t" \ ".set\tat\n\t" \ ".previous\n\t" \ @@ -236,22 +184,22 @@ __asm__ __volatile__( \ STR(PTR)"\t1b,3b\n\t" \ ".previous" \ :"=r" (__gu_err), "=r" (__gu_val) \ - :"o" (__m(__gu_addr)) \ + :"o" (__m(__gu_addr)), "i" (-EFAULT) \ :"$1"); }) /* * Get a long long 64 using 32 bit registers. */ -#define __get_user_check_asm_ll32 \ +#define __get_user_asm_ll32 \ ({ \ __asm__ __volatile__( \ "1:\tlw\t%1,%2\n" \ "2:\tlw\t%D1,%3\n\t" \ "move\t%0,$0\n" \ - "3:\n\t" \ - ".section\t.fixup,\"ax\"\n" \ + "3:\t.section\t.fixup,\"ax\"\n" \ "4:\t.set\tnoat\n\t" \ "la\t$1,3b\n\t" \ + "li\t%0,%4\n\t" \ "jr\t$1\n\t" \ ".set\tat\n\t" \ ".previous\n\t" \ @@ -259,8 +207,9 @@ __asm__ __volatile__( \ STR(PTR)"\t1b,4b\n\t" \ STR(PTR)"\t2b,4b\n\t" \ ".previous" \ - :"=r" (__gu_err), "=r" (__gu_val) \ - :"o" (__m(__gu_addr)),"o"(__m(__gu_addr + 4)) \ + :"=r" (__gu_err), "=&r" (__gu_val) \ + :"o" (__m(__gu_addr)), "o" (__m(__gu_addr + 4)), \ + "i" (-EFAULT) \ :"$1"); }) extern void __get_user_unknown(void); @@ -270,9 +219,9 @@ extern void __get_user_unknown(void); * for 32 bit mode and old iron. */ #ifdef __mips64 -#define __PUT_USER_NOCHECK_DW __put_user_nocheck_asm("sd") +#define __PUT_USER_DW __put_user_asm("sd") #else -#define __PUT_USER_NOCHECK_DW __put_user_nocheck_asm_ll32 +#define __PUT_USER_DW __put_user_asm_ll32 #endif #define __put_user_nocheck(x,ptr,size) ({ \ @@ -281,83 +230,32 @@ __typeof__(*(ptr)) __pu_val; \ long __pu_addr; \ __pu_val = (x); \ __pu_addr = (long) (ptr); \ -__pu_err = 0; \ +__asm__("":"=r" (__pu_err)); \ switch (size) { \ -case 1: __put_user_nocheck_asm("sb"); break; \ -case 2: __put_user_nocheck_asm("sh"); break; \ -case 4: __put_user_nocheck_asm("sw"); break; \ -case 8: __PUT_USER_NOCHECK_DW; break; \ +case 1: __put_user_asm("sb"); break; \ +case 2: __put_user_asm("sh"); break; \ +case 4: __put_user_asm("sw"); break; \ +case 8: __PUT_USER_DW; break; \ default: __put_user_unknown(); break; \ } __pu_err; }) -#define __put_user_nocheck_asm(insn) \ -({ \ -__asm__ __volatile__( \ - "1:\t" insn "\t%1,%2\n" \ - "2:\n\t" \ - ".section\t.fixup,\"ax\"\n" \ - "3:\t.set\tnoat\n\t" \ - "la\t$1,2b\n\t" \ - "li\t%0,%3\n\t" \ - "jr\t$1\n\t" \ - ".set\tat\n\t" \ - ".previous\n\t" \ - ".section\t__ex_table,\"a\"\n\t" \ - STR(PTR)"\t1b,3b\n\t" \ - ".previous" \ - :"=r" (__pu_err) \ - :"r" (__pu_val), "o" (__m(__pu_addr)), "i" (-EFAULT) \ - :"$1"); }) - -#define __put_user_nocheck_asm_ll32 \ -({ \ -__asm__ __volatile__( \ - "1:\tsw\t%1,%2\n" \ - "2:\tsw\t%D1,%3\n" \ - "3:\n\t" \ - ".section\t.fixup,\"ax\"\n" \ - "4:\t.set\tnoat\n\t" \ - "la\t$1,3b\n\t" \ - "li\t%0,%4\n\t" \ - "jr\t$1\n\t" \ - ".set\tat\n\t" \ - ".previous\n\t" \ - ".section\t__ex_table,\"a\"\n\t" \ - STR(PTR)"\t1b,4b\n\t" \ - STR(PTR)"\t2b,4b\n\t" \ - ".previous" \ - :"=r" (__pu_err) \ - :"r" (__pu_val), "o" (__m(__pu_addr)), "o" (__m(__pu_addr + 4)), \ - "i" (-EFAULT) \ - :"$1"); }) - -/* - * Yuck. We need two variants, one for 64bit operation and one - * for 32 bit mode and old iron. - */ -#ifdef __mips64 -#define __PUT_USER_CHECK_DW __put_user_check_asm("sd") -#else -#define __PUT_USER_CHECK_DW __put_user_check_asm_ll32 -#endif - #define __put_user_check(x,ptr,size,mask) ({ \ long __pu_err; \ __typeof__(*(ptr)) __pu_val; \ long __pu_addr; \ __pu_val = (x); \ __pu_addr = (long) (ptr); \ -__pu_err = -EFAULT; \ +__asm__("":"=r" (__pu_err)); \ if (__access_ok(__pu_addr,size,mask)) { \ switch (size) { \ -case 1: __put_user_check_asm("sb"); break; \ -case 2: __put_user_check_asm("sh"); break; \ -case 4: __put_user_check_asm("sw"); break; \ -case 8: __PUT_USER_CHECK_DW; break; \ +case 1: __put_user_asm("sb"); break; \ +case 2: __put_user_asm("sh"); break; \ +case 4: __put_user_asm("sw"); break; \ +case 8: __PUT_USER_DW; break; \ default: __put_user_unknown(); break; \ } } __pu_err; }) -#define __put_user_check_asm(insn) \ +#define __put_user_asm(insn) \ ({ \ __asm__ __volatile__( \ "1:\t" insn "\t%1,%2\n\t" \ @@ -366,6 +264,7 @@ __asm__ __volatile__( \ ".section\t.fixup,\"ax\"\n" \ "3:\t.set\tnoat\n\t" \ "la\t$1,2b\n\t" \ + "li\t%0,%3\n\t" \ "jr\t$1\n\t" \ ".set\tat\n\t" \ ".previous\n\t" \ @@ -373,19 +272,20 @@ __asm__ __volatile__( \ STR(PTR)"\t1b,3b\n\t" \ ".previous" \ :"=r" (__pu_err) \ - :"r" (__pu_val), "o" (__m(__pu_addr)) \ + :"r" (__pu_val), "o" (__m(__pu_addr)), "i" (-EFAULT) \ :"$1"); }) -#define __put_user_check_asm_ll32 \ +#define __put_user_asm_ll32 \ ({ \ __asm__ __volatile__( \ - "1:\tsw\t%1,%2\n" \ - "2:\tsw\t%D1,%3\n\t" \ + "1:\tsw\t%1,%2\n\t" \ + "2:\tsw\t%D1,%3\n" \ "move\t%0,$0\n" \ "3:\n\t" \ ".section\t.fixup,\"ax\"\n" \ "4:\t.set\tnoat\n\t" \ "la\t$1,3b\n\t" \ + "li\t%0,%4\n\t" \ "jr\t$1\n\t" \ ".set\tat\n\t" \ ".previous\n\t" \ @@ -394,7 +294,8 @@ __asm__ __volatile__( \ STR(PTR)"\t2b,4b\n\t" \ ".previous" \ :"=r" (__pu_err) \ - :"r" (__pu_val), "o" (__m(__pu_addr)), "o" (__m(__pu_addr + 4)) \ + :"r" (__pu_val), "o" (__m(__pu_addr)), "o" (__m(__pu_addr + 4)), \ + "i" (-EFAULT) \ :"$1"); }) extern void __put_user_unknown(void); |