X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=include%2Fasm-parisc%2Fuaccess.h;h=d973e8b3466ca805afbdf52a846211434f2e8269;hb=refs%2Fheads%2Fvserver;hp=4606ad917784719ae09ba696f8863b22364464f3;hpb=6a77f38946aaee1cd85eeec6cf4229b204c15071;p=linux-2.6.git diff --git a/include/asm-parisc/uaccess.h b/include/asm-parisc/uaccess.h index 4606ad917..d973e8b34 100644 --- a/include/asm-parisc/uaccess.h +++ b/include/asm-parisc/uaccess.h @@ -24,7 +24,7 @@ /* * Note that since kernel addresses are in a separate address space on - * parisc, we don't need to do anything for access_ok() or verify_area(). + * parisc, we don't need to do anything for access_ok(). * We just let the page fault handler do the right thing. This also means * that put_user is the same as __put_user, etc. */ @@ -34,8 +34,11 @@ extern int __get_user_bad(void); extern int __put_kernel_bad(void); extern int __put_user_bad(void); -#define access_ok(type,addr,size) (1) -#define verify_area(type,addr,size) (0) +static inline long access_ok(int type, const void __user * addr, + unsigned long size) +{ + return 1; +} #define put_user __put_user #define get_user __get_user @@ -142,22 +145,23 @@ struct exception_data { #define __put_user(x,ptr) \ ({ \ register long __pu_err __asm__ ("r8") = 0; \ + __typeof__(*(ptr)) __x = (__typeof__(*(ptr)))(x); \ \ if (segment_eq(get_fs(),KERNEL_DS)) { \ switch (sizeof(*(ptr))) { \ - case 1: __put_kernel_asm("stb",x,ptr); break; \ - case 2: __put_kernel_asm("sth",x,ptr); break; \ - case 4: __put_kernel_asm("stw",x,ptr); break; \ - case 8: STD_KERNEL(x,ptr); break; \ + case 1: __put_kernel_asm("stb",__x,ptr); break; \ + case 2: __put_kernel_asm("sth",__x,ptr); break; \ + case 4: __put_kernel_asm("stw",__x,ptr); break; \ + case 8: STD_KERNEL(__x,ptr); break; \ default: __put_kernel_bad(); break; \ } \ } \ else { \ switch (sizeof(*(ptr))) { \ - case 1: __put_user_asm("stb",x,ptr); break; \ - case 2: __put_user_asm("sth",x,ptr); break; \ - case 4: __put_user_asm("stw",x,ptr); break; \ - case 8: STD_USER(x,ptr); break; \ + case 1: __put_user_asm("stb",__x,ptr); break; \ + case 2: __put_user_asm("sth",__x,ptr); break; \ + case 4: __put_user_asm("stw",__x,ptr); break; \ + case 8: STD_USER(__x,ptr); break; \ default: __put_user_bad(); break; \ } \ } \ @@ -168,7 +172,11 @@ struct exception_data { /* * The "__put_user/kernel_asm()" macros tell gcc they read from memory * instead of writing. This is because they do not write to any memory - * gcc knows about, so there are no aliasing issues. + * gcc knows about, so there are no aliasing issues. These macros must + * also be aware that "fixup_put_user_skip_[12]" are executed in the + * context of the fault, and any registers used there must be listed + * as clobbers. In this case only "r1" is used by the current routines. + * r8/r9 are already listed as err/val. */ #ifdef __LP64__ @@ -179,7 +187,8 @@ struct exception_data { "\t.dword\t1b,fixup_put_user_skip_1\n" \ "\t.previous" \ : "=r"(__pu_err) \ - : "r"(ptr), "r"(x), "0"(__pu_err)) + : "r"(ptr), "r"(x), "0"(__pu_err) \ + : "r1") #define __put_user_asm(stx,x,ptr) \ __asm__ __volatile__ ( \