blob: 2a359c9ee3cd88a341550c57f34177288ee61ecd [file] [log] [blame]
Linus Torvalds1da177e2005-04-16 15:20:36 -07001/*
2 * arch/alpha/kernel/entry.S
3 *
4 * Kernel entry-points.
5 */
6
Sam Ravnborge2d5df92005-09-09 21:28:48 +02007#include <asm/asm-offsets.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -07008#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/* Stack offsets. */
17#define SP_OFF 184
18#define SWITCH_STACK_SIZE 320
19
20/*
21 * This defines the normal kernel pt-regs layout.
22 *
23 * regs 9-15 preserved by C code
24 * regs 16-18 saved by PAL-code
25 * regs 29-30 saved and set up by PAL-code
26 * JRP - Save regs 16-18 in a special area of the stack, so that
27 * the palcode-provided values are available to the signal handler.
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); \
Linus Torvalds1da177e2005-04-16 15:20:36 -07007699:; \
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 * Non-syscall kernel entry points.
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/* save $9 - $15 so the inline exception code can manipulate them. */
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/* handle the fault */
133 lda $8, 0x3fff
134 bic $sp, $8, $8
135 jsr $26, do_page_fault
136/* reload the registers after the exception code played. */
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/* finish up the syscall as normal. */
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) /* get PS */
168 stq $1, 8($sp)
169 stq $2, 16($sp)
170 stq $3, 24($sp)
171 and $0, 8, $0 /* user mode? */
172 stq $4, 32($sp)
173 bne $0, entUnaUser /* yup -> do user-level unaligned fault */
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 /* 16-18 PAL-saved */
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)
Richard Hendersond70ddac2005-10-02 12:49:52 -0700196 mov $sp, $19
Linus Torvalds1da177e2005-04-16 15:20:36 -0700197 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 /* 16-18 PAL-saved */
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) /* restore original $0 */
238 lda $sp, 256($sp) /* pop entUna's stack frame */
239 SAVE_ALL /* setup normal kernel stack */
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 * The system call entry point is special. Most importantly, it looks
277 * like a function call to userspace as far as clobbered registers. We
278 * do preserve the argument registers (for syscall restarts) and $26
279 * (for leaf syscall functions).
280 *
281 * So much for theory. We don't take advantage of this yet.
282 *
283 * Note that a0-a2 are not saved by PALcode as with the other entry points.
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 /* the call failed */
309 stq $0, 0($sp)
310 stq $31, 72($sp) /* a3=0 => no error */
311
312 .align 4
313ret_from_sys_call:
314 cmovne $26, 0, $19 /* $19 = 0 => non-restartable */
315 ldq $0, SP_OFF($sp)
316 and $0, 8, $0
Al Viro77edffb2010-09-25 21:07:14 +0100317 beq $0, ret_to_kernel
Al Viro494486a2010-09-18 08:42:27 -0400318ret_to_user:
Linus Torvalds1da177e2005-04-16 15:20:36 -0700319 /* Make sure need_resched and sigpending don't change between
320 sampling and the rti. */
321 lda $16, 7
322 call_pal PAL_swpipl
323 ldl $5, TI_FLAGS($8)
324 and $5, _TIF_WORK_MASK, $2
Al Viro494486a2010-09-18 08:42:27 -0400325 bne $2, work_pending
Linus Torvalds1da177e2005-04-16 15:20:36 -0700326restore_all:
327 RESTORE_ALL
328 call_pal PAL_rti
329
Al Viro77edffb2010-09-25 21:07:14 +0100330ret_to_kernel:
331 lda $16, 7
332 call_pal PAL_swpipl
333 br restore_all
334
Linus Torvalds1da177e2005-04-16 15:20:36 -0700335 .align 3
336$syscall_error:
337 /*
338 * Some system calls (e.g., ptrace) can return arbitrary
339 * values which might normally be mistaken as error numbers.
340 * Those functions must zero $0 (v0) directly in the stack
341 * frame to indicate that a negative return value wasn't an
342 * error number..
343 */
344 ldq $19, 0($sp) /* old syscall nr (zero if success) */
345 beq $19, $ret_success
346
347 ldq $20, 72($sp) /* .. and this a3 */
348 subq $31, $0, $0 /* with error in v0 */
349 addq $31, 1, $1 /* set a3 for errno return */
350 stq $0, 0($sp)
351 mov $31, $26 /* tell "ret_from_sys_call" we can restart */
352 stq $1, 72($sp) /* a3 for return */
353 br ret_from_sys_call
354
355$ret_success:
356 stq $0, 0($sp)
357 stq $31, 72($sp) /* a3=0 => no error */
358 br ret_from_sys_call
359.end entSys
360
361/*
362 * Do all cleanup when returning from all interrupts and system calls.
363 *
364 * Arguments:
365 * $5: TI_FLAGS.
366 * $8: current.
367 * $19: The old syscall number, or zero if this is not a return
368 * from a syscall that errored and is possibly restartable.
Al Viro494486a2010-09-18 08:42:27 -0400369 * $20: The old a3 value
Linus Torvalds1da177e2005-04-16 15:20:36 -0700370 */
371
372 .align 4
373 .ent work_pending
374work_pending:
375 and $5, _TIF_NEED_RESCHED, $2
376 beq $2, $work_notifysig
377
378$work_resched:
379 subq $sp, 16, $sp
380 stq $19, 0($sp) /* save syscall nr */
381 stq $20, 8($sp) /* and error indication (a3) */
382 jsr $26, schedule
383 ldq $19, 0($sp)
384 ldq $20, 8($sp)
385 addq $sp, 16, $sp
386 /* Make sure need_resched and sigpending don't change between
387 sampling and the rti. */
388 lda $16, 7
389 call_pal PAL_swpipl
390 ldl $5, TI_FLAGS($8)
391 and $5, _TIF_WORK_MASK, $2
392 beq $2, restore_all
393 and $5, _TIF_NEED_RESCHED, $2
394 bne $2, $work_resched
395
396$work_notifysig:
Richard Hendersonb927b3e2007-05-29 16:03:28 -0700397 mov $sp, $16
Al Viro494486a2010-09-18 08:42:27 -0400398 bsr $1, do_switch_stack
Richard Hendersonb927b3e2007-05-29 16:03:28 -0700399 mov $sp, $17
400 mov $5, $18
Al Viro494486a2010-09-18 08:42:27 -0400401 mov $19, $9 /* save old syscall number */
402 mov $20, $10 /* save old a3 */
403 and $5, _TIF_SIGPENDING, $2
404 cmovne $2, 0, $9 /* we don't want double syscall restarts */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700405 jsr $26, do_notify_resume
Al Viro494486a2010-09-18 08:42:27 -0400406 mov $9, $19
407 mov $10, $20
Linus Torvalds1da177e2005-04-16 15:20:36 -0700408 bsr $1, undo_switch_stack
Al Viro494486a2010-09-18 08:42:27 -0400409 br ret_to_user
Linus Torvalds1da177e2005-04-16 15:20:36 -0700410.end work_pending
411
412/*
413 * PTRACE syscall handler
414 */
415
416 .align 4
417 .ent strace
418strace:
419 /* set up signal stack, call syscall_trace */
420 bsr $1, do_switch_stack
Al Viro12f79be2012-05-26 21:44:21 -0400421 jsr $26, syscall_trace_enter /* returns the syscall number */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700422 bsr $1, undo_switch_stack
423
Al Viro12f79be2012-05-26 21:44:21 -0400424 /* get the arguments back.. */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700425 ldq $16, SP_OFF+24($sp)
426 ldq $17, SP_OFF+32($sp)
427 ldq $18, SP_OFF+40($sp)
428 ldq $19, 72($sp)
429 ldq $20, 80($sp)
430 ldq $21, 88($sp)
431
432 /* get the system call pointer.. */
433 lda $1, NR_SYSCALLS($31)
434 lda $2, sys_call_table
435 lda $27, alpha_ni_syscall
436 cmpult $0, $1, $1
437 s8addq $0, $2, $2
438 beq $1, 1f
439 ldq $27, 0($2)
4401: jsr $26, ($27), sys_gettimeofday
Al Viro53293632010-09-18 08:41:16 -0400441ret_from_straced:
Linus Torvalds1da177e2005-04-16 15:20:36 -0700442 ldgp $gp, 0($26)
443
444 /* check return.. */
445 blt $0, $strace_error /* the call failed */
446 stq $31, 72($sp) /* a3=0 => no error */
447$strace_success:
448 stq $0, 0($sp) /* save return value */
449
450 bsr $1, do_switch_stack
Al Viro12f79be2012-05-26 21:44:21 -0400451 jsr $26, syscall_trace_leave
Linus Torvalds1da177e2005-04-16 15:20:36 -0700452 bsr $1, undo_switch_stack
453 br $31, ret_from_sys_call
454
455 .align 3
456$strace_error:
457 ldq $19, 0($sp) /* old syscall nr (zero if success) */
458 beq $19, $strace_success
459 ldq $20, 72($sp) /* .. and this a3 */
460
461 subq $31, $0, $0 /* with error in v0 */
462 addq $31, 1, $1 /* set a3 for errno return */
463 stq $0, 0($sp)
464 stq $1, 72($sp) /* a3 for return */
465
466 bsr $1, do_switch_stack
467 mov $19, $9 /* save old syscall number */
468 mov $20, $10 /* save old a3 */
Al Viro12f79be2012-05-26 21:44:21 -0400469 jsr $26, syscall_trace_leave
Linus Torvalds1da177e2005-04-16 15:20:36 -0700470 mov $9, $19
471 mov $10, $20
472 bsr $1, undo_switch_stack
473
474 mov $31, $26 /* tell "ret_from_sys_call" we can restart */
475 br ret_from_sys_call
476.end strace
477
478/*
479 * Save and restore the switch stack -- aka the balance of the user context.
480 */
481
482 .align 4
483 .ent do_switch_stack
484do_switch_stack:
485 lda $sp, -SWITCH_STACK_SIZE($sp)
486 stq $9, 0($sp)
487 stq $10, 8($sp)
488 stq $11, 16($sp)
489 stq $12, 24($sp)
490 stq $13, 32($sp)
491 stq $14, 40($sp)
492 stq $15, 48($sp)
493 stq $26, 56($sp)
494 stt $f0, 64($sp)
495 stt $f1, 72($sp)
496 stt $f2, 80($sp)
497 stt $f3, 88($sp)
498 stt $f4, 96($sp)
499 stt $f5, 104($sp)
500 stt $f6, 112($sp)
501 stt $f7, 120($sp)
502 stt $f8, 128($sp)
503 stt $f9, 136($sp)
504 stt $f10, 144($sp)
505 stt $f11, 152($sp)
506 stt $f12, 160($sp)
507 stt $f13, 168($sp)
508 stt $f14, 176($sp)
509 stt $f15, 184($sp)
510 stt $f16, 192($sp)
511 stt $f17, 200($sp)
512 stt $f18, 208($sp)
513 stt $f19, 216($sp)
514 stt $f20, 224($sp)
515 stt $f21, 232($sp)
516 stt $f22, 240($sp)
517 stt $f23, 248($sp)
518 stt $f24, 256($sp)
519 stt $f25, 264($sp)
520 stt $f26, 272($sp)
521 stt $f27, 280($sp)
522 mf_fpcr $f0 # get fpcr
523 stt $f28, 288($sp)
524 stt $f29, 296($sp)
525 stt $f30, 304($sp)
526 stt $f0, 312($sp) # save fpcr in slot of $f31
527 ldt $f0, 64($sp) # dont let "do_switch_stack" change fp state.
528 ret $31, ($1), 1
529.end do_switch_stack
530
531 .align 4
532 .ent undo_switch_stack
533undo_switch_stack:
534 ldq $9, 0($sp)
535 ldq $10, 8($sp)
536 ldq $11, 16($sp)
537 ldq $12, 24($sp)
538 ldq $13, 32($sp)
539 ldq $14, 40($sp)
540 ldq $15, 48($sp)
541 ldq $26, 56($sp)
542 ldt $f30, 312($sp) # get saved fpcr
543 ldt $f0, 64($sp)
544 ldt $f1, 72($sp)
545 ldt $f2, 80($sp)
546 ldt $f3, 88($sp)
547 mt_fpcr $f30 # install saved fpcr
548 ldt $f4, 96($sp)
549 ldt $f5, 104($sp)
550 ldt $f6, 112($sp)
551 ldt $f7, 120($sp)
552 ldt $f8, 128($sp)
553 ldt $f9, 136($sp)
554 ldt $f10, 144($sp)
555 ldt $f11, 152($sp)
556 ldt $f12, 160($sp)
557 ldt $f13, 168($sp)
558 ldt $f14, 176($sp)
559 ldt $f15, 184($sp)
560 ldt $f16, 192($sp)
561 ldt $f17, 200($sp)
562 ldt $f18, 208($sp)
563 ldt $f19, 216($sp)
564 ldt $f20, 224($sp)
565 ldt $f21, 232($sp)
566 ldt $f22, 240($sp)
567 ldt $f23, 248($sp)
568 ldt $f24, 256($sp)
569 ldt $f25, 264($sp)
570 ldt $f26, 272($sp)
571 ldt $f27, 280($sp)
572 ldt $f28, 288($sp)
573 ldt $f29, 296($sp)
574 ldt $f30, 304($sp)
575 lda $sp, SWITCH_STACK_SIZE($sp)
576 ret $31, ($1), 1
577.end undo_switch_stack
578
579/*
580 * The meat of the context switch code.
581 */
582
583 .align 4
584 .globl alpha_switch_to
585 .ent alpha_switch_to
586alpha_switch_to:
587 .prologue 0
588 bsr $1, do_switch_stack
589 call_pal PAL_swpctx
590 lda $8, 0x3fff
591 bsr $1, undo_switch_stack
592 bic $sp, $8, $8
593 mov $17, $0
594 ret
595.end alpha_switch_to
596
597/*
598 * New processes begin life here.
599 */
600
601 .globl ret_from_fork
602 .align 4
603 .ent ret_from_fork
604ret_from_fork:
605 lda $26, ret_from_sys_call
606 mov $17, $16
607 jmp $31, schedule_tail
608.end ret_from_fork
609
610/*
Al Virocba1ec72012-09-09 22:03:42 -0400611 * ... and new kernel threads - here
Linus Torvalds1da177e2005-04-16 15:20:36 -0700612 */
613 .align 4
Al Virocba1ec72012-09-09 22:03:42 -0400614 .globl ret_from_kernel_thread
615 .ent ret_from_kernel_thread
616ret_from_kernel_thread:
617 mov $17, $16
618 jsr $26, schedule_tail
619 mov $9, $27
620 mov $10, $16
621 jsr $26, ($9)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700622 ldgp $gp, 0($26)
623 mov $0, $16
624 mov $31, $26
625 jmp $31, sys_exit
Al Virocba1ec72012-09-09 22:03:42 -0400626.end ret_from_kernel_thread
Linus Torvalds1da177e2005-04-16 15:20:36 -0700627
Al Viro44f4b562012-05-31 22:22:52 -0400628 .globl ret_from_kernel_execve
629 .align 4
630 .ent ret_from_kernel_execve
631ret_from_kernel_execve:
632 mov $16, $sp
633 /* Avoid the HAE being gratuitously wrong, to avoid restoring it. */
634 ldq $2, alpha_mv+HAE_CACHE
635 stq $2, 152($sp) /* HAE */
636 mov $31, $19 /* to disable syscall restarts */
637 br $31, ret_to_user
638
639.end ret_from_kernel_execve
640
Linus Torvalds1da177e2005-04-16 15:20:36 -0700641
642/*
643 * Special system calls. Most of these are special in that they either
644 * have to play switch_stack games or in some way use the pt_regs struct.
645 */
646 .align 4
647 .globl sys_fork
648 .ent sys_fork
649sys_fork:
650 .prologue 0
651 mov $sp, $21
652 bsr $1, do_switch_stack
653 bis $31, SIGCHLD, $16
654 mov $31, $17
655 mov $31, $18
656 mov $31, $19
657 mov $31, $20
658 jsr $26, alpha_clone
659 bsr $1, undo_switch_stack
660 ret
661.end sys_fork
662
663 .align 4
664 .globl sys_clone
665 .ent sys_clone
666sys_clone:
667 .prologue 0
668 mov $sp, $21
669 bsr $1, do_switch_stack
670 /* $16, $17, $18, $19, $20 come from the user. */
671 jsr $26, alpha_clone
672 bsr $1, undo_switch_stack
673 ret
674.end sys_clone
675
676 .align 4
677 .globl sys_vfork
678 .ent sys_vfork
679sys_vfork:
680 .prologue 0
681 mov $sp, $16
682 bsr $1, do_switch_stack
683 jsr $26, alpha_vfork
684 bsr $1, undo_switch_stack
685 ret
686.end sys_vfork
687
688 .align 4
689 .globl sys_sigreturn
690 .ent sys_sigreturn
691sys_sigreturn:
692 .prologue 0
Al Viro53293632010-09-18 08:41:16 -0400693 lda $9, ret_from_straced
694 cmpult $26, $9, $9
Linus Torvalds1da177e2005-04-16 15:20:36 -0700695 mov $sp, $17
696 lda $18, -SWITCH_STACK_SIZE($sp)
697 lda $sp, -SWITCH_STACK_SIZE($sp)
698 jsr $26, do_sigreturn
Al Viro53293632010-09-18 08:41:16 -0400699 bne $9, 1f
Al Viro12f79be2012-05-26 21:44:21 -0400700 jsr $26, syscall_trace_leave
Al Viro53293632010-09-18 08:41:16 -04007011: br $1, undo_switch_stack
Linus Torvalds1da177e2005-04-16 15:20:36 -0700702 br ret_from_sys_call
703.end sys_sigreturn
704
705 .align 4
706 .globl sys_rt_sigreturn
707 .ent sys_rt_sigreturn
708sys_rt_sigreturn:
709 .prologue 0
Al Viro53293632010-09-18 08:41:16 -0400710 lda $9, ret_from_straced
711 cmpult $26, $9, $9
Linus Torvalds1da177e2005-04-16 15:20:36 -0700712 mov $sp, $17
713 lda $18, -SWITCH_STACK_SIZE($sp)
714 lda $sp, -SWITCH_STACK_SIZE($sp)
715 jsr $26, do_rt_sigreturn
Al Viro53293632010-09-18 08:41:16 -0400716 bne $9, 1f
Al Viro12f79be2012-05-26 21:44:21 -0400717 jsr $26, syscall_trace_leave
Al Viro53293632010-09-18 08:41:16 -04007181: br $1, undo_switch_stack
Linus Torvalds1da177e2005-04-16 15:20:36 -0700719 br ret_from_sys_call
720.end sys_rt_sigreturn
721
722 .align 4
Linus Torvalds1da177e2005-04-16 15:20:36 -0700723 .globl alpha_ni_syscall
724 .ent alpha_ni_syscall
725alpha_ni_syscall:
726 .prologue 0
727 /* Special because it also implements overflow handling via
728 syscall number 0. And if you recall, zero is a special
729 trigger for "not an error". Store large non-zero there. */
730 lda $0, -ENOSYS
731 unop
732 stq $0, 0($sp)
733 ret
734.end alpha_ni_syscall