Subversion Repositories HelenOS

Rev

Rev 1269 | Go to most recent revision | Only display areas with differences | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 1269 Rev 1277
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 SP in SPRG1
36
	# save R12 in SPRG1, backup CR in R12
37
	# save R12 in SPRG2, backup CR in R12
37
	# save SP in SPRG2
38
 
38
 
39
	mtsprg1 sp
-
 
40
	mtsprg2 r12
39
	mtsprg1 r12
41
	mfcr r12
40
	mfcr r12
-
 
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
		mfsprg1 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, 140
63
	subi sp, sp, 148
64
	stw r0, 0(sp)
64
	stw r0, 0(sp)
65
	stw r2, 4(sp)
65
	stw r2, 4(sp)
66
	stw r3, 8(sp)
66
	stw r3, 8(sp)
67
	stw r4, 12(sp)
67
	stw r4, 12(sp)
68
	stw r5, 16(sp)
68
	stw r5, 16(sp)
69
	stw r6, 20(sp)
69
	stw r6, 20(sp)
70
	stw r7, 24(sp)
70
	stw r7, 24(sp)
71
	stw r8, 28(sp)
71
	stw r8, 28(sp)
72
	stw r9, 32(sp)
72
	stw r9, 32(sp)
73
	stw r10, 36(sp)
73
	stw r10, 36(sp)
74
	stw r11, 40(sp)
74
	stw r11, 40(sp)
75
	stw r13, 44(sp)
75
	stw r13, 44(sp)
76
	stw r14, 48(sp)
76
	stw r14, 48(sp)
77
	stw r15, 52(sp)
77
	stw r15, 52(sp)
78
	stw r16, 56(sp)
78
	stw r16, 56(sp)
79
	stw r17, 60(sp)
79
	stw r17, 60(sp)
80
	stw r18, 64(sp)
80
	stw r18, 64(sp)
81
	stw r19, 68(sp)
81
	stw r19, 68(sp)
82
	stw r20, 72(sp)
82
	stw r20, 72(sp)
83
	stw r21, 76(sp)
83
	stw r21, 76(sp)
84
	stw r22, 80(sp)
84
	stw r22, 80(sp)
85
	stw r23, 84(sp)
85
	stw r23, 84(sp)
86
	stw r24, 88(sp)
86
	stw r24, 88(sp)
87
	stw r25, 92(sp)
87
	stw r25, 92(sp)
88
	stw r26, 96(sp)
88
	stw r26, 96(sp)
89
	stw r27, 100(sp)
89
	stw r27, 100(sp)
90
	stw r28, 104(sp)
90
	stw r28, 104(sp)
91
	stw r29, 108(sp)
91
	stw r29, 108(sp)
92
	stw r30, 112(sp)
92
	stw r30, 112(sp)
93
	stw r31, 116(sp)
93
	stw r31, 116(sp)
94
	
94
	
95
	mfsrr0 r3
-
 
96
	stw r3, 120(sp)
95
	stw r12, 120(sp)
97
	
96
	
98
	mfsrr1 r3
97
	mfsrr0 r12
99
	stw r3, 124(sp)
98
	stw r12, 124(sp)
100
	
99
	
101
	mflr r3
100
	mfsrr1 r12
102
	stw r3, 128(sp)
101
	stw r12, 128(sp)
103
	
102
	
-
 
103
	mflr r12
104
	stw r12, 132(sp)
104
	stw r12, 132(sp)
105
	
105
	
106
	mfctr r3
106
	mfctr r12
107
	stw r3, 136(sp)
107
	stw r12, 136(sp)
108
	
108
	
109
	mfxer r3
109
	mfxer r12
110
	stw r3, 140(sp)
110
	stw r12, 140(sp)
-
 
111
	
-
 
112
	mfsprg1 r12
-
 
113
	stw r12, 144(sp)
-
 
114
	
-
 
115
	mfsprg2 r12
-
 
116
	stw r12, 148(sp)
111
.endm
117
.endm
112
 
118
 
-
 
119
.org 0x060
-
 
120
jump_to_kernel:
-
 
121
	lis r12, iret@ha
-
 
122
	addi r12, r12, iret@l
-
 
123
	mtlr r12
-
 
124
 
-
 
125
	mfmsr r12
-
 
126
	ori r12, r12, (msr_ir | msr_dr)@l
-
 
127
	mtsrr1 r12
-
 
128
	
-
 
129
	addis sp, sp, 0x8000
-
 
130
	mr r4, sp
-
 
131
	rfi
-
 
132
 
-
 
133
jump_to_kernel_syscall:
-
 
134
	lis r12, syscall_handler@ha
-
 
135
	addi r12, r12, syscall_handler@l
-
 
136
	mtsrr0 r12
-
 
137
	
-
 
138
	lis r12, iret_syscall@ha
-
 
139
	addi r12, r12, iret_syscall@l
-
 
140
	mtlr r12
-
 
141
 
-
 
142
	mfmsr r12
-
 
143
	ori r12, r12, (msr_ir | msr_dr)@l
-
 
144
	mtsrr1 r12
-
 
145
	
-
 
146
	addis sp, sp, 0x8000
-
 
147
	rfi
-
 
148
 
113
.org 0x100
149
.org 0x100
114
.global exc_system_reset
150
.global exc_system_reset
115
exc_system_reset:
151
exc_system_reset:
116
	b exc_system_reset
152
	b exc_system_reset
117
 
153
 
118
.org 0x200
154
.org 0x200
119
.global exc_machine_check
155
.global exc_machine_check
120
exc_machine_check:
156
exc_machine_check:
121
	b exc_machine_check
157
	b exc_machine_check
122
 
158
 
123
.org 0x300
159
.org 0x300
124
.global exc_data_storage
160
.global exc_data_storage
125
exc_data_storage:
161
exc_data_storage:
126
	CONTEXT_STORE
162
	CONTEXT_STORE
127
	
163
	
128
	lis r3, pht_refill@ha
164
	lis r12, pht_refill@ha
129
	addi r3, r3, pht_refill@l
165
	addi r12, r12, pht_refill@l
130
	mtsrr0 r3
166
	mtsrr0 r12
131
	
-
 
132
	mfmsr r3
-
 
133
	ori r3, r3, (msr_ir | msr_dr)@l
-
 
134
	mtsrr1 r3
-
 
135
	
-
 
136
	lis r3, iret@ha
-
 
137
	addi r3, r3, iret@l
-
 
138
	mtlr r3
-
 
139
	
167
	
140
	addis sp, sp, 0x8000
-
 
141
	li r3, 1
168
	li r3, 1
142
	mr r4, sp
169
	b jump_to_kernel
143
	rfi
-
 
144
 
170
 
145
.org 0x400
171
.org 0x400
146
.global exc_instruction_storage
172
.global exc_instruction_storage
147
exc_instruction_storage:
173
exc_instruction_storage:
148
	CONTEXT_STORE
174
	CONTEXT_STORE
149
	
175
	
150
	lis r3, pht_refill@ha
176
	lis r12, pht_refill@ha
151
	addi r3, r3, pht_refill@l
177
	addi r12, r12, pht_refill@l
152
	mtsrr0 r3
178
	mtsrr0 r12
153
	
-
 
154
	mfmsr r3
-
 
155
	ori r3, r3, (msr_ir | msr_dr)@l
-
 
156
	mtsrr1 r3
-
 
157
	
-
 
158
	lis r3, iret@ha
-
 
159
	addi r3, r3, iret@l
-
 
160
	mtlr r3
-
 
161
	
179
	
162
	addis sp, sp, 0x8000
-
 
163
	li r3, 0
180
	li r3, 0
164
	mr r4, sp
181
	b jump_to_kernel
165
	rfi
-
 
166
 
182
 
167
.org 0x500
183
.org 0x500
168
.global exc_external
184
.global exc_external
169
exc_external:
185
exc_external:
170
	b exc_external
186
	b exc_external
171
 
187
 
172
.org 0x600
188
.org 0x600
173
.global exc_alignment
189
.global exc_alignment
174
exc_alignment:
190
exc_alignment:
175
	b exc_alignment
191
	b exc_alignment
176
 
192
 
177
.org 0x700
193
.org 0x700
178
.global exc_program
194
.global exc_program
179
exc_program:
195
exc_program:
180
	b exc_program
196
	b exc_program
181
 
197
 
182
.org 0x800
198
.org 0x800
183
.global exc_fp_unavailable
199
.global exc_fp_unavailable
184
exc_fp_unavailable:
200
exc_fp_unavailable:
185
	b exc_fp_unavailable
201
	b exc_fp_unavailable
186
 
202
 
187
.org 0x900
203
.org 0x900
188
.global exc_decrementer
204
.global exc_decrementer
189
exc_decrementer:
205
exc_decrementer:
190
	CONTEXT_STORE	
206
	CONTEXT_STORE	
191
 
207
 
192
	lis r3, exc_dispatch@ha
208
	lis r12, exc_dispatch@ha
193
	addi r3, r3, exc_dispatch@l
209
	addi r12, r12, exc_dispatch@l
194
	mtsrr0 r3
210
	mtsrr0 r12
195
	
-
 
196
	mfmsr r3
-
 
197
	ori r3, r3, (msr_ir | msr_dr)@l
-
 
198
	mtsrr1 r3
-
 
199
	
-
 
200
	lis r3, iret@ha
-
 
201
	addi r3, r3, iret@l
-
 
202
	mtlr r3
-
 
203
	
211
	
204
	addis sp, sp, 0x8000
-
 
205
	li r3, 10
212
	li r3, 10
206
	mr r4, sp
213
	b jump_to_kernel
207
	rfi
-
 
208
 
214
 
209
.org 0xa00
215
.org 0xa00
210
.global exc_reserved0
216
.global exc_reserved0
211
exc_reserved0:
217
exc_reserved0:
212
	b exc_reserved0
218
	b exc_reserved0
213
 
219
 
214
.org 0xb00
220
.org 0xb00
215
.global exc_reserved1
221
.global exc_reserved1
216
exc_reserved1:
222
exc_reserved1:
217
	b exc_reserved1
223
	b exc_reserved1
218
 
224
 
219
.org 0xc00
225
.org 0xc00
220
.global exc_syscall
226
.global exc_syscall
221
exc_syscall:
227
exc_syscall:
-
 
228
	CONTEXT_STORE	
-
 
229
	
222
	b exc_syscall
230
	b jump_to_kernel_syscall
223
 
231
 
224
.org 0xd00
232
.org 0xd00
225
.global exc_trace
233
.global exc_trace
226
exc_trace:
234
exc_trace:
227
	b exc_trace
235
	b exc_trace
228
 
236