source: mainline/kernel/arch/sparc32/src/trap_table.S@ 13c94f7

lfn serial ticket/834-toolchain-update topic/msim-upgrade topic/simplify-dev-export
Last change on this file since 13c94f7 was 13c94f7, checked in by Jakub Klama <jakub.klama@…>, 12 years ago
  • Further work on preemptible trap handlers
  • Implemented page fault handling
  • Initial syscall and userspace support
  • Property mode set to 100644
File size: 8.7 KB
Line 
1#
2# Copyright (c) 2013 Jakub Klama
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/trap.h>
30
31.text
32
33.global trap_table
34.global reset_trap
35.global preemptible_trap
36.global syscall_trap
37.global window_overflow_trap
38.global window_underflow_trap
39
40reset_trap:
41 set 0x80000100, %l0
42 set 'r', %l1
43 sta %l1, [%l0] 0x1c
44 rett
45
46window_overflow_trap:
47 /* rotate WIM on bit right, we have 8 windows */
48 mov %wim, %l3
49 sll %l3, 7, %l4
50 srl %l3, 1, %l3
51 or %l3, %l4, %l3
52 and %l3, 0xff, %l3
53
54 /* disable WIM traps */
55 mov %g0,%wim
56 nop; nop; nop
57
58 /* Check whether previous mode was usermode */
59 mov %psr, %l0
60 and %l0, (1 << 6), %l0
61 cmp %l0, 0
62 beq 1f
63 nop
64
65 /* dump registers to stack */
66 save
67 std %l0, [%sp + 0]
68 std %l2, [%sp + 8]
69 std %l4, [%sp + 16]
70 std %l6, [%sp + 24]
71 std %i0, [%sp + 32]
72 std %i2, [%sp + 40]
73 std %i4, [%sp + 48]
74 std %i6, [%sp + 56]
75 b 2f
76 nop
77
78 /* dump registers to uwb */
791: save
80 set uspace_wbuf, %g2
81 ld [%g1], %g1
82 std %l0, [%g1 + 0]
83 std %l2, [%g1 + 8]
84 std %l4, [%g1 + 16]
85 std %l6, [%g1 + 24]
86 std %i0, [%g1 + 32]
87 std %i2, [%g1 + 40]
88 std %i4, [%g1 + 48]
89 std %i6, [%g1 + 56]
90 add %g1, 64, %g1
91 st %g1, [%g2]
92
93 /* back to where we should be */
942: restore
95
96 /* set new value of window */
97 mov %l3,%wim
98 nop; nop; nop
99
100 /* go home */
101 jmp %l1
102 rett %l2
103
104window_underflow_trap:
105 /* rotate WIM on bit LEFT, we have 8 windows */
106 mov %wim,%l3
107 srl %l3,7,%l4
108 sll %l3,1,%l3
109 or %l3,%l4,%l3
110 and %l3, 0xff,%l3
111
112 /* disable WIM traps */
113 mov %g0,%wim
114 nop; nop; nop
115
116 /* Check whether previous mode was usermode */
117 mov %psr, %l0
118 and %l0, (1 << 6), %l0
119 cmp %l0, 0
120 beq 1f
121 nop
122
123 /* load registers from stack */
124 restore
125 restore
126 ldd [%sp + 0], %l0
127 ldd [%sp + 8], %l2
128 ldd [%sp + 16], %l4
129 ldd [%sp + 24], %l6
130 ldd [%sp + 32], %i0
131 ldd [%sp + 40], %i2
132 ldd [%sp + 48], %i4
133 ldd [%sp + 56], %i6
134 b 2f
135 nop
136
137 /* load registers from uwb */
1381: restore
139 restore
140 set uspace_wbuf, %g2
141 ld [%g2], %g1
142 ldd [%g1 + 0], %l0
143 ldd [%g1 + 8], %l2
144 ldd [%g1 + 16], %l4
145 ldd [%g1 + 24], %l6
146 ldd [%g1 + 32], %i0
147 ldd [%g1 + 40], %i2
148 ldd [%g1 + 48], %i4
149 ldd [%g1 + 56], %i6
150 sub %g1, 64, %g1
151 st %g1, [%g2]
152
153 /* back to where we should be */
1542: save
155 save
156
157 /* set new value of window */
158 mov %l3,%wim
159 nop; nop; nop
160
161 /* go home */
162 jmp %l1
163 rett %l2
164
165preemptible_trap:
166 mov %psr, %l0
167
168 /* Check whether previous mode was usermode */
169 and %l0, (1 << 6), %l0
170 cmp %l0, 0
171 bne 1f
172 nop
173
174 /* Set up stack */
175 set kernel_sp, %l4
176 ld [%l4], %sp
177 mov %sp, %fp
1781: sub %sp, 112, %sp
179
180 /* Save trap data on stack */
181 mov %psr, %l0
182 st %l1, [%fp - 4]
183 st %l2, [%fp - 8]
184 st %l0, [%fp - 12]
185
186 /* Enable traps */
187 mov %psr, %l0
188 or %l0, (1 << 5), %l0
189 mov %l0, %psr
190 nop
191 nop
192 nop
193 nop
194
195 /* Jump to actual subroutine */
196 mov %g2, %o0
197 call %g1
198 sub %fp, 12, %o1
199
200 /* Return from handler */
201 ld [%fp - 4], %l1
202 ld [%fp - 8], %l2
203 ld [%fp - 12], %l0
204 mov %l0, %psr
205 nop
206 nop
207 nop
208 nop
209 nop
210 jmp %l1
211 rett %l2
212
213syscall_trap:
214 mov %psr, %l0
215
216 /* Set up stack */
217 set kernel_sp, %l4
218 ld [%l4], %sp
219 mov %sp, %fp
220 sub %sp, 112, %sp
221
222 /* Save trap data on stack */
223 mov %psr, %l0
224 st %l1, [%fp - 4]
225 st %l2, [%fp - 8]
226 st %l0, [%fp - 12]
227
228 /* Enable traps */
229 mov %psr, %l0
230 or %l0, (1 << 5), %l0
231 mov %l0, %psr
232 nop
233 nop
234 nop
235 nop
236
237 /* Jump to actual subroutine */
238 sub %g2, 0x80, %g2
239 st %g2, [ %sp + 92 ]
240 mov %i0, %o1
241 mov %i1, %o1
242 mov %i2, %o2
243 mov %i3, %o3
244 mov %i4, %o4
245 call syscall
246 mov %i5, %o5
247
248 /* Return from handler */
249 ld [%fp - 4], %l1
250 ld [%fp - 8], %l2
251 ld [%fp - 12], %l0
252 mov %l0, %psr
253 nop
254 nop
255 nop
256 nop
257 nop
258 jmp %l2
259 rett %l2 + 4
260
261#define STRAP(_vector, _handler) \
262 .org trap_table + _vector * TRAP_ENTRY_SIZE; \
263 mov %psr, %l0 ; \
264 sethi %hi(_handler), %l4 ; \
265 jmp %lo(_handler) + %l4 ; \
266 nop
267
268#define TRAP(_vector, _handler) \
269 .org trap_table + _vector * TRAP_ENTRY_SIZE; \
270 set _vector, %g2 ; \
271 sethi %hi(_handler), %g1 ; \
272 b preemptible_trap ; \
273 or %g1, %lo(_handler), %g1 ;
274
275#define SYSCALL(_vector) \
276 .org trap_table + _vector * TRAP_ENTRY_SIZE; \
277 set _vector, %g2 ; \
278 b syscall_trap ; \
279 nop ;
280
281#define INTERRUPT(_vector, _priority) \
282 .org trap_table + _vector * TRAP_ENTRY_SIZE; \
283 mov %psr, %l0 ; \
284 mov _priority, %g2 ; \
285 call exc_dispatch ; \
286 nop ;
287
288#define BADTRAP(_vector) \
289 .org trap_table + _vector * TRAP_ENTRY_SIZE ; \
290 ta 0 ;
291
292.align TRAP_TABLE_SIZE
293trap_table:
294 TRAP(0x0, reset_trap)
295 TRAP(0x1, instruction_access_exception)
296 TRAP(0x2, illegal_instruction)
297 TRAP(0x3, privileged_instruction)
298 TRAP(0x4, fp_disabled)
299 STRAP(0x5, window_overflow_trap)
300 STRAP(0x6, window_underflow_trap)
301 TRAP(0x7, mem_address_not_aligned)
302 TRAP(0x8, fp_exception)
303 TRAP(0x9, data_access_exception)
304 TRAP(0xa, tag_overflow)
305 BADTRAP(0xb)
306 BADTRAP(0xc)
307 BADTRAP(0xd)
308 BADTRAP(0xe)
309 BADTRAP(0xf)
310 BADTRAP(0x10)
311 INTERRUPT(0x11, 1)
312 INTERRUPT(0x12, 2)
313 INTERRUPT(0x13, 3)
314 INTERRUPT(0x14, 4)
315 INTERRUPT(0x15, 5)
316 INTERRUPT(0x16, 6)
317 INTERRUPT(0x17, 7)
318 INTERRUPT(0x18, 8)
319 INTERRUPT(0x19, 9)
320 INTERRUPT(0x1a, 10)
321 INTERRUPT(0x1b, 11)
322 INTERRUPT(0x1c, 12)
323 INTERRUPT(0x1d, 13)
324 INTERRUPT(0x1e, 14)
325 INTERRUPT(0x1f, 15)
326 TRAP(0x21, instruction_access_error)
327 BADTRAP(0x22)
328 BADTRAP(0x23)
329 BADTRAP(0x24)
330 BADTRAP(0x25)
331 BADTRAP(0x26)
332 BADTRAP(0x27)
333 BADTRAP(0x28)
334 TRAP(0x29, data_access_error)
335 TRAP(0x2a, division_by_zero)
336 TRAP(0x2b, data_store_error)
337 TRAP(0x2c, data_access_mmu_miss)
338 BADTRAP(0x2d)
339 BADTRAP(0x2e)
340 BADTRAP(0x2f)
341 BADTRAP(0x30)
342 BADTRAP(0x31)
343 BADTRAP(0x32)
344 BADTRAP(0x33)
345 BADTRAP(0x34)
346 BADTRAP(0x35)
347 BADTRAP(0x36)
348 BADTRAP(0x37)
349 BADTRAP(0x38)
350 BADTRAP(0x39)
351 BADTRAP(0x3a)
352 BADTRAP(0x3b)
353 BADTRAP(0x3c)
354 BADTRAP(0x3d)
355 BADTRAP(0x3e)
356 BADTRAP(0x3f)
357 BADTRAP(0x40)
358 BADTRAP(0x41)
359 BADTRAP(0x42)
360 BADTRAP(0x43)
361 BADTRAP(0x44)
362 BADTRAP(0x45)
363 BADTRAP(0x46)
364 BADTRAP(0x47)
365 BADTRAP(0x48)
366 BADTRAP(0x49)
367 BADTRAP(0x4a)
368 BADTRAP(0x4b)
369 BADTRAP(0x4c)
370 BADTRAP(0x4d)
371 BADTRAP(0x4e)
372 BADTRAP(0x4f)
373 BADTRAP(0x50)
374 BADTRAP(0x51)
375 BADTRAP(0x52)
376 BADTRAP(0x53)
377 BADTRAP(0x54)
378 BADTRAP(0x55)
379 BADTRAP(0x56)
380 BADTRAP(0x57)
381 BADTRAP(0x58)
382 BADTRAP(0x59)
383 BADTRAP(0x5a)
384 BADTRAP(0x5b)
385 BADTRAP(0x5c)
386 BADTRAP(0x5d)
387 BADTRAP(0x5e)
388 BADTRAP(0x5f)
389 BADTRAP(0x60)
390 BADTRAP(0x61)
391 BADTRAP(0x62)
392 BADTRAP(0x63)
393 BADTRAP(0x64)
394 BADTRAP(0x65)
395 BADTRAP(0x66)
396 BADTRAP(0x67)
397 BADTRAP(0x68)
398 BADTRAP(0x69)
399 BADTRAP(0x6a)
400 BADTRAP(0x6b)
401 BADTRAP(0x6c)
402 BADTRAP(0x6d)
403 BADTRAP(0x6e)
404 BADTRAP(0x6f)
405 BADTRAP(0x70)
406 BADTRAP(0x71)
407 BADTRAP(0x72)
408 BADTRAP(0x73)
409 BADTRAP(0x74)
410 BADTRAP(0x75)
411 BADTRAP(0x76)
412 BADTRAP(0x77)
413 BADTRAP(0x78)
414 BADTRAP(0x79)
415 BADTRAP(0x7a)
416 BADTRAP(0x7b)
417 BADTRAP(0x7c)
418 BADTRAP(0x7d)
419 BADTRAP(0x7e)
420 BADTRAP(0x7f)
421 SYSCALL(0x80)
422 SYSCALL(0x81)
423 SYSCALL(0x82)
424 SYSCALL(0x83)
425 SYSCALL(0x84)
426 SYSCALL(0x85)
427 SYSCALL(0x86)
428 SYSCALL(0x87)
429 SYSCALL(0x88)
430 SYSCALL(0x89)
431 SYSCALL(0x8a)
432 SYSCALL(0x8b)
433 SYSCALL(0x8c)
434 SYSCALL(0x8d)
435 SYSCALL(0x8e)
436 SYSCALL(0x8f)
437 SYSCALL(0x90)
438 SYSCALL(0x91)
439 SYSCALL(0x92)
440 SYSCALL(0x93)
441 SYSCALL(0x94)
442 SYSCALL(0x95)
443 SYSCALL(0x96)
444 SYSCALL(0x97)
445 SYSCALL(0x98)
446 SYSCALL(0x99)
447 SYSCALL(0x9a)
448 SYSCALL(0x9b)
449 SYSCALL(0x9c)
450 SYSCALL(0x9d)
451 SYSCALL(0x9e)
452 SYSCALL(0x9f)
453 SYSCALL(0xa0)
454 SYSCALL(0xa1)
455 SYSCALL(0xa2)
456 SYSCALL(0xa3)
457 SYSCALL(0xa4)
458 SYSCALL(0xa5)
459 SYSCALL(0xa6)
460 SYSCALL(0xa7)
461 SYSCALL(0xa8)
462 SYSCALL(0xa9)
Note: See TracBrowser for help on using the repository browser.