Subversion Repositories HelenOS

Rev

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

Rev Author Line No. Line
212 vana 1
#
2
# Copyright (C) 2005 Jakub Vana
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
 
435 jermar 30
/*
31
 * This macro roughly follows steps from 1 to 19 described in
32
 * Intel Itanium Architecture Software Developer's Manual, Chapter 3.4.2.
33
 *
34
 * Some steps are skipped (enabling and disabling interrupts).
35
 * Some steps are not fully supported yet (e.g. interruptions
36
 * from user space and floating-point context).
37
 */
38
.macro HEAVYWEIGHT_HANDLER offs handler
39
    .org IVT + \offs
40
	SAVE_INTERRUPTED_CONTEXT		/* steps 1 - 9 */
41
	br.call.sptk.many rp = \handler		/* steps 10 - 11 */
42
	br restore_interrupted_context		/* steps 12 - 19 */
43
.endm
212 vana 44
 
435 jermar 45
.macro SAVE_INTERRUPTED_CONTEXT
46
    /* 1. copy interrupt registers into bank 0 */
47
	mov r24 = cr.iip
48
	mov r25 = cr.ipsr
49
	mov r26 = cr.iipa
50
	mov r27 = cr.isr
51
	mov r28 = cr.ifa
52
 
53
    /* 2. preserve predicate register into bank 0 */
54
	mov r29 = pr ;;
55
 
56
	/* 3. switch to kernel memory stack */
57
	/* TODO: support interruptions from userspace */
58
	/* assume kernel stack */
59
 
60
    /* 4. allocate memory stack for registers saved in bank 0 */
61
	st8 [r12] = r29, -8 ;;	/* save predicate registers */
62
	st8 [r12] = r28, -8 ;;	/* save cr.ifa */
63
	st8 [r12] = r27, -8 ;;	/* save cr.isr */
64
	st8 [r12] = r26, -8 ;;	/* save cr.iipa */
65
	st8 [r12] = r25, -8 ;;	/* save cr.ipsr */
66
	st8 [r12] = r24, -8 ;;	/* save cr.iip */
67
 
68
    /* 5. RSE switch */
69
    	.auto
70
	mov r24 = ar.rsc
71
	mov r25 = ar.pfs
72
	cover
73
	mov r26 = cr.ifs
74
 
75
	st8 [r12] = r24, -8	/* save ar.rsc */
76
	st8 [r12] = r25, -8	/* save ar.pfs */
77
	st8 [r12] = r26, -8	/* save ar.ifs */
78
 
79
	and r30 = ~3, r24
80
	mov ar.rsc = r30	/* place RSE in enforced lazy mode */
81
 
82
	mov r27 = ar.rnat
83
	mov r28 = ar.bspstore
84
 
85
	/* assume kernel backing store */
86
	mov ar.bspstore = r28
87
 
88
	mov r29 = ar.bsp
89
 
90
	st8 [r12] = r27, -8	/* save ar.rnat */
91
	st8 [r12] = r28, -8	/* save ar.bspstore */
92
	st8 [r12] = r29, -8	/* save ar.bsp */
93
 
94
	mov ar.rsc = r24	/* restore RSE's setting */
95
	.explicit
96
 
97
    /* 6. switch to bank 1 and reenable PSR.ic */
98
	ssm 0x2000
99
	bsw.1 ;;
100
	srlz.d
101
 
102
    /* 7. preserve branch and application registers */
103
 
104
    /* 8. preserve general and floating-point registers */
105
	/* TODO: save floating-point context */
106
 
107
    /* 9. skipped (will not enable interrupts) */
108
.endm
238 vana 109
 
435 jermar 110
.macro RESTORE_INTERRUPTED_CONTEXT
111
    /* 12. skipped (will not disable interrupts) */
112
 
113
    /* 13. restore general and floating-point registers */
114
	/* TODO: restore floating-point context */
115
 
116
    /* 14. restore branch and application registers */
117
 
118
    /* 15. disable PSR.ic and switch to bank 0 */
119
	rsm 0x2000
120
	bsw.0 ;;
121
	srlz.d
122
 
123
    /* 16. RSE switch */
124
 
125
    /* 17. restore interruption state from memory stack */
126
 
127
    /* 18. restore predicate registers from memory stack */
128
 
129
    /* 19. return from interruption */
130
	rfi
131
.endm
132
 
133
.global restore_interrupted_context
134
restore_interrupted_context:
135
	RESTORE_INTERRUPTED_CONTEXT
136
	/* not reached */
137
 
238 vana 138
dump_gregs:
139
mov r16 = REG_DUMP;;
140
st8 [r16] = r0;;
141
add r16 = 8,r16 ;;
142
st8 [r16] = r1;;
143
add r16 = 8,r16 ;;
144
st8 [r16] = r2;;
145
add r16 = 8,r16 ;;
146
st8 [r16] = r3;;
147
add r16 = 8,r16 ;;
148
st8 [r16] = r4;;
149
add r16 = 8,r16 ;;
150
st8 [r16] = r5;;
151
add r16 = 8,r16 ;;
152
st8 [r16] = r6;;
153
add r16 = 8,r16 ;;
154
st8 [r16] = r7;;
155
add r16 = 8,r16 ;;
156
st8 [r16] = r8;;
157
add r16 = 8,r16 ;;
158
st8 [r16] = r9;;
159
add r16 = 8,r16 ;;
160
st8 [r16] = r10;;
161
add r16 = 8,r16 ;;
162
st8 [r16] = r11;;
163
add r16 = 8,r16 ;;
164
st8 [r16] = r12;;
165
add r16 = 8,r16 ;;
166
st8 [r16] = r13;;
167
add r16 = 8,r16 ;;
168
st8 [r16] = r14;;
169
add r16 = 8,r16 ;;
170
st8 [r16] = r15;;
171
add r16 = 8,r16 ;;
172
 
173
bsw.1;;
174
mov r15 = r16;;
175
bsw.0;;
176
st8 [r16] = r15;;
177
add r16 = 8,r16 ;;
178
bsw.1;;
179
mov r15 = r17;;
180
bsw.0;;
181
st8 [r16] = r15;;
182
add r16 = 8,r16 ;;
183
bsw.1;;
184
mov r15 = r18;;
185
bsw.0;;
186
st8 [r16] = r15;;
187
add r16 = 8,r16 ;;
188
bsw.1;;
189
mov r15 = r19;;
190
bsw.0;;
191
st8 [r16] = r15;;
192
add r16 = 8,r16 ;;
193
bsw.1;;
194
mov r15 = r20;;
195
bsw.0;;
196
st8 [r16] = r15;;
197
add r16 = 8,r16 ;;
198
bsw.1;;
199
mov r15 = r21;;
200
bsw.0;;
201
st8 [r16] = r15;;
202
add r16 = 8,r16 ;;
203
bsw.1;;
204
mov r15 = r22;;
205
bsw.0;;
206
st8 [r16] = r15;;
207
add r16 = 8,r16 ;;
208
bsw.1;;
209
mov r15 = r23;;
210
bsw.0;;
211
st8 [r16] = r15;;
212
add r16 = 8,r16 ;;
213
bsw.1;;
214
mov r15 = r24;;
215
bsw.0;;
216
st8 [r16] = r15;;
217
add r16 = 8,r16 ;;
218
bsw.1;;
219
mov r15 = r25;;
220
bsw.0;;
221
st8 [r16] = r15;;
222
add r16 = 8,r16 ;;
223
bsw.1;;
224
mov r15 = r26;;
225
bsw.0;;
226
st8 [r16] = r15;;
227
add r16 = 8,r16 ;;
228
bsw.1;;
229
mov r15 = r27;;
230
bsw.0;;
231
st8 [r16] = r15;;
232
add r16 = 8,r16 ;;
233
bsw.1;;
234
mov r15 = r28;;
235
bsw.0;;
236
st8 [r16] = r15;;
237
add r16 = 8,r16 ;;
238
bsw.1;;
239
mov r15 = r29;;
240
bsw.0;;
241
st8 [r16] = r15;;
242
add r16 = 8,r16 ;;
243
bsw.1;;
244
mov r15 = r30;;
245
bsw.0;;
246
st8 [r16] = r15;;
247
add r16 = 8,r16 ;;
248
bsw.1;;
249
mov r15 = r31;;
250
bsw.0;;
251
st8 [r16] = r15;;
252
add r16 = 8,r16 ;;
253
 
254
 
255
st8 [r16] = r32;;
256
add r16 = 8,r16 ;;
257
st8 [r16] = r33;;
258
add r16 = 8,r16 ;;
259
st8 [r16] = r34;;
260
add r16 = 8,r16 ;;
261
st8 [r16] = r35;;
262
add r16 = 8,r16 ;;
263
st8 [r16] = r36;;
264
add r16 = 8,r16 ;;
265
st8 [r16] = r37;;
266
add r16 = 8,r16 ;;
267
st8 [r16] = r38;;
268
add r16 = 8,r16 ;;
269
st8 [r16] = r39;;
270
add r16 = 8,r16 ;;
271
st8 [r16] = r40;;
272
add r16 = 8,r16 ;;
273
st8 [r16] = r41;;
274
add r16 = 8,r16 ;;
275
st8 [r16] = r42;;
276
add r16 = 8,r16 ;;
277
st8 [r16] = r43;;
278
add r16 = 8,r16 ;;
279
st8 [r16] = r44;;
280
add r16 = 8,r16 ;;
281
st8 [r16] = r45;;
282
add r16 = 8,r16 ;;
283
st8 [r16] = r46;;
284
add r16 = 8,r16 ;;
285
st8 [r16] = r47;;
286
add r16 = 8,r16 ;;
287
st8 [r16] = r48;;
288
add r16 = 8,r16 ;;
289
st8 [r16] = r49;;
290
add r16 = 8,r16 ;;
291
st8 [r16] = r50;;
292
add r16 = 8,r16 ;;
293
st8 [r16] = r51;;
294
add r16 = 8,r16 ;;
295
st8 [r16] = r52;;
296
add r16 = 8,r16 ;;
297
st8 [r16] = r53;;
298
add r16 = 8,r16 ;;
299
st8 [r16] = r54;;
300
add r16 = 8,r16 ;;
301
st8 [r16] = r55;;
302
add r16 = 8,r16 ;;
303
st8 [r16] = r56;;
304
add r16 = 8,r16 ;;
305
st8 [r16] = r57;;
306
add r16 = 8,r16 ;;
307
st8 [r16] = r58;;
308
add r16 = 8,r16 ;;
309
st8 [r16] = r59;;
310
add r16 = 8,r16 ;;
311
st8 [r16] = r60;;
312
add r16 = 8,r16 ;;
313
st8 [r16] = r61;;
314
add r16 = 8,r16 ;;
315
st8 [r16] = r62;;
316
add r16 = 8,r16 ;;
317
st8 [r16] = r63;;
318
add r16 = 8,r16 ;;
319
 
320
 
321
 
322
st8 [r16] = r64;;
323
add r16 = 8,r16 ;;
324
st8 [r16] = r65;;
325
add r16 = 8,r16 ;;
326
st8 [r16] = r66;;
327
add r16 = 8,r16 ;;
328
st8 [r16] = r67;;
329
add r16 = 8,r16 ;;
330
st8 [r16] = r68;;
331
add r16 = 8,r16 ;;
332
st8 [r16] = r69;;
333
add r16 = 8,r16 ;;
334
st8 [r16] = r70;;
335
add r16 = 8,r16 ;;
336
st8 [r16] = r71;;
337
add r16 = 8,r16 ;;
338
st8 [r16] = r72;;
339
add r16 = 8,r16 ;;
340
st8 [r16] = r73;;
341
add r16 = 8,r16 ;;
342
st8 [r16] = r74;;
343
add r16 = 8,r16 ;;
344
st8 [r16] = r75;;
345
add r16 = 8,r16 ;;
346
st8 [r16] = r76;;
347
add r16 = 8,r16 ;;
348
st8 [r16] = r77;;
349
add r16 = 8,r16 ;;
350
st8 [r16] = r78;;
351
add r16 = 8,r16 ;;
352
st8 [r16] = r79;;
353
add r16 = 8,r16 ;;
354
st8 [r16] = r80;;
355
add r16 = 8,r16 ;;
356
st8 [r16] = r81;;
357
add r16 = 8,r16 ;;
358
st8 [r16] = r82;;
359
add r16 = 8,r16 ;;
360
st8 [r16] = r83;;
361
add r16 = 8,r16 ;;
362
st8 [r16] = r84;;
363
add r16 = 8,r16 ;;
364
st8 [r16] = r85;;
365
add r16 = 8,r16 ;;
366
st8 [r16] = r86;;
367
add r16 = 8,r16 ;;
368
st8 [r16] = r87;;
369
add r16 = 8,r16 ;;
370
st8 [r16] = r88;;
371
add r16 = 8,r16 ;;
372
st8 [r16] = r89;;
373
add r16 = 8,r16 ;;
374
st8 [r16] = r90;;
375
add r16 = 8,r16 ;;
376
st8 [r16] = r91;;
377
add r16 = 8,r16 ;;
378
st8 [r16] = r92;;
379
add r16 = 8,r16 ;;
380
st8 [r16] = r93;;
381
add r16 = 8,r16 ;;
382
st8 [r16] = r94;;
383
add r16 = 8,r16 ;;
384
st8 [r16] = r95;;
385
add r16 = 8,r16 ;;
386
 
387
 
388
 
389
st8 [r16] = r96;;
390
add r16 = 8,r16 ;;
391
st8 [r16] = r97;;
392
add r16 = 8,r16 ;;
393
st8 [r16] = r98;;
394
add r16 = 8,r16 ;;
395
st8 [r16] = r99;;
396
add r16 = 8,r16 ;;
397
st8 [r16] = r100;;
398
add r16 = 8,r16 ;;
399
st8 [r16] = r101;;
400
add r16 = 8,r16 ;;
401
st8 [r16] = r102;;
402
add r16 = 8,r16 ;;
403
st8 [r16] = r103;;
404
add r16 = 8,r16 ;;
405
st8 [r16] = r104;;
406
add r16 = 8,r16 ;;
407
st8 [r16] = r105;;
408
add r16 = 8,r16 ;;
409
st8 [r16] = r106;;
410
add r16 = 8,r16 ;;
411
st8 [r16] = r107;;
412
add r16 = 8,r16 ;;
413
st8 [r16] = r108;;
414
add r16 = 8,r16 ;;
415
st8 [r16] = r109;;
416
add r16 = 8,r16 ;;
417
st8 [r16] = r110;;
418
add r16 = 8,r16 ;;
419
st8 [r16] = r111;;
420
add r16 = 8,r16 ;;
421
st8 [r16] = r112;;
422
add r16 = 8,r16 ;;
423
st8 [r16] = r113;;
424
add r16 = 8,r16 ;;
425
st8 [r16] = r114;;
426
add r16 = 8,r16 ;;
427
st8 [r16] = r115;;
428
add r16 = 8,r16 ;;
429
st8 [r16] = r116;;
430
add r16 = 8,r16 ;;
431
st8 [r16] = r117;;
432
add r16 = 8,r16 ;;
433
st8 [r16] = r118;;
434
add r16 = 8,r16 ;;
435
st8 [r16] = r119;;
436
add r16 = 8,r16 ;;
437
st8 [r16] = r120;;
438
add r16 = 8,r16 ;;
439
st8 [r16] = r121;;
440
add r16 = 8,r16 ;;
441
st8 [r16] = r122;;
442
add r16 = 8,r16 ;;
443
st8 [r16] = r123;;
444
add r16 = 8,r16 ;;
445
st8 [r16] = r124;;
446
add r16 = 8,r16 ;;
447
st8 [r16] = r125;;
448
add r16 = 8,r16 ;;
449
st8 [r16] = r126;;
450
add r16 = 8,r16 ;;
451
st8 [r16] = r127;;
452
add r16 = 8,r16 ;;
453
 
454
 
455
 
456
br.ret.sptk.many b0;;
457
 
458
 
459
 
460
 
461
 
212 vana 462
.macro Handler o h
463
.org IVT + \o
464
br \h;;
465
.endm
466
 
220 vana 467
.macro Handler2 o 
468
.org IVT + \o
238 vana 469
br.call.sptk.many b0 = dump_gregs;;
470
mov r16 = \o ;;
471
bsw.1;;
220 vana 472
br universal_handler;;
473
.endm
212 vana 474
 
475
 
220 vana 476
 
212 vana 477
.global IVT
478
.align 32768
479
IVT:
480
 
220 vana 481
 
482
Handler2 0x0000
483
Handler2 0x0400
484
Handler2 0x0800
485
Handler2 0x0c00
486
Handler2 0x1000
487
Handler2 0x1400
488
Handler2 0x1800
489
Handler2 0x1c00
490
Handler2 0x2000
491
Handler2 0x2400
492
Handler2 0x2800
212 vana 493
Handler 0x2c00 break_instruction
435 jermar 494
HEAVYWEIGHT_HANDLER 0x3000 external_interrupt	/* For external interrupt, heavyweight handler is used. */
220 vana 495
Handler2 0x3400
496
Handler2 0x3800
497
Handler2 0x3c00
498
Handler2 0x4000
499
Handler2 0x4400
500
Handler2 0x4800
501
Handler2 0x4c00
502
 
503
Handler2 0x5000
504
Handler2 0x5100
505
Handler2 0x5200
506
Handler2 0x5300
238 vana 507
#Handler 0x5400 general_exception
508
Handler2 0x5400
220 vana 509
Handler2 0x5500
510
Handler2 0x5600
511
Handler2 0x5700
512
Handler2 0x5800
513
Handler2 0x5900
514
Handler2 0x5a00
515
Handler2 0x5b00
516
Handler2 0x5c00
517
Handler2 0x5d00
518
Handler2 0x5e00
519
Handler2 0x5f00
212 vana 520
 
220 vana 521
Handler2 0x6000
522
Handler2 0x6100
523
Handler2 0x6200
524
Handler2 0x6300
525
Handler2 0x6400
526
Handler2 0x6500
527
Handler2 0x6600
528
Handler2 0x6700
529
Handler2 0x6800
530
Handler2 0x6900
531
Handler2 0x6a00
532
Handler2 0x6b00
533
Handler2 0x6c00
534
Handler2 0x6d00
535
Handler2 0x6e00
536
Handler2 0x6f00
212 vana 537
 
220 vana 538
Handler2 0x7000
539
Handler2 0x7100
540
Handler2 0x7200
541
Handler2 0x7300
542
Handler2 0x7400
543
Handler2 0x7500
544
Handler2 0x7600
545
Handler2 0x7700
546
Handler2 0x7800
547
Handler2 0x7900
548
Handler2 0x7a00
549
Handler2 0x7b00
550
Handler2 0x7c00
551
Handler2 0x7d00
552
Handler2 0x7e00
553
Handler2 0x7f00
212 vana 554
 
555
 
220 vana 556
 
557
 
558
 
559
 
560
 
561
 
212 vana 562
.align 32768
238 vana 563
.global REG_DUMP
564
 
565
REG_DUMP:
566
.space 128*8
567