mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-12-15 23:14:31 +08:00
6f5405bc2e
memmove may be called from module code copy_pages(btrfs), and it may call memcpy, which may call back to C code, so it needs to use _GLOBAL_TOC to set up r2 correctly. This fixes following error when I tried to boot an le guest: Vector: 300 (Data Access) at [c000000073f97210] pc: c000000000015004: enable_kernel_altivec+0x24/0x80 lr: c000000000058fbc: enter_vmx_copy+0x3c/0x60 sp: c000000073f97490 msr: 8000000002009033 dar: d000000001d50170 dsisr: 40000000 current = 0xc0000000734c0000 paca = 0xc00000000fff0000 softe: 0 irq_happened: 0x01 pid = 815, comm = mktemp enter ? for help [c000000073f974f0] c000000000058fbc enter_vmx_copy+0x3c/0x60 [c000000073f97510] c000000000057d34 memcpy_power7+0x274/0x840 [c000000073f97610] d000000001c3179c copy_pages+0xfc/0x110 [btrfs] [c000000073f97660] d000000001c3c248 memcpy_extent_buffer+0xe8/0x160 [btrfs] [c000000073f97700] d000000001be4be8 setup_items_for_insert+0x208/0x4a0 [btrfs] [c000000073f97820] d000000001be50b4 btrfs_insert_empty_items+0xf4/0x140 [btrfs] [c000000073f97890] d000000001bfed30 insert_with_overflow+0x70/0x180 [btrfs] [c000000073f97900] d000000001bff174 btrfs_insert_dir_item+0x114/0x2f0 [btrfs] [c000000073f979a0] d000000001c1f92c btrfs_add_link+0x10c/0x370 [btrfs] [c000000073f97a40] d000000001c20e94 btrfs_create+0x204/0x270 [btrfs] [c000000073f97b00] c00000000026d438 vfs_create+0x178/0x210 [c000000073f97b50] c000000000270a70 do_last+0x9f0/0xe90 [c000000073f97c20] c000000000271010 path_openat+0x100/0x810 [c000000073f97ce0] c000000000272ea8 do_filp_open+0x58/0xd0 [c000000073f97dc0] c00000000025ade8 do_sys_open+0x1b8/0x300 [c000000073f97e30] c00000000000a008 syscall_exit+0x0/0x7c Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
120 lines
1.9 KiB
ArmAsm
120 lines
1.9 KiB
ArmAsm
/*
|
|
* String handling functions for PowerPC.
|
|
*
|
|
* Copyright (C) 1996 Paul Mackerras.
|
|
*
|
|
* This program is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU General Public License
|
|
* as published by the Free Software Foundation; either version
|
|
* 2 of the License, or (at your option) any later version.
|
|
*/
|
|
#include <asm/processor.h>
|
|
#include <asm/errno.h>
|
|
#include <asm/ppc_asm.h>
|
|
|
|
_GLOBAL(memset)
|
|
neg r0,r3
|
|
rlwimi r4,r4,8,16,23
|
|
andi. r0,r0,7 /* # bytes to be 8-byte aligned */
|
|
rlwimi r4,r4,16,0,15
|
|
cmplw cr1,r5,r0 /* do we get that far? */
|
|
rldimi r4,r4,32,0
|
|
PPC_MTOCRF(1,r0)
|
|
mr r6,r3
|
|
blt cr1,8f
|
|
beq+ 3f /* if already 8-byte aligned */
|
|
subf r5,r0,r5
|
|
bf 31,1f
|
|
stb r4,0(r6)
|
|
addi r6,r6,1
|
|
1: bf 30,2f
|
|
sth r4,0(r6)
|
|
addi r6,r6,2
|
|
2: bf 29,3f
|
|
stw r4,0(r6)
|
|
addi r6,r6,4
|
|
3: srdi. r0,r5,6
|
|
clrldi r5,r5,58
|
|
mtctr r0
|
|
beq 5f
|
|
4: std r4,0(r6)
|
|
std r4,8(r6)
|
|
std r4,16(r6)
|
|
std r4,24(r6)
|
|
std r4,32(r6)
|
|
std r4,40(r6)
|
|
std r4,48(r6)
|
|
std r4,56(r6)
|
|
addi r6,r6,64
|
|
bdnz 4b
|
|
5: srwi. r0,r5,3
|
|
clrlwi r5,r5,29
|
|
PPC_MTOCRF(1,r0)
|
|
beq 8f
|
|
bf 29,6f
|
|
std r4,0(r6)
|
|
std r4,8(r6)
|
|
std r4,16(r6)
|
|
std r4,24(r6)
|
|
addi r6,r6,32
|
|
6: bf 30,7f
|
|
std r4,0(r6)
|
|
std r4,8(r6)
|
|
addi r6,r6,16
|
|
7: bf 31,8f
|
|
std r4,0(r6)
|
|
addi r6,r6,8
|
|
8: cmpwi r5,0
|
|
PPC_MTOCRF(1,r5)
|
|
beqlr+
|
|
bf 29,9f
|
|
stw r4,0(r6)
|
|
addi r6,r6,4
|
|
9: bf 30,10f
|
|
sth r4,0(r6)
|
|
addi r6,r6,2
|
|
10: bflr 31
|
|
stb r4,0(r6)
|
|
blr
|
|
|
|
_GLOBAL_TOC(memmove)
|
|
cmplw 0,r3,r4
|
|
bgt backwards_memcpy
|
|
b memcpy
|
|
|
|
_GLOBAL(backwards_memcpy)
|
|
rlwinm. r7,r5,32-3,3,31 /* r0 = r5 >> 3 */
|
|
add r6,r3,r5
|
|
add r4,r4,r5
|
|
beq 2f
|
|
andi. r0,r6,3
|
|
mtctr r7
|
|
bne 5f
|
|
1: lwz r7,-4(r4)
|
|
lwzu r8,-8(r4)
|
|
stw r7,-4(r6)
|
|
stwu r8,-8(r6)
|
|
bdnz 1b
|
|
andi. r5,r5,7
|
|
2: cmplwi 0,r5,4
|
|
blt 3f
|
|
lwzu r0,-4(r4)
|
|
subi r5,r5,4
|
|
stwu r0,-4(r6)
|
|
3: cmpwi 0,r5,0
|
|
beqlr
|
|
mtctr r5
|
|
4: lbzu r0,-1(r4)
|
|
stbu r0,-1(r6)
|
|
bdnz 4b
|
|
blr
|
|
5: mtctr r0
|
|
6: lbzu r7,-1(r4)
|
|
stbu r7,-1(r6)
|
|
bdnz 6b
|
|
subf r5,r0,r5
|
|
rlwinm. r7,r5,32-3,3,31
|
|
beq 2b
|
|
mtctr r7
|
|
b 1b
|