Rev 899 | Rev 912 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 899 | Rev 911 | ||
---|---|---|---|
Line 35... | Line 35... | ||
35 | 35 | ||
36 | #if (STACK_FRAME_SIZE % STACK_ALIGNMENT != 0) |
36 | #if (STACK_FRAME_SIZE % STACK_ALIGNMENT != 0) |
37 | #error Memory stack must be 16-byte aligned. |
37 | #error Memory stack must be 16-byte aligned. |
38 | #endif |
38 | #endif |
39 | 39 | ||
- | 40 | /** Partitioning of bank 0 registers. */ |
|
- | 41 | #define R_OFFS r16 |
|
- | 42 | #define R_HANDLER r17 |
|
- | 43 | #define R_RET r18 |
|
- | 44 | #define R_KSTACK r23 /* keep in sync with before_thread_runs_arch() */ |
|
- | 45 | ||
40 | /** Heavyweight interrupt handler |
46 | /** Heavyweight interrupt handler |
41 | * |
47 | * |
42 | * This macro roughly follows steps from 1 to 19 described in |
48 | * This macro roughly follows steps from 1 to 19 described in |
43 | * Intel Itanium Architecture Software Developer's Manual, Chapter 3.4.2. |
49 | * Intel Itanium Architecture Software Developer's Manual, Chapter 3.4.2. |
44 | * |
50 | * |
Line 52... | Line 58... | ||
52 | * @param offs Offset from the beginning of IVT. |
58 | * @param offs Offset from the beginning of IVT. |
53 | * @param handler Interrupt handler address. |
59 | * @param handler Interrupt handler address. |
54 | */ |
60 | */ |
55 | .macro HEAVYWEIGHT_HANDLER offs, handler=universal_handler |
61 | .macro HEAVYWEIGHT_HANDLER offs, handler=universal_handler |
56 | .org ivt + \offs |
62 | .org ivt + \offs |
57 | mov r24 = \offs |
63 | mov R_OFFS = \offs |
58 | movl r25 = \handler ;; |
64 | movl R_HANDLER = \handler ;; |
59 | mov ar.k0 = r24 |
- | |
60 | mov ar.k1 = r25 |
- | |
61 | br heavyweight_handler |
65 | br heavyweight_handler |
62 | .endm |
66 | .endm |
63 | 67 | ||
64 | .global heavyweight_handler |
68 | .global heavyweight_handler |
65 | heavyweight_handler: |
69 | heavyweight_handler: |
66 | /* 1. copy interrupt registers into bank 0 */ |
70 | /* 1. copy interrupt registers into bank 0 */ |
- | 71 | ||
- | 72 | /* |
|
- | 73 | * Note that r24-r31 from bank0 can be used only as long as PSR.ic = 0. |
|
- | 74 | */ |
|
67 | mov r24 = cr.iip |
75 | mov r24 = cr.iip |
68 | mov r25 = cr.ipsr |
76 | mov r25 = cr.ipsr |
69 | mov r26 = cr.iipa |
77 | mov r26 = cr.iipa |
70 | mov r27 = cr.isr |
78 | mov r27 = cr.isr |
71 | mov r28 = cr.ifa |
79 | mov r28 = cr.ifa |
Line 115... | Line 123... | ||
115 | st8 [r31] = r29, -8 /* save ar.bsp */ |
123 | st8 [r31] = r29, -8 /* save ar.bsp */ |
116 | 124 | ||
117 | mov ar.rsc = r24 /* restore RSE's setting */ |
125 | mov ar.rsc = r24 /* restore RSE's setting */ |
118 | 126 | ||
119 | /* steps 6 - 15 are done by heavyweight_handler_inner() */ |
127 | /* steps 6 - 15 are done by heavyweight_handler_inner() */ |
120 | mov r24 = b0 /* save b0 belonging to interrupted context */ |
128 | mov R_RET = b0 /* save b0 belonging to interrupted context */ |
121 | mov r26 = ar.k0 |
- | |
122 | mov r25 = ar.k1 |
- | |
123 | br.call.sptk.many rp = heavyweight_handler_inner |
129 | br.call.sptk.many b0 = heavyweight_handler_inner |
124 | 0: mov b0 = r24 /* restore b0 belonging to the interrupted context */ |
130 | 0: mov b0 = R_RET /* restore b0 belonging to the interrupted context */ |
125 | 131 | ||
126 | /* 16. RSE switch to interrupted context */ |
132 | /* 16. RSE switch to interrupted context */ |
127 | cover /* allocate zerro size frame (step 1 (from Intel Docs)) */ |
133 | cover /* allocate zerro size frame (step 1 (from Intel Docs)) */ |
128 | 134 | ||
129 | add r31 = STACK_SCRATCH_AREA_SIZE, r12 ;; |
135 | add r31 = STACK_SCRATCH_AREA_SIZE, r12 ;; |
Line 182... | Line 188... | ||
182 | * will be preserved in stacked registers and backing store. |
188 | * will be preserved in stacked registers and backing store. |
183 | */ |
189 | */ |
184 | alloc loc0 = ar.pfs, 0, 47, 2, 0 ;; |
190 | alloc loc0 = ar.pfs, 0, 47, 2, 0 ;; |
185 | 191 | ||
186 | /* bank 0 is going to be shadowed, copy essential data from there */ |
192 | /* bank 0 is going to be shadowed, copy essential data from there */ |
187 | mov loc1 = r24 /* b0 belonging to interrupted context */ |
193 | mov loc1 = R_RET /* b0 belonging to interrupted context */ |
188 | mov loc2 = r25 |
194 | mov loc2 = R_HANDLER |
189 | mov out0 = r26 |
195 | mov out0 = R_OFFS |
190 | 196 | ||
191 | add out1 = STACK_SCRATCH_AREA_SIZE, r12 |
197 | add out1 = STACK_SCRATCH_AREA_SIZE, r12 |
192 | 198 | ||
193 | /* 6. switch to bank 1 and reenable PSR.ic */ |
199 | /* 6. switch to bank 1 and reenable PSR.ic */ |
194 | ssm PSR_IC_MASK |
200 | ssm PSR_IC_MASK |
Line 321... | Line 327... | ||
321 | /* 15. disable PSR.ic and switch to bank 0 */ |
327 | /* 15. disable PSR.ic and switch to bank 0 */ |
322 | rsm PSR_IC_MASK |
328 | rsm PSR_IC_MASK |
323 | bsw.0 ;; |
329 | bsw.0 ;; |
324 | srlz.d |
330 | srlz.d |
325 | 331 | ||
326 | mov r24 = loc1 |
332 | mov R_RET = loc1 |
327 | mov ar.pfs = loc0 |
333 | mov ar.pfs = loc0 |
328 | br.ret.sptk.many b0 |
334 | br.ret.sptk.many b0 |
329 | 335 | ||
330 | .global ivt |
336 | .global ivt |
331 | .align 32768 |
337 | .align 32768 |