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>
This commit is contained in:
Родитель
f8dd0d3c62
Коммит
edf10162b2
|
@ -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)
|
||||
|
|
|
@ -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 */
|
||||
|
|
Загрузка…
Ссылка в новой задаче