blob: 943d0911ea890e960a8ff5cb2bd5ed24d4c6cd8b [file] [log] [blame]
/*
* 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
.align 2
ENTRY(__put_user_unknown)
.set volatile
ldi r4, -EFAULT
br r3
.align 2
ENTRY(__get_user_unknown)
ldi r5, 0
ldi r4, -EFAULT
br r3