diff options
author | Richard Henderson <rth@twiddle.net> | 2011-04-12 17:45:12 -0400 |
---|---|---|
committer | Matt Turner <mattst88@gmail.com> | 2013-07-19 16:54:25 -0400 |
commit | 231b0bedf55325ee5a1c7bdd47d00131dafc9ab7 (patch) | |
tree | 69bffb48c18f06e2bff658acce5a65030ea8cabd /arch/alpha/kernel | |
parent | 748a76b5152e8f38edf8afbf6f4cd6e326ad9e62 (diff) |
alpha: Generate dwarf2 unwind info for various kernel entry points.
Having unwind info past the PALcode generated stack frame makes
debugging the kernel significantly easier.
Acked-by: Matt Turner <mattst88@gmail.com>
Signed-off-by: Matt Turner <mattst88@gmail.com>
Signed-off-by: Richard Henderson <rth@twiddle.net>
Diffstat (limited to 'arch/alpha/kernel')
-rw-r--r-- | arch/alpha/kernel/entry.S | 399 |
1 files changed, 288 insertions, 111 deletions
diff --git a/arch/alpha/kernel/entry.S b/arch/alpha/kernel/entry.S index f62a994ef126..a969b95ee5ac 100644 --- a/arch/alpha/kernel/entry.S +++ b/arch/alpha/kernel/entry.S | |||
@@ -12,11 +12,32 @@ | |||
12 | 12 | ||
13 | .text | 13 | .text |
14 | .set noat | 14 | .set noat |
15 | .cfi_sections .debug_frame | ||
15 | 16 | ||
16 | /* Stack offsets. */ | 17 | /* Stack offsets. */ |
17 | #define SP_OFF 184 | 18 | #define SP_OFF 184 |
18 | #define SWITCH_STACK_SIZE 320 | 19 | #define SWITCH_STACK_SIZE 320 |
19 | 20 | ||
21 | .macro CFI_START_OSF_FRAME func | ||
22 | .align 4 | ||
23 | .globl \func | ||
24 | .type \func,@function | ||
25 | \func: | ||
26 | .cfi_startproc simple | ||
27 | .cfi_return_column 64 | ||
28 | .cfi_def_cfa $sp, 48 | ||
29 | .cfi_rel_offset 64, 8 | ||
30 | .cfi_rel_offset $gp, 16 | ||
31 | .cfi_rel_offset $16, 24 | ||
32 | .cfi_rel_offset $17, 32 | ||
33 | .cfi_rel_offset $18, 40 | ||
34 | .endm | ||
35 | |||
36 | .macro CFI_END_OSF_FRAME func | ||
37 | .cfi_endproc | ||
38 | .size \func, . - \func | ||
39 | .endm | ||
40 | |||
20 | /* | 41 | /* |
21 | * This defines the normal kernel pt-regs layout. | 42 | * This defines the normal kernel pt-regs layout. |
22 | * | 43 | * |
@@ -27,100 +48,158 @@ | |||
27 | * the palcode-provided values are available to the signal handler. | 48 | * the palcode-provided values are available to the signal handler. |
28 | */ | 49 | */ |
29 | 50 | ||
30 | #define SAVE_ALL \ | 51 | .macro SAVE_ALL |
31 | subq $sp, SP_OFF, $sp; \ | 52 | subq $sp, SP_OFF, $sp |
32 | stq $0, 0($sp); \ | 53 | .cfi_adjust_cfa_offset SP_OFF |
33 | stq $1, 8($sp); \ | 54 | stq $0, 0($sp) |
34 | stq $2, 16($sp); \ | 55 | stq $1, 8($sp) |
35 | stq $3, 24($sp); \ | 56 | stq $2, 16($sp) |
36 | stq $4, 32($sp); \ | 57 | stq $3, 24($sp) |
37 | stq $28, 144($sp); \ | 58 | stq $4, 32($sp) |
38 | lda $2, alpha_mv; \ | 59 | stq $28, 144($sp) |
39 | stq $5, 40($sp); \ | 60 | .cfi_rel_offset $0, 0 |
40 | stq $6, 48($sp); \ | 61 | .cfi_rel_offset $1, 8 |
41 | stq $7, 56($sp); \ | 62 | .cfi_rel_offset $2, 16 |
42 | stq $8, 64($sp); \ | 63 | .cfi_rel_offset $3, 24 |
43 | stq $19, 72($sp); \ | 64 | .cfi_rel_offset $4, 32 |
44 | stq $20, 80($sp); \ | 65 | .cfi_rel_offset $28, 144 |
45 | stq $21, 88($sp); \ | 66 | lda $2, alpha_mv |
46 | ldq $2, HAE_CACHE($2); \ | 67 | stq $5, 40($sp) |
47 | stq $22, 96($sp); \ | 68 | stq $6, 48($sp) |
48 | stq $23, 104($sp); \ | 69 | stq $7, 56($sp) |
49 | stq $24, 112($sp); \ | 70 | stq $8, 64($sp) |
50 | stq $25, 120($sp); \ | 71 | stq $19, 72($sp) |
51 | stq $26, 128($sp); \ | 72 | stq $20, 80($sp) |
52 | stq $27, 136($sp); \ | 73 | stq $21, 88($sp) |
53 | stq $2, 152($sp); \ | 74 | ldq $2, HAE_CACHE($2) |
54 | stq $16, 160($sp); \ | 75 | stq $22, 96($sp) |
55 | stq $17, 168($sp); \ | 76 | stq $23, 104($sp) |
77 | stq $24, 112($sp) | ||
78 | stq $25, 120($sp) | ||
79 | stq $26, 128($sp) | ||
80 | stq $27, 136($sp) | ||
81 | stq $2, 152($sp) | ||
82 | stq $16, 160($sp) | ||
83 | stq $17, 168($sp) | ||
56 | stq $18, 176($sp) | 84 | stq $18, 176($sp) |
85 | .cfi_rel_offset $5, 40 | ||
86 | .cfi_rel_offset $6, 48 | ||
87 | .cfi_rel_offset $7, 56 | ||
88 | .cfi_rel_offset $8, 64 | ||
89 | .cfi_rel_offset $19, 72 | ||
90 | .cfi_rel_offset $20, 80 | ||
91 | .cfi_rel_offset $21, 88 | ||
92 | .cfi_rel_offset $22, 96 | ||
93 | .cfi_rel_offset $23, 104 | ||
94 | .cfi_rel_offset $24, 112 | ||
95 | .cfi_rel_offset $25, 120 | ||
96 | .cfi_rel_offset $26, 128 | ||
97 | .cfi_rel_offset $27, 136 | ||
98 | .endm | ||
57 | 99 | ||
58 | #define RESTORE_ALL \ | 100 | .macro RESTORE_ALL |
59 | lda $19, alpha_mv; \ | 101 | lda $19, alpha_mv |
60 | ldq $0, 0($sp); \ | 102 | ldq $0, 0($sp) |
61 | ldq $1, 8($sp); \ | 103 | ldq $1, 8($sp) |
62 | ldq $2, 16($sp); \ | 104 | ldq $2, 16($sp) |
63 | ldq $3, 24($sp); \ | 105 | ldq $3, 24($sp) |
64 | ldq $21, 152($sp); \ | 106 | ldq $21, 152($sp) |
65 | ldq $20, HAE_CACHE($19); \ | 107 | ldq $20, HAE_CACHE($19) |
66 | ldq $4, 32($sp); \ | 108 | ldq $4, 32($sp) |
67 | ldq $5, 40($sp); \ | 109 | ldq $5, 40($sp) |
68 | ldq $6, 48($sp); \ | 110 | ldq $6, 48($sp) |
69 | ldq $7, 56($sp); \ | 111 | ldq $7, 56($sp) |
70 | subq $20, $21, $20; \ | 112 | subq $20, $21, $20 |
71 | ldq $8, 64($sp); \ | 113 | ldq $8, 64($sp) |
72 | beq $20, 99f; \ | 114 | beq $20, 99f |
73 | ldq $20, HAE_REG($19); \ | 115 | ldq $20, HAE_REG($19) |
74 | stq $21, HAE_CACHE($19); \ | 116 | stq $21, HAE_CACHE($19) |
75 | stq $21, 0($20); \ | 117 | stq $21, 0($20) |
76 | 99:; \ | 118 | 99: ldq $19, 72($sp) |
77 | ldq $19, 72($sp); \ | 119 | ldq $20, 80($sp) |
78 | ldq $20, 80($sp); \ | 120 | ldq $21, 88($sp) |
79 | ldq $21, 88($sp); \ | 121 | ldq $22, 96($sp) |
80 | ldq $22, 96($sp); \ | 122 | ldq $23, 104($sp) |
81 | ldq $23, 104($sp); \ | 123 | ldq $24, 112($sp) |
82 | ldq $24, 112($sp); \ | 124 | ldq $25, 120($sp) |
83 | ldq $25, 120($sp); \ | 125 | ldq $26, 128($sp) |
84 | ldq $26, 128($sp); \ | 126 | ldq $27, 136($sp) |
85 | ldq $27, 136($sp); \ | 127 | ldq $28, 144($sp) |
86 | ldq $28, 144($sp); \ | ||
87 | addq $sp, SP_OFF, $sp | 128 | addq $sp, SP_OFF, $sp |
129 | .cfi_restore $0 | ||
130 | .cfi_restore $1 | ||
131 | .cfi_restore $2 | ||
132 | .cfi_restore $3 | ||
133 | .cfi_restore $4 | ||
134 | .cfi_restore $5 | ||
135 | .cfi_restore $6 | ||
136 | .cfi_restore $7 | ||
137 | .cfi_restore $8 | ||
138 | .cfi_restore $19 | ||
139 | .cfi_restore $20 | ||
140 | .cfi_restore $21 | ||
141 | .cfi_restore $22 | ||
142 | .cfi_restore $23 | ||
143 | .cfi_restore $24 | ||
144 | .cfi_restore $25 | ||
145 | .cfi_restore $26 | ||
146 | .cfi_restore $27 | ||
147 | .cfi_restore $28 | ||
148 | .cfi_adjust_cfa_offset -SP_OFF | ||
149 | .endm | ||
150 | |||
151 | .macro DO_SWITCH_STACK | ||
152 | bsr $1, do_switch_stack | ||
153 | .cfi_adjust_cfa_offset SWITCH_STACK_SIZE | ||
154 | .cfi_rel_offset $9, 0 | ||
155 | .cfi_rel_offset $10, 8 | ||
156 | .cfi_rel_offset $11, 16 | ||
157 | .cfi_rel_offset $12, 24 | ||
158 | .cfi_rel_offset $13, 32 | ||
159 | .cfi_rel_offset $14, 40 | ||
160 | .cfi_rel_offset $15, 48 | ||
161 | /* We don't really care about the FP registers for debugging. */ | ||
162 | .endm | ||
163 | |||
164 | .macro UNDO_SWITCH_STACK | ||
165 | bsr $1, undo_switch_stack | ||
166 | .cfi_restore $9 | ||
167 | .cfi_restore $10 | ||
168 | .cfi_restore $11 | ||
169 | .cfi_restore $12 | ||
170 | .cfi_restore $13 | ||
171 | .cfi_restore $14 | ||
172 | .cfi_restore $15 | ||
173 | .cfi_adjust_cfa_offset -SWITCH_STACK_SIZE | ||
174 | .endm | ||
88 | 175 | ||
89 | /* | 176 | /* |
90 | * Non-syscall kernel entry points. | 177 | * Non-syscall kernel entry points. |
91 | */ | 178 | */ |
92 | 179 | ||
93 | .align 4 | 180 | CFI_START_OSF_FRAME entInt |
94 | .globl entInt | ||
95 | .ent entInt | ||
96 | entInt: | ||
97 | SAVE_ALL | 181 | SAVE_ALL |
98 | lda $8, 0x3fff | 182 | lda $8, 0x3fff |
99 | lda $26, ret_from_sys_call | 183 | lda $26, ret_from_sys_call |
100 | bic $sp, $8, $8 | 184 | bic $sp, $8, $8 |
101 | mov $sp, $19 | 185 | mov $sp, $19 |
102 | jsr $31, do_entInt | 186 | jsr $31, do_entInt |
103 | .end entInt | 187 | CFI_END_OSF_FRAME entInt |
104 | 188 | ||
105 | .align 4 | 189 | CFI_START_OSF_FRAME entArith |
106 | .globl entArith | ||
107 | .ent entArith | ||
108 | entArith: | ||
109 | SAVE_ALL | 190 | SAVE_ALL |
110 | lda $8, 0x3fff | 191 | lda $8, 0x3fff |
111 | lda $26, ret_from_sys_call | 192 | lda $26, ret_from_sys_call |
112 | bic $sp, $8, $8 | 193 | bic $sp, $8, $8 |
113 | mov $sp, $18 | 194 | mov $sp, $18 |
114 | jsr $31, do_entArith | 195 | jsr $31, do_entArith |
115 | .end entArith | 196 | CFI_END_OSF_FRAME entArith |
116 | 197 | ||
117 | .align 4 | 198 | CFI_START_OSF_FRAME entMM |
118 | .globl entMM | ||
119 | .ent entMM | ||
120 | entMM: | ||
121 | SAVE_ALL | 199 | SAVE_ALL |
122 | /* save $9 - $15 so the inline exception code can manipulate them. */ | 200 | /* save $9 - $15 so the inline exception code can manipulate them. */ |
123 | subq $sp, 56, $sp | 201 | subq $sp, 56, $sp |
202 | .cfi_adjust_cfa_offset 56 | ||
124 | stq $9, 0($sp) | 203 | stq $9, 0($sp) |
125 | stq $10, 8($sp) | 204 | stq $10, 8($sp) |
126 | stq $11, 16($sp) | 205 | stq $11, 16($sp) |
@@ -128,6 +207,13 @@ entMM: | |||
128 | stq $13, 32($sp) | 207 | stq $13, 32($sp) |
129 | stq $14, 40($sp) | 208 | stq $14, 40($sp) |
130 | stq $15, 48($sp) | 209 | stq $15, 48($sp) |
210 | .cfi_rel_offset $9, 0 | ||
211 | .cfi_rel_offset $10, 8 | ||
212 | .cfi_rel_offset $11, 16 | ||
213 | .cfi_rel_offset $12, 24 | ||
214 | .cfi_rel_offset $13, 32 | ||
215 | .cfi_rel_offset $14, 40 | ||
216 | .cfi_rel_offset $15, 48 | ||
131 | addq $sp, 56, $19 | 217 | addq $sp, 56, $19 |
132 | /* handle the fault */ | 218 | /* handle the fault */ |
133 | lda $8, 0x3fff | 219 | lda $8, 0x3fff |
@@ -142,28 +228,33 @@ entMM: | |||
142 | ldq $14, 40($sp) | 228 | ldq $14, 40($sp) |
143 | ldq $15, 48($sp) | 229 | ldq $15, 48($sp) |
144 | addq $sp, 56, $sp | 230 | addq $sp, 56, $sp |
231 | .cfi_restore $9 | ||
232 | .cfi_restore $10 | ||
233 | .cfi_restore $11 | ||
234 | .cfi_restore $12 | ||
235 | .cfi_restore $13 | ||
236 | .cfi_restore $14 | ||
237 | .cfi_restore $15 | ||
238 | .cfi_adjust_cfa_offset -56 | ||
145 | /* finish up the syscall as normal. */ | 239 | /* finish up the syscall as normal. */ |
146 | br ret_from_sys_call | 240 | br ret_from_sys_call |
147 | .end entMM | 241 | CFI_END_OSF_FRAME entMM |
148 | 242 | ||
149 | .align 4 | 243 | CFI_START_OSF_FRAME entIF |
150 | .globl entIF | ||
151 | .ent entIF | ||
152 | entIF: | ||
153 | SAVE_ALL | 244 | SAVE_ALL |
154 | lda $8, 0x3fff | 245 | lda $8, 0x3fff |
155 | lda $26, ret_from_sys_call | 246 | lda $26, ret_from_sys_call |
156 | bic $sp, $8, $8 | 247 | bic $sp, $8, $8 |
157 | mov $sp, $17 | 248 | mov $sp, $17 |
158 | jsr $31, do_entIF | 249 | jsr $31, do_entIF |
159 | .end entIF | 250 | CFI_END_OSF_FRAME entIF |
160 | 251 | ||
161 | .align 4 | 252 | CFI_START_OSF_FRAME entUna |
162 | .globl entUna | ||
163 | .ent entUna | ||
164 | entUna: | ||
165 | lda $sp, -256($sp) | 253 | lda $sp, -256($sp) |
254 | .cfi_adjust_cfa_offset 256 | ||
166 | stq $0, 0($sp) | 255 | stq $0, 0($sp) |
256 | .cfi_rel_offset $0, 0 | ||
257 | .cfi_remember_state | ||
167 | ldq $0, 256($sp) /* get PS */ | 258 | ldq $0, 256($sp) /* get PS */ |
168 | stq $1, 8($sp) | 259 | stq $1, 8($sp) |
169 | stq $2, 16($sp) | 260 | stq $2, 16($sp) |
@@ -195,6 +286,32 @@ entUna: | |||
195 | stq $28, 224($sp) | 286 | stq $28, 224($sp) |
196 | mov $sp, $19 | 287 | mov $sp, $19 |
197 | stq $gp, 232($sp) | 288 | stq $gp, 232($sp) |
289 | .cfi_rel_offset $1, 1*8 | ||
290 | .cfi_rel_offset $2, 2*8 | ||
291 | .cfi_rel_offset $3, 3*8 | ||
292 | .cfi_rel_offset $4, 4*8 | ||
293 | .cfi_rel_offset $5, 5*8 | ||
294 | .cfi_rel_offset $6, 6*8 | ||
295 | .cfi_rel_offset $7, 7*8 | ||
296 | .cfi_rel_offset $8, 8*8 | ||
297 | .cfi_rel_offset $9, 9*8 | ||
298 | .cfi_rel_offset $10, 10*8 | ||
299 | .cfi_rel_offset $11, 11*8 | ||
300 | .cfi_rel_offset $12, 12*8 | ||
301 | .cfi_rel_offset $13, 13*8 | ||
302 | .cfi_rel_offset $14, 14*8 | ||
303 | .cfi_rel_offset $15, 15*8 | ||
304 | .cfi_rel_offset $19, 19*8 | ||
305 | .cfi_rel_offset $20, 20*8 | ||
306 | .cfi_rel_offset $21, 21*8 | ||
307 | .cfi_rel_offset $22, 22*8 | ||
308 | .cfi_rel_offset $23, 23*8 | ||
309 | .cfi_rel_offset $24, 24*8 | ||
310 | .cfi_rel_offset $25, 25*8 | ||
311 | .cfi_rel_offset $26, 26*8 | ||
312 | .cfi_rel_offset $27, 27*8 | ||
313 | .cfi_rel_offset $28, 28*8 | ||
314 | .cfi_rel_offset $29, 29*8 | ||
198 | lda $8, 0x3fff | 315 | lda $8, 0x3fff |
199 | stq $31, 248($sp) | 316 | stq $31, 248($sp) |
200 | bic $sp, $8, $8 | 317 | bic $sp, $8, $8 |
@@ -228,16 +345,45 @@ entUna: | |||
228 | ldq $28, 224($sp) | 345 | ldq $28, 224($sp) |
229 | ldq $gp, 232($sp) | 346 | ldq $gp, 232($sp) |
230 | lda $sp, 256($sp) | 347 | lda $sp, 256($sp) |
348 | .cfi_restore $1 | ||
349 | .cfi_restore $2 | ||
350 | .cfi_restore $3 | ||
351 | .cfi_restore $4 | ||
352 | .cfi_restore $5 | ||
353 | .cfi_restore $6 | ||
354 | .cfi_restore $7 | ||
355 | .cfi_restore $8 | ||
356 | .cfi_restore $9 | ||
357 | .cfi_restore $10 | ||
358 | .cfi_restore $11 | ||
359 | .cfi_restore $12 | ||
360 | .cfi_restore $13 | ||
361 | .cfi_restore $14 | ||
362 | .cfi_restore $15 | ||
363 | .cfi_restore $19 | ||
364 | .cfi_restore $20 | ||
365 | .cfi_restore $21 | ||
366 | .cfi_restore $22 | ||
367 | .cfi_restore $23 | ||
368 | .cfi_restore $24 | ||
369 | .cfi_restore $25 | ||
370 | .cfi_restore $26 | ||
371 | .cfi_restore $27 | ||
372 | .cfi_restore $28 | ||
373 | .cfi_restore $29 | ||
374 | .cfi_adjust_cfa_offset -256 | ||
231 | call_pal PAL_rti | 375 | call_pal PAL_rti |
232 | .end entUna | ||
233 | 376 | ||
234 | .align 4 | 377 | .align 4 |
235 | .ent entUnaUser | ||
236 | entUnaUser: | 378 | entUnaUser: |
379 | .cfi_restore_state | ||
237 | ldq $0, 0($sp) /* restore original $0 */ | 380 | ldq $0, 0($sp) /* restore original $0 */ |
238 | lda $sp, 256($sp) /* pop entUna's stack frame */ | 381 | lda $sp, 256($sp) /* pop entUna's stack frame */ |
382 | .cfi_restore $0 | ||
383 | .cfi_adjust_cfa_offset -256 | ||
239 | SAVE_ALL /* setup normal kernel stack */ | 384 | SAVE_ALL /* setup normal kernel stack */ |
240 | lda $sp, -56($sp) | 385 | lda $sp, -56($sp) |
386 | .cfi_adjust_cfa_offset 56 | ||
241 | stq $9, 0($sp) | 387 | stq $9, 0($sp) |
242 | stq $10, 8($sp) | 388 | stq $10, 8($sp) |
243 | stq $11, 16($sp) | 389 | stq $11, 16($sp) |
@@ -245,6 +391,13 @@ entUnaUser: | |||
245 | stq $13, 32($sp) | 391 | stq $13, 32($sp) |
246 | stq $14, 40($sp) | 392 | stq $14, 40($sp) |
247 | stq $15, 48($sp) | 393 | stq $15, 48($sp) |
394 | .cfi_rel_offset $9, 0 | ||
395 | .cfi_rel_offset $10, 8 | ||
396 | .cfi_rel_offset $11, 16 | ||
397 | .cfi_rel_offset $12, 24 | ||
398 | .cfi_rel_offset $13, 32 | ||
399 | .cfi_rel_offset $14, 40 | ||
400 | .cfi_rel_offset $15, 48 | ||
248 | lda $8, 0x3fff | 401 | lda $8, 0x3fff |
249 | addq $sp, 56, $19 | 402 | addq $sp, 56, $19 |
250 | bic $sp, $8, $8 | 403 | bic $sp, $8, $8 |
@@ -257,20 +410,25 @@ entUnaUser: | |||
257 | ldq $14, 40($sp) | 410 | ldq $14, 40($sp) |
258 | ldq $15, 48($sp) | 411 | ldq $15, 48($sp) |
259 | lda $sp, 56($sp) | 412 | lda $sp, 56($sp) |
413 | .cfi_restore $9 | ||
414 | .cfi_restore $10 | ||
415 | .cfi_restore $11 | ||
416 | .cfi_restore $12 | ||
417 | .cfi_restore $13 | ||
418 | .cfi_restore $14 | ||
419 | .cfi_restore $15 | ||
420 | .cfi_adjust_cfa_offset -56 | ||
260 | br ret_from_sys_call | 421 | br ret_from_sys_call |
261 | .end entUnaUser | 422 | CFI_END_OSF_FRAME entUna |
262 | 423 | ||
263 | .align 4 | 424 | CFI_START_OSF_FRAME entDbg |
264 | .globl entDbg | ||
265 | .ent entDbg | ||
266 | entDbg: | ||
267 | SAVE_ALL | 425 | SAVE_ALL |
268 | lda $8, 0x3fff | 426 | lda $8, 0x3fff |
269 | lda $26, ret_from_sys_call | 427 | lda $26, ret_from_sys_call |
270 | bic $sp, $8, $8 | 428 | bic $sp, $8, $8 |
271 | mov $sp, $16 | 429 | mov $sp, $16 |
272 | jsr $31, do_entDbg | 430 | jsr $31, do_entDbg |
273 | .end entDbg | 431 | CFI_END_OSF_FRAME entDbg |
274 | 432 | ||
275 | /* | 433 | /* |
276 | * The system call entry point is special. Most importantly, it looks | 434 | * The system call entry point is special. Most importantly, it looks |
@@ -285,8 +443,12 @@ entDbg: | |||
285 | 443 | ||
286 | .align 4 | 444 | .align 4 |
287 | .globl entSys | 445 | .globl entSys |
288 | .globl ret_from_sys_call | 446 | .type entSys, @function |
289 | .ent entSys | 447 | .cfi_startproc simple |
448 | .cfi_return_column 64 | ||
449 | .cfi_def_cfa $sp, 48 | ||
450 | .cfi_rel_offset 64, 8 | ||
451 | .cfi_rel_offset $gp, 16 | ||
290 | entSys: | 452 | entSys: |
291 | SAVE_ALL | 453 | SAVE_ALL |
292 | lda $8, 0x3fff | 454 | lda $8, 0x3fff |
@@ -300,6 +462,9 @@ entSys: | |||
300 | stq $17, SP_OFF+32($sp) | 462 | stq $17, SP_OFF+32($sp) |
301 | s8addq $0, $5, $5 | 463 | s8addq $0, $5, $5 |
302 | stq $18, SP_OFF+40($sp) | 464 | stq $18, SP_OFF+40($sp) |
465 | .cfi_rel_offset $16, SP_OFF+24 | ||
466 | .cfi_rel_offset $17, SP_OFF+32 | ||
467 | .cfi_rel_offset $18, SP_OFF+40 | ||
303 | blbs $3, strace | 468 | blbs $3, strace |
304 | beq $4, 1f | 469 | beq $4, 1f |
305 | ldq $27, 0($5) | 470 | ldq $27, 0($5) |
@@ -310,6 +475,7 @@ entSys: | |||
310 | stq $31, 72($sp) /* a3=0 => no error */ | 475 | stq $31, 72($sp) /* a3=0 => no error */ |
311 | 476 | ||
312 | .align 4 | 477 | .align 4 |
478 | .globl ret_from_sys_call | ||
313 | ret_from_sys_call: | 479 | ret_from_sys_call: |
314 | cmovne $26, 0, $18 /* $18 = 0 => non-restartable */ | 480 | cmovne $26, 0, $18 /* $18 = 0 => non-restartable */ |
315 | ldq $0, SP_OFF($sp) | 481 | ldq $0, SP_OFF($sp) |
@@ -324,10 +490,12 @@ ret_to_user: | |||
324 | and $17, _TIF_WORK_MASK, $2 | 490 | and $17, _TIF_WORK_MASK, $2 |
325 | bne $2, work_pending | 491 | bne $2, work_pending |
326 | restore_all: | 492 | restore_all: |
493 | .cfi_remember_state | ||
327 | RESTORE_ALL | 494 | RESTORE_ALL |
328 | call_pal PAL_rti | 495 | call_pal PAL_rti |
329 | 496 | ||
330 | ret_to_kernel: | 497 | ret_to_kernel: |
498 | .cfi_restore_state | ||
331 | lda $16, 7 | 499 | lda $16, 7 |
332 | call_pal PAL_swpipl | 500 | call_pal PAL_swpipl |
333 | br restore_all | 501 | br restore_all |
@@ -356,7 +524,6 @@ $ret_success: | |||
356 | stq $0, 0($sp) | 524 | stq $0, 0($sp) |
357 | stq $31, 72($sp) /* a3=0 => no error */ | 525 | stq $31, 72($sp) /* a3=0 => no error */ |
358 | br ret_from_sys_call | 526 | br ret_from_sys_call |
359 | .end entSys | ||
360 | 527 | ||
361 | /* | 528 | /* |
362 | * Do all cleanup when returning from all interrupts and system calls. | 529 | * Do all cleanup when returning from all interrupts and system calls. |
@@ -370,7 +537,7 @@ $ret_success: | |||
370 | */ | 537 | */ |
371 | 538 | ||
372 | .align 4 | 539 | .align 4 |
373 | .ent work_pending | 540 | .type work_pending, @function |
374 | work_pending: | 541 | work_pending: |
375 | and $17, _TIF_NOTIFY_RESUME | _TIF_SIGPENDING, $2 | 542 | and $17, _TIF_NOTIFY_RESUME | _TIF_SIGPENDING, $2 |
376 | bne $2, $work_notifysig | 543 | bne $2, $work_notifysig |
@@ -387,23 +554,22 @@ $work_resched: | |||
387 | 554 | ||
388 | $work_notifysig: | 555 | $work_notifysig: |
389 | mov $sp, $16 | 556 | mov $sp, $16 |
390 | bsr $1, do_switch_stack | 557 | DO_SWITCH_STACK |
391 | jsr $26, do_work_pending | 558 | jsr $26, do_work_pending |
392 | bsr $1, undo_switch_stack | 559 | UNDO_SWITCH_STACK |
393 | br restore_all | 560 | br restore_all |
394 | .end work_pending | ||
395 | 561 | ||
396 | /* | 562 | /* |
397 | * PTRACE syscall handler | 563 | * PTRACE syscall handler |
398 | */ | 564 | */ |
399 | 565 | ||
400 | .align 4 | 566 | .align 4 |
401 | .ent strace | 567 | .type strace, @function |
402 | strace: | 568 | strace: |
403 | /* set up signal stack, call syscall_trace */ | 569 | /* set up signal stack, call syscall_trace */ |
404 | bsr $1, do_switch_stack | 570 | DO_SWITCH_STACK |
405 | jsr $26, syscall_trace_enter /* returns the syscall number */ | 571 | jsr $26, syscall_trace_enter /* returns the syscall number */ |
406 | bsr $1, undo_switch_stack | 572 | UNDO_SWITCH_STACK |
407 | 573 | ||
408 | /* get the arguments back.. */ | 574 | /* get the arguments back.. */ |
409 | ldq $16, SP_OFF+24($sp) | 575 | ldq $16, SP_OFF+24($sp) |
@@ -431,9 +597,9 @@ ret_from_straced: | |||
431 | $strace_success: | 597 | $strace_success: |
432 | stq $0, 0($sp) /* save return value */ | 598 | stq $0, 0($sp) /* save return value */ |
433 | 599 | ||
434 | bsr $1, do_switch_stack | 600 | DO_SWITCH_STACK |
435 | jsr $26, syscall_trace_leave | 601 | jsr $26, syscall_trace_leave |
436 | bsr $1, undo_switch_stack | 602 | UNDO_SWITCH_STACK |
437 | br $31, ret_from_sys_call | 603 | br $31, ret_from_sys_call |
438 | 604 | ||
439 | .align 3 | 605 | .align 3 |
@@ -447,26 +613,31 @@ $strace_error: | |||
447 | stq $0, 0($sp) | 613 | stq $0, 0($sp) |
448 | stq $1, 72($sp) /* a3 for return */ | 614 | stq $1, 72($sp) /* a3 for return */ |
449 | 615 | ||
450 | bsr $1, do_switch_stack | 616 | DO_SWITCH_STACK |
451 | mov $18, $9 /* save old syscall number */ | 617 | mov $18, $9 /* save old syscall number */ |
452 | mov $19, $10 /* save old a3 */ | 618 | mov $19, $10 /* save old a3 */ |
453 | jsr $26, syscall_trace_leave | 619 | jsr $26, syscall_trace_leave |
454 | mov $9, $18 | 620 | mov $9, $18 |
455 | mov $10, $19 | 621 | mov $10, $19 |
456 | bsr $1, undo_switch_stack | 622 | UNDO_SWITCH_STACK |
457 | 623 | ||
458 | mov $31, $26 /* tell "ret_from_sys_call" we can restart */ | 624 | mov $31, $26 /* tell "ret_from_sys_call" we can restart */ |
459 | br ret_from_sys_call | 625 | br ret_from_sys_call |
460 | .end strace | 626 | CFI_END_OSF_FRAME entSys |
461 | 627 | ||
462 | /* | 628 | /* |
463 | * Save and restore the switch stack -- aka the balance of the user context. | 629 | * Save and restore the switch stack -- aka the balance of the user context. |
464 | */ | 630 | */ |
465 | 631 | ||
466 | .align 4 | 632 | .align 4 |
467 | .ent do_switch_stack | 633 | .type do_switch_stack, @function |
634 | .cfi_startproc simple | ||
635 | .cfi_return_column 64 | ||
636 | .cfi_def_cfa $sp, 0 | ||
637 | .cfi_register 64, $1 | ||
468 | do_switch_stack: | 638 | do_switch_stack: |
469 | lda $sp, -SWITCH_STACK_SIZE($sp) | 639 | lda $sp, -SWITCH_STACK_SIZE($sp) |
640 | .cfi_adjust_cfa_offset SWITCH_STACK_SIZE | ||
470 | stq $9, 0($sp) | 641 | stq $9, 0($sp) |
471 | stq $10, 8($sp) | 642 | stq $10, 8($sp) |
472 | stq $11, 16($sp) | 643 | stq $11, 16($sp) |
@@ -510,10 +681,14 @@ do_switch_stack: | |||
510 | stt $f0, 312($sp) # save fpcr in slot of $f31 | 681 | stt $f0, 312($sp) # save fpcr in slot of $f31 |
511 | ldt $f0, 64($sp) # dont let "do_switch_stack" change fp state. | 682 | ldt $f0, 64($sp) # dont let "do_switch_stack" change fp state. |
512 | ret $31, ($1), 1 | 683 | ret $31, ($1), 1 |
513 | .end do_switch_stack | 684 | .cfi_endproc |
685 | .size do_switch_stack, .-do_switch_stack | ||
514 | 686 | ||
515 | .align 4 | 687 | .align 4 |
516 | .ent undo_switch_stack | 688 | .type undo_switch_stack, @function |
689 | .cfi_startproc simple | ||
690 | .cfi_def_cfa $sp, 0 | ||
691 | .cfi_register 64, $1 | ||
517 | undo_switch_stack: | 692 | undo_switch_stack: |
518 | ldq $9, 0($sp) | 693 | ldq $9, 0($sp) |
519 | ldq $10, 8($sp) | 694 | ldq $10, 8($sp) |
@@ -558,7 +733,8 @@ undo_switch_stack: | |||
558 | ldt $f30, 304($sp) | 733 | ldt $f30, 304($sp) |
559 | lda $sp, SWITCH_STACK_SIZE($sp) | 734 | lda $sp, SWITCH_STACK_SIZE($sp) |
560 | ret $31, ($1), 1 | 735 | ret $31, ($1), 1 |
561 | .end undo_switch_stack | 736 | .cfi_endproc |
737 | .size undo_switch_stack, .-undo_switch_stack | ||
562 | 738 | ||
563 | /* | 739 | /* |
564 | * The meat of the context switch code. | 740 | * The meat of the context switch code. |
@@ -566,17 +742,18 @@ undo_switch_stack: | |||
566 | 742 | ||
567 | .align 4 | 743 | .align 4 |
568 | .globl alpha_switch_to | 744 | .globl alpha_switch_to |
569 | .ent alpha_switch_to | 745 | .type alpha_switch_to, @function |
746 | .cfi_startproc | ||
570 | alpha_switch_to: | 747 | alpha_switch_to: |
571 | .prologue 0 | 748 | DO_SWITCH_STACK |
572 | bsr $1, do_switch_stack | ||
573 | call_pal PAL_swpctx | 749 | call_pal PAL_swpctx |
574 | lda $8, 0x3fff | 750 | lda $8, 0x3fff |
575 | bsr $1, undo_switch_stack | 751 | UNDO_SWITCH_STACK |
576 | bic $sp, $8, $8 | 752 | bic $sp, $8, $8 |
577 | mov $17, $0 | 753 | mov $17, $0 |
578 | ret | 754 | ret |
579 | .end alpha_switch_to | 755 | .cfi_endproc |
756 | .size alpha_switch_to, .-alpha_switch_to | ||
580 | 757 | ||
581 | /* | 758 | /* |
582 | * New processes begin life here. | 759 | * New processes begin life here. |