1
2
3
4
5
6
7#include <asm/asm-offsets.h>
8#include <asm/thread_info.h>
9#include <asm/pal.h>
10#include <asm/errno.h>
11#include <asm/unistd.h>
12
13 .text
14 .set noat
15
16
17#define SP_OFF 184
18#define SWITCH_STACK_SIZE 320
19
20
21
22
23
24
25
26
27
28
29
30#define SAVE_ALL \
31 subq $sp, SP_OFF, $sp; \
32 stq $0, 0($sp); \
33 stq $1, 8($sp); \
34 stq $2, 16($sp); \
35 stq $3, 24($sp); \
36 stq $4, 32($sp); \
37 stq $28, 144($sp); \
38 lda $2, alpha_mv; \
39 stq $5, 40($sp); \
40 stq $6, 48($sp); \
41 stq $7, 56($sp); \
42 stq $8, 64($sp); \
43 stq $19, 72($sp); \
44 stq $20, 80($sp); \
45 stq $21, 88($sp); \
46 ldq $2, HAE_CACHE($2); \
47 stq $22, 96($sp); \
48 stq $23, 104($sp); \
49 stq $24, 112($sp); \
50 stq $25, 120($sp); \
51 stq $26, 128($sp); \
52 stq $27, 136($sp); \
53 stq $2, 152($sp); \
54 stq $16, 160($sp); \
55 stq $17, 168($sp); \
56 stq $18, 176($sp)
57
58#define RESTORE_ALL \
59 lda $19, alpha_mv; \
60 ldq $0, 0($sp); \
61 ldq $1, 8($sp); \
62 ldq $2, 16($sp); \
63 ldq $3, 24($sp); \
64 ldq $21, 152($sp); \
65 ldq $20, HAE_CACHE($19); \
66 ldq $4, 32($sp); \
67 ldq $5, 40($sp); \
68 ldq $6, 48($sp); \
69 ldq $7, 56($sp); \
70 subq $20, $21, $20; \
71 ldq $8, 64($sp); \
72 beq $20, 99f; \
73 ldq $20, HAE_REG($19); \
74 stq $21, HAE_CACHE($19); \
75 stq $21, 0($20); \
7699:; \
77 ldq $19, 72($sp); \
78 ldq $20, 80($sp); \
79 ldq $21, 88($sp); \
80 ldq $22, 96($sp); \
81 ldq $23, 104($sp); \
82 ldq $24, 112($sp); \
83 ldq $25, 120($sp); \
84 ldq $26, 128($sp); \
85 ldq $27, 136($sp); \
86 ldq $28, 144($sp); \
87 addq $sp, SP_OFF, $sp
88
89
90
91
92
93 .align 4
94 .globl entInt
95 .ent entInt
96entInt:
97 SAVE_ALL
98 lda $8, 0x3fff
99 lda $26, ret_from_sys_call
100 bic $sp, $8, $8
101 mov $sp, $19
102 jsr $31, do_entInt
103.end entInt
104
105 .align 4
106 .globl entArith
107 .ent entArith
108entArith:
109 SAVE_ALL
110 lda $8, 0x3fff
111 lda $26, ret_from_sys_call
112 bic $sp, $8, $8
113 mov $sp, $18
114 jsr $31, do_entArith
115.end entArith
116
117 .align 4
118 .globl entMM
119 .ent entMM
120entMM:
121 SAVE_ALL
122
123 subq $sp, 56, $sp
124 stq $9, 0($sp)
125 stq $10, 8($sp)
126 stq $11, 16($sp)
127 stq $12, 24($sp)
128 stq $13, 32($sp)
129 stq $14, 40($sp)
130 stq $15, 48($sp)
131 addq $sp, 56, $19
132
133 lda $8, 0x3fff
134 bic $sp, $8, $8
135 jsr $26, do_page_fault
136
137 ldq $9, 0($sp)
138 ldq $10, 8($sp)
139 ldq $11, 16($sp)
140 ldq $12, 24($sp)
141 ldq $13, 32($sp)
142 ldq $14, 40($sp)
143 ldq $15, 48($sp)
144 addq $sp, 56, $sp
145
146 br ret_from_sys_call
147.end entMM
148
149 .align 4
150 .globl entIF
151 .ent entIF
152entIF:
153 SAVE_ALL
154 lda $8, 0x3fff
155 lda $26, ret_from_sys_call
156 bic $sp, $8, $8
157 mov $sp, $17
158 jsr $31, do_entIF
159.end entIF
160
161 .align 4
162 .globl entUna
163 .ent entUna
164entUna:
165 lda $sp, -256($sp)
166 stq $0, 0($sp)
167 ldq $0, 256($sp)
168 stq $1, 8($sp)
169 stq $2, 16($sp)
170 stq $3, 24($sp)
171 and $0, 8, $0
172 stq $4, 32($sp)
173 bne $0, entUnaUser
174 stq $5, 40($sp)
175 stq $6, 48($sp)
176 stq $7, 56($sp)
177 stq $8, 64($sp)
178 stq $9, 72($sp)
179 stq $10, 80($sp)
180 stq $11, 88($sp)
181 stq $12, 96($sp)
182 stq $13, 104($sp)
183 stq $14, 112($sp)
184 stq $15, 120($sp)
185
186 stq $19, 152($sp)
187 stq $20, 160($sp)
188 stq $21, 168($sp)
189 stq $22, 176($sp)
190 stq $23, 184($sp)
191 stq $24, 192($sp)
192 stq $25, 200($sp)
193 stq $26, 208($sp)
194 stq $27, 216($sp)
195 stq $28, 224($sp)
196 mov $sp, $19
197 stq $gp, 232($sp)
198 lda $8, 0x3fff
199 stq $31, 248($sp)
200 bic $sp, $8, $8
201 jsr $26, do_entUna
202 ldq $0, 0($sp)
203 ldq $1, 8($sp)
204 ldq $2, 16($sp)
205 ldq $3, 24($sp)
206 ldq $4, 32($sp)
207 ldq $5, 40($sp)
208 ldq $6, 48($sp)
209 ldq $7, 56($sp)
210 ldq $8, 64($sp)
211 ldq $9, 72($sp)
212 ldq $10, 80($sp)
213 ldq $11, 88($sp)
214 ldq $12, 96($sp)
215 ldq $13, 104($sp)
216 ldq $14, 112($sp)
217 ldq $15, 120($sp)
218
219 ldq $19, 152($sp)
220 ldq $20, 160($sp)
221 ldq $21, 168($sp)
222 ldq $22, 176($sp)
223 ldq $23, 184($sp)
224 ldq $24, 192($sp)
225 ldq $25, 200($sp)
226 ldq $26, 208($sp)
227 ldq $27, 216($sp)
228 ldq $28, 224($sp)
229 ldq $gp, 232($sp)
230 lda $sp, 256($sp)
231 call_pal PAL_rti
232.end entUna
233
234 .align 4
235 .ent entUnaUser
236entUnaUser:
237 ldq $0, 0($sp)
238 lda $sp, 256($sp)
239 SAVE_ALL
240 lda $sp, -56($sp)
241 stq $9, 0($sp)
242 stq $10, 8($sp)
243 stq $11, 16($sp)
244 stq $12, 24($sp)
245 stq $13, 32($sp)
246 stq $14, 40($sp)
247 stq $15, 48($sp)
248 lda $8, 0x3fff
249 addq $sp, 56, $19
250 bic $sp, $8, $8
251 jsr $26, do_entUnaUser
252 ldq $9, 0($sp)
253 ldq $10, 8($sp)
254 ldq $11, 16($sp)
255 ldq $12, 24($sp)
256 ldq $13, 32($sp)
257 ldq $14, 40($sp)
258 ldq $15, 48($sp)
259 lda $sp, 56($sp)
260 br ret_from_sys_call
261.end entUnaUser
262
263 .align 4
264 .globl entDbg
265 .ent entDbg
266entDbg:
267 SAVE_ALL
268 lda $8, 0x3fff
269 lda $26, ret_from_sys_call
270 bic $sp, $8, $8
271 mov $sp, $16
272 jsr $31, do_entDbg
273.end entDbg
274
275
276
277
278
279
280
281
282
283
284
285
286 .align 4
287 .globl entSys
288 .globl ret_from_sys_call
289 .ent entSys
290entSys:
291 SAVE_ALL
292 lda $8, 0x3fff
293 bic $sp, $8, $8
294 lda $4, NR_SYSCALLS($31)
295 stq $16, SP_OFF+24($sp)
296 lda $5, sys_call_table
297 lda $27, sys_ni_syscall
298 cmpult $0, $4, $4
299 ldl $3, TI_FLAGS($8)
300 stq $17, SP_OFF+32($sp)
301 s8addq $0, $5, $5
302 stq $18, SP_OFF+40($sp)
303 blbs $3, strace
304 beq $4, 1f
305 ldq $27, 0($5)
3061: jsr $26, ($27), alpha_ni_syscall
307 ldgp $gp, 0($26)
308 blt $0, $syscall_error
309 stq $0, 0($sp)
310 stq $31, 72($sp)
311
312 .align 4
313ret_from_sys_call:
314 cmovne $26, 0, $18
315 ldq $0, SP_OFF($sp)
316 and $0, 8, $0
317 beq $0, ret_to_kernel
318ret_to_user:
319
320
321 lda $16, 7
322 call_pal PAL_swpipl
323 ldl $17, TI_FLAGS($8)
324 and $17, _TIF_WORK_MASK, $2
325 bne $2, work_pending
326restore_all:
327 RESTORE_ALL
328 call_pal PAL_rti
329
330ret_to_kernel:
331 lda $16, 7
332 call_pal PAL_swpipl
333 br restore_all
334
335 .align 3
336$syscall_error:
337
338
339
340
341
342
343
344 ldq $18, 0($sp)
345 beq $18, $ret_success
346
347 ldq $19, 72($sp)
348 subq $31, $0, $0
349 addq $31, 1, $1
350 stq $0, 0($sp)
351 mov $31, $26
352 stq $1, 72($sp)
353 br ret_from_sys_call
354
355$ret_success:
356 stq $0, 0($sp)
357 stq $31, 72($sp)
358 br ret_from_sys_call
359.end entSys
360
361
362
363
364
365
366
367
368
369
370
371
372 .align 4
373 .ent work_pending
374work_pending:
375 and $17, _TIF_NOTIFY_RESUME | _TIF_SIGPENDING, $2
376 bne $2, $work_notifysig
377
378$work_resched:
379
380
381
382
383
384 jsr $26, schedule
385 mov 0, $18
386 br ret_to_user
387
388$work_notifysig:
389 mov $sp, $16
390 bsr $1, do_switch_stack
391 jsr $26, do_work_pending
392 bsr $1, undo_switch_stack
393 br restore_all
394.end work_pending
395
396
397
398
399
400 .align 4
401 .ent strace
402strace:
403
404 bsr $1, do_switch_stack
405 jsr $26, syscall_trace_enter
406 bsr $1, undo_switch_stack
407
408
409 ldq $16, SP_OFF+24($sp)
410 ldq $17, SP_OFF+32($sp)
411 ldq $18, SP_OFF+40($sp)
412 ldq $19, 72($sp)
413 ldq $20, 80($sp)
414 ldq $21, 88($sp)
415
416
417 lda $1, NR_SYSCALLS($31)
418 lda $2, sys_call_table
419 lda $27, alpha_ni_syscall
420 cmpult $0, $1, $1
421 s8addq $0, $2, $2
422 beq $1, 1f
423 ldq $27, 0($2)
4241: jsr $26, ($27), sys_gettimeofday
425ret_from_straced:
426 ldgp $gp, 0($26)
427
428
429 blt $0, $strace_error
430 stq $31, 72($sp)
431$strace_success:
432 stq $0, 0($sp)
433
434 bsr $1, do_switch_stack
435 jsr $26, syscall_trace_leave
436 bsr $1, undo_switch_stack
437 br $31, ret_from_sys_call
438
439 .align 3
440$strace_error:
441 ldq $18, 0($sp)
442 beq $18, $strace_success
443 ldq $19, 72($sp)
444
445 subq $31, $0, $0
446 addq $31, 1, $1
447 stq $0, 0($sp)
448 stq $1, 72($sp)
449
450 bsr $1, do_switch_stack
451 mov $18, $9
452 mov $19, $10
453 jsr $26, syscall_trace_leave
454 mov $9, $18
455 mov $10, $19
456 bsr $1, undo_switch_stack
457
458 mov $31, $26
459 br ret_from_sys_call
460.end strace
461
462
463
464
465
466 .align 4
467 .ent do_switch_stack
468do_switch_stack:
469 lda $sp, -SWITCH_STACK_SIZE($sp)
470 stq $9, 0($sp)
471 stq $10, 8($sp)
472 stq $11, 16($sp)
473 stq $12, 24($sp)
474 stq $13, 32($sp)
475 stq $14, 40($sp)
476 stq $15, 48($sp)
477 stq $26, 56($sp)
478 stt $f0, 64($sp)
479 stt $f1, 72($sp)
480 stt $f2, 80($sp)
481 stt $f3, 88($sp)
482 stt $f4, 96($sp)
483 stt $f5, 104($sp)
484 stt $f6, 112($sp)
485 stt $f7, 120($sp)
486 stt $f8, 128($sp)
487 stt $f9, 136($sp)
488 stt $f10, 144($sp)
489 stt $f11, 152($sp)
490 stt $f12, 160($sp)
491 stt $f13, 168($sp)
492 stt $f14, 176($sp)
493 stt $f15, 184($sp)
494 stt $f16, 192($sp)
495 stt $f17, 200($sp)
496 stt $f18, 208($sp)
497 stt $f19, 216($sp)
498 stt $f20, 224($sp)
499 stt $f21, 232($sp)
500 stt $f22, 240($sp)
501 stt $f23, 248($sp)
502 stt $f24, 256($sp)
503 stt $f25, 264($sp)
504 stt $f26, 272($sp)
505 stt $f27, 280($sp)
506 mf_fpcr $f0
507 stt $f28, 288($sp)
508 stt $f29, 296($sp)
509 stt $f30, 304($sp)
510 stt $f0, 312($sp)
511 ldt $f0, 64($sp)
512 ret $31, ($1), 1
513.end do_switch_stack
514
515 .align 4
516 .ent undo_switch_stack
517undo_switch_stack:
518 ldq $9, 0($sp)
519 ldq $10, 8($sp)
520 ldq $11, 16($sp)
521 ldq $12, 24($sp)
522 ldq $13, 32($sp)
523 ldq $14, 40($sp)
524 ldq $15, 48($sp)
525 ldq $26, 56($sp)
526 ldt $f30, 312($sp)
527 ldt $f0, 64($sp)
528 ldt $f1, 72($sp)
529 ldt $f2, 80($sp)
530 ldt $f3, 88($sp)
531 mt_fpcr $f30
532 ldt $f4, 96($sp)
533 ldt $f5, 104($sp)
534 ldt $f6, 112($sp)
535 ldt $f7, 120($sp)
536 ldt $f8, 128($sp)
537 ldt $f9, 136($sp)
538 ldt $f10, 144($sp)
539 ldt $f11, 152($sp)
540 ldt $f12, 160($sp)
541 ldt $f13, 168($sp)
542 ldt $f14, 176($sp)
543 ldt $f15, 184($sp)
544 ldt $f16, 192($sp)
545 ldt $f17, 200($sp)
546 ldt $f18, 208($sp)
547 ldt $f19, 216($sp)
548 ldt $f20, 224($sp)
549 ldt $f21, 232($sp)
550 ldt $f22, 240($sp)
551 ldt $f23, 248($sp)
552 ldt $f24, 256($sp)
553 ldt $f25, 264($sp)
554 ldt $f26, 272($sp)
555 ldt $f27, 280($sp)
556 ldt $f28, 288($sp)
557 ldt $f29, 296($sp)
558 ldt $f30, 304($sp)
559 lda $sp, SWITCH_STACK_SIZE($sp)
560 ret $31, ($1), 1
561.end undo_switch_stack
562
563
564
565
566
567 .align 4
568 .globl alpha_switch_to
569 .ent alpha_switch_to
570alpha_switch_to:
571 .prologue 0
572 bsr $1, do_switch_stack
573 call_pal PAL_swpctx
574 lda $8, 0x3fff
575 bsr $1, undo_switch_stack
576 bic $sp, $8, $8
577 mov $17, $0
578 ret
579.end alpha_switch_to
580
581
582
583
584
585 .globl ret_from_fork
586 .align 4
587 .ent ret_from_fork
588ret_from_fork:
589 lda $26, ret_from_sys_call
590 mov $17, $16
591 jmp $31, schedule_tail
592.end ret_from_fork
593
594
595
596
597 .align 4
598 .globl ret_from_kernel_thread
599 .ent ret_from_kernel_thread
600ret_from_kernel_thread:
601 mov $17, $16
602 jsr $26, schedule_tail
603 mov $9, $27
604 mov $10, $16
605 jsr $26, ($9)
606 mov $31, $19
607 br $31, ret_to_user
608.end ret_from_kernel_thread
609
610
611
612
613
614
615
616.macro fork_like name
617 .align 4
618 .globl alpha_\name
619 .ent alpha_\name
620alpha_\name:
621 .prologue 0
622 bsr $1, do_switch_stack
623 jsr $26, sys_\name
624 ldq $26, 56($sp)
625 lda $sp, SWITCH_STACK_SIZE($sp)
626 ret
627.end alpha_\name
628.endm
629
630fork_like fork
631fork_like vfork
632fork_like clone
633
634 .align 4
635 .globl sys_sigreturn
636 .ent sys_sigreturn
637sys_sigreturn:
638 .prologue 0
639 lda $9, ret_from_straced
640 cmpult $26, $9, $9
641 lda $sp, -SWITCH_STACK_SIZE($sp)
642 jsr $26, do_sigreturn
643 bne $9, 1f
644 jsr $26, syscall_trace_leave
6451: br $1, undo_switch_stack
646 br ret_from_sys_call
647.end sys_sigreturn
648
649 .align 4
650 .globl sys_rt_sigreturn
651 .ent sys_rt_sigreturn
652sys_rt_sigreturn:
653 .prologue 0
654 lda $9, ret_from_straced
655 cmpult $26, $9, $9
656 lda $sp, -SWITCH_STACK_SIZE($sp)
657 jsr $26, do_rt_sigreturn
658 bne $9, 1f
659 jsr $26, syscall_trace_leave
6601: br $1, undo_switch_stack
661 br ret_from_sys_call
662.end sys_rt_sigreturn
663
664 .align 4
665 .globl alpha_ni_syscall
666 .ent alpha_ni_syscall
667alpha_ni_syscall:
668 .prologue 0
669
670
671
672 lda $0, -ENOSYS
673 unop
674 stq $0, 0($sp)
675 ret
676.end alpha_ni_syscall
677