diff options
author | Glauber Costa <gcosta@redhat.com> | 2008-06-13 15:35:52 -0400 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2008-07-09 03:13:59 -0400 |
commit | edf10162b2c5ad78ada8e63e960f9d0949c6c219 (patch) | |
tree | c860cce966d760d230fe56de713093b7eec25df4 | |
parent | f8dd0d3c62164160c59034a96eb17d69ac8a0328 (diff) |
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 <gcosta@redhat.com>
Signed-off-by: H. Peter Anvin <hpa@zytor.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
-rw-r--r-- | arch/x86/lib/getuser_64.S | 42 | ||||
-rw-r--r-- | 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 5448876261f8..2b003d313480 100644 --- a/arch/x86/lib/getuser_64.S +++ b/arch/x86/lib/getuser_64.S | |||
@@ -36,10 +36,10 @@ | |||
36 | .text | 36 | .text |
37 | ENTRY(__get_user_1) | 37 | ENTRY(__get_user_1) |
38 | CFI_STARTPROC | 38 | CFI_STARTPROC |
39 | GET_THREAD_INFO(%r8) | 39 | GET_THREAD_INFO(%rdx) |
40 | cmpq threadinfo_addr_limit(%r8),%rcx | 40 | cmpq threadinfo_addr_limit(%rdx),%rax |
41 | jae bad_get_user | 41 | jae bad_get_user |
42 | 1: movzb (%rcx),%edx | 42 | 1: movzb (%rax),%edx |
43 | xorl %eax,%eax | 43 | xorl %eax,%eax |
44 | ret | 44 | ret |
45 | CFI_ENDPROC | 45 | CFI_ENDPROC |
@@ -47,48 +47,48 @@ ENDPROC(__get_user_1) | |||
47 | 47 | ||
48 | ENTRY(__get_user_2) | 48 | ENTRY(__get_user_2) |
49 | CFI_STARTPROC | 49 | CFI_STARTPROC |
50 | GET_THREAD_INFO(%r8) | 50 | GET_THREAD_INFO(%rdx) |
51 | addq $1,%rcx | 51 | addq $1,%rax |
52 | jc 20f | 52 | jc 20f |
53 | cmpq threadinfo_addr_limit(%r8),%rcx | 53 | cmpq threadinfo_addr_limit(%rdx),%rax |
54 | jae 20f | 54 | jae 20f |
55 | decq %rcx | 55 | decq %rax |
56 | 2: movzwl (%rcx),%edx | 56 | 2: movzwl (%rax),%edx |
57 | xorl %eax,%eax | 57 | xorl %eax,%eax |
58 | ret | 58 | ret |
59 | 20: decq %rcx | 59 | 20: decq %rax |
60 | jmp bad_get_user | 60 | jmp bad_get_user |
61 | CFI_ENDPROC | 61 | CFI_ENDPROC |
62 | ENDPROC(__get_user_2) | 62 | ENDPROC(__get_user_2) |
63 | 63 | ||
64 | ENTRY(__get_user_4) | 64 | ENTRY(__get_user_4) |
65 | CFI_STARTPROC | 65 | CFI_STARTPROC |
66 | GET_THREAD_INFO(%r8) | 66 | GET_THREAD_INFO(%rdx) |
67 | addq $3,%rcx | 67 | addq $3,%rax |
68 | jc 30f | 68 | jc 30f |
69 | cmpq threadinfo_addr_limit(%r8),%rcx | 69 | cmpq threadinfo_addr_limit(%rdx),%rax |
70 | jae 30f | 70 | jae 30f |
71 | subq $3,%rcx | 71 | subq $3,%rax |
72 | 3: movl (%rcx),%edx | 72 | 3: movl (%rax),%edx |
73 | xorl %eax,%eax | 73 | xorl %eax,%eax |
74 | ret | 74 | ret |
75 | 30: subq $3,%rcx | 75 | 30: subq $3,%rax |
76 | jmp bad_get_user | 76 | jmp bad_get_user |
77 | CFI_ENDPROC | 77 | CFI_ENDPROC |
78 | ENDPROC(__get_user_4) | 78 | ENDPROC(__get_user_4) |
79 | 79 | ||
80 | ENTRY(__get_user_8) | 80 | ENTRY(__get_user_8) |
81 | CFI_STARTPROC | 81 | CFI_STARTPROC |
82 | GET_THREAD_INFO(%r8) | 82 | GET_THREAD_INFO(%rdx) |
83 | addq $7,%rcx | 83 | addq $7,%rax |
84 | jc 40f | 84 | jc 40f |
85 | cmpq threadinfo_addr_limit(%r8),%rcx | 85 | cmpq threadinfo_addr_limit(%rdx),%rax |
86 | jae 40f | 86 | jae 40f |
87 | subq $7,%rcx | 87 | subq $7,%rax |
88 | 4: movq (%rcx),%rdx | 88 | 4: movq (%rax),%rdx |
89 | xorl %eax,%eax | 89 | xorl %eax,%eax |
90 | ret | 90 | ret |
91 | 40: subq $7,%rcx | 91 | 40: subq $7,%rax |
92 | jmp bad_get_user | 92 | jmp bad_get_user |
93 | CFI_ENDPROC | 93 | CFI_ENDPROC |
94 | ENDPROC(__get_user_8) | 94 | ENDPROC(__get_user_8) |
diff --git a/include/asm-x86/uaccess_64.h b/include/asm-x86/uaccess_64.h index b8a2f4339903..a2d49078e19c 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); | |||
90 | #define __get_user_x(size, ret, x, ptr) \ | 90 | #define __get_user_x(size, ret, x, ptr) \ |
91 | asm volatile("call __get_user_" #size \ | 91 | asm volatile("call __get_user_" #size \ |
92 | : "=a" (ret),"=d" (x) \ | 92 | : "=a" (ret),"=d" (x) \ |
93 | : "c" (ptr) \ | 93 | : "0" (ptr)) \ |
94 | : "r8") | ||
95 | 94 | ||
96 | /* Careful: we have to cast the result to the type of the pointer | 95 | /* Careful: we have to cast the result to the type of the pointer |
97 | * for sign reasons */ | 96 | * for sign reasons */ |