diff options
Diffstat (limited to 'arch/alpha/kernel/entry.S')
| -rw-r--r-- | arch/alpha/kernel/entry.S | 774 | 
1 files changed, 351 insertions, 423 deletions
diff --git a/arch/alpha/kernel/entry.S b/arch/alpha/kernel/entry.S index 6d159cee5f2..98703d99b56 100644 --- a/arch/alpha/kernel/entry.S +++ b/arch/alpha/kernel/entry.S @@ -12,11 +12,32 @@  	.text  	.set noat +	.cfi_sections	.debug_frame  /* Stack offsets.  */  #define SP_OFF			184  #define SWITCH_STACK_SIZE	320 +.macro	CFI_START_OSF_FRAME	func +	.align	4 +	.globl	\func +	.type	\func,@function +\func: +	.cfi_startproc simple +	.cfi_return_column 64 +	.cfi_def_cfa	$sp, 48 +	.cfi_rel_offset	64, 8 +	.cfi_rel_offset	$gp, 16 +	.cfi_rel_offset	$16, 24 +	.cfi_rel_offset	$17, 32 +	.cfi_rel_offset	$18, 40 +.endm + +.macro	CFI_END_OSF_FRAME	func +	.cfi_endproc +	.size	\func, . - \func +.endm +  /*   * This defines the normal kernel pt-regs layout.   * @@ -27,100 +48,158 @@   * the palcode-provided values are available to the signal handler.   */ -#define SAVE_ALL			\ -	subq	$sp, SP_OFF, $sp;	\ -	stq	$0, 0($sp);		\ -	stq	$1, 8($sp);		\ -	stq	$2, 16($sp);		\ -	stq	$3, 24($sp);		\ -	stq	$4, 32($sp);		\ -	stq	$28, 144($sp);		\ -	lda	$2, alpha_mv;		\ -	stq	$5, 40($sp);		\ -	stq	$6, 48($sp);		\ -	stq	$7, 56($sp);		\ -	stq	$8, 64($sp);		\ -	stq	$19, 72($sp);		\ -	stq	$20, 80($sp);		\ -	stq	$21, 88($sp);		\ -	ldq	$2, HAE_CACHE($2);	\ -	stq	$22, 96($sp);		\ -	stq	$23, 104($sp);		\ -	stq	$24, 112($sp);		\ -	stq	$25, 120($sp);		\ -	stq	$26, 128($sp);		\ -	stq	$27, 136($sp);		\ -	stq	$2, 152($sp);		\ -	stq	$16, 160($sp);		\ -	stq	$17, 168($sp);		\ +.macro	SAVE_ALL +	subq	$sp, SP_OFF, $sp +	.cfi_adjust_cfa_offset	SP_OFF +	stq	$0, 0($sp) +	stq	$1, 8($sp) +	stq	$2, 16($sp) +	stq	$3, 24($sp) +	stq	$4, 32($sp) +	stq	$28, 144($sp) +	.cfi_rel_offset	$0, 0 +	.cfi_rel_offset $1, 8 +	.cfi_rel_offset	$2, 16 +	.cfi_rel_offset	$3, 24 +	.cfi_rel_offset	$4, 32 +	.cfi_rel_offset	$28, 144 +	lda	$2, alpha_mv +	stq	$5, 40($sp) +	stq	$6, 48($sp) +	stq	$7, 56($sp) +	stq	$8, 64($sp) +	stq	$19, 72($sp) +	stq	$20, 80($sp) +	stq	$21, 88($sp) +	ldq	$2, HAE_CACHE($2) +	stq	$22, 96($sp) +	stq	$23, 104($sp) +	stq	$24, 112($sp) +	stq	$25, 120($sp) +	stq	$26, 128($sp) +	stq	$27, 136($sp) +	stq	$2, 152($sp) +	stq	$16, 160($sp) +	stq	$17, 168($sp)  	stq	$18, 176($sp) - -#define RESTORE_ALL			\ -	lda	$19, alpha_mv;		\ -	ldq	$0, 0($sp);		\ -	ldq	$1, 8($sp);		\ -	ldq	$2, 16($sp);		\ -	ldq	$3, 24($sp);		\ -	ldq	$21, 152($sp);		\ -	ldq	$20, HAE_CACHE($19);	\ -	ldq	$4, 32($sp);		\ -	ldq	$5, 40($sp);		\ -	ldq	$6, 48($sp);		\ -	ldq	$7, 56($sp);		\ -	subq	$20, $21, $20;		\ -	ldq	$8, 64($sp);		\ -	beq	$20, 99f;		\ -	ldq	$20, HAE_REG($19);	\ -	stq	$21, HAE_CACHE($19);	\ -	stq	$21, 0($20);		\ -99:;					\ -	ldq	$19, 72($sp);		\ -	ldq	$20, 80($sp);		\ -	ldq	$21, 88($sp);		\ -	ldq	$22, 96($sp);		\ -	ldq	$23, 104($sp);		\ -	ldq	$24, 112($sp);		\ -	ldq	$25, 120($sp);		\ -	ldq	$26, 128($sp);		\ -	ldq	$27, 136($sp);		\ -	ldq	$28, 144($sp);		\ +	.cfi_rel_offset	$5, 40 +	.cfi_rel_offset	$6, 48 +	.cfi_rel_offset	$7, 56 +	.cfi_rel_offset	$8, 64 +	.cfi_rel_offset $19, 72 +	.cfi_rel_offset	$20, 80 +	.cfi_rel_offset	$21, 88 +	.cfi_rel_offset $22, 96 +	.cfi_rel_offset	$23, 104 +	.cfi_rel_offset	$24, 112 +	.cfi_rel_offset	$25, 120 +	.cfi_rel_offset	$26, 128 +	.cfi_rel_offset	$27, 136 +.endm + +.macro	RESTORE_ALL +	lda	$19, alpha_mv +	ldq	$0, 0($sp) +	ldq	$1, 8($sp) +	ldq	$2, 16($sp) +	ldq	$3, 24($sp) +	ldq	$21, 152($sp) +	ldq	$20, HAE_CACHE($19) +	ldq	$4, 32($sp) +	ldq	$5, 40($sp) +	ldq	$6, 48($sp) +	ldq	$7, 56($sp) +	subq	$20, $21, $20 +	ldq	$8, 64($sp) +	beq	$20, 99f +	ldq	$20, HAE_REG($19) +	stq	$21, HAE_CACHE($19) +	stq	$21, 0($20) +99:	ldq	$19, 72($sp) +	ldq	$20, 80($sp) +	ldq	$21, 88($sp) +	ldq	$22, 96($sp) +	ldq	$23, 104($sp) +	ldq	$24, 112($sp) +	ldq	$25, 120($sp) +	ldq	$26, 128($sp) +	ldq	$27, 136($sp) +	ldq	$28, 144($sp)  	addq	$sp, SP_OFF, $sp +	.cfi_restore	$0 +	.cfi_restore	$1 +	.cfi_restore	$2 +	.cfi_restore	$3 +	.cfi_restore	$4 +	.cfi_restore	$5 +	.cfi_restore	$6 +	.cfi_restore	$7 +	.cfi_restore	$8 +	.cfi_restore	$19 +	.cfi_restore	$20 +	.cfi_restore	$21 +	.cfi_restore	$22 +	.cfi_restore	$23 +	.cfi_restore	$24 +	.cfi_restore	$25 +	.cfi_restore	$26 +	.cfi_restore	$27 +	.cfi_restore	$28 +	.cfi_adjust_cfa_offset	-SP_OFF +.endm + +.macro	DO_SWITCH_STACK +	bsr	$1, do_switch_stack +	.cfi_adjust_cfa_offset	SWITCH_STACK_SIZE +	.cfi_rel_offset	$9, 0 +	.cfi_rel_offset	$10, 8 +	.cfi_rel_offset	$11, 16 +	.cfi_rel_offset	$12, 24 +	.cfi_rel_offset	$13, 32 +	.cfi_rel_offset	$14, 40 +	.cfi_rel_offset	$15, 48 +	/* We don't really care about the FP registers for debugging.  */ +.endm + +.macro	UNDO_SWITCH_STACK +	bsr	$1, undo_switch_stack +	.cfi_restore	$9 +	.cfi_restore	$10 +	.cfi_restore	$11 +	.cfi_restore	$12 +	.cfi_restore	$13 +	.cfi_restore	$14 +	.cfi_restore	$15 +	.cfi_adjust_cfa_offset	-SWITCH_STACK_SIZE +.endm  /*   * Non-syscall kernel entry points.   */ -	.align	4 -	.globl	entInt -	.ent	entInt -entInt: +CFI_START_OSF_FRAME entInt  	SAVE_ALL  	lda	$8, 0x3fff  	lda	$26, ret_from_sys_call  	bic	$sp, $8, $8  	mov	$sp, $19  	jsr	$31, do_entInt -.end entInt +CFI_END_OSF_FRAME entInt -	.align	4 -	.globl	entArith -	.ent	entArith -entArith: +CFI_START_OSF_FRAME entArith  	SAVE_ALL  	lda	$8, 0x3fff  	lda	$26, ret_from_sys_call  	bic	$sp, $8, $8  	mov	$sp, $18  	jsr	$31, do_entArith -.end entArith +CFI_END_OSF_FRAME entArith -	.align	4 -	.globl	entMM -	.ent	entMM -entMM: +CFI_START_OSF_FRAME entMM  	SAVE_ALL  /* save $9 - $15 so the inline exception code can manipulate them.  */  	subq	$sp, 56, $sp +	.cfi_adjust_cfa_offset	56  	stq	$9, 0($sp)  	stq	$10, 8($sp)  	stq	$11, 16($sp) @@ -128,6 +207,13 @@ entMM:  	stq	$13, 32($sp)  	stq	$14, 40($sp)  	stq	$15, 48($sp) +	.cfi_rel_offset	$9, 0 +	.cfi_rel_offset	$10, 8 +	.cfi_rel_offset	$11, 16 +	.cfi_rel_offset	$12, 24 +	.cfi_rel_offset	$13, 32 +	.cfi_rel_offset	$14, 40 +	.cfi_rel_offset	$15, 48  	addq	$sp, 56, $19  /* handle the fault */  	lda	$8, 0x3fff @@ -142,28 +228,33 @@ entMM:  	ldq	$14, 40($sp)  	ldq	$15, 48($sp)  	addq	$sp, 56, $sp +	.cfi_restore	$9 +	.cfi_restore	$10 +	.cfi_restore	$11 +	.cfi_restore	$12 +	.cfi_restore	$13 +	.cfi_restore	$14 +	.cfi_restore	$15 +	.cfi_adjust_cfa_offset	-56  /* finish up the syscall as normal.  */  	br	ret_from_sys_call -.end entMM +CFI_END_OSF_FRAME entMM -	.align	4 -	.globl	entIF -	.ent	entIF -entIF: +CFI_START_OSF_FRAME entIF  	SAVE_ALL  	lda	$8, 0x3fff  	lda	$26, ret_from_sys_call  	bic	$sp, $8, $8  	mov	$sp, $17  	jsr	$31, do_entIF -.end entIF +CFI_END_OSF_FRAME entIF -	.align	4 -	.globl	entUna -	.ent	entUna -entUna: +CFI_START_OSF_FRAME entUna  	lda	$sp, -256($sp) +	.cfi_adjust_cfa_offset	256  	stq	$0, 0($sp) +	.cfi_rel_offset	$0, 0 +	.cfi_remember_state  	ldq	$0, 256($sp)	/* get PS */  	stq	$1, 8($sp)  	stq	$2, 16($sp) @@ -195,6 +286,32 @@ entUna:  	stq	$28, 224($sp)  	mov	$sp, $19  	stq	$gp, 232($sp) +	.cfi_rel_offset	$1, 1*8 +	.cfi_rel_offset	$2, 2*8 +	.cfi_rel_offset	$3, 3*8 +	.cfi_rel_offset	$4, 4*8 +	.cfi_rel_offset	$5, 5*8 +	.cfi_rel_offset	$6, 6*8 +	.cfi_rel_offset	$7, 7*8 +	.cfi_rel_offset	$8, 8*8 +	.cfi_rel_offset	$9, 9*8 +	.cfi_rel_offset	$10, 10*8 +	.cfi_rel_offset	$11, 11*8 +	.cfi_rel_offset	$12, 12*8 +	.cfi_rel_offset	$13, 13*8 +	.cfi_rel_offset	$14, 14*8 +	.cfi_rel_offset	$15, 15*8 +	.cfi_rel_offset	$19, 19*8 +	.cfi_rel_offset	$20, 20*8 +	.cfi_rel_offset	$21, 21*8 +	.cfi_rel_offset	$22, 22*8 +	.cfi_rel_offset	$23, 23*8 +	.cfi_rel_offset	$24, 24*8 +	.cfi_rel_offset	$25, 25*8 +	.cfi_rel_offset	$26, 26*8 +	.cfi_rel_offset	$27, 27*8 +	.cfi_rel_offset	$28, 28*8 +	.cfi_rel_offset	$29, 29*8  	lda	$8, 0x3fff  	stq	$31, 248($sp)  	bic	$sp, $8, $8 @@ -228,16 +345,45 @@ entUna:  	ldq	$28, 224($sp)  	ldq	$gp, 232($sp)  	lda	$sp, 256($sp) +	.cfi_restore	$1 +	.cfi_restore	$2 +	.cfi_restore	$3 +	.cfi_restore	$4 +	.cfi_restore	$5 +	.cfi_restore	$6 +	.cfi_restore	$7 +	.cfi_restore	$8 +	.cfi_restore	$9 +	.cfi_restore	$10 +	.cfi_restore	$11 +	.cfi_restore	$12 +	.cfi_restore	$13 +	.cfi_restore	$14 +	.cfi_restore	$15 +	.cfi_restore	$19 +	.cfi_restore	$20 +	.cfi_restore	$21 +	.cfi_restore	$22 +	.cfi_restore	$23 +	.cfi_restore	$24 +	.cfi_restore	$25 +	.cfi_restore	$26 +	.cfi_restore	$27 +	.cfi_restore	$28 +	.cfi_restore	$29 +	.cfi_adjust_cfa_offset	-256  	call_pal PAL_rti -.end entUna  	.align	4 -	.ent	entUnaUser  entUnaUser: +	.cfi_restore_state  	ldq	$0, 0($sp)	/* restore original $0 */  	lda	$sp, 256($sp)	/* pop entUna's stack frame */ +	.cfi_restore	$0 +	.cfi_adjust_cfa_offset	-256  	SAVE_ALL		/* setup normal kernel stack */  	lda	$sp, -56($sp) +	.cfi_adjust_cfa_offset	56  	stq	$9, 0($sp)  	stq	$10, 8($sp)  	stq	$11, 16($sp) @@ -245,6 +391,13 @@ entUnaUser:  	stq	$13, 32($sp)  	stq	$14, 40($sp)  	stq	$15, 48($sp) +	.cfi_rel_offset	$9, 0 +	.cfi_rel_offset	$10, 8 +	.cfi_rel_offset	$11, 16 +	.cfi_rel_offset	$12, 24 +	.cfi_rel_offset	$13, 32 +	.cfi_rel_offset	$14, 40 +	.cfi_rel_offset	$15, 48  	lda	$8, 0x3fff  	addq	$sp, 56, $19  	bic	$sp, $8, $8 @@ -257,20 +410,25 @@ entUnaUser:  	ldq	$14, 40($sp)  	ldq	$15, 48($sp)  	lda	$sp, 56($sp) +	.cfi_restore	$9 +	.cfi_restore	$10 +	.cfi_restore	$11 +	.cfi_restore	$12 +	.cfi_restore	$13 +	.cfi_restore	$14 +	.cfi_restore	$15 +	.cfi_adjust_cfa_offset	-56  	br	ret_from_sys_call -.end entUnaUser +CFI_END_OSF_FRAME entUna -	.align	4 -	.globl	entDbg -	.ent	entDbg -entDbg: +CFI_START_OSF_FRAME entDbg  	SAVE_ALL  	lda	$8, 0x3fff  	lda	$26, ret_from_sys_call  	bic	$sp, $8, $8  	mov	$sp, $16  	jsr	$31, do_entDbg -.end entDbg +CFI_END_OSF_FRAME entDbg  /*   * The system call entry point is special.  Most importantly, it looks @@ -285,8 +443,12 @@ entDbg:  	.align	4  	.globl	entSys -	.globl	ret_from_sys_call -	.ent	entSys +	.type	entSys, @function +	.cfi_startproc simple +	.cfi_return_column 64 +	.cfi_def_cfa	$sp, 48 +	.cfi_rel_offset	64, 8 +	.cfi_rel_offset	$gp, 16  entSys:  	SAVE_ALL  	lda	$8, 0x3fff @@ -300,7 +462,14 @@ entSys:  	stq	$17, SP_OFF+32($sp)  	s8addq	$0, $5, $5  	stq	$18, SP_OFF+40($sp) -	blbs	$3, strace +	.cfi_rel_offset	$16, SP_OFF+24 +	.cfi_rel_offset	$17, SP_OFF+32 +	.cfi_rel_offset	$18, SP_OFF+40 +#ifdef CONFIG_AUDITSYSCALL +	lda     $6, _TIF_SYSCALL_TRACE | _TIF_SYSCALL_AUDIT +	and     $3, $6, $3 +#endif +	bne     $3, strace  	beq	$4, 1f  	ldq	$27, 0($5)  1:	jsr	$26, ($27), alpha_ni_syscall @@ -310,8 +479,9 @@ entSys:  	stq	$31, 72($sp)		/* a3=0 => no error */  	.align	4 +	.globl	ret_from_sys_call  ret_from_sys_call: -	cmovne	$26, 0, $19		/* $19 = 0 => non-restartable */ +	cmovne	$26, 0, $18		/* $18 = 0 => non-restartable */  	ldq	$0, SP_OFF($sp)  	and	$0, 8, $0  	beq	$0, ret_to_kernel @@ -320,14 +490,16 @@ ret_to_user:  		sampling and the rti.  */  	lda	$16, 7  	call_pal PAL_swpipl -	ldl	$5, TI_FLAGS($8) -	and	$5, _TIF_WORK_MASK, $2 +	ldl	$17, TI_FLAGS($8) +	and	$17, _TIF_WORK_MASK, $2  	bne	$2, work_pending  restore_all: +	.cfi_remember_state  	RESTORE_ALL  	call_pal PAL_rti  ret_to_kernel: +	.cfi_restore_state  	lda	$16, 7  	call_pal PAL_swpipl  	br restore_all @@ -341,10 +513,10 @@ $syscall_error:  	 * frame to indicate that a negative return value wasn't an  	 * error number..  	 */ -	ldq	$19, 0($sp)	/* old syscall nr (zero if success) */ -	beq	$19, $ret_success +	ldq	$18, 0($sp)	/* old syscall nr (zero if success) */ +	beq	$18, $ret_success -	ldq	$20, 72($sp)	/* .. and this a3 */ +	ldq	$19, 72($sp)	/* .. and this a3 */  	subq	$31, $0, $0	/* with error in v0 */  	addq	$31, 1, $1	/* set a3 for errno return */  	stq	$0, 0($sp) @@ -356,73 +528,54 @@ $ret_success:  	stq	$0, 0($sp)  	stq	$31, 72($sp)	/* a3=0 => no error */  	br	ret_from_sys_call -.end entSys  /*   * Do all cleanup when returning from all interrupts and system calls.   *   * Arguments: - *       $5: TI_FLAGS.   *       $8: current. - *      $19: The old syscall number, or zero if this is not a return + *      $17: TI_FLAGS. + *      $18: The old syscall number, or zero if this is not a return   *           from a syscall that errored and is possibly restartable. - *      $20: The old a3 value + *      $19: The old a3 value   */  	.align	4 -	.ent	work_pending +	.type	work_pending, @function  work_pending: -	and	$5, _TIF_NEED_RESCHED, $2 -	beq	$2, $work_notifysig +	and	$17, _TIF_NOTIFY_RESUME | _TIF_SIGPENDING, $2 +	bne	$2, $work_notifysig  $work_resched: -	subq	$sp, 16, $sp -	stq	$19, 0($sp)              /* save syscall nr */ -	stq	$20, 8($sp)              /* and error indication (a3) */ +	/* +	 * We can get here only if we returned from syscall without SIGPENDING +	 * or got through work_notifysig already.  Either case means no syscall +	 * restarts for us, so let $18 and $19 burn. +	 */  	jsr	$26, schedule -	ldq	$19, 0($sp) -	ldq	$20, 8($sp) -	addq	$sp, 16, $sp -	/* Make sure need_resched and sigpending don't change between -		sampling and the rti.  */ -	lda	$16, 7 -	call_pal PAL_swpipl -	ldl	$5, TI_FLAGS($8) -	and	$5, _TIF_WORK_MASK, $2 -	beq	$2, restore_all -	and	$5, _TIF_NEED_RESCHED, $2 -	bne	$2, $work_resched +	mov	0, $18 +	br	ret_to_user  $work_notifysig:  	mov	$sp, $16 -	bsr	$1, do_switch_stack -	mov	$sp, $17 -	mov	$5, $18 -	mov	$19, $9		/* save old syscall number */ -	mov	$20, $10	/* save old a3 */ -	and	$5, _TIF_SIGPENDING, $2 -	cmovne	$2, 0, $9	/* we don't want double syscall restarts */ -	jsr	$26, do_notify_resume -	mov	$9, $19 -	mov	$10, $20 -	bsr	$1, undo_switch_stack -	br	ret_to_user -.end work_pending +	DO_SWITCH_STACK +	jsr	$26, do_work_pending +	UNDO_SWITCH_STACK +	br	restore_all  /*   * PTRACE syscall handler   */  	.align	4 -	.ent	strace +	.type	strace, @function  strace:  	/* set up signal stack, call syscall_trace */ -	bsr	$1, do_switch_stack -	jsr	$26, syscall_trace -	bsr	$1, undo_switch_stack +	DO_SWITCH_STACK +	jsr	$26, syscall_trace_enter /* returns the syscall number */ +	UNDO_SWITCH_STACK -	/* get the system call number and the arguments back.. */ -	ldq	$0, 0($sp) +	/* get the arguments back.. */  	ldq	$16, SP_OFF+24($sp)  	ldq	$17, SP_OFF+32($sp)  	ldq	$18, SP_OFF+40($sp) @@ -448,42 +601,47 @@ ret_from_straced:  $strace_success:  	stq	$0, 0($sp)		/* save return value */ -	bsr	$1, do_switch_stack -	jsr	$26, syscall_trace -	bsr	$1, undo_switch_stack +	DO_SWITCH_STACK +	jsr	$26, syscall_trace_leave +	UNDO_SWITCH_STACK  	br	$31, ret_from_sys_call  	.align	3  $strace_error: -	ldq	$19, 0($sp)	/* old syscall nr (zero if success) */ -	beq	$19, $strace_success -	ldq	$20, 72($sp)	/* .. and this a3 */ +	ldq	$18, 0($sp)	/* old syscall nr (zero if success) */ +	beq	$18, $strace_success +	ldq	$19, 72($sp)	/* .. and this a3 */  	subq	$31, $0, $0	/* with error in v0 */  	addq	$31, 1, $1	/* set a3 for errno return */  	stq	$0, 0($sp)  	stq	$1, 72($sp)	/* a3 for return */ -	bsr	$1, do_switch_stack -	mov	$19, $9		/* save old syscall number */ -	mov	$20, $10	/* save old a3 */ -	jsr	$26, syscall_trace -	mov	$9, $19 -	mov	$10, $20 -	bsr	$1, undo_switch_stack +	DO_SWITCH_STACK +	mov	$18, $9		/* save old syscall number */ +	mov	$19, $10	/* save old a3 */ +	jsr	$26, syscall_trace_leave +	mov	$9, $18 +	mov	$10, $19 +	UNDO_SWITCH_STACK  	mov	$31, $26	/* tell "ret_from_sys_call" we can restart */  	br	ret_from_sys_call -.end strace +CFI_END_OSF_FRAME entSys  /*   * Save and restore the switch stack -- aka the balance of the user context.   */  	.align	4 -	.ent	do_switch_stack +	.type	do_switch_stack, @function +	.cfi_startproc simple +	.cfi_return_column 64 +	.cfi_def_cfa $sp, 0 +	.cfi_register 64, $1  do_switch_stack:  	lda	$sp, -SWITCH_STACK_SIZE($sp) +	.cfi_adjust_cfa_offset	SWITCH_STACK_SIZE  	stq	$9, 0($sp)  	stq	$10, 8($sp)  	stq	$11, 16($sp) @@ -527,10 +685,14 @@ do_switch_stack:  	stt	$f0, 312($sp)	# save fpcr in slot of $f31  	ldt	$f0, 64($sp)	# dont let "do_switch_stack" change fp state.  	ret	$31, ($1), 1 -.end do_switch_stack +	.cfi_endproc +	.size	do_switch_stack, .-do_switch_stack  	.align	4 -	.ent	undo_switch_stack +	.type	undo_switch_stack, @function +	.cfi_startproc simple +	.cfi_def_cfa $sp, 0 +	.cfi_register 64, $1  undo_switch_stack:  	ldq	$9, 0($sp)  	ldq	$10, 8($sp) @@ -575,7 +737,8 @@ undo_switch_stack:  	ldt	$f30, 304($sp)  	lda	$sp, SWITCH_STACK_SIZE($sp)  	ret	$31, ($1), 1 -.end undo_switch_stack +	.cfi_endproc +	.size	undo_switch_stack, .-undo_switch_stack  /*   * The meat of the context switch code. @@ -583,17 +746,18 @@ undo_switch_stack:  	.align	4  	.globl	alpha_switch_to -	.ent	alpha_switch_to +	.type	alpha_switch_to, @function +	.cfi_startproc  alpha_switch_to: -	.prologue 0 -	bsr	$1, do_switch_stack +	DO_SWITCH_STACK  	call_pal PAL_swpctx  	lda	$8, 0x3fff -	bsr	$1, undo_switch_stack +	UNDO_SWITCH_STACK  	bic	$sp, $8, $8  	mov	$17, $0  	ret -.end alpha_switch_to +	.cfi_endproc +	.size	alpha_switch_to, .-alpha_switch_to  /*   * New processes begin life here. @@ -609,158 +773,44 @@ ret_from_fork:  .end ret_from_fork  /* - * kernel_thread(fn, arg, clone_flags) + * ... and new kernel threads - here   */  	.align 4 -	.globl	kernel_thread -	.ent	kernel_thread -kernel_thread: -	/* We can be called from a module.  */ -	ldgp	$gp, 0($27) -	.prologue 1 -	subq	$sp, SP_OFF+6*8, $sp -	br	$1, 2f		/* load start address */ - -	/* We've now "returned" from a fake system call.  */ -	unop -	blt	$0, 1f		/* error?  */ -	ldi	$1, 0x3fff -	beq	$20, 1f		/* parent or child?  */ - -	bic	$sp, $1, $8	/* in child.  */ -	jsr	$26, ($27) -	ldgp	$gp, 0($26) -	mov	$0, $16 -	mov	$31, $26 -	jmp	$31, sys_exit - -1:	ret			/* in parent.  */ - -	.align 4 -2:	/* Fake a system call stack frame, as we can't do system calls -	   from kernel space.  Note that we store FN and ARG as they -	   need to be set up in the child for the call.  Also store $8 -	   and $26 for use in the parent.  */ -	stq	$31, SP_OFF($sp)	/* ps */ -	stq	$1, SP_OFF+8($sp)	/* pc */ -	stq	$gp, SP_OFF+16($sp)	/* gp */ -	stq	$16, 136($sp)		/* $27; FN for child */ -	stq	$17, SP_OFF+24($sp)	/* $16; ARG for child */ -	stq	$8, 64($sp)		/* $8 */ -	stq	$26, 128($sp)		/* $26 */ -	/* Avoid the HAE being gratuitously wrong, to avoid restoring it.  */ -	ldq	$2, alpha_mv+HAE_CACHE -	stq	$2, 152($sp)		/* HAE */ - -	/* Shuffle FLAGS to the front; add CLONE_VM.  */ -	ldi	$1, CLONE_VM|CLONE_UNTRACED -	or	$18, $1, $16 -	bsr	$26, sys_clone - -	/* We don't actually care for a3 success widgetry in the kernel. -	   Not for positive errno values.  */ -	stq	$0, 0($sp)		/* $0 */ -	br	ret_to_kernel -.end kernel_thread - -/* - * kernel_execve(path, argv, envp) - */ -	.align	4 -	.globl	kernel_execve -	.ent	kernel_execve -kernel_execve: -	/* We can be called from a module.  */ -	ldgp	$gp, 0($27) -	lda	$sp, -(32+SIZEOF_PT_REGS+8)($sp) -	.frame	$sp, 32+SIZEOF_PT_REGS+8, $26, 0 -	stq	$26, 0($sp) -	stq	$16, 8($sp) -	stq	$17, 16($sp) -	stq	$18, 24($sp) -	.prologue 1 - -	lda	$16, 32($sp) -	lda	$17, 0 -	lda	$18, SIZEOF_PT_REGS -	bsr	$26, memset		!samegp - -	/* Avoid the HAE being gratuitously wrong, which would cause us -	   to do the whole turn off interrupts thing and restore it.  */ -	ldq	$2, alpha_mv+HAE_CACHE -	stq	$2, 152+32($sp) - -	ldq	$16, 8($sp) -	ldq	$17, 16($sp) -	ldq	$18, 24($sp) -	lda	$19, 32($sp) -	bsr	$26, do_execve		!samegp - -	ldq	$26, 0($sp) -	bne	$0, 1f			/* error! */ - -	/* Move the temporary pt_regs struct from its current location -	   to the top of the kernel stack frame.  See copy_thread for -	   details for a normal process.  */ -	lda	$16, 0x4000 - SIZEOF_PT_REGS($8) -	lda	$17, 32($sp) -	lda	$18, SIZEOF_PT_REGS -	bsr	$26, memmove		!samegp - -	/* Take that over as our new stack frame and visit userland!  */ -	lda	$sp, 0x4000 - SIZEOF_PT_REGS($8) -	br	$31, ret_from_sys_call - -1:	lda	$sp, 32+SIZEOF_PT_REGS+8($sp) -	ret -.end kernel_execve +	.globl	ret_from_kernel_thread +	.ent	ret_from_kernel_thread +ret_from_kernel_thread: +	mov	$17, $16 +	jsr	$26, schedule_tail +	mov	$9, $27 +	mov	$10, $16 +	jsr	$26, ($9) +	mov	$31, $19		/* to disable syscall restarts */ +	br	$31, ret_to_user +.end ret_from_kernel_thread  /*   * Special system calls.  Most of these are special in that they either   * have to play switch_stack games or in some way use the pt_regs struct.   */ -	.align	4 -	.globl	sys_fork -	.ent	sys_fork -sys_fork: -	.prologue 0 -	mov	$sp, $21 -	bsr	$1, do_switch_stack -	bis	$31, SIGCHLD, $16 -	mov	$31, $17 -	mov	$31, $18 -	mov	$31, $19 -	mov	$31, $20 -	jsr	$26, alpha_clone -	bsr	$1, undo_switch_stack -	ret -.end sys_fork +.macro	fork_like name  	.align	4 -	.globl	sys_clone -	.ent	sys_clone -sys_clone: +	.globl	alpha_\name +	.ent	alpha_\name +alpha_\name:  	.prologue 0 -	mov	$sp, $21  	bsr	$1, do_switch_stack -	/* $16, $17, $18, $19, $20 come from the user.  */ -	jsr	$26, alpha_clone -	bsr	$1, undo_switch_stack +	jsr	$26, sys_\name +	ldq	$26, 56($sp) +	lda	$sp, SWITCH_STACK_SIZE($sp)  	ret -.end sys_clone +.end	alpha_\name +.endm -	.align	4 -	.globl	sys_vfork -	.ent	sys_vfork -sys_vfork: -	.prologue 0 -	mov	$sp, $16 -	bsr	$1, do_switch_stack -	jsr	$26, alpha_vfork -	bsr	$1, undo_switch_stack -	ret -.end sys_vfork +fork_like fork +fork_like vfork +fork_like clone  	.align	4  	.globl	sys_sigreturn @@ -769,12 +819,10 @@ sys_sigreturn:  	.prologue 0  	lda	$9, ret_from_straced  	cmpult	$26, $9, $9 -	mov	$sp, $17 -	lda	$18, -SWITCH_STACK_SIZE($sp)  	lda	$sp, -SWITCH_STACK_SIZE($sp)  	jsr	$26, do_sigreturn  	bne	$9, 1f -	jsr	$26, syscall_trace +	jsr	$26, syscall_trace_leave  1:	br	$1, undo_switch_stack  	br	ret_from_sys_call  .end sys_sigreturn @@ -786,135 +834,15 @@ sys_rt_sigreturn:  	.prologue 0  	lda	$9, ret_from_straced  	cmpult	$26, $9, $9 -	mov	$sp, $17 -	lda	$18, -SWITCH_STACK_SIZE($sp)  	lda	$sp, -SWITCH_STACK_SIZE($sp)  	jsr	$26, do_rt_sigreturn  	bne	$9, 1f -	jsr	$26, syscall_trace +	jsr	$26, syscall_trace_leave  1:	br	$1, undo_switch_stack  	br	ret_from_sys_call  .end sys_rt_sigreturn  	.align	4 -	.globl	sys_sethae -	.ent	sys_sethae -sys_sethae: -	.prologue 0 -	stq	$16, 152($sp) -	ret -.end sys_sethae - -	.align	4 -	.globl	osf_getpriority -	.ent	osf_getpriority -osf_getpriority: -	lda	$sp, -16($sp) -	stq	$26, 0($sp) -	.prologue 0 - -	jsr	$26, sys_getpriority - -	ldq	$26, 0($sp) -	blt	$0, 1f - -	/* Return value is the unbiased priority, i.e. 20 - prio. -	   This does result in negative return values, so signal -	   no error by writing into the R0 slot.  */ -	lda	$1, 20 -	stq	$31, 16($sp) -	subl	$1, $0, $0 -	unop - -1:	lda	$sp, 16($sp) -	ret -.end osf_getpriority - -	.align	4 -	.globl	sys_getxuid -	.ent	sys_getxuid -sys_getxuid: -	.prologue 0 -	ldq	$2, TI_TASK($8) -	ldq	$3, TASK_CRED($2) -	ldl	$0, CRED_UID($3) -	ldl	$1, CRED_EUID($3) -	stq	$1, 80($sp) -	ret -.end sys_getxuid - -	.align	4 -	.globl	sys_getxgid -	.ent	sys_getxgid -sys_getxgid: -	.prologue 0 -	ldq	$2, TI_TASK($8) -	ldq	$3, TASK_CRED($2) -	ldl	$0, CRED_GID($3) -	ldl	$1, CRED_EGID($3) -	stq	$1, 80($sp) -	ret -.end sys_getxgid - -	.align	4 -	.globl	sys_getxpid -	.ent	sys_getxpid -sys_getxpid: -	.prologue 0 -	ldq	$2, TI_TASK($8) - -	/* See linux/kernel/timer.c sys_getppid for discussion -	   about this loop.  */ -	ldq	$3, TASK_GROUP_LEADER($2) -	ldq	$4, TASK_REAL_PARENT($3) -	ldl	$0, TASK_TGID($2) -1:	ldl	$1, TASK_TGID($4) -#ifdef CONFIG_SMP -	mov	$4, $5 -	mb -	ldq	$3, TASK_GROUP_LEADER($2) -	ldq	$4, TASK_REAL_PARENT($3) -	cmpeq	$4, $5, $5 -	beq	$5, 1b -#endif -	stq	$1, 80($sp) -	ret -.end sys_getxpid - -	.align	4 -	.globl	sys_alpha_pipe -	.ent	sys_alpha_pipe -sys_alpha_pipe: -	lda	$sp, -16($sp) -	stq	$26, 0($sp) -	.prologue 0 - -	mov	$31, $17 -	lda	$16, 8($sp) -	jsr	$26, do_pipe_flags - -	ldq	$26, 0($sp) -	bne	$0, 1f - -	/* The return values are in $0 and $20.  */ -	ldl	$1, 12($sp) -	ldl	$0, 8($sp) - -	stq	$1, 80+16($sp) -1:	lda	$sp, 16($sp) -	ret -.end sys_alpha_pipe - -	.align	4 -	.globl	sys_execve -	.ent	sys_execve -sys_execve: -	.prologue 0 -	mov	$sp, $19 -	jmp	$31, do_sys_execve -.end sys_execve - -	.align	4  	.globl	alpha_ni_syscall  	.ent	alpha_ni_syscall  alpha_ni_syscall:  | 
