OpenCores
URL https://opencores.org/ocsvn/or1k/or1k/trunk

Subversion Repositories or1k

[/] [or1k/] [trunk/] [linux/] [linux-2.4/] [arch/] [or32/] [lib/] [string.S] - Blame information for rev 1765

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 1275 phoenix
/*
2
 *  linux/arch/or32/lib/string.S
3
 *
4
 *  or32 version
5
 *    author(s): Matjaz Breskvar (phoenix@opencores.org)
6
 *
7
 *  changes:
8
 *  18. 11. 2003: Matjaz Breskvar (phoenix@opencores.org)
9
 *    initial port to or32 architecture
10
 *
11
 */
12
 
13
#include 
14
#include 
15
#include 
16
#include 
17
#include 
18
#include 
19
 
20
        /*
21
         * this can be optimized by doing gcc inline assemlby with
22
         * proper constraints (no need to save args registers...)
23
         *
24
         */
25
 
26
 
27
/*
28
 *
29
 * int __copy_tofrom_user(void *to, const void *from, unsigned long size);
30
 *
31
 * NOTE: it returns number of bytes NOT copied !!!
32
 *
33
 */
34
        .global ___copy_tofrom_user
35
___copy_tofrom_user:
36
        l.addi  r1,r1,-12
37
        l.sw    0(r1),r6
38
        l.sw    4(r1),r4
39
        l.sw    8(r1),r3
40
 
41
        l.addi  r11,r5,0
42
2:      l.sfeq  r11,r0
43
        l.bf    1f
44
        l.addi  r11,r11,-1
45
8:      l.lbz   r6,0(r4)
46
9:      l.sb    0(r3),r6
47
        l.addi  r3,r3,1
48
        l.j     2b
49
        l.addi  r4,r4,1
50
1:
51
        l.addi  r11,r11,1               // r11 holds the return value
52
 
53
        l.lwz   r6,0(r1)
54
        l.lwz   r4,4(r1)
55
        l.lwz   r3,8(r1)
56
        l.jr    r9
57
        l.addi  r1,r1,12
58
 
59
        .section .fixup, "ax"
60
99:
61
                l.j     1b
62
                l.nop
63
        .previous
64
 
65
        .section __ex_table, "a"
66
                .long 8b, 99b           // read fault
67
                .long 9b, 99b           // write fault
68
        .previous
69
 
70
/*
71
 * unsigned long clear_user(void *addr, unsigned long size) ;
72
 *
73
 * NOTE: it returns number of bytes NOT cleared !!!
74
 */
75
        .global ___clear_user
76
___clear_user:
77
        l.addi  r1,r1,-8
78
        l.sw    0(r1),r4
79
        l.sw    4(r1),r3
80
 
81
2:      l.sfeq  r4,r0
82
        l.bf    1f
83
        l.addi  r4,r4,-1
84
9:      l.sb    0(r3),r0
85
        l.j     2b
86
        l.addi  r3,r3,1
87
 
88
1:
89
        l.addi  r11,r4,1
90
 
91
        l.lwz   r4,0(r1)
92
        l.lwz   r3,4(r1)
93
        l.jr    r9
94
        l.addi  r1,r1,8
95
 
96
        .section .fixup, "ax"
97
99:
98
                l.j     1b
99
                l.nop
100
        .previous
101
 
102
        .section __ex_table, "a"
103
                .long 9b, 99b           // write fault
104
        .previous
105
 
106
/*
107
 * long strncpy_from_user(char *dst, const char *src, long count)
108
 *
109
 *
110
 */
111
        .global ___strncpy_from_user
112
___strncpy_from_user:
113
        l.addi  r1,r1,-16
114
        l.sw    0(r1),r6
115
        l.sw    4(r1),r5
116
        l.sw    8(r1),r4
117
        l.sw    12(r1),r3
118
 
119
        l.addi  r11,r5,0
120
2:      l.sfeq  r5,r0
121
        l.bf    1f
122
        l.addi  r5,r5,-1
123
8:      l.lbz   r6,0(r4)
124
        l.sfeq  r6,r0
125
        l.bf    1f
126
9:      l.sb    0(r3),r6
127
        l.addi  r3,r3,1
128
        l.j     2b
129
        l.addi  r4,r4,1
130
1:
131
        l.lwz   r6,0(r1)
132
        l.addi  r5,r5,1
133
        l.sub   r11,r11,r5              // r11 holds the return value
134
 
135
        l.lwz   r6,0(r1)
136
        l.lwz   r5,4(r1)
137
        l.lwz   r4,8(r1)
138
        l.lwz   r3,12(r1)
139
        l.jr    r9
140
        l.addi  r1,r1,16
141
 
142
        .section .fixup, "ax"
143
99:
144
                l.movhi r11,hi(-EFAULT)
145
                l.ori   r11,r11,lo(-EFAULT)
146
 
147
                l.lwz   r6,0(r1)
148
                l.lwz   r5,4(r1)
149
                l.lwz   r4,8(r1)
150
                l.lwz   r3,12(r1)
151
                l.jr    r9
152
                l.addi  r1,r1,16
153
        .previous
154
 
155
        .section __ex_table, "a"
156
                .long 8b, 99b           // read fault
157
        .previous
158
 
159
/*
160
 * extern int __strnlen_user(const char *str, long len, unsigned long top);
161
 *
162
 *
163
 * RTRN: - length of a string including NUL termination character
164
 *       - on page fault 0
165
 */
166
 
167
        .global ___strnlen_user
168
___strnlen_user:
169
        l.addi  r1,r1,-8
170
        l.sw    0(r1),r6
171
        l.sw    4(r1),r3
172
 
173
        l.addi  r11,r0,0
174
2:      l.sfeq  r11,r4
175
        l.bf    1f
176
        l.addi  r11,r11,1
177
8:      l.lbz   r6,0(r3)
178
        l.sfeq  r6,r0
179
        l.bf    1f
180
        l.sfgeu r3,r5                  // are we over the top ?
181
        l.bf    99f
182
        l.j     2b
183
        l.addi  r3,r3,1
184
 
185
1:
186
        l.lwz   r6,0(r1)
187
        l.lwz   r3,4(r1)
188
        l.jr    r9
189
        l.addi  r1,r1,8
190
 
191
        .section .fixup, "ax"
192
99:
193
                l.addi  r11,r0,0
194
 
195
                l.lwz   r6,0(r1)
196
                l.lwz   r3,4(r1)
197
                l.jr    r9
198
                l.addi  r1,r1,8
199
        .previous
200
 
201
        .section __ex_table, "a"
202
                .long 8b, 99b           // read fault
203
        .previous

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.