Linux-libre 5.3.12-gnu
[librecmc/linux-libre.git] / arch / openrisc / lib / string.S
1 /* SPDX-License-Identifier: GPL-2.0-or-later */
2 /*
3  * OpenRISC string.S
4  *
5  * Linux architectural port borrowing liberally from similar works of
6  * others.  All original copyrights apply as per the original source
7  * declaration.
8  *
9  * Modifications for the OpenRISC architecture:
10  * Copyright (C) 2003 Matjaz Breskvar <phoenix@bsemi.com>
11  * Copyright (C) 2010-2011 Jonas Bonn <jonas@southpole.se>
12  */
13
14 #include <linux/linkage.h>
15 #include <asm/errno.h>
16
17         /*
18          * this can be optimized by doing gcc inline assemlby with
19          * proper constraints (no need to save args registers...)
20          *
21          */
22
23
24 /*
25  *
26  * int __copy_tofrom_user(void *to, const void *from, unsigned long size);
27  *
28  * NOTE: it returns number of bytes NOT copied !!!
29  *
30  */
31         .global __copy_tofrom_user
32 __copy_tofrom_user:
33         l.addi  r1,r1,-12
34         l.sw    0(r1),r6
35         l.sw    4(r1),r4
36         l.sw    8(r1),r3
37
38         l.addi  r11,r5,0
39 2:      l.sfeq  r11,r0
40         l.bf    1f
41         l.addi  r11,r11,-1
42 8:      l.lbz   r6,0(r4)
43 9:      l.sb    0(r3),r6
44         l.addi  r3,r3,1
45         l.j     2b
46         l.addi  r4,r4,1
47 1:
48         l.addi  r11,r11,1               // r11 holds the return value
49
50         l.lwz   r6,0(r1)
51         l.lwz   r4,4(r1)
52         l.lwz   r3,8(r1)
53         l.jr    r9
54         l.addi  r1,r1,12
55
56         .section .fixup, "ax"
57 99:
58                 l.j     1b
59                 l.nop
60         .previous
61
62         .section __ex_table, "a"
63                 .long 8b, 99b           // read fault
64                 .long 9b, 99b           // write fault
65         .previous
66
67 /*
68  * unsigned long clear_user(void *addr, unsigned long size) ;
69  *
70  * NOTE: it returns number of bytes NOT cleared !!!
71  */
72         .global __clear_user
73 __clear_user:
74         l.addi  r1,r1,-8
75         l.sw    0(r1),r4
76         l.sw    4(r1),r3
77
78 2:      l.sfeq  r4,r0
79         l.bf    1f
80         l.addi  r4,r4,-1
81 9:      l.sb    0(r3),r0
82         l.j     2b
83         l.addi  r3,r3,1
84
85 1:
86         l.addi  r11,r4,1
87
88         l.lwz   r4,0(r1)
89         l.lwz   r3,4(r1)
90         l.jr    r9
91         l.addi  r1,r1,8
92
93         .section .fixup, "ax"
94 99:
95                 l.j     1b
96                 l.nop
97         .previous
98
99         .section __ex_table, "a"
100                 .long 9b, 99b           // write fault
101         .previous