linux/arch
Alexander Shmelev f61698e648 [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 <ashmelev@task.sun.mcst.ru>
Signed-off-by: David S. Miller <davem@davemloft.net>
2007-07-24 13:41:44 -07:00
..
alpha some kmalloc/memset ->kzalloc (tree wide) 2007-07-19 10:04:50 -07:00
arm Merge branch 'devel' of master.kernel.org:/home/rmk/linux-2.6-arm 2007-07-22 11:22:59 -07:00
arm26 take declarations of enable_irq() et.al. to linux/interrupt.h 2007-07-22 11:44:00 -07:00
avr32 Merge branch 'for-linus' of git://git.o-hand.com/linux-rpurdie-leds 2007-07-22 11:22:01 -07:00
blackfin some kmalloc/memset ->kzalloc (tree wide) 2007-07-19 10:04:50 -07:00
cris Merge git://git.kernel.org/pub/scm/linux/kernel/git/sam/kbuild 2007-07-19 14:28:19 -07:00
frv FRV: work around a possible compiler bug 2007-07-19 10:04:50 -07:00
h8300 PTRACE_POKEDATA consolidation 2007-07-17 10:23:03 -07:00
i386 x86_64: Fix xen section warnings 2007-07-22 11:17:17 -07:00
ia64 revert "PIE randomization" 2007-07-21 17:49:14 -07:00
m32r Merge branch 'release' of git://lm-sensors.org/kernel/mhoffman/hwmon-2.6 2007-07-19 14:24:57 -07:00
m68k take declarations of enable_irq() et.al. to linux/interrupt.h 2007-07-22 11:44:00 -07:00
m68knommu m68knommu: reformat show_cpuinfo() 2007-07-20 08:44:20 -07:00
mips [MIPS] User stack pointer randomisation 2007-07-20 18:57:40 +01:00
parisc define new percpu interface for shared data 2007-07-19 10:04:44 -07:00
powerpc spusched: fix mismerge in spufs.h 2007-07-24 12:24:58 -07:00
ppc [POWERPC] mv64x60: Use mutex instead of semaphore 2007-07-22 21:30:58 +10:00
s390 s390: Put allocated ELF notes in read-only data segment 2007-07-19 10:04:47 -07:00
sh clockevents: fix resume logic 2007-07-21 17:49:15 -07:00
sh64 sh64: Flag sh64_get_page() as __init_refok. 2007-07-20 17:46:42 +09:00
sparc [SPARC32]: Fix bug in sparc optimized memset. 2007-07-24 13:41:44 -07:00
sparc64 [SPARC64]: Update defconfig. 2007-07-24 13:24:35 -07:00
um uml: more __init annotations 2007-07-24 12:24:58 -07:00
v850 PTRACE_POKEDATA consolidation 2007-07-17 10:23:03 -07:00
x86_64 x86_64: Rename CF Makefile variable in vdso 2007-07-22 12:43:28 -07:00
xtensa Merge git://git.kernel.org/pub/scm/linux/kernel/git/sam/kbuild 2007-07-19 14:28:19 -07:00