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

Subversion Repositories or1k_soc_on_altera_embedded_dev_kit

[/] [or1k_soc_on_altera_embedded_dev_kit/] [trunk/] [linux-2.6/] [linux-2.6.24/] [arch/] [or32/] [lib/] [string.S] - Blame information for rev 7

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 7 xianfeng
/*
2
 *  linux/arch/or32/lib/string.S
3
 *
4
 *  or32 version
5
 *    author(s): Matjaz Breskvar (phoenix@bsemi.com)
6
 *
7
 *  changes:
8
 *  18. 11. 2003: Matjaz Breskvar (phoenix@bsemi.com)
9
 *    initial port to or32 architecture
10
 *
11
 */
12
 
13
#include 
14
#include 
15
#include 
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
102
 
103
/*
104
 * long strncpy_from_user(char *dst, const char *src, long count)
105
 *
106
 *
107
 */
108
        .global ___strncpy_from_user
109
___strncpy_from_user:
110
        l.addi  r1,r1,-16
111
        l.sw    0(r1),r6
112
        l.sw    4(r1),r5
113
        l.sw    8(r1),r4
114
        l.sw    12(r1),r3
115
 
116
        l.addi  r11,r5,0
117
2:      l.sfeq  r5,r0
118
        l.bf    1f
119
        l.addi  r5,r5,-1
120
8:      l.lbz   r6,0(r4)
121
        l.sfeq  r6,r0
122
        l.bf    1f
123
9:      l.sb    0(r3),r6
124
        l.addi  r3,r3,1
125
        l.j     2b
126
        l.addi  r4,r4,1
127
1:
128
        l.lwz   r6,0(r1)
129
        l.addi  r5,r5,1
130
        l.sub   r11,r11,r5              // r11 holds the return value
131
 
132
        l.lwz   r6,0(r1)
133
        l.lwz   r5,4(r1)
134
        l.lwz   r4,8(r1)
135
        l.lwz   r3,12(r1)
136
        l.jr    r9
137
        l.addi  r1,r1,16
138
 
139
        .section .fixup, "ax"
140
99:
141
                l.movhi r11,hi(-EFAULT)
142
                l.ori   r11,r11,lo(-EFAULT)
143
 
144
                l.lwz   r6,0(r1)
145
                l.lwz   r5,4(r1)
146
                l.lwz   r4,8(r1)
147
                l.lwz   r3,12(r1)
148
                l.jr    r9
149
                l.addi  r1,r1,16
150
        .previous
151
 
152
        .section __ex_table, "a"
153
                .long 8b, 99b           // read fault
154
        .previous
155
 
156
/*
157
 * extern int __strnlen_user(const char *str, long len, unsigned long top);
158
 *
159
 *
160
 * RTRN: - length of a string including NUL termination character
161
 *       - on page fault 0
162
 */
163
 
164
        .global ___strnlen_user
165
___strnlen_user:
166
        l.addi  r1,r1,-8
167
        l.sw    0(r1),r6
168
        l.sw    4(r1),r3
169
 
170
        l.addi  r11,r0,0
171
2:      l.sfeq  r11,r4
172
        l.bf    1f
173
        l.addi  r11,r11,1
174
8:      l.lbz   r6,0(r3)
175
        l.sfeq  r6,r0
176
        l.bf    1f
177
        l.sfgeu r3,r5                  // are we over the top ?
178
        l.bf    99f
179
        l.j     2b
180
        l.addi  r3,r3,1
181
 
182
1:
183
        l.lwz   r6,0(r1)
184
        l.lwz   r3,4(r1)
185
        l.jr    r9
186
        l.addi  r1,r1,8
187
 
188
        .section .fixup, "ax"
189
99:
190
                l.addi  r11,r0,0
191
 
192
                l.lwz   r6,0(r1)
193
                l.lwz   r3,4(r1)
194
                l.jr    r9
195
                l.addi  r1,r1,8
196
        .previous
197
 
198
        .section __ex_table, "a"
199
                .long 8b, 99b           // read fault
200
        .previous

powered by: WebSVN 2.1.0

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