Rev 2071 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 2071 | Rev 2608 | ||
---|---|---|---|
Line 31... | Line 31... | ||
31 | #include <arch/register.h> |
31 | #include <arch/register.h> |
32 | #include <arch/mm/page.h> |
32 | #include <arch/mm/page.h> |
33 | #include <align.h> |
33 | #include <align.h> |
34 | 34 | ||
35 | #define FRS_TO_SAVE 30 |
35 | #define FRS_TO_SAVE 30 |
36 | #define STACK_ITEMS (19 + FRS_TO_SAVE*2) |
36 | #define STACK_ITEMS (21 + FRS_TO_SAVE * 2) |
37 | #define STACK_FRAME_SIZE ALIGN_UP((STACK_ITEMS*STACK_ITEM_SIZE) + STACK_SCRATCH_AREA_SIZE, STACK_ALIGNMENT) |
37 | #define STACK_FRAME_SIZE ALIGN_UP((STACK_ITEMS*STACK_ITEM_SIZE) + STACK_SCRATCH_AREA_SIZE, STACK_ALIGNMENT) |
38 | 38 | ||
39 | #if (STACK_ITEMS % 2 == 0) |
39 | #if (STACK_ITEMS % 2 == 0) |
40 | # define STACK_FRAME_BIAS 8 |
40 | # define STACK_FRAME_BIAS 8 |
41 | #else |
41 | #else |
Line 133... | Line 133... | ||
133 | /* |
133 | /* |
134 | * If this is break_instruction handler, |
134 | * If this is break_instruction handler, |
135 | * copy input parameters to stack. |
135 | * copy input parameters to stack. |
136 | */ |
136 | */ |
137 | mov R_TMP = 0x2c00 ;; |
137 | mov R_TMP = 0x2c00 ;; |
138 | cmp.eq p6,p5 = R_OFFS, R_TMP ;; |
138 | cmp.eq p6, p5 = R_OFFS, R_TMP ;; |
139 | 139 | ||
140 | /* |
140 | /* |
141 | * From now on, if this is break_instruction handler, p6 is true and p5 is false. |
141 | * From now on, if this is break_instruction handler, p6 is true and p5 |
142 | * Otherwise p6 is false and p5 is true. |
142 | * is false. Otherwise p6 is false and p5 is true. |
143 | * Note that p5 is a preserved predicate register and we make use of it. |
143 | * Note that p5 is a preserved predicate register and we make use of it. |
144 | */ |
144 | */ |
145 | 145 | ||
- | 146 | (p6) st8 [r31] = r38, -8 ;; /* save in6 */ |
|
- | 147 | (p6) st8 [r31] = r37, -8 ;; /* save in5 */ |
|
146 | (p6) st8 [r31] = r36, -8 ;; /* save in4 */ |
148 | (p6) st8 [r31] = r36, -8 ;; /* save in4 */ |
147 | (p6) st8 [r31] = r35, -8 ;; /* save in3 */ |
149 | (p6) st8 [r31] = r35, -8 ;; /* save in3 */ |
148 | (p6) st8 [r31] = r34, -8 ;; /* save in2 */ |
150 | (p6) st8 [r31] = r34, -8 ;; /* save in2 */ |
149 | (p6) st8 [r31] = r33, -8 ;; /* save in1 */ |
151 | (p6) st8 [r31] = r33, -8 ;; /* save in1 */ |
150 | (p6) st8 [r31] = r32, -8 ;; /* save in0 */ |
152 | (p6) st8 [r31] = r32, -8 ;; /* save in0 */ |
151 | (p5) add r31 = -40, r31 ;; |
153 | (p5) add r31 = -56, r31 ;; |
152 | 154 | ||
153 | st8 [r31] = r30, -8 ;; /* save old stack pointer */ |
155 | st8 [r31] = r30, -8 ;; /* save old stack pointer */ |
154 | 156 | ||
155 | st8 [r31] = r29, -8 ;; /* save predicate registers */ |
157 | st8 [r31] = r29, -8 ;; /* save predicate registers */ |
156 | 158 | ||
Line 176... | Line 178... | ||
176 | 178 | ||
177 | mov r27 = ar.rnat |
179 | mov r27 = ar.rnat |
178 | mov r28 = ar.bspstore ;; |
180 | mov r28 = ar.bspstore ;; |
179 | 181 | ||
180 | /* |
182 | /* |
181 | * Inspect BSPSTORE to figure out whether it is necessary to switch to kernel BSPSTORE. |
183 | * Inspect BSPSTORE to figure out whether it is necessary to switch to |
- | 184 | * kernel BSPSTORE. |
|
182 | */ |
185 | */ |
183 | (p1) shr.u r30 = r28, VRN_SHIFT ;; |
186 | (p1) shr.u r30 = r28, VRN_SHIFT ;; |
184 | (p1) cmp.eq p1, p2 = VRN_KERNEL, r30 ;; |
187 | (p1) cmp.eq p1, p2 = VRN_KERNEL, r30 ;; |
185 | 188 | ||
186 | /* |
189 | /* |
Line 203... | Line 206... | ||
203 | mov R_RET = b0 /* save b0 belonging to interrupted context */ |
206 | mov R_RET = b0 /* save b0 belonging to interrupted context */ |
204 | br.call.sptk.many b0 = heavyweight_handler_inner |
207 | br.call.sptk.many b0 = heavyweight_handler_inner |
205 | 0: mov b0 = R_RET /* restore b0 belonging to the interrupted context */ |
208 | 0: mov b0 = R_RET /* restore b0 belonging to the interrupted context */ |
206 | 209 | ||
207 | /* 16. RSE switch to interrupted context */ |
210 | /* 16. RSE switch to interrupted context */ |
208 | cover /* allocate zerro size frame (step 1 (from Intel Docs)) */ |
211 | cover /* allocate zero size frame (step 1 (from Intel Docs)) */ |
209 | 212 | ||
210 | add r31 = (STACK_SCRATCH_AREA_SIZE+(FRS_TO_SAVE*2*8)), r12 ;; |
213 | add r31 = (STACK_SCRATCH_AREA_SIZE + (FRS_TO_SAVE * 2 * 8)), r12 ;; |
211 | 214 | ||
212 | ld8 r30 = [r31], +8 ;; /* load ar.bsp */ |
215 | ld8 r30 = [r31], +8 ;; /* load ar.bsp */ |
213 | ld8 r29 = [r31], +8 ;; /* load ar.bspstore */ |
216 | ld8 r29 = [r31], +8 ;; /* load ar.bspstore */ |
214 | ld8 r28 = [r31], +8 ;; /* load ar.bspstore_new */ |
217 | ld8 r28 = [r31], +8 ;; /* load ar.bspstore_new */ |
215 | sub r27 = r30 , r28 ;; /* calculate loadrs (step 2) */ |
218 | sub r27 = r30 , r28 ;; /* calculate loadrs (step 2) */ |