[PATCH] x86_64: Bug in new out of line put_user()
authorAlexander Nyberg <alexn@telia.com>
Thu, 21 Apr 2005 14:59:51 +0000 (07:59 -0700)
committerLinus Torvalds <torvalds@ppc970.osdl.org>
Thu, 21 Apr 2005 14:59:51 +0000 (07:59 -0700)
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: Alexander Nyberg <alexn@telia.com>
Signed-off-by: ak@suse.de
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
arch/x86_64/lib/getuser.S
arch/x86_64/lib/putuser.S

index f94ea8a..f80bafe 100644 (file)
@@ -78,9 +78,9 @@ __get_user_4:
 __get_user_8:
        GET_THREAD_INFO(%r8)
        addq $7,%rcx
-       jc bad_get_user
+       jc 40f
        cmpq threadinfo_addr_limit(%r8),%rcx
-       jae     bad_get_user
+       jae     40f
        subq    $7,%rcx
 4:     movq (%rcx),%rdx
        xorl %eax,%eax
index 0dee1fd..d9d3e5e 100644 (file)
@@ -46,36 +46,45 @@ __put_user_1:
 __put_user_2:
        GET_THREAD_INFO(%r8)
        addq $1,%rcx
-       jc bad_put_user
+       jc 20f
        cmpq threadinfo_addr_limit(%r8),%rcx
-       jae      bad_put_user
-2:     movw %dx,-1(%rcx)
+       jae 20f
+2:     decq %rcx
+       movw %dx,(%rcx)
        xorl %eax,%eax
        ret
+20:    decq %rcx
+       jmp bad_put_user
 
        .p2align 4
 .globl __put_user_4
 __put_user_4:
        GET_THREAD_INFO(%r8)
        addq $3,%rcx
-       jc bad_put_user
+       jc 30f
        cmpq threadinfo_addr_limit(%r8),%rcx
-       jae bad_put_user
-3:     movl %edx,-3(%rcx)
+       jae 30f
+3:     subq $3,%rcx
+       movl %edx,(%rcx)
        xorl %eax,%eax
        ret
+30:    subq $3,%rcx
+       jmp bad_put_user
 
        .p2align 4
 .globl __put_user_8
 __put_user_8:
        GET_THREAD_INFO(%r8)
        addq $7,%rcx
-       jc bad_put_user
+       jc 40f
        cmpq threadinfo_addr_limit(%r8),%rcx
-       jae     bad_put_user
-4:     movq %rdx,-7(%rcx)
+       jae 40f
+4:     subq $7,%rcx
+       movq %rdx,(%rcx)
        xorl %eax,%eax
        ret
+40:    subq $7,%rcx
+       jmp bad_put_user
 
 bad_put_user:
        movq $(-EFAULT),%rax