Subversion Repositories HelenOS-historic

Rev

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

Rev 1726 Rev 1730
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, 160
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
	mfsprg1 r12
113
	stw r12, 152(sp)
113
	stw r12, 152(sp)
114
	
114
	
115
	mfsprg2 r12
115
	mfsprg2 r12
116
	stw r12, 156(sp)
116
	stw r12, 156(sp)
117
.endm
117
.endm
118
 
118
 
119
.org 0x100
119
.org 0x100
120
.global exc_system_reset
120
.global exc_system_reset
121
exc_system_reset:
121
exc_system_reset:
122
	CONTEXT_STORE
122
	CONTEXT_STORE
123
	
123
	
124
	li r3, 0
124
	li r3, 0
125
	b jump_to_kernel
125
	b jump_to_kernel
126
 
126
 
127
.org 0x200
127
.org 0x200
128
.global exc_machine_check
128
.global exc_machine_check
129
exc_machine_check:
129
exc_machine_check:
130
	CONTEXT_STORE
130
	CONTEXT_STORE
131
	
131
	
132
	li r3, 1
132
	li r3, 1
133
	b jump_to_kernel
133
	b jump_to_kernel
134
 
134
 
135
.org 0x300
135
.org 0x300
136
.global exc_data_storage
136
.global exc_data_storage
137
exc_data_storage:
137
exc_data_storage:
138
	CONTEXT_STORE
138
	CONTEXT_STORE
139
	
139
	
140
#	li r3, 2
140
	li r3, 2
141
#	mr r4, sp
141
	mr r4, sp
142
#	addi r4, r4, 8
142
	addi r4, r4, 8
143
#	bl pht_real_refill
143
	bl pht_real_refill
144
	
144
	
145
#	cmpwi r3, 0
145
	cmpwi r3, 0
146
#	bne iret_real
146
	bne iret_real
147
	
147
	
148
	li r3, 2
148
	li r3, 2
149
	b jump_to_kernel
149
	b jump_to_kernel
150
 
150
 
151
.org 0x400
151
.org 0x400
152
.global exc_instruction_storage
152
.global exc_instruction_storage
153
exc_instruction_storage:
153
exc_instruction_storage:
154
	CONTEXT_STORE
154
	CONTEXT_STORE
155
	
155
	
156
#	li r3, 3
156
	li r3, 3
157
#	mr r4, sp
157
	mr r4, sp
158
#	addi r4, r4, 8
158
	addi r4, r4, 8
159
#	bl pht_real_refill
159
	bl pht_real_refill
160
	
160
	
161
#	cmpwi r3, 0
161
	cmpwi r3, 0
162
#	bne iret_real
162
	bne iret_real
163
 
163
 
164
	li r3, 3
164
	li r3, 3
165
	b jump_to_kernel
165
	b jump_to_kernel
166
 
166
 
167
.org 0x500
167
.org 0x500
168
.global exc_external
168
.global exc_external
169
exc_external:
169
exc_external:
170
	CONTEXT_STORE
170
	CONTEXT_STORE
171
	
171
	
172
	li r3, 4
172
	li r3, 4
173
	b jump_to_kernel
173
	b jump_to_kernel
174
 
174
 
175
.org 0x600
175
.org 0x600
176
.global exc_alignment
176
.global exc_alignment
177
exc_alignment:
177
exc_alignment:
178
	CONTEXT_STORE
178
	CONTEXT_STORE
179
	
179
	
180
	li r3, 5
180
	li r3, 5
181
	b jump_to_kernel
181
	b jump_to_kernel
182
 
182
 
183
.org 0x700
183
.org 0x700
184
.global exc_program
184
.global exc_program
185
exc_program:
185
exc_program:
186
	CONTEXT_STORE
186
	CONTEXT_STORE
187
	
187
	
188
	li r3, 6
188
	li r3, 6
189
	b jump_to_kernel
189
	b jump_to_kernel
190
 
190
 
191
.org 0x800
191
.org 0x800
192
.global exc_fp_unavailable
192
.global exc_fp_unavailable
193
exc_fp_unavailable:
193
exc_fp_unavailable:
194
	CONTEXT_STORE
194
	CONTEXT_STORE
195
	
195
	
196
	li r3, 7
196
	li r3, 7
197
	b jump_to_kernel
197
	b jump_to_kernel
198
 
198
 
199
.org 0x900
199
.org 0x900
200
.global exc_decrementer
200
.global exc_decrementer
201
exc_decrementer:
201
exc_decrementer:
202
	CONTEXT_STORE
202
	CONTEXT_STORE
203
	
203
	
204
	li r3, 8
204
	li r3, 8
205
	b jump_to_kernel
205
	b jump_to_kernel
206
 
206
 
207
.org 0xa00
207
.org 0xa00
208
.global exc_reserved0
208
.global exc_reserved0
209
exc_reserved0:
209
exc_reserved0:
210
	CONTEXT_STORE
210
	CONTEXT_STORE
211
	
211
	
212
	li r3, 9
212
	li r3, 9
213
	b jump_to_kernel
213
	b jump_to_kernel
214
 
214
 
215
.org 0xb00
215
.org 0xb00
216
.global exc_reserved1
216
.global exc_reserved1
217
exc_reserved1:
217
exc_reserved1:
218
	CONTEXT_STORE
218
	CONTEXT_STORE
219
	
219
	
220
	li r3, 10
220
	li r3, 10
221
	b jump_to_kernel
221
	b jump_to_kernel
222
 
222
 
223
.org 0xc00
223
.org 0xc00
224
.global exc_syscall
224
.global exc_syscall
225
exc_syscall:
225
exc_syscall:
226
	CONTEXT_STORE	
226
	CONTEXT_STORE	
227
	
227
	
228
	b jump_to_kernel_syscall
228
	b jump_to_kernel_syscall
229
 
229
 
230
.org 0xd00
230
.org 0xd00
231
.global exc_trace
231
.global exc_trace
232
exc_trace:
232
exc_trace:
233
	CONTEXT_STORE
233
	CONTEXT_STORE
234
	
234
	
235
	li r3, 12
235
	li r3, 12
236
	b jump_to_kernel
236
	b jump_to_kernel
237
 
237
 
238
.org 0x4000
238
.org 0x4000
239
jump_to_kernel:
239
jump_to_kernel:
240
	lis r12, iret@ha
240
	lis r12, iret@ha
241
	addi r12, r12, iret@l
241
	addi r12, r12, iret@l
242
	mtlr r12
242
	mtlr r12
243
	
243
	
244
	lis r12, exc_dispatch@ha
244
	lis r12, exc_dispatch@ha
245
	addi r12, r12, exc_dispatch@l
245
	addi r12, r12, exc_dispatch@l
246
	mtsrr0 r12
246
	mtsrr0 r12
247
	
247
	
248
	mfmsr r12
248
	mfmsr r12
249
	ori r12, r12, (msr_ir | msr_dr)@l
249
	ori r12, r12, (msr_ir | msr_dr)@l
250
	mtsrr1 r12
250
	mtsrr1 r12
251
	
251
	
252
	addis sp, sp, 0x8000
252
	addis sp, sp, 0x8000
253
	mr r4, sp
253
	mr r4, sp
254
	addi r4, r4, 8
254
	addi r4, r4, 8
255
	
255
	
256
	rfi
256
	rfi
257
 
257
 
258
jump_to_kernel_syscall:
258
jump_to_kernel_syscall:
259
	lis r12, syscall_handler@ha
259
	lis r12, syscall_handler@ha
260
	addi r12, r12, syscall_handler@l
260
	addi r12, r12, syscall_handler@l
261
	mtsrr0 r12
261
	mtsrr0 r12
262
	
262
	
263
	lis r12, iret_syscall@ha
263
	lis r12, iret_syscall@ha
264
	addi r12, r12, iret_syscall@l
264
	addi r12, r12, iret_syscall@l
265
	mtlr r12
265
	mtlr r12
266
	
266
	
267
	mfmsr r12
267
	mfmsr r12
268
	ori r12, r12, (msr_ir | msr_dr)@l
268
	ori r12, r12, (msr_ir | msr_dr)@l
269
	mtsrr1 r12
269
	mtsrr1 r12
270
	
270
	
271
	addis sp, sp, 0x8000
271
	addis sp, sp, 0x8000
272
	rfi
272
	rfi
273
 
273
 
274
iret_real:
274
iret_real:
275
	
275
	
276
	lwz r0, 8(sp)
276
	lwz r0, 8(sp)
277
	lwz r2, 12(sp)
277
	lwz r2, 12(sp)
278
	lwz r3, 16(sp)
278
	lwz r3, 16(sp)
279
	lwz r4, 20(sp)
279
	lwz r4, 20(sp)
280
	lwz r5, 24(sp)
280
	lwz r5, 24(sp)
281
	lwz r6, 28(sp)
281
	lwz r6, 28(sp)
282
	lwz r7, 32(sp)
282
	lwz r7, 32(sp)
283
	lwz r8, 36(sp)
283
	lwz r8, 36(sp)
284
	lwz r9, 40(sp)
284
	lwz r9, 40(sp)
285
	lwz r10, 44(sp)
285
	lwz r10, 44(sp)
286
	lwz r11, 48(sp)
286
	lwz r11, 48(sp)
287
	lwz r13, 52(sp)
287
	lwz r13, 52(sp)
288
	lwz r14, 56(sp)
288
	lwz r14, 56(sp)
289
	lwz r15, 60(sp)
289
	lwz r15, 60(sp)
290
	lwz r16, 64(sp)
290
	lwz r16, 64(sp)
291
	lwz r17, 68(sp)
291
	lwz r17, 68(sp)
292
	lwz r18, 72(sp)
292
	lwz r18, 72(sp)
293
	lwz r19, 76(sp)
293
	lwz r19, 76(sp)
294
	lwz r20, 80(sp)
294
	lwz r20, 80(sp)
295
	lwz r21, 84(sp)
295
	lwz r21, 84(sp)
296
	lwz r22, 88(sp)
296
	lwz r22, 88(sp)
297
	lwz r23, 92(sp)
297
	lwz r23, 92(sp)
298
	lwz r24, 96(sp)
298
	lwz r24, 96(sp)
299
	lwz r25, 100(sp)
299
	lwz r25, 100(sp)
300
	lwz r26, 104(sp)
300
	lwz r26, 104(sp)
301
	lwz r27, 108(sp)
301
	lwz r27, 108(sp)
302
	lwz r28, 112(sp)
302
	lwz r28, 112(sp)
303
	lwz r29, 116(sp)
303
	lwz r29, 116(sp)
304
	lwz r30, 120(sp)
304
	lwz r30, 120(sp)
305
	lwz r31, 124(sp)
305
	lwz r31, 124(sp)
306
	
306
	
307
	lwz r12, 128(sp)
307
	lwz r12, 128(sp)
308
	mtcr r12
308
	mtcr r12
309
	
309
	
310
	lwz r12, 132(sp)
310
	lwz r12, 132(sp)
311
	mtsrr0 r12
311
	mtsrr0 r12
312
	
312
	
313
	lwz r12, 136(sp)
313
	lwz r12, 136(sp)
314
	mtsrr1 r12
314
	mtsrr1 r12
315
	
315
	
316
	lwz r12, 140(sp)
316
	lwz r12, 140(sp)
317
	mtlr r12
317
	mtlr r12
318
	
318
	
319
	lwz r12, 144(sp)
319
	lwz r12, 144(sp)
320
	mtctr r12
320
	mtctr r12
321
	
321
	
322
	lwz r12, 148(sp)
322
	lwz r12, 148(sp)
323
	mtxer r12
323
	mtxer r12
324
	
324
	
325
	lwz r12, 152(sp)
325
	lwz r12, 152(sp)
326
	lwz sp, 156(sp)
326
	lwz sp, 156(sp)
327
	
327
	
328
	rfi
328
	rfi
329
 
329