 6f5405bc2e
			
		
	
	
	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>
		
	
			
		
			
				
	
	
		
			119 lines
		
	
	
	
		
			1.9 KiB
			
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
			
		
		
	
	
			119 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
 |