Subversion Repositories HelenOS

Rev

Rev 3833 | Go to most recent revision | 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
 
3833 decky 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
 
3833 decky 112
	mfdar r12
1355 decky 113
	stw r12, 152(sp)
1277 decky 114
 
3833 decky 115
	mfsprg1 r12
116
	stw r12, 156(sp)
117
 
1277 decky 118
	mfsprg2 r12
3833 decky 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
 
3833 decky 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
 
3833 decky 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:
1277 decky 211
	CONTEXT_STORE	
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
 
223
.org 0x4000
3833 decky 224
data_storage:
225
	li r3, 2
226
	mr r4, sp
227
	addi r4, r4, 8
3837 decky 228
	bl pht_refill_real
3833 decky 229
 
230
	cmpwi r3, 0
231
	bne iret_real
232
 
233
	li r3, 2
234
	b jump_to_kernel
235
 
236
instruction_storage:
237
	li r3, 3
238
	mr r4, sp
239
	addi r4, r4, 8
3837 decky 240
	bl pht_refill_real
3833 decky 241
 
242
	cmpwi r3, 0
243
	bne iret_real
244
 
245
	li r3, 3
246
	b jump_to_kernel
247
 
1716 decky 248
jump_to_kernel:
249
	lis r12, iret@ha
250
	addi r12, r12, iret@l
251
	mtlr r12
1726 decky 252
 
253
	lis r12, exc_dispatch@ha
254
	addi r12, r12, exc_dispatch@l
255
	mtsrr0 r12
256
 
1716 decky 257
	mfmsr r12
258
	ori r12, r12, (msr_ir | msr_dr)@l
259
	mtsrr1 r12
260
 
261
	addis sp, sp, 0x8000
262
	mr r4, sp
263
	addi r4, r4, 8
264
 
265
	rfi
266
 
267
jump_to_kernel_syscall:
268
	lis r12, syscall_handler@ha
269
	addi r12, r12, syscall_handler@l
270
	mtsrr0 r12
271
 
272
	lis r12, iret_syscall@ha
273
	addi r12, r12, iret_syscall@l
274
	mtlr r12
1726 decky 275
 
1716 decky 276
	mfmsr r12
277
	ori r12, r12, (msr_ir | msr_dr)@l
278
	mtsrr1 r12
279
 
280
	addis sp, sp, 0x8000
281
	rfi
1726 decky 282
 
283
iret_real:
284
	lwz r0, 8(sp)
285
	lwz r2, 12(sp)
286
	lwz r3, 16(sp)
287
	lwz r4, 20(sp)
288
	lwz r5, 24(sp)
289
	lwz r6, 28(sp)
290
	lwz r7, 32(sp)
291
	lwz r8, 36(sp)
292
	lwz r9, 40(sp)
293
	lwz r10, 44(sp)
294
	lwz r11, 48(sp)
295
	lwz r13, 52(sp)
296
	lwz r14, 56(sp)
297
	lwz r15, 60(sp)
298
	lwz r16, 64(sp)
299
	lwz r17, 68(sp)
300
	lwz r18, 72(sp)
301
	lwz r19, 76(sp)
302
	lwz r20, 80(sp)
303
	lwz r21, 84(sp)
304
	lwz r22, 88(sp)
305
	lwz r23, 92(sp)
306
	lwz r24, 96(sp)
307
	lwz r25, 100(sp)
308
	lwz r26, 104(sp)
309
	lwz r27, 108(sp)
310
	lwz r28, 112(sp)
311
	lwz r29, 116(sp)
312
	lwz r30, 120(sp)
313
	lwz r31, 124(sp)
314
 
315
	lwz r12, 128(sp)
316
	mtcr r12
317
 
318
	lwz r12, 132(sp)
319
	mtsrr0 r12
320
 
321
	lwz r12, 136(sp)
322
	mtsrr1 r12
323
 
324
	lwz r12, 140(sp)
325
	mtlr r12
326
 
327
	lwz r12, 144(sp)
328
	mtctr r12
329
 
330
	lwz r12, 148(sp)
331
	mtxer r12
332
 
3833 decky 333
	lwz r12, 156(sp)
334
	lwz sp, 160(sp)
1726 decky 335
 
336
	rfi