source: mainline/kernel/arch/ppc64/src/asm.S@ 0d387d2

lfn serial ticket/834-toolchain-update topic/msim-upgrade topic/simplify-dev-export
Last change on this file since 0d387d2 was c98e6ee, checked in by Jiri Svoboda <jirik.svoboda@…>, 17 years ago

Merge program-loader related stuff from dynload branch to trunk. (huge)

  • Property mode set to 100644
File size: 4.8 KB
Line 
1#
2# Copyright (c) 2006 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
31.text
32
33.global userspace_asm
34.global iret
35.global iret_syscall
36.global memsetb
37.global memcpy
38.global memcpy_from_uspace
39.global memcpy_to_uspace
40.global memcpy_from_uspace_failover_address
41.global memcpy_to_uspace_failover_address
42
43userspace_asm:
44
45 # r3 = uspace_uarg
46 # r4 = stack
47 # r5 = entry
48
49 # disable interrupts
50
51 mfmsr r31
52 rlwinm r31, r31, 0, 17, 15
53 mtmsr r31
54
55 # set entry point
56
57 mtsrr0 r5
58
59 # set problem state, enable interrupts
60
61 ori r31, r31, msr_pr
62 ori r31, r31, msr_ee
63 mtsrr1 r31
64
65 # set stack
66
67 mr sp, r4
68
69 # %r3 is defined to hold pcb_ptr - set it to 0
70
71 xor r3, r3, r3
72
73 # jump to userspace
74
75 rfi
76
77iret:
78
79 # disable interrupts
80
81 mfmsr r31
82 rlwinm r31, r31, 0, 17, 15
83 mtmsr r31
84
85 lwz r0, 8(sp)
86 lwz r2, 12(sp)
87 lwz r3, 16(sp)
88 lwz r4, 20(sp)
89 lwz r5, 24(sp)
90 lwz r6, 28(sp)
91 lwz r7, 32(sp)
92 lwz r8, 36(sp)
93 lwz r9, 40(sp)
94 lwz r10, 44(sp)
95 lwz r11, 48(sp)
96 lwz r13, 52(sp)
97 lwz r14, 56(sp)
98 lwz r15, 60(sp)
99 lwz r16, 64(sp)
100 lwz r17, 68(sp)
101 lwz r18, 72(sp)
102 lwz r19, 76(sp)
103 lwz r20, 80(sp)
104 lwz r21, 84(sp)
105 lwz r22, 88(sp)
106 lwz r23, 92(sp)
107 lwz r24, 96(sp)
108 lwz r25, 100(sp)
109 lwz r26, 104(sp)
110 lwz r27, 108(sp)
111 lwz r28, 112(sp)
112 lwz r29, 116(sp)
113 lwz r30, 120(sp)
114 lwz r31, 124(sp)
115
116 lwz r12, 128(sp)
117 mtcr r12
118
119 lwz r12, 132(sp)
120 mtsrr0 r12
121
122 lwz r12, 136(sp)
123 mtsrr1 r12
124
125 lwz r12, 140(sp)
126 mtlr r12
127
128 lwz r12, 144(sp)
129 mtctr r12
130
131 lwz r12, 148(sp)
132 mtxer r12
133
134 lwz r12, 152(sp)
135 lwz sp, 156(sp)
136
137 rfi
138
139iret_syscall:
140
141 # reset decrementer
142
143 li r31, 1000
144 mtdec r31
145
146 # disable interrupts
147
148 mfmsr r31
149 rlwinm r31, r31, 0, 17, 15
150 mtmsr r31
151
152 lwz r0, 8(sp)
153 lwz r2, 12(sp)
154 lwz r4, 20(sp)
155 lwz r5, 24(sp)
156 lwz r6, 28(sp)
157 lwz r7, 32(sp)
158 lwz r8, 36(sp)
159 lwz r9, 40(sp)
160 lwz r10, 44(sp)
161 lwz r11, 48(sp)
162 lwz r13, 52(sp)
163 lwz r14, 56(sp)
164 lwz r15, 60(sp)
165 lwz r16, 64(sp)
166 lwz r17, 68(sp)
167 lwz r18, 72(sp)
168 lwz r19, 76(sp)
169 lwz r20, 80(sp)
170 lwz r21, 84(sp)
171 lwz r22, 88(sp)
172 lwz r23, 92(sp)
173 lwz r24, 96(sp)
174 lwz r25, 100(sp)
175 lwz r26, 104(sp)
176 lwz r27, 108(sp)
177 lwz r28, 112(sp)
178 lwz r29, 116(sp)
179 lwz r30, 120(sp)
180 lwz r31, 124(sp)
181
182 lwz r12, 128(sp)
183 mtcr r12
184
185 lwz r12, 132(sp)
186 mtsrr0 r12
187
188 lwz r12, 136(sp)
189 mtsrr1 r12
190
191 lwz r12, 140(sp)
192 mtlr r12
193
194 lwz r12, 144(sp)
195 mtctr r12
196
197 lwz r12, 148(sp)
198 mtxer r12
199
200 lwz r12, 152(sp)
201 lwz sp, 156(sp)
202
203 rfi
204
205memsetb:
206 rlwimi r5, r5, 8, 16, 23
207 rlwimi r5, r5, 16, 0, 15
208
209 addi r14, r3, -4
210
211 cmplwi 0, r4, 4
212 blt 7f
213
214 stwu r5, 4(r14)
215 beqlr
216
217 andi. r15, r14, 3
218 add r4, r15, r4
219 subf r14, r15, r14
220 srwi r15, r4, 2
221 mtctr r15
222
223 bdz 6f
224
225 1:
226 stwu r5, 4(r14)
227 bdnz 1b
228
229 6:
230
231 andi. r4, r4, 3
232
233 7:
234
235 cmpwi 0, r4, 0
236 beqlr
237
238 mtctr r4
239 addi r6, r6, 3
240
241 8:
242
243 stbu r5, 1(r14)
244 bdnz 8b
245
246 blr
247
248memcpy:
249memcpy_from_uspace:
250memcpy_to_uspace:
251
252 srwi. r7, r5, 3
253 addi r6, r3, -4
254 addi r4, r4, -4
255 beq 2f
256
257 andi. r0, r6, 3
258 mtctr r7
259 bne 5f
260
261 1:
262
263 lwz r7, 4(r4)
264 lwzu r8, 8(r4)
265 stw r7, 4(r6)
266 stwu r8, 8(r6)
267 bdnz 1b
268
269 andi. r5, r5, 7
270
271 2:
272
273 cmplwi 0, r5, 4
274 blt 3f
275
276 lwzu r0, 4(r4)
277 addi r5, r5, -4
278 stwu r0, 4(r6)
279
280 3:
281
282 cmpwi 0, r5, 0
283 beqlr
284 mtctr r5
285 addi r4, r4, 3
286 addi r6, r6, 3
287
288 4:
289
290 lbzu r0, 1(r4)
291 stbu r0, 1(r6)
292 bdnz 4b
293 blr
294
295 5:
296
297 subfic r0, r0, 4
298 mtctr r0
299
300 6:
301
302 lbz r7, 4(r4)
303 addi r4, r4, 1
304 stb r7, 4(r6)
305 addi r6, r6, 1
306 bdnz 6b
307 subf r5, r0, r5
308 rlwinm. r7, r5, 32-3, 3, 31
309 beq 2b
310 mtctr r7
311 b 1b
312
313memcpy_from_uspace_failover_address:
314memcpy_to_uspace_failover_address:
315 b memcpy_from_uspace_failover_address
Note: See TracBrowser for help on using the repository browser.