diff options
Diffstat (limited to 'arch/s390/kernel/entry.S')
| -rw-r--r-- | arch/s390/kernel/entry.S | 39 | 
1 files changed, 17 insertions, 22 deletions
diff --git a/arch/s390/kernel/entry.S b/arch/s390/kernel/entry.S index 94feff7d613..4d5e6f8a797 100644 --- a/arch/s390/kernel/entry.S +++ b/arch/s390/kernel/entry.S @@ -45,6 +45,7 @@ _TIF_TRACE    = (_TIF_SYSCALL_TRACE | _TIF_SYSCALL_AUDIT | _TIF_SECCOMP | \  STACK_SHIFT = PAGE_SHIFT + THREAD_ORDER  STACK_SIZE  = 1 << STACK_SHIFT +STACK_INIT  = STACK_SIZE - STACK_FRAME_OVERHEAD - __PT_SIZE  #define BASED(name) name-system_call(%r13) @@ -97,10 +98,10 @@ STACK_SIZE  = 1 << STACK_SHIFT  	sra	%r14,\shift  	jnz	1f  	CHECK_STACK 1<<\shift,\savearea +	ahi	%r15,-(STACK_FRAME_OVERHEAD + __PT_SIZE)  	j	2f  1:	l	%r15,\stack		# load target stack -2:	ahi	%r15,-(STACK_FRAME_OVERHEAD + __PT_SIZE) -	la	%r11,STACK_FRAME_OVERHEAD(%r15) +2:	la	%r11,STACK_FRAME_OVERHEAD(%r15)  	.endm  	.macro	ADD64 high,low,timer @@ -150,7 +151,7 @@ ENTRY(__switch_to)  	l	%r4,__THREAD_info(%r2)		# get thread_info of prev  	l	%r5,__THREAD_info(%r3)		# get thread_info of next  	lr	%r15,%r5 -	ahi	%r15,STACK_SIZE			# end of kernel stack of next +	ahi	%r15,STACK_INIT			# end of kernel stack of next  	st	%r3,__LC_CURRENT		# store task struct of next  	st	%r5,__LC_THREAD_INFO		# store thread info of next  	st	%r15,__LC_KERNEL_STACK		# store end of kernel stack @@ -178,7 +179,6 @@ sysc_stm:  	l	%r13,__LC_SVC_NEW_PSW+4  sysc_per:  	l	%r15,__LC_KERNEL_STACK -	ahi	%r15,-(STACK_FRAME_OVERHEAD + __PT_SIZE)  	la	%r11,STACK_FRAME_OVERHEAD(%r15)	# pointer to pt_regs  sysc_vtime:  	UPDATE_VTIME %r8,%r9,__LC_SYNC_ENTER_TIMER @@ -188,6 +188,7 @@ sysc_vtime:  	mvc	__PT_INT_CODE(4,%r11),__LC_SVC_ILC  sysc_do_svc:  	oi	__TI_flags+3(%r12),_TIF_SYSCALL +	l	%r10,__TI_sysc_table(%r12)	# 31 bit system call table  	lh	%r8,__PT_INT_CODE+2(%r11)  	sla	%r8,2				# shift and test for svc0  	jnz	sysc_nr_ok @@ -198,7 +199,6 @@ sysc_do_svc:  	lr	%r8,%r1  	sla	%r8,2  sysc_nr_ok: -	l	%r10,BASED(.Lsys_call_table)	# 31 bit system call table  	xc	__SF_BACKCHAIN(4,%r15),__SF_BACKCHAIN(%r15)  	st	%r2,__PT_ORIG_GPR2(%r11)  	st	%r7,STACK_FRAME_OVERHEAD(%r15) @@ -359,11 +359,11 @@ ENTRY(pgm_check_handler)  	tm	__LC_PGM_ILC+3,0x80	# check for per exception  	jnz	pgm_svcper		# -> single stepped svc  0:	CHECK_STACK STACK_SIZE,__LC_SAVE_AREA_SYNC +	ahi	%r15,-(STACK_FRAME_OVERHEAD + __PT_SIZE)  	j	2f  1:	UPDATE_VTIME %r14,%r15,__LC_SYNC_ENTER_TIMER  	l	%r15,__LC_KERNEL_STACK -2:	ahi	%r15,-(STACK_FRAME_OVERHEAD + __PT_SIZE) -	la	%r11,STACK_FRAME_OVERHEAD(%r15) +2:	la	%r11,STACK_FRAME_OVERHEAD(%r15)  	stm	%r0,%r7,__PT_R0(%r11)  	mvc	__PT_R8(32,%r11),__LC_SAVE_AREA_SYNC  	stm	%r8,%r9,__PT_PSW(%r11) @@ -485,7 +485,6 @@ io_work:  #  io_work_user:  	l	%r1,__LC_KERNEL_STACK -	ahi	%r1,-(STACK_FRAME_OVERHEAD + __PT_SIZE)  	mvc	STACK_FRAME_OVERHEAD(__PT_SIZE,%r1),0(%r11)  	xc	__SF_BACKCHAIN(4,%r1),__SF_BACKCHAIN(%r1)  	la	%r11,STACK_FRAME_OVERHEAD(%r1) @@ -646,7 +645,6 @@ mcck_skip:  	tm	__PT_PSW+1(%r11),0x01	# returning to user ?  	jno	mcck_return  	l	%r1,__LC_KERNEL_STACK	# switch to kernel stack -	ahi	%r1,-(STACK_FRAME_OVERHEAD + __PT_SIZE)  	mvc	STACK_FRAME_OVERHEAD(__PT_SIZE,%r1),0(%r11)  	xc	__SF_BACKCHAIN(4,%r1),__SF_BACKCHAIN(%r1)  	la	%r11,STACK_FRAME_OVERHEAD(%r15) @@ -674,6 +672,7 @@ mcck_panic:  	sra	%r14,PAGE_SHIFT  	jz	0f  	l	%r15,__LC_PANIC_STACK +	j	mcck_skip  0:	ahi	%r15,-(STACK_FRAME_OVERHEAD + __PT_SIZE)  	j	mcck_skip @@ -714,12 +713,10 @@ ENTRY(restart_int_handler)   */  stack_overflow:  	l	%r15,__LC_PANIC_STACK	# change to panic stack -	ahi	%r15,-__PT_SIZE		# create pt_regs -	stm	%r0,%r7,__PT_R0(%r15) -	stm	%r8,%r9,__PT_PSW(%r15) +	la	%r11,STACK_FRAME_OVERHEAD(%r15) +	stm	%r0,%r7,__PT_R0(%r11) +	stm	%r8,%r9,__PT_PSW(%r11)  	mvc	__PT_R8(32,%r11),0(%r14) -	lr	%r15,%r11 -	ahi	%r15,-STACK_FRAME_OVERHEAD  	l	%r1,BASED(1f)  	xc	__SF_BACKCHAIN(4,%r15),__SF_BACKCHAIN(%r15)  	lr	%r2,%r11		# pass pointer to pt_regs @@ -799,15 +796,14 @@ cleanup_system_call:  	mvc	__LC_LAST_UPDATE_TIMER(8),__LC_SYNC_ENTER_TIMER  	# set up saved register 11  	l	%r15,__LC_KERNEL_STACK -	ahi	%r15,-__PT_SIZE -	st	%r15,12(%r11)		# r11 pt_regs pointer +	la	%r9,STACK_FRAME_OVERHEAD(%r15) +	st	%r9,12(%r11)		# r11 pt_regs pointer  	# fill pt_regs -	mvc	__PT_R8(32,%r15),__LC_SAVE_AREA_SYNC -	stm	%r0,%r7,__PT_R0(%r15) -	mvc	__PT_PSW(8,%r15),__LC_SVC_OLD_PSW -	mvc	__PT_INT_CODE(4,%r15),__LC_SVC_ILC +	mvc	__PT_R8(32,%r9),__LC_SAVE_AREA_SYNC +	stm	%r0,%r7,__PT_R0(%r9) +	mvc	__PT_PSW(8,%r9),__LC_SVC_OLD_PSW +	mvc	__PT_INT_CODE(4,%r9),__LC_SVC_ILC  	# setup saved register 15 -	ahi	%r15,-STACK_FRAME_OVERHEAD  	st	%r15,28(%r11)		# r15 stack pointer  	# set new psw address and exit  	l	%r9,BASED(cleanup_table+4)	# sysc_do_svc + 0x80000000 @@ -910,7 +906,6 @@ cleanup_idle_wait:  .Ltrace_enter:		.long	do_syscall_trace_enter  .Ltrace_exit:		.long	do_syscall_trace_exit  .Lschedule_tail:	.long	schedule_tail -.Lsys_call_table:	.long	sys_call_table  .Lsysc_per:		.long	sysc_per + 0x80000000  #ifdef CONFIG_TRACE_IRQFLAGS  .Lhardirqs_on:		.long	trace_hardirqs_on_caller  |