Rev 911 | Rev 915 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 911 | Rev 912 | ||
---|---|---|---|
Line 27... | Line 27... | ||
27 | # THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
27 | # THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
28 | # |
28 | # |
29 | 29 | ||
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> |
|
- | 33 | #include <align.h> |
|
32 | 34 | ||
33 | #define STACK_ITEMS 12 |
35 | #define STACK_ITEMS 13 |
34 | #define STACK_FRAME_SIZE ((STACK_ITEMS*STACK_ITEM_SIZE) + STACK_SCRATCH_AREA_SIZE) |
36 | #define STACK_FRAME_SIZE ALIGN_UP((STACK_ITEMS*STACK_ITEM_SIZE) + STACK_SCRATCH_AREA_SIZE, STACK_ALIGNMENT) |
35 | 37 | ||
36 | #if (STACK_FRAME_SIZE % STACK_ALIGNMENT != 0) |
38 | #if (STACK_ITEMS % 2 == 0) |
- | 39 | # define STACK_FRAME_BIAS 8 |
|
- | 40 | #else |
|
37 | #error Memory stack must be 16-byte aligned. |
41 | # define STACK_FRAME_BIAS 16 |
38 | #endif |
42 | #endif |
39 | 43 | ||
40 | /** Partitioning of bank 0 registers. */ |
44 | /** Partitioning of bank 0 registers. */ |
41 | #define R_OFFS r16 |
45 | #define R_OFFS r16 |
42 | #define R_HANDLER r17 |
46 | #define R_HANDLER r17 |
Line 80... | Line 84... | ||
80 | 84 | ||
81 | /* 2. preserve predicate register into bank 0 */ |
85 | /* 2. preserve predicate register into bank 0 */ |
82 | mov r29 = pr ;; |
86 | mov r29 = pr ;; |
83 | 87 | ||
84 | /* 3. switch to kernel memory stack */ |
88 | /* 3. switch to kernel memory stack */ |
85 | /* TODO: support interruptions from userspace */ |
89 | mov r30 = cr.ipsr |
86 | /* assume kernel stack */ |
90 | shr.u r31 = r12, VRN_SHIFT ;; |
87 | 91 | ||
- | 92 | /* |
|
- | 93 | * Set p6 to true if the stack register references kernel address space. |
|
- | 94 | * Set p7 to false if the stack register doesn't reference kernel address space. |
|
- | 95 | */ |
|
- | 96 | cmp.eq p6, p7 = VRN_KERNEL, r31 ;; |
|
- | 97 | ||
- | 98 | (p6) shr.u r30 = r30, PSR_CPL_SHIFT ;; |
|
- | 99 | (p6) and r30 = PSR_CPL_MASK_SHIFTED, r30 ;; |
|
- | 100 | ||
- | 101 | /* |
|
- | 102 | * Set p6 to true if the interrupted context executed in kernel mode. |
|
- | 103 | * Set p7 to false if the interrupted context didn't execute in kernel mode. |
|
- | 104 | */ |
|
- | 105 | (p6) cmp.eq p6, p7 = r30, r0 ;; |
|
- | 106 | ||
- | 107 | /* |
|
- | 108 | * Now, p7 is true iff the stack needs to be switched to kernel stack. |
|
- | 109 | */ |
|
- | 110 | mov r30 = r12 |
|
- | 111 | (p7) mov r12 = R_KSTACK ;; |
|
- | 112 | ||
88 | add r31 = -8, r12 ;; |
113 | add r31 = -STACK_FRAME_BIAS, r12 ;; |
89 | add r12 = -STACK_FRAME_SIZE, r12 |
114 | add r12 = -STACK_FRAME_SIZE, r12 |
90 | 115 | ||
91 | /* 4. save registers in bank 0 into memory stack */ |
116 | /* 4. save registers in bank 0 into memory stack */ |
- | 117 | st8 [r31] = r30, -8 ;; /* save old stack pointer */ |
|
- | 118 | ||
92 | st8 [r31] = r29, -8 ;; /* save predicate registers */ |
119 | st8 [r31] = r29, -8 ;; /* save predicate registers */ |
93 | 120 | ||
94 | st8 [r31] = r24, -8 ;; /* save cr.iip */ |
121 | st8 [r31] = r24, -8 ;; /* save cr.iip */ |
95 | st8 [r31] = r25, -8 ;; /* save cr.ipsr */ |
122 | st8 [r31] = r25, -8 ;; /* save cr.ipsr */ |
96 | st8 [r31] = r26, -8 ;; /* save cr.iipa */ |
123 | st8 [r31] = r26, -8 ;; /* save cr.iipa */ |
97 | st8 [r31] = r27, -8 ;; /* save cr.isr */ |
124 | st8 [r31] = r27, -8 ;; /* save cr.isr */ |
98 | st8 [r31] = r28, -8 /* save cr.ifa */ |
125 | st8 [r31] = r28, -8 ;; /* save cr.ifa */ |
99 | 126 | ||
100 | /* 5. RSE switch from interrupted context */ |
127 | /* 5. RSE switch from interrupted context */ |
101 | mov r24 = ar.rsc |
128 | mov r24 = ar.rsc |
102 | mov r25 = ar.pfs |
129 | mov r25 = ar.pfs |
103 | cover |
130 | cover |
Line 172... | Line 199... | ||
172 | mov cr.iipa = r26 |
199 | mov cr.iipa = r26 |
173 | mov cr.isr = r27 |
200 | mov cr.isr = r27 |
174 | mov cr.ifa = r28 |
201 | mov cr.ifa = r28 |
175 | 202 | ||
176 | /* 18. restore predicate registers from memory stack */ |
203 | /* 18. restore predicate registers from memory stack */ |
177 | ld8 r29 = [r31] , -8 ;; /* load predicate registers */ |
204 | ld8 r29 = [r31], +8 ;; /* load predicate registers */ |
178 | mov pr = r29 |
205 | mov pr = r29 |
179 | 206 | ||
180 | /* 19. return from interruption */ |
207 | /* 19. return from interruption */ |
181 | add r12 = STACK_FRAME_SIZE, r12 |
208 | ld8 r12 = [r31] /* load stack pointer */ |
182 | rfi ;; |
209 | rfi ;; |
183 | 210 | ||
184 | .global heavyweight_handler_inner |
211 | .global heavyweight_handler_inner |
185 | heavyweight_handler_inner: |
212 | heavyweight_handler_inner: |
186 | /* |
213 | /* |