From edf10162b2c5ad78ada8e63e960f9d0949c6c219 Mon Sep 17 00:00:00 2001 From: Glauber Costa Date: Fri, 13 Jun 2008 16:35:52 -0300 Subject: [PATCH] x86: don't clobber r8 nor use rcx. There's really no reason to clobber r8 or pass the address in rcx. We can safely use only two registers (which we already have to touch anyway) to do the job. Signed-off-by: Glauber Costa Signed-off-by: H. Peter Anvin Signed-off-by: Ingo Molnar --- arch/x86/lib/getuser_64.S | 42 ++++++++++++++++++------------------ include/asm-x86/uaccess_64.h | 3 +-- 2 files changed, 22 insertions(+), 23 deletions(-) diff --git a/arch/x86/lib/getuser_64.S b/arch/x86/lib/getuser_64.S index 5448876261..2b003d3134 100644 --- a/arch/x86/lib/getuser_64.S +++ b/arch/x86/lib/getuser_64.S @@ -36,10 +36,10 @@ .text ENTRY(__get_user_1) CFI_STARTPROC - GET_THREAD_INFO(%r8) - cmpq threadinfo_addr_limit(%r8),%rcx + GET_THREAD_INFO(%rdx) + cmpq threadinfo_addr_limit(%rdx),%rax jae bad_get_user -1: movzb (%rcx),%edx +1: movzb (%rax),%edx xorl %eax,%eax ret CFI_ENDPROC @@ -47,48 +47,48 @@ ENDPROC(__get_user_1) ENTRY(__get_user_2) CFI_STARTPROC - GET_THREAD_INFO(%r8) - addq $1,%rcx + GET_THREAD_INFO(%rdx) + addq $1,%rax jc 20f - cmpq threadinfo_addr_limit(%r8),%rcx + cmpq threadinfo_addr_limit(%rdx),%rax jae 20f - decq %rcx -2: movzwl (%rcx),%edx + decq %rax +2: movzwl (%rax),%edx xorl %eax,%eax ret -20: decq %rcx +20: decq %rax jmp bad_get_user CFI_ENDPROC ENDPROC(__get_user_2) ENTRY(__get_user_4) CFI_STARTPROC - GET_THREAD_INFO(%r8) - addq $3,%rcx + GET_THREAD_INFO(%rdx) + addq $3,%rax jc 30f - cmpq threadinfo_addr_limit(%r8),%rcx + cmpq threadinfo_addr_limit(%rdx),%rax jae 30f - subq $3,%rcx -3: movl (%rcx),%edx + subq $3,%rax +3: movl (%rax),%edx xorl %eax,%eax ret -30: subq $3,%rcx +30: subq $3,%rax jmp bad_get_user CFI_ENDPROC ENDPROC(__get_user_4) ENTRY(__get_user_8) CFI_STARTPROC - GET_THREAD_INFO(%r8) - addq $7,%rcx + GET_THREAD_INFO(%rdx) + addq $7,%rax jc 40f - cmpq threadinfo_addr_limit(%r8),%rcx + cmpq threadinfo_addr_limit(%rdx),%rax jae 40f - subq $7,%rcx -4: movq (%rcx),%rdx + subq $7,%rax +4: movq (%rax),%rdx xorl %eax,%eax ret -40: subq $7,%rcx +40: subq $7,%rax jmp bad_get_user CFI_ENDPROC ENDPROC(__get_user_8) diff --git a/include/asm-x86/uaccess_64.h b/include/asm-x86/uaccess_64.h index b8a2f43399..a2d49078e1 100644 --- a/include/asm-x86/uaccess_64.h +++ b/include/asm-x86/uaccess_64.h @@ -90,8 +90,7 @@ extern int fixup_exception(struct pt_regs *regs); #define __get_user_x(size, ret, x, ptr) \ asm volatile("call __get_user_" #size \ : "=a" (ret),"=d" (x) \ - : "c" (ptr) \ - : "r8") + : "0" (ptr)) \ /* Careful: we have to cast the result to the type of the pointer * for sign reasons */ -- 2.39.5