fedora core 6 1.2949 + vserver 2.2.0
[linux-2.6.git] / include / asm-parisc / uaccess.h
index 4606ad9..d973e8b 100644 (file)
@@ -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__ (                              \