Subversion Repositories HelenOS

Rev

Rev 2787 | Details | Compare with Previous | Last modification | View Log | RSS feed

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