Rev 919 | Rev 962 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 919 | Rev 921 | ||
---|---|---|---|
Line 30... | Line 30... | ||
30 | #include <arch/stack.h> |
30 | #include <arch/stack.h> |
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 STACK_ITEMS 14 |
35 | #define STACK_ITEMS 18 |
36 | #define STACK_FRAME_SIZE ALIGN_UP((STACK_ITEMS*STACK_ITEM_SIZE) + STACK_SCRATCH_AREA_SIZE, STACK_ALIGNMENT) |
36 | #define STACK_FRAME_SIZE ALIGN_UP((STACK_ITEMS*STACK_ITEM_SIZE) + STACK_SCRATCH_AREA_SIZE, STACK_ALIGNMENT) |
37 | 37 | ||
38 | #if (STACK_ITEMS % 2 == 0) |
38 | #if (STACK_ITEMS % 2 == 0) |
39 | # define STACK_FRAME_BIAS 8 |
39 | # define STACK_FRAME_BIAS 8 |
40 | #else |
40 | #else |
Line 43... | Line 43... | ||
43 | 43 | ||
44 | /** Partitioning of bank 0 registers. */ |
44 | /** Partitioning of bank 0 registers. */ |
45 | #define R_OFFS r16 |
45 | #define R_OFFS r16 |
46 | #define R_HANDLER r17 |
46 | #define R_HANDLER r17 |
47 | #define R_RET r18 |
47 | #define R_RET r18 |
- | 48 | #define R_TMP r19 |
|
48 | #define R_KSTACK_BSP r22 /* keep in sync with before_thread_runs_arch() */ |
49 | #define R_KSTACK_BSP r22 /* keep in sync with before_thread_runs_arch() */ |
49 | #define R_KSTACK r23 /* keep in sync with before_thread_runs_arch() */ |
50 | #define R_KSTACK r23 /* keep in sync with before_thread_runs_arch() */ |
50 | 51 | ||
51 | /** Heavyweight interrupt handler |
52 | /** Heavyweight interrupt handler |
52 | * |
53 | * |
Line 114... | Line 115... | ||
114 | 115 | ||
115 | add r31 = -STACK_FRAME_BIAS, r12 ;; |
116 | add r31 = -STACK_FRAME_BIAS, r12 ;; |
116 | add r12 = -STACK_FRAME_SIZE, r12 |
117 | add r12 = -STACK_FRAME_SIZE, r12 |
117 | 118 | ||
118 | /* 4. save registers in bank 0 into memory stack */ |
119 | /* 4. save registers in bank 0 into memory stack */ |
- | 120 | ||
- | 121 | /* |
|
- | 122 | * If this is break_instruction handler, |
|
- | 123 | * copy input parameters to stack. |
|
- | 124 | */ |
|
- | 125 | mov R_TMP = 0x2c00 ;; |
|
- | 126 | cmp.eq p6,p5 = R_OFFS, R_TMP ;; |
|
- | 127 | ||
- | 128 | /* |
|
- | 129 | * From now on, if this is break_instruction handler, p6 is true and p5 is false. |
|
- | 130 | * Otherwise p6 is false and p5 is true. |
|
- | 131 | * Note that p5 is a preserved predicate register and we make use of it. |
|
- | 132 | */ |
|
- | 133 | ||
- | 134 | (p6) st8 [r31] = r35, -8 ;; /* save in3 */ |
|
- | 135 | (p6) st8 [r31] = r34, -8 ;; /* save in2 */ |
|
- | 136 | (p6) st8 [r31] = r33, -8 ;; /* save in1 */ |
|
- | 137 | (p6) st8 [r31] = r32, -8 ;; /* save in0 */ |
|
- | 138 | (p5) add r31 = -32, r31 ;; |
|
- | 139 | ||
119 | st8 [r31] = r30, -8 ;; /* save old stack pointer */ |
140 | st8 [r31] = r30, -8 ;; /* save old stack pointer */ |
120 | 141 | ||
121 | st8 [r31] = r29, -8 ;; /* save predicate registers */ |
142 | st8 [r31] = r29, -8 ;; /* save predicate registers */ |
122 | 143 | ||
123 | st8 [r31] = r24, -8 ;; /* save cr.iip */ |
144 | st8 [r31] = r24, -8 ;; /* save cr.iip */ |
Line 266... | Line 287... | ||
266 | mov loc19 = r3 |
287 | mov loc19 = r3 |
267 | mov loc20 = r4 |
288 | mov loc20 = r4 |
268 | mov loc21 = r5 |
289 | mov loc21 = r5 |
269 | mov loc22 = r6 |
290 | mov loc22 = r6 |
270 | mov loc23 = r7 |
291 | mov loc23 = r7 |
271 | mov loc24 = r8 |
292 | (p5) mov loc24 = r8 /* only if not in break_instruction handler */ |
272 | mov loc25 = r9 |
293 | mov loc25 = r9 |
273 | mov loc26 = r10 |
294 | mov loc26 = r10 |
274 | mov loc27 = r11 |
295 | mov loc27 = r11 |
275 | /* skip r12 (stack pointer) */ |
296 | /* skip r12 (stack pointer) */ |
276 | mov loc28 = r13 |
297 | mov loc28 = r13 |
Line 323... | Line 344... | ||
323 | mov r3 = loc19 |
344 | mov r3 = loc19 |
324 | mov r4 = loc20 |
345 | mov r4 = loc20 |
325 | mov r5 = loc21 |
346 | mov r5 = loc21 |
326 | mov r6 = loc22 |
347 | mov r6 = loc22 |
327 | mov r7 = loc23 |
348 | mov r7 = loc23 |
328 | mov r8 = loc24 |
349 | (p5) mov r8 = loc24 /* only if not in break_instruction handler */ |
329 | mov r9 = loc25 |
350 | mov r9 = loc25 |
330 | mov r10 = loc26 |
351 | mov r10 = loc26 |
331 | mov r11 = loc27 |
352 | mov r11 = loc27 |
332 | /* skip r12 (stack pointer) */ |
353 | /* skip r12 (stack pointer) */ |
333 | mov r13 = loc28 |
354 | mov r13 = loc28 |