summaryrefslogtreecommitdiffstats
path: root/include/asm-sparc64/uaccess.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/asm-sparc64/uaccess.h')
-rw-r--r--include/asm-sparc64/uaccess.h104
1 files changed, 65 insertions, 39 deletions
diff --git a/include/asm-sparc64/uaccess.h b/include/asm-sparc64/uaccess.h
index 40ad3ee21..c0668e3f2 100644
--- a/include/asm-sparc64/uaccess.h
+++ b/include/asm-sparc64/uaccess.h
@@ -1,4 +1,4 @@
-/* $Id: uaccess.h,v 1.13 1997/05/29 12:45:04 jj Exp $ */
+/* $Id: uaccess.h,v 1.20 1997/07/13 18:23:45 davem Exp $ */
#ifndef _ASM_UACCESS_H
#define _ASM_UACCESS_H
@@ -22,26 +22,26 @@
*
* "For historical reasons, these macros are grossly misnamed." -Linus
*/
-#define KERNEL_DS 0
-#define USER_DS -1
+#define KERNEL_DS 0x00
+#define USER_DS 0x2B /* har har har */
#define VERIFY_READ 0
#define VERIFY_WRITE 1
#define get_fs() (current->tss.current_ds)
#define get_ds() (KERNEL_DS)
-extern __inline__ void set_fs(int val)
-{
- if (val != current->tss.current_ds) {
- if (val == KERNEL_DS) {
- flushw_user ();
- spitfire_set_secondary_context (0);
- } else {
- spitfire_set_secondary_context (current->mm->context);
- }
- current->tss.current_ds = val;
- }
-}
+#define set_fs(val) \
+do { \
+ current->tss.current_ds = (val); \
+ if ((val) == KERNEL_DS) { \
+ flushw_user (); \
+ current->tss.ctx = 0; \
+ } else { \
+ current->tss.ctx = (current->mm->context & 0x1fff); \
+ } \
+ spitfire_set_secondary_context(current->tss.ctx); \
+ __asm__ __volatile__("flush %g6"); \
+} while(0)
#define __user_ok(addr,size) 1
#define __kernel_ok (get_fs() == KERNEL_DS)
@@ -255,8 +255,44 @@ __asm__ __volatile__( \
extern int __get_user_bad(void);
-extern __kernel_size_t __copy_to_user(void *to, void *from, __kernel_size_t size);
-extern __kernel_size_t __copy_from_user(void *to, void *from, __kernel_size_t size);
+extern __kernel_size_t __memcpy_short(void *to, const void *from,
+ __kernel_size_t size,
+ long asi_src, long asi_dst);
+
+extern __kernel_size_t __memcpy_entry(void *to, const void *from,
+ __kernel_size_t size,
+ long asi_src, long asi_dst);
+
+extern __kernel_size_t __memcpy_16plus(void *to, const void *from,
+ __kernel_size_t size,
+ long asi_src, long asi_dst);
+
+extern __kernel_size_t __memcpy_386plus(void *to, const void *from,
+ __kernel_size_t size,
+ long asi_src, long asi_dst);
+
+extern __kernel_size_t __copy_from_user(void *to, const void *from,
+ __kernel_size_t size);
+
+extern __kernel_size_t __copy_to_user(void *to, const void *from,
+ __kernel_size_t size);
+
+extern __kernel_size_t __copy_in_user(void *to, const void *from,
+ __kernel_size_t size);
+
+#define copy_from_user(to,from,n) \
+ __copy_from_user((void *)(to), \
+ (void *)(from), (__kernel_size_t)(n))
+
+#define copy_from_user_ret(to,from,n,retval) ({ \
+if (copy_from_user(to,from,n)) \
+ return retval; \
+})
+
+#define __copy_from_user_ret(to,from,n,retval) ({ \
+if (__copy_from_user(to,from,n)) \
+ return retval; \
+})
#define copy_to_user(to,from,n) \
__copy_to_user((void *)(to), \
@@ -272,37 +308,27 @@ if (__copy_to_user(to,from,n)) \
return retval; \
})
-#define copy_from_user(to,from,n) \
- __copy_from_user((void *)(to), \
- (void *)(from), (__kernel_size_t)(n))
+#define copy_in_user(to,from,n) \
+ __copy_in_user((void *)(to), \
+ (void *) (from), (__kernel_size_t)(n))
-#define copy_from_user_ret(to,from,n,retval) ({ \
-if (copy_from_user(to,from,n)) \
+#define copy_in_user_ret(to,from,n,retval) ({ \
+if (copy_in_user(to,from,n)) \
return retval; \
})
-#define __copy_from_user_ret(to,from,n,retval) ({ \
-if (__copy_from_user(to,from,n)) \
+#define __copy_in_user_ret(to,from,n,retval) ({ \
+if (__copy_in_user(to,from,n)) \
return retval; \
})
extern __inline__ __kernel_size_t __clear_user(void *addr, __kernel_size_t size)
{
- __kernel_size_t ret;
- __asm__ __volatile__ ("
- .section __ex_table,#alloc
- .align 8
- .xword 1f,3
- .previous
-1:
- wr %%g0, %3, %%asi
- mov %2, %%o1
- call __bzero_noasi
- mov %1, %%o0
- mov %%o0, %0
- " : "=r" (ret) : "r" (addr), "r" (size), "i" (ASI_S) :
- "cc", "o0", "o1", "o2", "o3", "o4", "o5", "o7", "g1", "g2", "g3", "g5", "g7");
- return ret;
+ extern __kernel_size_t __bzero_noasi(void *addr, __kernel_size_t size);
+
+
+ __asm__ __volatile__ ("wr %%g0, %0, %%asi" : : "i" (ASI_S));
+ return __bzero_noasi(addr, size);
}
#define clear_user(addr,n) \