185 lines
		
	
	
	
		
			2.8 KiB
			
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
		
		
			
		
	
	
			185 lines
		
	
	
	
		
			2.8 KiB
			
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
|   | /* | ||
|  |  * arch/score/lib/string.S | ||
|  |  * | ||
|  |  * Score Processor version. | ||
|  |  * | ||
|  |  * Copyright (C) 2009 Sunplus Core Technology Co., Ltd. | ||
|  |  *  Chen Liqin <liqin.chen@sunplusct.com>
 | ||
|  |  *  Lennox Wu <lennox.wu@sunplusct.com>
 | ||
|  |  * | ||
|  |  * 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. | ||
|  |  * | ||
|  |  * This program is distributed in the hope that it will be useful, | ||
|  |  * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | ||
|  |  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||
|  |  * GNU General Public License for more details. | ||
|  |  * | ||
|  |  * You should have received a copy of the GNU General Public License | ||
|  |  * along with this program; if not, see the file COPYING, or write
 | ||
|  |  * to the Free Software Foundation, Inc., | ||
|  |  * 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA | ||
|  |  */ | ||
|  | 
 | ||
|  | #include <linux/linkage.h> | ||
|  | #include <asm-generic/errno.h> | ||
|  | 
 | ||
|  | 	.text | ||
|  | 	.align 2
 | ||
|  | ENTRY(__strncpy_from_user) | ||
|  | 	cmpi.c	r6, 0 | ||
|  | 	mv	r9, r6 | ||
|  | 	ble	.L2 | ||
|  | 0:	lbu	r7, [r5] | ||
|  | 	ldi	r8, 0 | ||
|  | 1:	sb	r7, [r4] | ||
|  | 2:	lb	r6, [r5] | ||
|  | 	cmp.c	r6, r8 | ||
|  | 	beq	.L2 | ||
|  | 
 | ||
|  | .L5: | ||
|  | 	addi	r8, 1 | ||
|  | 	cmp.c	r8, r9 | ||
|  | 	beq	.L7 | ||
|  | 3:	lbu	r6, [r5, 1]+ | ||
|  | 4:	sb	r6, [r4, 1]+ | ||
|  | 5:	lb	r7, [r5] | ||
|  | 	cmpi.c	r7, 0 | ||
|  | 	bne	.L5 | ||
|  | .L7: | ||
|  | 	mv	r4, r8 | ||
|  | 	br	r3 | ||
|  | .L2: | ||
|  | 	ldi	r8, 0 | ||
|  | 	mv	r4, r8 | ||
|  | 	br	r3 | ||
|  | 	.section .fixup, "ax" | ||
|  | 99: | ||
|  | 	ldi	r4, -EFAULT | ||
|  | 	br	r3 | ||
|  | 	.previous | ||
|  | 	.section __ex_table, "a" | ||
|  | 	.align	2
 | ||
|  | 	.word	0b ,99b | ||
|  | 	.word	1b ,99b | ||
|  | 	.word	2b ,99b | ||
|  | 	.word	3b ,99b | ||
|  | 	.word	4b ,99b | ||
|  | 	.word	5b ,99b | ||
|  | 	.previous | ||
|  | 
 | ||
|  | 	.align 2
 | ||
|  | ENTRY(__strnlen_user) | ||
|  | 	cmpi.c	r5, 0 | ||
|  | 	ble	.L11 | ||
|  | 0:	lb	r6, [r4] | ||
|  | 	ldi	r7, 0 | ||
|  | 	cmp.c	r6, r7 | ||
|  | 	beq	.L11 | ||
|  | .L15: | ||
|  | 	addi	r7, 1 | ||
|  | 	cmp.c	r7, r5 | ||
|  | 	beq	.L23 | ||
|  | 1:	lb	r6, [r4,1]+ | ||
|  | 	cmpi.c	r6, 0 | ||
|  | 	bne	.L15 | ||
|  | .L23: | ||
|  | 	addri	r4, r7, 1 | ||
|  | 	br	r3 | ||
|  | 
 | ||
|  | .L11: | ||
|  | 	ldi	r4, 1 | ||
|  | 	br	r3 | ||
|  | 	.section .fixup, "ax" | ||
|  | 99: | ||
|  | 	ldi	r4, 0 | ||
|  | 	br	r3 | ||
|  | 
 | ||
|  | 	.section __ex_table,"a" | ||
|  | 	.align 2
 | ||
|  | 	.word	0b, 99b | ||
|  | 	.word	1b, 99b | ||
|  | 	.previous | ||
|  | 
 | ||
|  | 	.align 2
 | ||
|  | ENTRY(__strlen_user) | ||
|  | 0:	lb	r6, [r4] | ||
|  | 	mv	r7, r4 | ||
|  | 	extsb	r6, r6 | ||
|  | 	cmpi.c	r6, 0 | ||
|  | 	mv	r4, r6 | ||
|  | 	beq	.L27 | ||
|  | .L28: | ||
|  | 1:	lb	r6, [r7, 1]+ | ||
|  | 	addi	r6, 1 | ||
|  | 	cmpi.c	r6, 0 | ||
|  | 	bne	.L28 | ||
|  | .L27: | ||
|  | 	br	r3 | ||
|  | 	.section .fixup, "ax" | ||
|  | 	ldi	r4, 0x0 | ||
|  | 	br	r3 | ||
|  | 99: | ||
|  | 	ldi	r4, 0 | ||
|  | 	br	r3 | ||
|  | 	.previous | ||
|  | 	.section __ex_table, "a" | ||
|  | 	.align	2
 | ||
|  | 	.word	0b ,99b | ||
|  | 	.word	1b ,99b | ||
|  | 	.previous | ||
|  | 
 | ||
|  | 	.align 2
 | ||
|  | ENTRY(__copy_tofrom_user) | ||
|  | 	cmpi.c	r6, 0 | ||
|  | 	mv	r10,r6 | ||
|  | 	beq	.L32 | ||
|  | 	ldi	r9, 0 | ||
|  | .L34: | ||
|  | 	add	r6, r5, r9 | ||
|  | 0:	lbu	r8, [r6] | ||
|  | 	add	r7, r4, r9 | ||
|  | 1:	sb	r8, [r7] | ||
|  | 	addi	r9, 1 | ||
|  | 	cmp.c	r9, r10 | ||
|  | 	bne	.L34 | ||
|  | .L32: | ||
|  | 	ldi	r4, 0 | ||
|  | 	br	r3 | ||
|  | 	.section .fixup, "ax" | ||
|  | 99: | ||
|  | 	sub	r4, r10, r9 | ||
|  | 	br	r3 | ||
|  | 	.previous | ||
|  | 	.section __ex_table, "a" | ||
|  | 	.align	2
 | ||
|  | 	.word	0b, 99b | ||
|  | 	.word	1b, 99b | ||
|  | 	.previous | ||
|  | 
 | ||
|  | 	.align 2
 | ||
|  | ENTRY(__clear_user) | ||
|  | 	cmpi.c	r5, 0 | ||
|  | 	beq	.L38 | ||
|  | 	ldi	r6, 0 | ||
|  | 	mv	r7, r6 | ||
|  | .L40: | ||
|  | 	addi	r6, 1 | ||
|  | 0:	sb	r7, [r4]+, 1 | ||
|  | 	cmp.c	r6, r5 | ||
|  | 	bne	.L40 | ||
|  | .L38: | ||
|  | 	ldi	r4, 0 | ||
|  | 	br	r3 | ||
|  | 
 | ||
|  | 	.section .fixup, "ax" | ||
|  | 	br	r3 | ||
|  | 	.previous | ||
|  | 	.section __ex_table, "a" | ||
|  | 	.align	2
 | ||
|  | 99: | ||
|  | 	.word	0b, 99b | ||
|  | 	.previous |