Subversion Repositories HelenOS-historic

Rev

Rev 1609 | Rev 1726 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
987 decky 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>
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
 
1355 decky 63
	subi sp, sp, 160
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
 
112
	mfsprg1 r12
1355 decky 113
	stw r12, 152(sp)
1277 decky 114
 
115
	mfsprg2 r12
1355 decky 116
	stw r12, 156(sp)
1215 decky 117
.endm
1004 decky 118
 
1215 decky 119
.org 0x100
120
.global exc_system_reset
121
exc_system_reset:
1609 decky 122
	CONTEXT_STORE
123
 
124
	lis r12, exc_dispatch@ha
125
	addi r12, r12, exc_dispatch@l
126
	mtsrr0 r12
127
 
128
	li r3, 0
129
	b jump_to_kernel
1215 decky 130
 
131
.org 0x200
132
.global exc_machine_check
133
exc_machine_check:
1609 decky 134
	CONTEXT_STORE
135
 
136
	lis r12, exc_dispatch@ha
137
	addi r12, r12, exc_dispatch@l
138
	mtsrr0 r12
139
 
140
	li r3, 1
141
	b jump_to_kernel
1215 decky 142
 
143
.org 0x300
144
.global exc_data_storage
145
exc_data_storage:
146
	CONTEXT_STORE
1267 decky 147
 
1609 decky 148
	lis r12, exc_dispatch@ha
149
	addi r12, r12, exc_dispatch@l
1277 decky 150
	mtsrr0 r12
1215 decky 151
 
1609 decky 152
	li r3, 2
1277 decky 153
	b jump_to_kernel
1215 decky 154
 
155
.org 0x400
156
.global exc_instruction_storage
157
exc_instruction_storage:
1267 decky 158
	CONTEXT_STORE
159
 
1609 decky 160
	lis r12, exc_dispatch@ha
161
	addi r12, r12, exc_dispatch@l
1277 decky 162
	mtsrr0 r12
1267 decky 163
 
1609 decky 164
	li r3, 3
1277 decky 165
	b jump_to_kernel
1215 decky 166
 
167
.org 0x500
168
.global exc_external
169
exc_external:
1480 palkovsky 170
	CONTEXT_STORE
1609 decky 171
 
172
	lis r12, exc_dispatch@ha
173
	addi r12, r12, exc_dispatch@l
1480 palkovsky 174
	mtsrr0 r12
1609 decky 175
 
176
	li r3, 4
1480 palkovsky 177
	b jump_to_kernel
178
 
1215 decky 179
.org 0x600
180
.global exc_alignment
181
exc_alignment:
1609 decky 182
	CONTEXT_STORE
183
 
184
	lis r12, exc_dispatch@ha
185
	addi r12, r12, exc_dispatch@l
186
	mtsrr0 r12
187
 
188
	li r3, 5
189
	b jump_to_kernel
1215 decky 190
 
191
.org 0x700
192
.global exc_program
193
exc_program:
1609 decky 194
	CONTEXT_STORE
195
 
196
	lis r12, exc_dispatch@ha
197
	addi r12, r12, exc_dispatch@l
198
	mtsrr0 r12
199
 
200
	li r3, 6
201
	b jump_to_kernel
1215 decky 202
 
203
.org 0x800
204
.global exc_fp_unavailable
205
exc_fp_unavailable:
1609 decky 206
	CONTEXT_STORE
207
 
208
	lis r12, exc_dispatch@ha
209
	addi r12, r12, exc_dispatch@l
210
	mtsrr0 r12
211
 
212
	li r3, 7
213
	b jump_to_kernel
1215 decky 214
 
215
.org 0x900
216
.global exc_decrementer
217
exc_decrementer:
1384 decky 218
	CONTEXT_STORE
1215 decky 219
 
1277 decky 220
	lis r12, exc_dispatch@ha
221
	addi r12, r12, exc_dispatch@l
222
	mtsrr0 r12
1004 decky 223
 
1609 decky 224
	li r3, 8
1277 decky 225
	b jump_to_kernel
987 decky 226
 
227
.org 0xa00
228
.global exc_reserved0
229
exc_reserved0:
1609 decky 230
	CONTEXT_STORE
231
 
232
	lis r12, exc_dispatch@ha
233
	addi r12, r12, exc_dispatch@l
234
	mtsrr0 r12
235
 
236
	li r3, 9
237
	b jump_to_kernel
987 decky 238
 
239
.org 0xb00
240
.global exc_reserved1
241
exc_reserved1:
1609 decky 242
	CONTEXT_STORE
243
 
244
	lis r12, exc_dispatch@ha
245
	addi r12, r12, exc_dispatch@l
246
	mtsrr0 r12
247
 
248
	li r3, 10
249
	b jump_to_kernel
987 decky 250
 
251
.org 0xc00
252
.global exc_syscall
253
exc_syscall:
1277 decky 254
	CONTEXT_STORE	
255
 
256
	b jump_to_kernel_syscall
987 decky 257
 
258
.org 0xd00
259
.global exc_trace
260
exc_trace:
1609 decky 261
	CONTEXT_STORE
262
 
263
	lis r12, exc_dispatch@ha
264
	addi r12, r12, exc_dispatch@l
265
	mtsrr0 r12
266
 
267
	li r3, 12
268
	b jump_to_kernel
1716 decky 269
 
270
.org 0x4000
271
jump_to_kernel:
272
	lis r12, iret@ha
273
	addi r12, r12, iret@l
274
	mtlr r12
275
 
276
	mfmsr r12
277
	ori r12, r12, (msr_ir | msr_dr)@l
278
	mtsrr1 r12
279
 
280
	addis sp, sp, 0x8000
281
	mr r4, sp
282
	addi r4, r4, 8
283
 
284
	rfi
285
 
286
jump_to_kernel_syscall:
287
	lis r12, syscall_handler@ha
288
	addi r12, r12, syscall_handler@l
289
	mtsrr0 r12
290
 
291
	lis r12, iret_syscall@ha
292
	addi r12, r12, iret_syscall@l
293
	mtlr r12
294
 
295
	mfmsr r12
296
	ori r12, r12, (msr_ir | msr_dr)@l
297
	mtsrr1 r12
298
 
299
	addis sp, sp, 0x8000
300
	rfi