Gitweb:     
http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=f61698e6489f229f9fcfe29e68f228389a772993
Commit:     f61698e6489f229f9fcfe29e68f228389a772993
Parent:     1b64e7abe742c0d32cdb1545d9a67f80cc6e81f3
Author:     Alexander Shmelev <[EMAIL PROTECTED]>
AuthorDate: Tue Jul 24 13:41:44 2007 -0700
Committer:  David S. Miller <[EMAIL PROTECTED]>
CommitDate: Tue Jul 24 13:41:44 2007 -0700

    [SPARC32]: Fix bug in sparc optimized memset.
    
    Sparc optimized memset (arch/sparc/lib/memset.S) does not fill last
    byte of the memory area, if area size is less than 8 bytes and start
    address is not word (4-bytes) aligned.
    
    Here is code chunk where bug located:
    /* %o0 - memory address, %o1 - size, %g3 - value */
    8:
         add    %o0, 1, %o0
        subcc    %o1, 1, %o1
        bne,a    8b
         stb %g3, [%o0 - 1]
    
    This code should write byte every loop iteration, but last time delay
    instruction stb is not executed because branch instruction sets
    "annul" bit.
    
    Patch replaces bne,a by bne instruction.
    
    Error can be reproduced by simple kernel module:
    
    --------------------
    #include <linux/module.h>
    #include <linux/config.h>
    #include <linux/kernel.h>
    #include <linux/errno.h>
    #include <string.h>
    
    static void do_memset(void **p, int size)
    {
            memset(p, 0x00, size);
    }
    
    static int __init memset_test_init(void)
    {
        char fooc[8];
        int *fooi;
        memset(fooc, 0xba, sizeof(fooc));
    
        do_memset((void**)(fooc + 3), 1);
    
        fooi = (int*) fooc;
        printk("%08X %08X\n", fooi[0], fooi[1]);
    
        return -1;
    }
    
    static void __exit memset_test_cleanup(void)
    {
        return;
    }
    
    module_init(memset_test_init);
    module_exit(memset_test_cleanup);
    
    MODULE_LICENSE("GPL");
    EXPORT_NO_SYMBOLS;
    --------------------
    
    Signed-off-by: Alexander Shmelev <[EMAIL PROTECTED]>
    Signed-off-by: David S. Miller <[EMAIL PROTECTED]>
---
 arch/sparc/lib/memset.S |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/arch/sparc/lib/memset.S b/arch/sparc/lib/memset.S
index a65eba4..1c37ea8 100644
--- a/arch/sparc/lib/memset.S
+++ b/arch/sparc/lib/memset.S
@@ -162,7 +162,7 @@ __bzero:
 8:
         add    %o0, 1, %o0
        subcc   %o1, 1, %o1
-       bne,a   8b
+       bne     8b
         EX(stb %g3, [%o0 - 1], add %o1, 1)
 0:
        retl
-
To unsubscribe from this list: send the line "unsubscribe git-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