Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 3a6fd752 authored by Alexander Nyberg's avatar Alexander Nyberg Committed by Linus Torvalds
Browse files

[PATCH] x86_64: Bug in new out of line put_user()

The new out of line put_user() assembly on x86_64 changes %rcx without
telling GCC about it causing things like:

http://bugme.osdl.org/show_bug.cgi?id=4515

 

See to it that %rcx is not changed (made it consistent with get_user()).

Signed-off-by: default avatarAlexander Nyberg <alexn@telia.com>
Signed-off-by: default avatar <ak@suse.de>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent 6d9c5d94
Loading
Loading
Loading
Loading
+2 −2
Original line number Original line Diff line number Diff line
@@ -78,9 +78,9 @@ __get_user_4:
__get_user_8:
__get_user_8:
	GET_THREAD_INFO(%r8)
	GET_THREAD_INFO(%r8)
	addq $7,%rcx
	addq $7,%rcx
	jc bad_get_user
	jc 40f
	cmpq threadinfo_addr_limit(%r8),%rcx
	cmpq threadinfo_addr_limit(%r8),%rcx
	jae	bad_get_user
	jae	40f
	subq	$7,%rcx
	subq	$7,%rcx
4:	movq (%rcx),%rdx
4:	movq (%rcx),%rdx
	xorl %eax,%eax
	xorl %eax,%eax
+18 −9
Original line number Original line Diff line number Diff line
@@ -46,36 +46,45 @@ __put_user_1:
__put_user_2:
__put_user_2:
	GET_THREAD_INFO(%r8)
	GET_THREAD_INFO(%r8)
	addq $1,%rcx
	addq $1,%rcx
	jc bad_put_user
	jc 20f
	cmpq threadinfo_addr_limit(%r8),%rcx
	cmpq threadinfo_addr_limit(%r8),%rcx
	jae	 bad_put_user
	jae 20f
2:	movw %dx,-1(%rcx)
2:	decq %rcx
	movw %dx,(%rcx)
	xorl %eax,%eax
	xorl %eax,%eax
	ret
	ret
20:	decq %rcx
	jmp bad_put_user


	.p2align 4
	.p2align 4
.globl __put_user_4
.globl __put_user_4
__put_user_4:
__put_user_4:
	GET_THREAD_INFO(%r8)
	GET_THREAD_INFO(%r8)
	addq $3,%rcx
	addq $3,%rcx
	jc bad_put_user
	jc 30f
	cmpq threadinfo_addr_limit(%r8),%rcx
	cmpq threadinfo_addr_limit(%r8),%rcx
	jae bad_put_user
	jae 30f
3:	movl %edx,-3(%rcx)
3:	subq $3,%rcx
	movl %edx,(%rcx)
	xorl %eax,%eax
	xorl %eax,%eax
	ret
	ret
30:	subq $3,%rcx
	jmp bad_put_user


	.p2align 4
	.p2align 4
.globl __put_user_8
.globl __put_user_8
__put_user_8:
__put_user_8:
	GET_THREAD_INFO(%r8)
	GET_THREAD_INFO(%r8)
	addq $7,%rcx
	addq $7,%rcx
	jc bad_put_user
	jc 40f
	cmpq threadinfo_addr_limit(%r8),%rcx
	cmpq threadinfo_addr_limit(%r8),%rcx
	jae	bad_put_user
	jae 40f
4:	movq %rdx,-7(%rcx)
4:	subq $7,%rcx
	movq %rdx,(%rcx)
	xorl %eax,%eax
	xorl %eax,%eax
	ret
	ret
40:	subq $7,%rcx
	jmp bad_put_user


bad_put_user:
bad_put_user:
	movq $(-EFAULT),%rax
	movq $(-EFAULT),%rax