source: mainline/kernel/arch/ppc32/src/asm.S@ 5ac77cc

lfn serial ticket/834-toolchain-update topic/msim-upgrade topic/simplify-dev-export
Last change on this file since 5ac77cc was ffe276f, checked in by Martin Decky <martin@…>, 16 years ago

restructure constants
change the return type of pic_get_pending()
coding style changes

  • Property mode set to 100644
File size: 4.6 KB
Line 
1#
2# Copyright (c) 2005 Martin Decky
3# All rights reserved.
4#
5# Redistribution and use in source and binary forms, with or without
6# modification, are permitted provided that the following conditions
7# are met:
8#
9# - Redistributions of source code must retain the above copyright
10# notice, this list of conditions and the following disclaimer.
11# - Redistributions in binary form must reproduce the above copyright
12# notice, this list of conditions and the following disclaimer in the
13# documentation and/or other materials provided with the distribution.
14# - The name of the author may not be used to endorse or promote products
15# derived from this software without specific prior written permission.
16#
17# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27#
28
29#include <arch/asm/regname.h>
30#include <arch/cpu.h>
31
32.text
33
34.global userspace_asm
35.global iret
36.global iret_syscall
37.global memsetb
38.global memsetw
39.global memcpy
40.global memcpy_from_uspace
41.global memcpy_to_uspace
42.global memcpy_from_uspace_failover_address
43.global memcpy_to_uspace_failover_address
44
45userspace_asm:
46
47 # r3 = uspace_uarg
48 # r4 = stack
49 # r5 = entry
50
51 # disable interrupts
52
53 mfmsr r31
54 rlwinm r31, r31, 0, 17, 15
55 mtmsr r31
56
57 # set entry point
58
59 mtsrr0 r5
60
61 # set problem state, enable interrupts
62
63 ori r31, r31, MSR_PR
64 ori r31, r31, MSR_EE
65 mtsrr1 r31
66
67 # set stack
68
69 mr sp, r4
70
71 # %r6 is defined to hold pcb_ptr - set it to 0
72
73 xor r6, r6, r6
74
75 # jump to userspace
76
77 rfi
78
79iret:
80
81 # disable interrupts
82
83 mfmsr r31
84 rlwinm r31, r31, 0, 17, 15
85 mtmsr r31
86
87 lwz r0, 8(sp)
88 lwz r2, 12(sp)
89 lwz r3, 16(sp)
90 lwz r4, 20(sp)
91 lwz r5, 24(sp)
92 lwz r6, 28(sp)
93 lwz r7, 32(sp)
94 lwz r8, 36(sp)
95 lwz r9, 40(sp)
96 lwz r10, 44(sp)
97 lwz r11, 48(sp)
98 lwz r13, 52(sp)
99 lwz r14, 56(sp)
100 lwz r15, 60(sp)
101 lwz r16, 64(sp)
102 lwz r17, 68(sp)
103 lwz r18, 72(sp)
104 lwz r19, 76(sp)
105 lwz r20, 80(sp)
106 lwz r21, 84(sp)
107 lwz r22, 88(sp)
108 lwz r23, 92(sp)
109 lwz r24, 96(sp)
110 lwz r25, 100(sp)
111 lwz r26, 104(sp)
112 lwz r27, 108(sp)
113 lwz r28, 112(sp)
114 lwz r29, 116(sp)
115 lwz r30, 120(sp)
116 lwz r31, 124(sp)
117
118 lwz r12, 128(sp)
119 mtcr r12
120
121 lwz r12, 132(sp)
122 mtsrr0 r12
123
124 lwz r12, 136(sp)
125 mtsrr1 r12
126
127 lwz r12, 140(sp)
128 mtlr r12
129
130 lwz r12, 144(sp)
131 mtctr r12
132
133 lwz r12, 148(sp)
134 mtxer r12
135
136 lwz r12, 156(sp)
137 lwz sp, 160(sp)
138
139 rfi
140
141iret_syscall:
142
143 # reset decrementer
144
145 li r31, 1000
146 mtdec r31
147
148 # disable interrupts
149
150 mfmsr r31
151 rlwinm r31, r31, 0, 17, 15
152 mtmsr r31
153
154 lwz r0, 8(sp)
155 lwz r2, 12(sp)
156 lwz r4, 20(sp)
157 lwz r5, 24(sp)
158 lwz r6, 28(sp)
159 lwz r7, 32(sp)
160 lwz r8, 36(sp)
161 lwz r9, 40(sp)
162 lwz r10, 44(sp)
163 lwz r11, 48(sp)
164 lwz r13, 52(sp)
165 lwz r14, 56(sp)
166 lwz r15, 60(sp)
167 lwz r16, 64(sp)
168 lwz r17, 68(sp)
169 lwz r18, 72(sp)
170 lwz r19, 76(sp)
171 lwz r20, 80(sp)
172 lwz r21, 84(sp)
173 lwz r22, 88(sp)
174 lwz r23, 92(sp)
175 lwz r24, 96(sp)
176 lwz r25, 100(sp)
177 lwz r26, 104(sp)
178 lwz r27, 108(sp)
179 lwz r28, 112(sp)
180 lwz r29, 116(sp)
181 lwz r30, 120(sp)
182 lwz r31, 124(sp)
183
184 lwz r12, 128(sp)
185 mtcr r12
186
187 lwz r12, 132(sp)
188 mtsrr0 r12
189
190 lwz r12, 136(sp)
191 mtsrr1 r12
192
193 lwz r12, 140(sp)
194 mtlr r12
195
196 lwz r12, 144(sp)
197 mtctr r12
198
199 lwz r12, 148(sp)
200 mtxer r12
201
202 lwz r12, 156(sp)
203 lwz sp, 160(sp)
204
205 rfi
206
207memsetb:
208 b _memsetb
209
210memsetw:
211 b _memsetw
212
213memcpy:
214memcpy_from_uspace:
215memcpy_to_uspace:
216
217 srwi. r7, r5, 3
218 addi r6, r3, -4
219 addi r4, r4, -4
220 beq 2f
221
222 andi. r0, r6, 3
223 mtctr r7
224 bne 5f
225
226 1:
227
228 lwz r7, 4(r4)
229 lwzu r8, 8(r4)
230 stw r7, 4(r6)
231 stwu r8, 8(r6)
232 bdnz 1b
233
234 andi. r5, r5, 7
235
236 2:
237
238 cmplwi 0, r5, 4
239 blt 3f
240
241 lwzu r0, 4(r4)
242 addi r5, r5, -4
243 stwu r0, 4(r6)
244
245 3:
246
247 cmpwi 0, r5, 0
248 beqlr
249 mtctr r5
250 addi r4, r4, 3
251 addi r6, r6, 3
252
253 4:
254
255 lbzu r0, 1(r4)
256 stbu r0, 1(r6)
257 bdnz 4b
258 blr
259
260 5:
261
262 subfic r0, r0, 4
263 mtctr r0
264
265 6:
266
267 lbz r7, 4(r4)
268 addi r4, r4, 1
269 stb r7, 4(r6)
270 addi r6, r6, 1
271 bdnz 6b
272 subf r5, r0, r5
273 rlwinm. r7, r5, 32-3, 3, 31
274 beq 2b
275 mtctr r7
276 b 1b
277
278memcpy_from_uspace_failover_address:
279memcpy_to_uspace_failover_address:
280 # return zero, failure
281 xor r3, r3, r3
282 blr
Note: See TracBrowser for help on using the repository browser.