Subversion Repositories HelenOS

Rev

Rev 3200 | Rev 3585 | Go to most recent revision | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

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