ChangeSet 1.2231.1.66, 2005/03/28 19:34:59-08:00, [EMAIL PROTECTED]
[PATCH] x86_64: Give out of line get_user better calling conventions
Give out of line get_user better calling conventions
Signed-off-by: Andi Kleen <[EMAIL PROTECTED]>
Signed-off-by: Andrew Morton <[EMAIL PROTECTED]>
Signed-off-by: Linus Torvalds <[EMAIL PROTECTED]>
arch/x86_64/lib/getuser.S | 65 +++++++++++++++++++++++++------------------
include/asm-x86_64/uaccess.h | 13 +++-----
2 files changed, 44 insertions(+), 34 deletions(-)
diff -Nru a/arch/x86_64/lib/getuser.S b/arch/x86_64/lib/getuser.S
--- a/arch/x86_64/lib/getuser.S 2005-03-28 21:21:01 -08:00
+++ b/arch/x86_64/lib/getuser.S 2005-03-28 21:21:01 -08:00
@@ -2,6 +2,7 @@
* __get_user functions.
*
* (C) Copyright 1998 Linus Torvalds
+ * (C) Copyright 2005 Andi Kleen
*
* These functions have a non-standard call interface
* to make them more efficient, especially as they
@@ -12,12 +13,14 @@
/*
* __get_user_X
*
- * Inputs: %rax contains the address
+ * Inputs: %rcx contains the address.
+ * The register is modified, but all changes are undone
+ * before returning because the C code doesn't know about it.
*
* Outputs: %rax is error code (0 or -EFAULT)
* %rdx contains zero-extended value
*
- * %rbx is destroyed.
+ * %r8 is destroyed.
*
* These functions should not modify any other registers,
* as they get called from within inline assembly.
@@ -33,52 +36,60 @@
.p2align 4
.globl __get_user_1
__get_user_1:
- GET_THREAD_INFO(%rbx)
- cmpq threadinfo_addr_limit(%rbx),%rax
+ GET_THREAD_INFO(%r8)
+ cmpq threadinfo_addr_limit(%r8),%rcx
jae bad_get_user
-1: movzb (%rax),%edx
- xorq %rax,%rax
+1: movzb (%rcx),%edx
+ xorl %eax,%eax
ret
.p2align 4
.globl __get_user_2
__get_user_2:
- GET_THREAD_INFO(%rbx)
- addq $1,%rax
- jc bad_get_user
- cmpq threadinfo_addr_limit(%rbx),%rax
- jae bad_get_user
-2: movzwl -1(%rax),%edx
- xorq %rax,%rax
+ GET_THREAD_INFO(%r8)
+ addq $1,%rcx
+ jc 20f
+ cmpq threadinfo_addr_limit(%r8),%rcx
+ jae 20f
+ decq %rcx
+2: movzwl (%rcx),%edx
+ xorl %eax,%eax
ret
+20: decq %rcx
+ jmp bad_get_user
.p2align 4
.globl __get_user_4
__get_user_4:
- GET_THREAD_INFO(%rbx)
- addq $3,%rax
- jc bad_get_user
- cmpq threadinfo_addr_limit(%rbx),%rax
- jae bad_get_user
-3: movl -3(%rax),%edx
- xorq %rax,%rax
+ GET_THREAD_INFO(%r8)
+ addq $3,%rcx
+ jc 30f
+ cmpq threadinfo_addr_limit(%r8),%rcx
+ jae 30f
+ subq $3,%rcx
+3: movl (%rcx),%edx
+ xorl %eax,%eax
ret
+30: subq $3,%rcx
+ jmp bad_get_user
.p2align 4
.globl __get_user_8
__get_user_8:
- GET_THREAD_INFO(%rbx)
- addq $7,%rax
+ GET_THREAD_INFO(%r8)
+ addq $7,%rcx
jc bad_get_user
- cmpq threadinfo_addr_limit(%rbx),%rax
+ cmpq threadinfo_addr_limit(%r8),%rcx
jae bad_get_user
-4: movq -7(%rax),%rdx
- xorq %rax,%rax
+ subq $7,%rcx
+4: movq (%rcx),%rdx
+ xorl %eax,%eax
ret
+40: subq $7,%rcx
+ jmp bad_get_user
-ENTRY(bad_get_user)
bad_get_user:
- xorq %rdx,%rdx
+ xorl %edx,%edx
movq $(-EFAULT),%rax
ret
diff -Nru a/include/asm-x86_64/uaccess.h b/include/asm-x86_64/uaccess.h
--- a/include/asm-x86_64/uaccess.h 2005-03-28 21:21:01 -08:00
+++ b/include/asm-x86_64/uaccess.h 2005-03-28 21:21:01 -08:00
@@ -91,16 +91,11 @@
* accesses to the same area of user memory).
*/
-extern void __get_user_1(void);
-extern void __get_user_2(void);
-extern void __get_user_4(void);
-extern void __get_user_8(void);
-
#define __get_user_x(size,ret,x,ptr) \
__asm__ __volatile__("call __get_user_" #size \
:"=a" (ret),"=d" (x) \
- :"0" (ptr) \
- :"rbx")
+ :"c" (ptr) \
+ :"r8")
/* Careful: we have to cast the result to the type of the pointer for sign
reasons */
#define get_user(x,ptr)
\
@@ -210,6 +205,10 @@
__gu_err; \
})
+extern int __get_user_1(void);
+extern int __get_user_2(void);
+extern int __get_user_4(void);
+extern int __get_user_8(void);
extern int __get_user_bad(void);
#define __get_user_size(x,ptr,size,retval) \
-
To unsubscribe from this list: send the line "unsubscribe bk-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at http://vger.kernel.org/majordomo-info.html