tree dc79d50fb8d8c74259945b8a044f93982a9289bd
parent 6d9c5d94d39a09d9b112613f0bfdb9af0e6dc253
author Alexander Nyberg <[EMAIL PROTECTED]> Thu, 21 Apr 2005 21:59:51 -0700
committer Linus Torvalds <[EMAIL PROTECTED]> Thu, 21 Apr 2005 21:59:51 -0700

[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: Alexander Nyberg <[EMAIL PROTECTED]>
Signed-off-by: [EMAIL PROTECTED]
Signed-off-by: Linus Torvalds <[EMAIL PROTECTED]>


 x86_64/lib/getuser.S |    4 ++--
 x86_64/lib/putuser.S |   27 ++++++++++++++++++---------
 2 files changed, 20 insertions(+), 11 deletions(-)

Index: arch/x86_64/lib/getuser.S
===================================================================
--- ccfdb83a12f3cc582717c59e219150c6a00b4e16/arch/x86_64/lib/getuser.S  
(mode:100644 sha1:f94ea8a44051524639412986ac1d86677df5c9c2)
+++ dc79d50fb8d8c74259945b8a044f93982a9289bd/arch/x86_64/lib/getuser.S  
(mode:100644 sha1:f80bafee8669fbcb0420d6e5173ea1f79e863082)
@@ -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: arch/x86_64/lib/putuser.S
===================================================================
--- ccfdb83a12f3cc582717c59e219150c6a00b4e16/arch/x86_64/lib/putuser.S  
(mode:100644 sha1:0dee1fdcb16280d3d0bb0053ab8634072adfda45)
+++ dc79d50fb8d8c74259945b8a044f93982a9289bd/arch/x86_64/lib/putuser.S  
(mode:100644 sha1:d9d3e5ec9ad196a9d2c20617abcb1066aa2f4132)
@@ -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
-
To unsubscribe from this list: send the line "unsubscribe bk-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to