Subversion Repositories HelenOS

Rev

Rev 2927 | Only display areas with differences | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 2927 Rev 4341
1
#
1
#
2
# Copyright (c) 2006 Martin Decky
2
# Copyright (c) 2006 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
#include <arch/mm/page.h>
30
#include <arch/mm/page.h>
31
 
31
 
32
.section K_UNMAPPED_TEXT_START, "ax"
32
.section K_UNMAPPED_TEXT_START, "ax"
33
 
33
 
34
.macro CONTEXT_STORE
34
.macro CONTEXT_STORE
35
	
35
	
36
	# save R12 in SPRG1, backup CR in R12
36
	# save R12 in SPRG1, backup CR in R12
37
	# save SP in SPRG2
37
	# save SP in SPRG2
38
 
38
 
39
	mtsprg1 r12
39
	mtsprg1 r12
40
	mfcr r12
40
	mfcr r12
41
	mtsprg2 sp
41
	mtsprg2 sp
42
	
42
	
43
	# check whether SP is in kernel
43
	# check whether SP is in kernel
44
	
44
	
45
	andis. sp, sp, 0x8000
45
	andis. sp, sp, 0x8000
46
	bne 1f
46
	bne 1f
47
	
47
	
48
		# stack is in user-space
48
		# stack is in user-space
49
		
49
		
50
		mfsprg0 sp
50
		mfsprg0 sp
51
	
51
	
52
	b 2f
52
	b 2f
53
	
53
	
54
	1:
54
	1:
55
	
55
	
56
		# stack is in kernel
56
		# stack is in kernel
57
		
57
		
58
		mfsprg2 sp
58
		mfsprg2 sp
59
		subis sp, sp, 0x8000
59
		subis sp, sp, 0x8000
60
	
60
	
61
	2:
61
	2:
62
	
62
	
63
	subi sp, sp, 160
63
	subi sp, sp, 164
64
	stw r0, 8(sp)
64
	stw r0, 8(sp)
65
	stw r2, 12(sp)
65
	stw r2, 12(sp)
66
	stw r3, 16(sp)
66
	stw r3, 16(sp)
67
	stw r4, 20(sp)
67
	stw r4, 20(sp)
68
	stw r5, 24(sp)
68
	stw r5, 24(sp)
69
	stw r6, 28(sp)
69
	stw r6, 28(sp)
70
	stw r7, 32(sp)
70
	stw r7, 32(sp)
71
	stw r8, 36(sp)
71
	stw r8, 36(sp)
72
	stw r9, 40(sp)
72
	stw r9, 40(sp)
73
	stw r10, 44(sp)
73
	stw r10, 44(sp)
74
	stw r11, 48(sp)
74
	stw r11, 48(sp)
75
	stw r13, 52(sp)
75
	stw r13, 52(sp)
76
	stw r14, 56(sp)
76
	stw r14, 56(sp)
77
	stw r15, 60(sp)
77
	stw r15, 60(sp)
78
	stw r16, 64(sp)
78
	stw r16, 64(sp)
79
	stw r17, 68(sp)
79
	stw r17, 68(sp)
80
	stw r18, 72(sp)
80
	stw r18, 72(sp)
81
	stw r19, 76(sp)
81
	stw r19, 76(sp)
82
	stw r20, 80(sp)
82
	stw r20, 80(sp)
83
	stw r21, 84(sp)
83
	stw r21, 84(sp)
84
	stw r22, 88(sp)
84
	stw r22, 88(sp)
85
	stw r23, 92(sp)
85
	stw r23, 92(sp)
86
	stw r24, 96(sp)
86
	stw r24, 96(sp)
87
	stw r25, 100(sp)
87
	stw r25, 100(sp)
88
	stw r26, 104(sp)
88
	stw r26, 104(sp)
89
	stw r27, 108(sp)
89
	stw r27, 108(sp)
90
	stw r28, 112(sp)
90
	stw r28, 112(sp)
91
	stw r29, 116(sp)
91
	stw r29, 116(sp)
92
	stw r30, 120(sp)
92
	stw r30, 120(sp)
93
	stw r31, 124(sp)
93
	stw r31, 124(sp)
94
	
94
	
95
	stw r12, 128(sp)
95
	stw r12, 128(sp)
96
	
96
	
97
	mfsrr0 r12
97
	mfsrr0 r12
98
	stw r12, 132(sp)
98
	stw r12, 132(sp)
99
	
99
	
100
	mfsrr1 r12
100
	mfsrr1 r12
101
	stw r12, 136(sp)
101
	stw r12, 136(sp)
102
	
102
	
103
	mflr r12
103
	mflr r12
104
	stw r12, 140(sp)
104
	stw r12, 140(sp)
105
	
105
	
106
	mfctr r12
106
	mfctr r12
107
	stw r12, 144(sp)
107
	stw r12, 144(sp)
108
	
108
	
109
	mfxer r12
109
	mfxer r12
110
	stw r12, 148(sp)
110
	stw r12, 148(sp)
111
	
111
	
112
	mfsprg1 r12
112
	mfdar r12
113
	stw r12, 152(sp)
113
	stw r12, 152(sp)
114
	
114
	
115
	mfsprg2 r12
115
	mfsprg1 r12
116
	stw r12, 156(sp)
116
	stw r12, 156(sp)
-
 
117
	
-
 
118
	mfsprg2 r12
-
 
119
	stw r12, 160(sp)
117
.endm
120
.endm
118
 
121
 
119
.org 0x100
122
.org 0x100
120
.global exc_system_reset
123
.global exc_system_reset
121
exc_system_reset:
124
exc_system_reset:
122
	CONTEXT_STORE
125
	CONTEXT_STORE
123
	
126
	
124
	li r3, 0
127
	li r3, 0
125
	b jump_to_kernel
128
	b jump_to_kernel
126
 
129
 
127
.org 0x200
130
.org 0x200
128
.global exc_machine_check
131
.global exc_machine_check
129
exc_machine_check:
132
exc_machine_check:
130
	CONTEXT_STORE
133
	CONTEXT_STORE
131
	
134
	
132
	li r3, 1
135
	li r3, 1
133
	b jump_to_kernel
136
	b jump_to_kernel
134
 
137
 
135
.org 0x300
138
.org 0x300
136
.global exc_data_storage
139
.global exc_data_storage
137
exc_data_storage:
140
exc_data_storage:
138
	CONTEXT_STORE
141
	CONTEXT_STORE
139
	
142
	
140
	li r3, 2
-
 
141
	mr r4, sp
-
 
142
	addi r4, r4, 8
-
 
143
	bl pht_real_refill
-
 
144
	
-
 
145
	cmpwi r3, 0
-
 
146
	bne iret_real
-
 
147
	
-
 
148
	li r3, 2
-
 
149
	b jump_to_kernel
143
	b data_storage
150
 
144
 
151
.org 0x400
145
.org 0x400
152
.global exc_instruction_storage
146
.global exc_instruction_storage
153
exc_instruction_storage:
147
exc_instruction_storage:
154
	CONTEXT_STORE
148
	CONTEXT_STORE
155
	
149
	
156
	li r3, 3
-
 
157
	mr r4, sp
-
 
158
	addi r4, r4, 8
-
 
159
	bl pht_real_refill
-
 
160
	
-
 
161
	cmpwi r3, 0
-
 
162
	bne iret_real
-
 
163
 
-
 
164
	li r3, 3
-
 
165
	b jump_to_kernel
150
	b instruction_storage
166
 
151
 
167
.org 0x500
152
.org 0x500
168
.global exc_external
153
.global exc_external
169
exc_external:
154
exc_external:
170
	CONTEXT_STORE
155
	CONTEXT_STORE
171
	
156
	
172
	li r3, 4
157
	li r3, 4
173
	b jump_to_kernel
158
	b jump_to_kernel
174
 
159
 
175
.org 0x600
160
.org 0x600
176
.global exc_alignment
161
.global exc_alignment
177
exc_alignment:
162
exc_alignment:
178
	CONTEXT_STORE
163
	CONTEXT_STORE
179
	
164
	
180
	li r3, 5
165
	li r3, 5
181
	b jump_to_kernel
166
	b jump_to_kernel
182
 
167
 
183
.org 0x700
168
.org 0x700
184
.global exc_program
169
.global exc_program
185
exc_program:
170
exc_program:
186
	CONTEXT_STORE
171
	CONTEXT_STORE
187
	
172
	
188
	li r3, 6
173
	li r3, 6
189
	b jump_to_kernel
174
	b jump_to_kernel
190
 
175
 
191
.org 0x800
176
.org 0x800
192
.global exc_fp_unavailable
177
.global exc_fp_unavailable
193
exc_fp_unavailable:
178
exc_fp_unavailable:
194
	CONTEXT_STORE
179
	CONTEXT_STORE
195
	
180
	
196
	li r3, 7
181
	li r3, 7
197
	b jump_to_kernel
182
	b jump_to_kernel
198
 
183
 
199
.org 0x900
184
.org 0x900
200
.global exc_decrementer
185
.global exc_decrementer
201
exc_decrementer:
186
exc_decrementer:
202
	CONTEXT_STORE
187
	CONTEXT_STORE
203
	
188
	
204
	li r3, 8
189
	li r3, 8
205
	b jump_to_kernel
190
	b jump_to_kernel
206
 
191
 
207
.org 0xa00
192
.org 0xa00
208
.global exc_reserved0
193
.global exc_reserved0
209
exc_reserved0:
194
exc_reserved0:
210
	CONTEXT_STORE
195
	CONTEXT_STORE
211
	
196
	
212
	li r3, 9
197
	li r3, 9
213
	b jump_to_kernel
198
	b jump_to_kernel
214
 
199
 
215
.org 0xb00
200
.org 0xb00
216
.global exc_reserved1
201
.global exc_reserved1
217
exc_reserved1:
202
exc_reserved1:
218
	CONTEXT_STORE
203
	CONTEXT_STORE
219
	
204
	
220
	li r3, 10
205
	li r3, 10
221
	b jump_to_kernel
206
	b jump_to_kernel
222
 
207
 
223
.org 0xc00
208
.org 0xc00
224
.global exc_syscall
209
.global exc_syscall
225
exc_syscall:
210
exc_syscall:
226
	CONTEXT_STORE	
211
	CONTEXT_STORE
227
	
212
	
228
	b jump_to_kernel_syscall
213
	b jump_to_kernel_syscall
229
 
214
 
230
.org 0xd00
215
.org 0xd00
231
.global exc_trace
216
.global exc_trace
232
exc_trace:
217
exc_trace:
233
	CONTEXT_STORE
218
	CONTEXT_STORE
234
	
219
	
235
	li r3, 12
220
	li r3, 12
236
	b jump_to_kernel
221
	b jump_to_kernel
237
 
222
 
-
 
223
.org 0x1000
-
 
224
.global exc_itlb_miss
-
 
225
exc_itlb_miss:
-
 
226
	CONTEXT_STORE
-
 
227
	
-
 
228
	b tlb_miss
-
 
229
 
-
 
230
.org 0x1100
-
 
231
.global exc_dtlb_miss_load
-
 
232
exc_dtlb_miss_load:
-
 
233
	CONTEXT_STORE
-
 
234
	
-
 
235
	b tlb_miss
-
 
236
 
-
 
237
.org 0x1200
-
 
238
.global exc_dtlb_miss_store
-
 
239
exc_dtlb_miss_store:
-
 
240
	CONTEXT_STORE
-
 
241
	
-
 
242
	b tlb_miss
-
 
243
 
238
.org 0x4000
244
.org 0x4000
-
 
245
data_storage:
-
 
246
	li r3, 2
-
 
247
	mr r4, sp
-
 
248
	addi r4, r4, 8
-
 
249
	bl pht_refill_real
-
 
250
	
-
 
251
	cmpwi r3, 0
-
 
252
	bne iret_real
-
 
253
	
-
 
254
	li r3, 2
-
 
255
	b jump_to_kernel
-
 
256
 
-
 
257
instruction_storage:
-
 
258
	li r3, 3
-
 
259
	mr r4, sp
-
 
260
	addi r4, r4, 8
-
 
261
	bl pht_refill_real
-
 
262
	
-
 
263
	cmpwi r3, 0
-
 
264
	bne iret_real
-
 
265
	
-
 
266
	li r3, 3
-
 
267
	b jump_to_kernel
-
 
268
 
-
 
269
tlb_miss:
-
 
270
	li r3, 16
-
 
271
	mfspr r4, tlbmiss
-
 
272
	mfspr r5, ptehi
-
 
273
	mfspr r6, ptelo
-
 
274
	mr r7, sp
-
 
275
	addi r7, r7, 20
-
 
276
	
-
 
277
	bl tlb_refill_real
-
 
278
	b iret_real
-
 
279
 
239
jump_to_kernel:
280
jump_to_kernel:
240
	lis r12, iret@ha
281
	lis r12, iret@ha
241
	addi r12, r12, iret@l
282
	addi r12, r12, iret@l
242
	mtlr r12
283
	mtlr r12
243
	
284
	
244
	lis r12, exc_dispatch@ha
285
	lis r12, exc_dispatch@ha
245
	addi r12, r12, exc_dispatch@l
286
	addi r12, r12, exc_dispatch@l
246
	mtsrr0 r12
287
	mtsrr0 r12
247
	
288
	
248
	mfmsr r12
289
	mfmsr r12
249
	ori r12, r12, (msr_ir | msr_dr)@l
290
	ori r12, r12, (msr_ir | msr_dr)@l
250
	mtsrr1 r12
291
	mtsrr1 r12
251
	
292
	
252
	addis sp, sp, 0x8000
293
	addis sp, sp, 0x8000
253
	mr r4, sp
294
	mr r4, sp
254
	addi r4, r4, 8
295
	addi r4, r4, 8
255
	
296
	
256
	rfi
297
	rfi
257
 
298
 
258
jump_to_kernel_syscall:
299
jump_to_kernel_syscall:
259
	lis r12, syscall_handler@ha
300
	lis r12, syscall_handler@ha
260
	addi r12, r12, syscall_handler@l
301
	addi r12, r12, syscall_handler@l
261
	mtsrr0 r12
302
	mtsrr0 r12
262
	
303
	
263
	lis r12, iret_syscall@ha
304
	lis r12, iret_syscall@ha
264
	addi r12, r12, iret_syscall@l
305
	addi r12, r12, iret_syscall@l
265
	mtlr r12
306
	mtlr r12
266
	
307
	
267
	mfmsr r12
308
	mfmsr r12
268
	ori r12, r12, (msr_ir | msr_dr)@l
309
	ori r12, r12, (msr_ir | msr_dr)@l
269
	mtsrr1 r12
310
	mtsrr1 r12
270
	
311
	
271
	addis sp, sp, 0x8000
312
	addis sp, sp, 0x8000
272
	rfi
313
	rfi
273
 
314
 
274
iret_real:
315
iret_real:
275
	
-
 
276
	lwz r0, 8(sp)
316
	lwz r0, 8(sp)
277
	lwz r2, 12(sp)
317
	lwz r2, 12(sp)
278
	lwz r3, 16(sp)
318
	lwz r3, 16(sp)
279
	lwz r4, 20(sp)
319
	lwz r4, 20(sp)
280
	lwz r5, 24(sp)
320
	lwz r5, 24(sp)
281
	lwz r6, 28(sp)
321
	lwz r6, 28(sp)
282
	lwz r7, 32(sp)
322
	lwz r7, 32(sp)
283
	lwz r8, 36(sp)
323
	lwz r8, 36(sp)
284
	lwz r9, 40(sp)
324
	lwz r9, 40(sp)
285
	lwz r10, 44(sp)
325
	lwz r10, 44(sp)
286
	lwz r11, 48(sp)
326
	lwz r11, 48(sp)
287
	lwz r13, 52(sp)
327
	lwz r13, 52(sp)
288
	lwz r14, 56(sp)
328
	lwz r14, 56(sp)
289
	lwz r15, 60(sp)
329
	lwz r15, 60(sp)
290
	lwz r16, 64(sp)
330
	lwz r16, 64(sp)
291
	lwz r17, 68(sp)
331
	lwz r17, 68(sp)
292
	lwz r18, 72(sp)
332
	lwz r18, 72(sp)
293
	lwz r19, 76(sp)
333
	lwz r19, 76(sp)
294
	lwz r20, 80(sp)
334
	lwz r20, 80(sp)
295
	lwz r21, 84(sp)
335
	lwz r21, 84(sp)
296
	lwz r22, 88(sp)
336
	lwz r22, 88(sp)
297
	lwz r23, 92(sp)
337
	lwz r23, 92(sp)
298
	lwz r24, 96(sp)
338
	lwz r24, 96(sp)
299
	lwz r25, 100(sp)
339
	lwz r25, 100(sp)
300
	lwz r26, 104(sp)
340
	lwz r26, 104(sp)
301
	lwz r27, 108(sp)
341
	lwz r27, 108(sp)
302
	lwz r28, 112(sp)
342
	lwz r28, 112(sp)
303
	lwz r29, 116(sp)
343
	lwz r29, 116(sp)
304
	lwz r30, 120(sp)
344
	lwz r30, 120(sp)
305
	lwz r31, 124(sp)
345
	lwz r31, 124(sp)
306
	
346
	
307
	lwz r12, 128(sp)
347
	lwz r12, 128(sp)
308
	mtcr r12
348
	mtcr r12
309
	
349
	
310
	lwz r12, 132(sp)
350
	lwz r12, 132(sp)
311
	mtsrr0 r12
351
	mtsrr0 r12
312
	
352
	
313
	lwz r12, 136(sp)
353
	lwz r12, 136(sp)
314
	mtsrr1 r12
354
	mtsrr1 r12
315
	
355
	
316
	lwz r12, 140(sp)
356
	lwz r12, 140(sp)
317
	mtlr r12
357
	mtlr r12
318
	
358
	
319
	lwz r12, 144(sp)
359
	lwz r12, 144(sp)
320
	mtctr r12
360
	mtctr r12
321
	
361
	
322
	lwz r12, 148(sp)
362
	lwz r12, 148(sp)
323
	mtxer r12
363
	mtxer r12
324
	
364
	
325
	lwz r12, 152(sp)
365
	lwz r12, 156(sp)
326
	lwz sp, 156(sp)
366
	lwz sp, 160(sp)
327
	
367
	
328
	rfi
368
	rfi
329
 
369