Linux Audio

Check our new training course

Loading...
Note: File does not exist in v5.4.
   1/*
   2 *    S390 low-level entry points.
   3 *
   4 *    Copyright IBM Corp. 1999, 2012
   5 *    Author(s): Martin Schwidefsky (schwidefsky@de.ibm.com),
   6 *		 Hartmut Penner (hp@de.ibm.com),
   7 *		 Denis Joseph Barrow (djbarrow@de.ibm.com,barrow_dj@yahoo.com),
   8 *		 Heiko Carstens <heiko.carstens@de.ibm.com>
   9 */
  10
  11#include <linux/init.h>
  12#include <linux/linkage.h>
  13#include <asm/processor.h>
  14#include <asm/cache.h>
  15#include <asm/errno.h>
  16#include <asm/ptrace.h>
  17#include <asm/thread_info.h>
  18#include <asm/asm-offsets.h>
  19#include <asm/unistd.h>
  20#include <asm/page.h>
  21#include <asm/sigp.h>
  22#include <asm/irq.h>
  23
  24__PT_R0      =	__PT_GPRS
  25__PT_R1      =	__PT_GPRS + 8
  26__PT_R2      =	__PT_GPRS + 16
  27__PT_R3      =	__PT_GPRS + 24
  28__PT_R4      =	__PT_GPRS + 32
  29__PT_R5      =	__PT_GPRS + 40
  30__PT_R6      =	__PT_GPRS + 48
  31__PT_R7      =	__PT_GPRS + 56
  32__PT_R8      =	__PT_GPRS + 64
  33__PT_R9      =	__PT_GPRS + 72
  34__PT_R10     =	__PT_GPRS + 80
  35__PT_R11     =	__PT_GPRS + 88
  36__PT_R12     =	__PT_GPRS + 96
  37__PT_R13     =	__PT_GPRS + 104
  38__PT_R14     =	__PT_GPRS + 112
  39__PT_R15     =	__PT_GPRS + 120
  40
  41STACK_SHIFT = PAGE_SHIFT + THREAD_ORDER
  42STACK_SIZE  = 1 << STACK_SHIFT
  43STACK_INIT = STACK_SIZE - STACK_FRAME_OVERHEAD - __PT_SIZE
  44
  45_TIF_WORK_SVC = (_TIF_SIGPENDING | _TIF_NOTIFY_RESUME | _TIF_NEED_RESCHED | \
  46		 _TIF_MCCK_PENDING | _TIF_PER_TRAP | _TIF_ASCE)
  47_TIF_WORK_INT = (_TIF_SIGPENDING | _TIF_NOTIFY_RESUME | _TIF_NEED_RESCHED | \
  48		 _TIF_MCCK_PENDING | _TIF_ASCE)
  49_TIF_TRACE    = (_TIF_SYSCALL_TRACE | _TIF_SYSCALL_AUDIT | _TIF_SECCOMP | \
  50		 _TIF_SYSCALL_TRACEPOINT)
  51_TIF_TRANSFER = (_TIF_MCCK_PENDING | _TIF_TLB_WAIT)
  52
  53#define BASED(name) name-system_call(%r13)
  54
  55	.macro	TRACE_IRQS_ON
  56#ifdef CONFIG_TRACE_IRQFLAGS
  57	basr	%r2,%r0
  58	brasl	%r14,trace_hardirqs_on_caller
  59#endif
  60	.endm
  61
  62	.macro	TRACE_IRQS_OFF
  63#ifdef CONFIG_TRACE_IRQFLAGS
  64	basr	%r2,%r0
  65	brasl	%r14,trace_hardirqs_off_caller
  66#endif
  67	.endm
  68
  69	.macro	LOCKDEP_SYS_EXIT
  70#ifdef CONFIG_LOCKDEP
  71	tm	__PT_PSW+1(%r11),0x01	# returning to user ?
  72	jz	.+10
  73	brasl	%r14,lockdep_sys_exit
  74#endif
  75	.endm
  76
  77	.macro LPP newpp
  78#if IS_ENABLED(CONFIG_KVM)
  79	tm	__LC_MACHINE_FLAGS+6,0x20	# MACHINE_FLAG_LPP
  80	jz	.+8
  81	.insn	s,0xb2800000,\newpp
  82#endif
  83	.endm
  84
  85	.macro	HANDLE_SIE_INTERCEPT scratch,reason
  86#if IS_ENABLED(CONFIG_KVM)
  87	tmhh	%r8,0x0001		# interrupting from user ?
  88	jnz	.+62
  89	lgr	\scratch,%r9
  90	slg	\scratch,BASED(.Lsie_critical)
  91	clg	\scratch,BASED(.Lsie_critical_length)
  92	.if	\reason==1
  93	# Some program interrupts are suppressing (e.g. protection).
  94	# We must also check the instruction after SIE in that case.
  95	# do_protection_exception will rewind to rewind_pad
  96	jh	.+42
  97	.else
  98	jhe	.+42
  99	.endif
 100	lg	%r14,__SF_EMPTY(%r15)		# get control block pointer
 101	LPP	__SF_EMPTY+16(%r15)		# set host id
 102	ni	__SIE_PROG0C+3(%r14),0xfe	# no longer in SIE
 103	lctlg	%c1,%c1,__LC_USER_ASCE		# load primary asce
 104	larl	%r9,sie_exit			# skip forward to sie_exit
 105	mvi	__SF_EMPTY+31(%r15),\reason	# set exit reason
 106#endif
 107	.endm
 108
 109	.macro	CHECK_STACK stacksize,savearea
 110#ifdef CONFIG_CHECK_STACK
 111	tml	%r15,\stacksize - CONFIG_STACK_GUARD
 112	lghi	%r14,\savearea
 113	jz	stack_overflow
 114#endif
 115	.endm
 116
 117	.macro	SWITCH_ASYNC savearea,stack,shift
 118	tmhh	%r8,0x0001		# interrupting from user ?
 119	jnz	1f
 120	lgr	%r14,%r9
 121	slg	%r14,BASED(.Lcritical_start)
 122	clg	%r14,BASED(.Lcritical_length)
 123	jhe	0f
 124	lghi	%r11,\savearea		# inside critical section, do cleanup
 125	brasl	%r14,cleanup_critical
 126	tmhh	%r8,0x0001		# retest problem state after cleanup
 127	jnz	1f
 1280:	lg	%r14,\stack		# are we already on the target stack?
 129	slgr	%r14,%r15
 130	srag	%r14,%r14,\shift
 131	jnz	1f
 132	CHECK_STACK 1<<\shift,\savearea
 133	aghi	%r15,-(STACK_FRAME_OVERHEAD + __PT_SIZE)
 134	j	2f
 1351:	lg	%r15,\stack		# load target stack
 1362:	la	%r11,STACK_FRAME_OVERHEAD(%r15)
 137	.endm
 138
 139	.macro UPDATE_VTIME scratch,enter_timer
 140	lg	\scratch,__LC_EXIT_TIMER
 141	slg	\scratch,\enter_timer
 142	alg	\scratch,__LC_USER_TIMER
 143	stg	\scratch,__LC_USER_TIMER
 144	lg	\scratch,__LC_LAST_UPDATE_TIMER
 145	slg	\scratch,__LC_EXIT_TIMER
 146	alg	\scratch,__LC_SYSTEM_TIMER
 147	stg	\scratch,__LC_SYSTEM_TIMER
 148	mvc	__LC_LAST_UPDATE_TIMER(8),\enter_timer
 149	.endm
 150
 151	.macro	LAST_BREAK scratch
 152	srag	\scratch,%r10,23
 153	jz	.+10
 154	stg	%r10,__TI_last_break(%r12)
 155	.endm
 156
 157	.macro REENABLE_IRQS
 158	stg	%r8,__LC_RETURN_PSW
 159	ni	__LC_RETURN_PSW,0xbf
 160	ssm	__LC_RETURN_PSW
 161	.endm
 162
 163	.macro STCK savearea
 164#ifdef CONFIG_HAVE_MARCH_Z9_109_FEATURES
 165	.insn	s,0xb27c0000,\savearea		# store clock fast
 166#else
 167	.insn	s,0xb2050000,\savearea		# store clock
 168#endif
 169	.endm
 170
 171	.section .kprobes.text, "ax"
 172
 173/*
 174 * Scheduler resume function, called by switch_to
 175 *  gpr2 = (task_struct *) prev
 176 *  gpr3 = (task_struct *) next
 177 * Returns:
 178 *  gpr2 = prev
 179 */
 180ENTRY(__switch_to)
 181	stmg	%r6,%r15,__SF_GPRS(%r15)	# store gprs of prev task
 182	stg	%r15,__THREAD_ksp(%r2)		# store kernel stack of prev
 183	lg	%r4,__THREAD_info(%r2)		# get thread_info of prev
 184	lg	%r5,__THREAD_info(%r3)		# get thread_info of next
 185	lgr	%r15,%r5
 186	aghi	%r15,STACK_INIT			# end of kernel stack of next
 187	stg	%r3,__LC_CURRENT		# store task struct of next
 188	stg	%r5,__LC_THREAD_INFO		# store thread info of next
 189	stg	%r15,__LC_KERNEL_STACK		# store end of kernel stack
 190	lctl	%c4,%c4,__TASK_pid(%r3)		# load pid to control reg. 4
 191	mvc	__LC_CURRENT_PID+4(4,%r0),__TASK_pid(%r3) # store pid of next
 192	lg	%r15,__THREAD_ksp(%r3)		# load kernel stack of next
 193	llill	%r6,_TIF_TRANSFER		# transfer TIF bits
 194	ng	%r6,__TI_flags(%r4)		# isolate TIF bits
 195	jz	0f
 196	og	%r6,__TI_flags(%r5)		# set TIF bits of next
 197	stg	%r6,__TI_flags(%r5)
 198	ni	__TI_flags+7(%r4),255-_TIF_TRANSFER # clear TIF bits of prev
 1990:	lmg	%r6,%r15,__SF_GPRS(%r15)	# load gprs of next task
 200	br	%r14
 201
 202__critical_start:
 203/*
 204 * SVC interrupt handler routine. System calls are synchronous events and
 205 * are executed with interrupts enabled.
 206 */
 207
 208ENTRY(system_call)
 209	stpt	__LC_SYNC_ENTER_TIMER
 210sysc_stmg:
 211	stmg	%r8,%r15,__LC_SAVE_AREA_SYNC
 212	lg	%r10,__LC_LAST_BREAK
 213	lg	%r12,__LC_THREAD_INFO
 214sysc_per:
 215	lg	%r15,__LC_KERNEL_STACK
 216	la	%r11,STACK_FRAME_OVERHEAD(%r15)	# pointer to pt_regs
 217sysc_vtime:
 218	UPDATE_VTIME %r13,__LC_SYNC_ENTER_TIMER
 219	LAST_BREAK %r13
 220	stmg	%r0,%r7,__PT_R0(%r11)
 221	mvc	__PT_R8(64,%r11),__LC_SAVE_AREA_SYNC
 222	mvc	__PT_PSW(16,%r11),__LC_SVC_OLD_PSW
 223	mvc	__PT_INT_CODE(4,%r11),__LC_SVC_ILC
 224sysc_do_svc:
 225	oi	__TI_flags+7(%r12),_TIF_SYSCALL
 226	lg	%r10,__TI_sysc_table(%r12)	# address of system call table
 227	llgh	%r8,__PT_INT_CODE+2(%r11)
 228	slag	%r8,%r8,2			# shift and test for svc 0
 229	jnz	sysc_nr_ok
 230	# svc 0: system call number in %r1
 231	llgfr	%r1,%r1				# clear high word in r1
 232	cghi	%r1,NR_syscalls
 233	jnl	sysc_nr_ok
 234	sth	%r1,__PT_INT_CODE+2(%r11)
 235	slag	%r8,%r1,2
 236sysc_nr_ok:
 237	xc	__SF_BACKCHAIN(8,%r15),__SF_BACKCHAIN(%r15)
 238	stg	%r2,__PT_ORIG_GPR2(%r11)
 239	stg	%r7,STACK_FRAME_OVERHEAD(%r15)
 240	lgf	%r9,0(%r8,%r10)			# get system call add.
 241	tm	__TI_flags+6(%r12),_TIF_TRACE >> 8
 242	jnz	sysc_tracesys
 243	basr	%r14,%r9			# call sys_xxxx
 244	stg	%r2,__PT_R2(%r11)		# store return value
 245
 246sysc_return:
 247	LOCKDEP_SYS_EXIT
 248sysc_tif:
 249	tm	__PT_PSW+1(%r11),0x01		# returning to user ?
 250	jno	sysc_restore
 251	tm	__TI_flags+7(%r12),_TIF_WORK_SVC
 252	jnz	sysc_work			# check for work
 253	ni	__TI_flags+7(%r12),255-_TIF_SYSCALL
 254sysc_restore:
 255	lg	%r14,__LC_VDSO_PER_CPU
 256	lmg	%r0,%r10,__PT_R0(%r11)
 257	mvc	__LC_RETURN_PSW(16),__PT_PSW(%r11)
 258	stpt	__LC_EXIT_TIMER
 259	mvc	__VDSO_ECTG_BASE(16,%r14),__LC_EXIT_TIMER
 260	lmg	%r11,%r15,__PT_R11(%r11)
 261	lpswe	__LC_RETURN_PSW
 262sysc_done:
 263
 264#
 265# One of the work bits is on. Find out which one.
 266#
 267sysc_work:
 268	tm	__TI_flags+7(%r12),_TIF_MCCK_PENDING
 269	jo	sysc_mcck_pending
 270	tm	__TI_flags+7(%r12),_TIF_NEED_RESCHED
 271	jo	sysc_reschedule
 272	tm	__TI_flags+7(%r12),_TIF_PER_TRAP
 273	jo	sysc_singlestep
 274	tm	__TI_flags+7(%r12),_TIF_SIGPENDING
 275	jo	sysc_sigpending
 276	tm	__TI_flags+7(%r12),_TIF_NOTIFY_RESUME
 277	jo	sysc_notify_resume
 278	tm	__TI_flags+7(%r12),_TIF_ASCE
 279	jo	sysc_uaccess
 280	j	sysc_return		# beware of critical section cleanup
 281
 282#
 283# _TIF_NEED_RESCHED is set, call schedule
 284#
 285sysc_reschedule:
 286	larl	%r14,sysc_return
 287	jg	schedule
 288
 289#
 290# _TIF_MCCK_PENDING is set, call handler
 291#
 292sysc_mcck_pending:
 293	larl	%r14,sysc_return
 294	jg	s390_handle_mcck	# TIF bit will be cleared by handler
 295
 296#
 297# _TIF_ASCE is set, load user space asce
 298#
 299sysc_uaccess:
 300	ni	__TI_flags+7(%r12),255-_TIF_ASCE
 301	lctlg	%c1,%c1,__LC_USER_ASCE		# load primary asce
 302	j	sysc_return
 303
 304#
 305# _TIF_SIGPENDING is set, call do_signal
 306#
 307sysc_sigpending:
 308	lgr	%r2,%r11		# pass pointer to pt_regs
 309	brasl	%r14,do_signal
 310	tm	__TI_flags+7(%r12),_TIF_SYSCALL
 311	jno	sysc_return
 312	lmg	%r2,%r7,__PT_R2(%r11)	# load svc arguments
 313	lg	%r10,__TI_sysc_table(%r12)	# address of system call table
 314	lghi	%r8,0			# svc 0 returns -ENOSYS
 315	llgh	%r1,__PT_INT_CODE+2(%r11)	# load new svc number
 316	cghi	%r1,NR_syscalls
 317	jnl	sysc_nr_ok		# invalid svc number -> do svc 0
 318	slag	%r8,%r1,2
 319	j	sysc_nr_ok		# restart svc
 320
 321#
 322# _TIF_NOTIFY_RESUME is set, call do_notify_resume
 323#
 324sysc_notify_resume:
 325	lgr	%r2,%r11		# pass pointer to pt_regs
 326	larl	%r14,sysc_return
 327	jg	do_notify_resume
 328
 329#
 330# _TIF_PER_TRAP is set, call do_per_trap
 331#
 332sysc_singlestep:
 333	ni	__TI_flags+7(%r12),255-_TIF_PER_TRAP
 334	lgr	%r2,%r11		# pass pointer to pt_regs
 335	larl	%r14,sysc_return
 336	jg	do_per_trap
 337
 338#
 339# call tracehook_report_syscall_entry/tracehook_report_syscall_exit before
 340# and after the system call
 341#
 342sysc_tracesys:
 343	lgr	%r2,%r11		# pass pointer to pt_regs
 344	la	%r3,0
 345	llgh	%r0,__PT_INT_CODE+2(%r11)
 346	stg	%r0,__PT_R2(%r11)
 347	brasl	%r14,do_syscall_trace_enter
 348	lghi	%r0,NR_syscalls
 349	clgr	%r0,%r2
 350	jnh	sysc_tracenogo
 351	sllg	%r8,%r2,2
 352	lgf	%r9,0(%r8,%r10)
 353sysc_tracego:
 354	lmg	%r3,%r7,__PT_R3(%r11)
 355	stg	%r7,STACK_FRAME_OVERHEAD(%r15)
 356	lg	%r2,__PT_ORIG_GPR2(%r11)
 357	basr	%r14,%r9		# call sys_xxx
 358	stg	%r2,__PT_R2(%r11)	# store return value
 359sysc_tracenogo:
 360	tm	__TI_flags+6(%r12),_TIF_TRACE >> 8
 361	jz	sysc_return
 362	lgr	%r2,%r11		# pass pointer to pt_regs
 363	larl	%r14,sysc_return
 364	jg	do_syscall_trace_exit
 365
 366#
 367# a new process exits the kernel with ret_from_fork
 368#
 369ENTRY(ret_from_fork)
 370	la	%r11,STACK_FRAME_OVERHEAD(%r15)
 371	lg	%r12,__LC_THREAD_INFO
 372	brasl	%r14,schedule_tail
 373	TRACE_IRQS_ON
 374	ssm	__LC_SVC_NEW_PSW	# reenable interrupts
 375	tm	__PT_PSW+1(%r11),0x01	# forking a kernel thread ?
 376	jne	sysc_tracenogo
 377	# it's a kernel thread
 378	lmg	%r9,%r10,__PT_R9(%r11)	# load gprs
 379ENTRY(kernel_thread_starter)
 380	la	%r2,0(%r10)
 381	basr	%r14,%r9
 382	j	sysc_tracenogo
 383
 384/*
 385 * Program check handler routine
 386 */
 387
 388ENTRY(pgm_check_handler)
 389	stpt	__LC_SYNC_ENTER_TIMER
 390	stmg	%r8,%r15,__LC_SAVE_AREA_SYNC
 391	lg	%r10,__LC_LAST_BREAK
 392	lg	%r12,__LC_THREAD_INFO
 393	larl	%r13,system_call
 394	lmg	%r8,%r9,__LC_PGM_OLD_PSW
 395	HANDLE_SIE_INTERCEPT %r14,1
 396	tmhh	%r8,0x0001		# test problem state bit
 397	jnz	1f			# -> fault in user space
 398	tmhh	%r8,0x4000		# PER bit set in old PSW ?
 399	jnz	0f			# -> enabled, can't be a double fault
 400	tm	__LC_PGM_ILC+3,0x80	# check for per exception
 401	jnz	pgm_svcper		# -> single stepped svc
 4020:	CHECK_STACK STACK_SIZE,__LC_SAVE_AREA_SYNC
 403	aghi	%r15,-(STACK_FRAME_OVERHEAD + __PT_SIZE)
 404	j	2f
 4051:	UPDATE_VTIME %r14,__LC_SYNC_ENTER_TIMER
 406	LAST_BREAK %r14
 407	lg	%r15,__LC_KERNEL_STACK
 408	lg	%r14,__TI_task(%r12)
 409	lghi	%r13,__LC_PGM_TDB
 410	tm	__LC_PGM_ILC+2,0x02	# check for transaction abort
 411	jz	2f
 412	mvc	__THREAD_trap_tdb(256,%r14),0(%r13)
 4132:	la	%r11,STACK_FRAME_OVERHEAD(%r15)
 414	stmg	%r0,%r7,__PT_R0(%r11)
 415	mvc	__PT_R8(64,%r11),__LC_SAVE_AREA_SYNC
 416	stmg	%r8,%r9,__PT_PSW(%r11)
 417	mvc	__PT_INT_CODE(4,%r11),__LC_PGM_ILC
 418	mvc	__PT_INT_PARM_LONG(8,%r11),__LC_TRANS_EXC_CODE
 419	stg	%r10,__PT_ARGS(%r11)
 420	tm	__LC_PGM_ILC+3,0x80	# check for per exception
 421	jz	0f
 422	tmhh	%r8,0x0001		# kernel per event ?
 423	jz	pgm_kprobe
 424	oi	__TI_flags+7(%r12),_TIF_PER_TRAP
 425	mvc	__THREAD_per_address(8,%r14),__LC_PER_ADDRESS
 426	mvc	__THREAD_per_cause(2,%r14),__LC_PER_CAUSE
 427	mvc	__THREAD_per_paid(1,%r14),__LC_PER_PAID
 4280:	REENABLE_IRQS
 429	xc	__SF_BACKCHAIN(8,%r15),__SF_BACKCHAIN(%r15)
 430	larl	%r1,pgm_check_table
 431	llgh	%r10,__PT_INT_CODE+2(%r11)
 432	nill	%r10,0x007f
 433	sll	%r10,2
 434	je	sysc_return
 435	lgf	%r1,0(%r10,%r1)		# load address of handler routine
 436	lgr	%r2,%r11		# pass pointer to pt_regs
 437	basr	%r14,%r1		# branch to interrupt-handler
 438	j	sysc_return
 439
 440#
 441# PER event in supervisor state, must be kprobes
 442#
 443pgm_kprobe:
 444	REENABLE_IRQS
 445	xc	__SF_BACKCHAIN(8,%r15),__SF_BACKCHAIN(%r15)
 446	lgr	%r2,%r11		# pass pointer to pt_regs
 447	brasl	%r14,do_per_trap
 448	j	sysc_return
 449
 450#
 451# single stepped system call
 452#
 453pgm_svcper:
 454	oi	__TI_flags+7(%r12),_TIF_PER_TRAP
 455	mvc	__LC_RETURN_PSW(8),__LC_SVC_NEW_PSW
 456	larl	%r14,sysc_per
 457	stg	%r14,__LC_RETURN_PSW+8
 458	lpswe	__LC_RETURN_PSW		# branch to sysc_per and enable irqs
 459
 460/*
 461 * IO interrupt handler routine
 462 */
 463ENTRY(io_int_handler)
 464	STCK	__LC_INT_CLOCK
 465	stpt	__LC_ASYNC_ENTER_TIMER
 466	stmg	%r8,%r15,__LC_SAVE_AREA_ASYNC
 467	lg	%r10,__LC_LAST_BREAK
 468	lg	%r12,__LC_THREAD_INFO
 469	larl	%r13,system_call
 470	lmg	%r8,%r9,__LC_IO_OLD_PSW
 471	HANDLE_SIE_INTERCEPT %r14,2
 472	SWITCH_ASYNC __LC_SAVE_AREA_ASYNC,__LC_ASYNC_STACK,STACK_SHIFT
 473	tmhh	%r8,0x0001		# interrupting from user?
 474	jz	io_skip
 475	UPDATE_VTIME %r14,__LC_ASYNC_ENTER_TIMER
 476	LAST_BREAK %r14
 477io_skip:
 478	stmg	%r0,%r7,__PT_R0(%r11)
 479	mvc	__PT_R8(64,%r11),__LC_SAVE_AREA_ASYNC
 480	stmg	%r8,%r9,__PT_PSW(%r11)
 481	mvc	__PT_INT_CODE(12,%r11),__LC_SUBCHANNEL_ID
 482	TRACE_IRQS_OFF
 483	xc	__SF_BACKCHAIN(8,%r15),__SF_BACKCHAIN(%r15)
 484io_loop:
 485	lgr	%r2,%r11		# pass pointer to pt_regs
 486	lghi	%r3,IO_INTERRUPT
 487	tm	__PT_INT_CODE+8(%r11),0x80	# adapter interrupt ?
 488	jz	io_call
 489	lghi	%r3,THIN_INTERRUPT
 490io_call:
 491	brasl	%r14,do_IRQ
 492	tm	__LC_MACHINE_FLAGS+6,0x10	# MACHINE_FLAG_LPAR
 493	jz	io_return
 494	tpi	0
 495	jz	io_return
 496	mvc	__PT_INT_CODE(12,%r11),__LC_SUBCHANNEL_ID
 497	j	io_loop
 498io_return:
 499	LOCKDEP_SYS_EXIT
 500	TRACE_IRQS_ON
 501io_tif:
 502	tm	__TI_flags+7(%r12),_TIF_WORK_INT
 503	jnz	io_work 		# there is work to do (signals etc.)
 504io_restore:
 505	lg	%r14,__LC_VDSO_PER_CPU
 506	lmg	%r0,%r10,__PT_R0(%r11)
 507	mvc	__LC_RETURN_PSW(16),__PT_PSW(%r11)
 508	stpt	__LC_EXIT_TIMER
 509	mvc	__VDSO_ECTG_BASE(16,%r14),__LC_EXIT_TIMER
 510	lmg	%r11,%r15,__PT_R11(%r11)
 511	lpswe	__LC_RETURN_PSW
 512io_done:
 513
 514#
 515# There is work todo, find out in which context we have been interrupted:
 516# 1) if we return to user space we can do all _TIF_WORK_INT work
 517# 2) if we return to kernel code and kvm is enabled check if we need to
 518#    modify the psw to leave SIE
 519# 3) if we return to kernel code and preemptive scheduling is enabled check
 520#    the preemption counter and if it is zero call preempt_schedule_irq
 521# Before any work can be done, a switch to the kernel stack is required.
 522#
 523io_work:
 524	tm	__PT_PSW+1(%r11),0x01	# returning to user ?
 525	jo	io_work_user		# yes -> do resched & signal
 526#ifdef CONFIG_PREEMPT
 527	# check for preemptive scheduling
 528	icm	%r0,15,__TI_precount(%r12)
 529	jnz	io_restore		# preemption is disabled
 530	tm	__TI_flags+7(%r12),_TIF_NEED_RESCHED
 531	jno	io_restore
 532	# switch to kernel stack
 533	lg	%r1,__PT_R15(%r11)
 534	aghi	%r1,-(STACK_FRAME_OVERHEAD + __PT_SIZE)
 535	mvc	STACK_FRAME_OVERHEAD(__PT_SIZE,%r1),0(%r11)
 536	xc	__SF_BACKCHAIN(8,%r1),__SF_BACKCHAIN(%r1)
 537	la	%r11,STACK_FRAME_OVERHEAD(%r1)
 538	lgr	%r15,%r1
 539	# TRACE_IRQS_ON already done at io_return, call
 540	# TRACE_IRQS_OFF to keep things symmetrical
 541	TRACE_IRQS_OFF
 542	brasl	%r14,preempt_schedule_irq
 543	j	io_return
 544#else
 545	j	io_restore
 546#endif
 547
 548#
 549# Need to do work before returning to userspace, switch to kernel stack
 550#
 551io_work_user:
 552	lg	%r1,__LC_KERNEL_STACK
 553	mvc	STACK_FRAME_OVERHEAD(__PT_SIZE,%r1),0(%r11)
 554	xc	__SF_BACKCHAIN(8,%r1),__SF_BACKCHAIN(%r1)
 555	la	%r11,STACK_FRAME_OVERHEAD(%r1)
 556	lgr	%r15,%r1
 557
 558#
 559# One of the work bits is on. Find out which one.
 560# Checked are: _TIF_SIGPENDING, _TIF_NOTIFY_RESUME, _TIF_NEED_RESCHED
 561#	       and _TIF_MCCK_PENDING
 562#
 563io_work_tif:
 564	tm	__TI_flags+7(%r12),_TIF_MCCK_PENDING
 565	jo	io_mcck_pending
 566	tm	__TI_flags+7(%r12),_TIF_NEED_RESCHED
 567	jo	io_reschedule
 568	tm	__TI_flags+7(%r12),_TIF_SIGPENDING
 569	jo	io_sigpending
 570	tm	__TI_flags+7(%r12),_TIF_NOTIFY_RESUME
 571	jo	io_notify_resume
 572	tm	__TI_flags+7(%r12),_TIF_ASCE
 573	jo	io_uaccess
 574	j	io_return		# beware of critical section cleanup
 575
 576#
 577# _TIF_MCCK_PENDING is set, call handler
 578#
 579io_mcck_pending:
 580	# TRACE_IRQS_ON already done at io_return
 581	brasl	%r14,s390_handle_mcck	# TIF bit will be cleared by handler
 582	TRACE_IRQS_OFF
 583	j	io_return
 584
 585#
 586# _TIF_ASCE is set, load user space asce
 587#
 588io_uaccess:
 589	ni	__TI_flags+7(%r12),255-_TIF_ASCE
 590	lctlg	%c1,%c1,__LC_USER_ASCE		# load primary asce
 591	j	io_return
 592
 593#
 594# _TIF_NEED_RESCHED is set, call schedule
 595#
 596io_reschedule:
 597	# TRACE_IRQS_ON already done at io_return
 598	ssm	__LC_SVC_NEW_PSW	# reenable interrupts
 599	brasl	%r14,schedule		# call scheduler
 600	ssm	__LC_PGM_NEW_PSW	# disable I/O and ext. interrupts
 601	TRACE_IRQS_OFF
 602	j	io_return
 603
 604#
 605# _TIF_SIGPENDING or is set, call do_signal
 606#
 607io_sigpending:
 608	# TRACE_IRQS_ON already done at io_return
 609	ssm	__LC_SVC_NEW_PSW	# reenable interrupts
 610	lgr	%r2,%r11		# pass pointer to pt_regs
 611	brasl	%r14,do_signal
 612	ssm	__LC_PGM_NEW_PSW	# disable I/O and ext. interrupts
 613	TRACE_IRQS_OFF
 614	j	io_return
 615
 616#
 617# _TIF_NOTIFY_RESUME or is set, call do_notify_resume
 618#
 619io_notify_resume:
 620	# TRACE_IRQS_ON already done at io_return
 621	ssm	__LC_SVC_NEW_PSW	# reenable interrupts
 622	lgr	%r2,%r11		# pass pointer to pt_regs
 623	brasl	%r14,do_notify_resume
 624	ssm	__LC_PGM_NEW_PSW	# disable I/O and ext. interrupts
 625	TRACE_IRQS_OFF
 626	j	io_return
 627
 628/*
 629 * External interrupt handler routine
 630 */
 631ENTRY(ext_int_handler)
 632	STCK	__LC_INT_CLOCK
 633	stpt	__LC_ASYNC_ENTER_TIMER
 634	stmg	%r8,%r15,__LC_SAVE_AREA_ASYNC
 635	lg	%r10,__LC_LAST_BREAK
 636	lg	%r12,__LC_THREAD_INFO
 637	larl	%r13,system_call
 638	lmg	%r8,%r9,__LC_EXT_OLD_PSW
 639	HANDLE_SIE_INTERCEPT %r14,3
 640	SWITCH_ASYNC __LC_SAVE_AREA_ASYNC,__LC_ASYNC_STACK,STACK_SHIFT
 641	tmhh	%r8,0x0001		# interrupting from user ?
 642	jz	ext_skip
 643	UPDATE_VTIME %r14,__LC_ASYNC_ENTER_TIMER
 644	LAST_BREAK %r14
 645ext_skip:
 646	stmg	%r0,%r7,__PT_R0(%r11)
 647	mvc	__PT_R8(64,%r11),__LC_SAVE_AREA_ASYNC
 648	stmg	%r8,%r9,__PT_PSW(%r11)
 649	lghi	%r1,__LC_EXT_PARAMS2
 650	mvc	__PT_INT_CODE(4,%r11),__LC_EXT_CPU_ADDR
 651	mvc	__PT_INT_PARM(4,%r11),__LC_EXT_PARAMS
 652	mvc	__PT_INT_PARM_LONG(8,%r11),0(%r1)
 653	TRACE_IRQS_OFF
 654	xc	__SF_BACKCHAIN(8,%r15),__SF_BACKCHAIN(%r15)
 655	lgr	%r2,%r11		# pass pointer to pt_regs
 656	lghi	%r3,EXT_INTERRUPT
 657	brasl	%r14,do_IRQ
 658	j	io_return
 659
 660/*
 661 * Load idle PSW. The second "half" of this function is in cleanup_idle.
 662 */
 663ENTRY(psw_idle)
 664	stg	%r3,__SF_EMPTY(%r15)
 665	larl	%r1,psw_idle_lpsw+4
 666	stg	%r1,__SF_EMPTY+8(%r15)
 667	STCK	__CLOCK_IDLE_ENTER(%r2)
 668	stpt	__TIMER_IDLE_ENTER(%r2)
 669psw_idle_lpsw:
 670	lpswe	__SF_EMPTY(%r15)
 671	br	%r14
 672psw_idle_end:
 673
 674__critical_end:
 675
 676/*
 677 * Machine check handler routines
 678 */
 679ENTRY(mcck_int_handler)
 680	STCK	__LC_MCCK_CLOCK
 681	la	%r1,4095		# revalidate r1
 682	spt	__LC_CPU_TIMER_SAVE_AREA-4095(%r1)	# revalidate cpu timer
 683	lmg	%r0,%r15,__LC_GPREGS_SAVE_AREA-4095(%r1)# revalidate gprs
 684	lg	%r10,__LC_LAST_BREAK
 685	lg	%r12,__LC_THREAD_INFO
 686	larl	%r13,system_call
 687	lmg	%r8,%r9,__LC_MCK_OLD_PSW
 688	HANDLE_SIE_INTERCEPT %r14,4
 689	tm	__LC_MCCK_CODE,0x80	# system damage?
 690	jo	mcck_panic		# yes -> rest of mcck code invalid
 691	lghi	%r14,__LC_CPU_TIMER_SAVE_AREA
 692	mvc	__LC_MCCK_ENTER_TIMER(8),0(%r14)
 693	tm	__LC_MCCK_CODE+5,0x02	# stored cpu timer value valid?
 694	jo	3f
 695	la	%r14,__LC_SYNC_ENTER_TIMER
 696	clc	0(8,%r14),__LC_ASYNC_ENTER_TIMER
 697	jl	0f
 698	la	%r14,__LC_ASYNC_ENTER_TIMER
 6990:	clc	0(8,%r14),__LC_EXIT_TIMER
 700	jl	1f
 701	la	%r14,__LC_EXIT_TIMER
 7021:	clc	0(8,%r14),__LC_LAST_UPDATE_TIMER
 703	jl	2f
 704	la	%r14,__LC_LAST_UPDATE_TIMER
 7052:	spt	0(%r14)
 706	mvc	__LC_MCCK_ENTER_TIMER(8),0(%r14)
 7073:	tm	__LC_MCCK_CODE+2,0x09	# mwp + ia of old psw valid?
 708	jno	mcck_panic		# no -> skip cleanup critical
 709	SWITCH_ASYNC __LC_GPREGS_SAVE_AREA+64,__LC_PANIC_STACK,PAGE_SHIFT
 710	tm	%r8,0x0001		# interrupting from user ?
 711	jz	mcck_skip
 712	UPDATE_VTIME %r14,__LC_MCCK_ENTER_TIMER
 713	LAST_BREAK %r14
 714mcck_skip:
 715	lghi	%r14,__LC_GPREGS_SAVE_AREA+64
 716	stmg	%r0,%r7,__PT_R0(%r11)
 717	mvc	__PT_R8(64,%r11),0(%r14)
 718	stmg	%r8,%r9,__PT_PSW(%r11)
 719	xc	__SF_BACKCHAIN(8,%r15),__SF_BACKCHAIN(%r15)
 720	lgr	%r2,%r11		# pass pointer to pt_regs
 721	brasl	%r14,s390_do_machine_check
 722	tm	__PT_PSW+1(%r11),0x01	# returning to user ?
 723	jno	mcck_return
 724	lg	%r1,__LC_KERNEL_STACK	# switch to kernel stack
 725	mvc	STACK_FRAME_OVERHEAD(__PT_SIZE,%r1),0(%r11)
 726	xc	__SF_BACKCHAIN(8,%r1),__SF_BACKCHAIN(%r1)
 727	la	%r11,STACK_FRAME_OVERHEAD(%r1)
 728	lgr	%r15,%r1
 729	ssm	__LC_PGM_NEW_PSW	# turn dat on, keep irqs off
 730	tm	__TI_flags+7(%r12),_TIF_MCCK_PENDING
 731	jno	mcck_return
 732	TRACE_IRQS_OFF
 733	brasl	%r14,s390_handle_mcck
 734	TRACE_IRQS_ON
 735mcck_return:
 736	lg	%r14,__LC_VDSO_PER_CPU
 737	lmg	%r0,%r10,__PT_R0(%r11)
 738	mvc	__LC_RETURN_MCCK_PSW(16),__PT_PSW(%r11) # move return PSW
 739	tm	__LC_RETURN_MCCK_PSW+1,0x01 # returning to user ?
 740	jno	0f
 741	stpt	__LC_EXIT_TIMER
 742	mvc	__VDSO_ECTG_BASE(16,%r14),__LC_EXIT_TIMER
 7430:	lmg	%r11,%r15,__PT_R11(%r11)
 744	lpswe	__LC_RETURN_MCCK_PSW
 745
 746mcck_panic:
 747	lg	%r14,__LC_PANIC_STACK
 748	slgr	%r14,%r15
 749	srag	%r14,%r14,PAGE_SHIFT
 750	jz	0f
 751	lg	%r15,__LC_PANIC_STACK
 7520:	aghi	%r15,-(STACK_FRAME_OVERHEAD + __PT_SIZE)
 753	j	mcck_skip
 754
 755#
 756# PSW restart interrupt handler
 757#
 758ENTRY(restart_int_handler)
 759	stg	%r15,__LC_SAVE_AREA_RESTART
 760	lg	%r15,__LC_RESTART_STACK
 761	aghi	%r15,-__PT_SIZE			# create pt_regs on stack
 762	xc	0(__PT_SIZE,%r15),0(%r15)
 763	stmg	%r0,%r14,__PT_R0(%r15)
 764	mvc	__PT_R15(8,%r15),__LC_SAVE_AREA_RESTART
 765	mvc	__PT_PSW(16,%r15),__LC_RST_OLD_PSW # store restart old psw
 766	aghi	%r15,-STACK_FRAME_OVERHEAD	# create stack frame on stack
 767	xc	0(STACK_FRAME_OVERHEAD,%r15),0(%r15)
 768	lg	%r1,__LC_RESTART_FN		# load fn, parm & source cpu
 769	lg	%r2,__LC_RESTART_DATA
 770	lg	%r3,__LC_RESTART_SOURCE
 771	ltgr	%r3,%r3				# test source cpu address
 772	jm	1f				# negative -> skip source stop
 7730:	sigp	%r4,%r3,SIGP_SENSE		# sigp sense to source cpu
 774	brc	10,0b				# wait for status stored
 7751:	basr	%r14,%r1			# call function
 776	stap	__SF_EMPTY(%r15)		# store cpu address
 777	llgh	%r3,__SF_EMPTY(%r15)
 7782:	sigp	%r4,%r3,SIGP_STOP		# sigp stop to current cpu
 779	brc	2,2b
 7803:	j	3b
 781
 782	.section .kprobes.text, "ax"
 783
 784#ifdef CONFIG_CHECK_STACK
 785/*
 786 * The synchronous or the asynchronous stack overflowed. We are dead.
 787 * No need to properly save the registers, we are going to panic anyway.
 788 * Setup a pt_regs so that show_trace can provide a good call trace.
 789 */
 790stack_overflow:
 791	lg	%r15,__LC_PANIC_STACK	# change to panic stack
 792	la	%r11,STACK_FRAME_OVERHEAD(%r15)
 793	stmg	%r0,%r7,__PT_R0(%r11)
 794	stmg	%r8,%r9,__PT_PSW(%r11)
 795	mvc	__PT_R8(64,%r11),0(%r14)
 796	stg	%r10,__PT_ORIG_GPR2(%r11) # store last break to orig_gpr2
 797	xc	__SF_BACKCHAIN(8,%r15),__SF_BACKCHAIN(%r15)
 798	lgr	%r2,%r11		# pass pointer to pt_regs
 799	jg	kernel_stack_overflow
 800#endif
 801
 802	.align	8
 803cleanup_table:
 804	.quad	system_call
 805	.quad	sysc_do_svc
 806	.quad	sysc_tif
 807	.quad	sysc_restore
 808	.quad	sysc_done
 809	.quad	io_tif
 810	.quad	io_restore
 811	.quad	io_done
 812	.quad	psw_idle
 813	.quad	psw_idle_end
 814
 815cleanup_critical:
 816	clg	%r9,BASED(cleanup_table)	# system_call
 817	jl	0f
 818	clg	%r9,BASED(cleanup_table+8)	# sysc_do_svc
 819	jl	cleanup_system_call
 820	clg	%r9,BASED(cleanup_table+16)	# sysc_tif
 821	jl	0f
 822	clg	%r9,BASED(cleanup_table+24)	# sysc_restore
 823	jl	cleanup_sysc_tif
 824	clg	%r9,BASED(cleanup_table+32)	# sysc_done
 825	jl	cleanup_sysc_restore
 826	clg	%r9,BASED(cleanup_table+40)	# io_tif
 827	jl	0f
 828	clg	%r9,BASED(cleanup_table+48)	# io_restore
 829	jl	cleanup_io_tif
 830	clg	%r9,BASED(cleanup_table+56)	# io_done
 831	jl	cleanup_io_restore
 832	clg	%r9,BASED(cleanup_table+64)	# psw_idle
 833	jl	0f
 834	clg	%r9,BASED(cleanup_table+72)	# psw_idle_end
 835	jl	cleanup_idle
 8360:	br	%r14
 837
 838
 839cleanup_system_call:
 840	# check if stpt has been executed
 841	clg	%r9,BASED(cleanup_system_call_insn)
 842	jh	0f
 843	mvc	__LC_SYNC_ENTER_TIMER(8),__LC_ASYNC_ENTER_TIMER
 844	cghi	%r11,__LC_SAVE_AREA_ASYNC
 845	je	0f
 846	mvc	__LC_SYNC_ENTER_TIMER(8),__LC_MCCK_ENTER_TIMER
 8470:	# check if stmg has been executed
 848	clg	%r9,BASED(cleanup_system_call_insn+8)
 849	jh	0f
 850	mvc	__LC_SAVE_AREA_SYNC(64),0(%r11)
 8510:	# check if base register setup + TIF bit load has been done
 852	clg	%r9,BASED(cleanup_system_call_insn+16)
 853	jhe	0f
 854	# set up saved registers r10 and r12
 855	stg	%r10,16(%r11)		# r10 last break
 856	stg	%r12,32(%r11)		# r12 thread-info pointer
 8570:	# check if the user time update has been done
 858	clg	%r9,BASED(cleanup_system_call_insn+24)
 859	jh	0f
 860	lg	%r15,__LC_EXIT_TIMER
 861	slg	%r15,__LC_SYNC_ENTER_TIMER
 862	alg	%r15,__LC_USER_TIMER
 863	stg	%r15,__LC_USER_TIMER
 8640:	# check if the system time update has been done
 865	clg	%r9,BASED(cleanup_system_call_insn+32)
 866	jh	0f
 867	lg	%r15,__LC_LAST_UPDATE_TIMER
 868	slg	%r15,__LC_EXIT_TIMER
 869	alg	%r15,__LC_SYSTEM_TIMER
 870	stg	%r15,__LC_SYSTEM_TIMER
 8710:	# update accounting time stamp
 872	mvc	__LC_LAST_UPDATE_TIMER(8),__LC_SYNC_ENTER_TIMER
 873	# do LAST_BREAK
 874	lg	%r9,16(%r11)
 875	srag	%r9,%r9,23
 876	jz	0f
 877	mvc	__TI_last_break(8,%r12),16(%r11)
 8780:	# set up saved register r11
 879	lg	%r15,__LC_KERNEL_STACK
 880	la	%r9,STACK_FRAME_OVERHEAD(%r15)
 881	stg	%r9,24(%r11)		# r11 pt_regs pointer
 882	# fill pt_regs
 883	mvc	__PT_R8(64,%r9),__LC_SAVE_AREA_SYNC
 884	stmg	%r0,%r7,__PT_R0(%r9)
 885	mvc	__PT_PSW(16,%r9),__LC_SVC_OLD_PSW
 886	mvc	__PT_INT_CODE(4,%r9),__LC_SVC_ILC
 887	# setup saved register r15
 888	stg	%r15,56(%r11)		# r15 stack pointer
 889	# set new psw address and exit
 890	larl	%r9,sysc_do_svc
 891	br	%r14
 892cleanup_system_call_insn:
 893	.quad	system_call
 894	.quad	sysc_stmg
 895	.quad	sysc_per
 896	.quad	sysc_vtime+18
 897	.quad	sysc_vtime+42
 898
 899cleanup_sysc_tif:
 900	larl	%r9,sysc_tif
 901	br	%r14
 902
 903cleanup_sysc_restore:
 904	clg	%r9,BASED(cleanup_sysc_restore_insn)
 905	je	0f
 906	lg	%r9,24(%r11)		# get saved pointer to pt_regs
 907	mvc	__LC_RETURN_PSW(16),__PT_PSW(%r9)
 908	mvc	0(64,%r11),__PT_R8(%r9)
 909	lmg	%r0,%r7,__PT_R0(%r9)
 9100:	lmg	%r8,%r9,__LC_RETURN_PSW
 911	br	%r14
 912cleanup_sysc_restore_insn:
 913	.quad	sysc_done - 4
 914
 915cleanup_io_tif:
 916	larl	%r9,io_tif
 917	br	%r14
 918
 919cleanup_io_restore:
 920	clg	%r9,BASED(cleanup_io_restore_insn)
 921	je	0f
 922	lg	%r9,24(%r11)		# get saved r11 pointer to pt_regs
 923	mvc	__LC_RETURN_PSW(16),__PT_PSW(%r9)
 924	mvc	0(64,%r11),__PT_R8(%r9)
 925	lmg	%r0,%r7,__PT_R0(%r9)
 9260:	lmg	%r8,%r9,__LC_RETURN_PSW
 927	br	%r14
 928cleanup_io_restore_insn:
 929	.quad	io_done - 4
 930
 931cleanup_idle:
 932	# copy interrupt clock & cpu timer
 933	mvc	__CLOCK_IDLE_EXIT(8,%r2),__LC_INT_CLOCK
 934	mvc	__TIMER_IDLE_EXIT(8,%r2),__LC_ASYNC_ENTER_TIMER
 935	cghi	%r11,__LC_SAVE_AREA_ASYNC
 936	je	0f
 937	mvc	__CLOCK_IDLE_EXIT(8,%r2),__LC_MCCK_CLOCK
 938	mvc	__TIMER_IDLE_EXIT(8,%r2),__LC_MCCK_ENTER_TIMER
 9390:	# check if stck & stpt have been executed
 940	clg	%r9,BASED(cleanup_idle_insn)
 941	jhe	1f
 942	mvc	__CLOCK_IDLE_ENTER(8,%r2),__CLOCK_IDLE_EXIT(%r2)
 943	mvc	__TIMER_IDLE_ENTER(8,%r2),__TIMER_IDLE_EXIT(%r2)
 9441:	# account system time going idle
 945	lg	%r9,__LC_STEAL_TIMER
 946	alg	%r9,__CLOCK_IDLE_ENTER(%r2)
 947	slg	%r9,__LC_LAST_UPDATE_CLOCK
 948	stg	%r9,__LC_STEAL_TIMER
 949	mvc	__LC_LAST_UPDATE_CLOCK(8),__CLOCK_IDLE_EXIT(%r2)
 950	lg	%r9,__LC_SYSTEM_TIMER
 951	alg	%r9,__LC_LAST_UPDATE_TIMER
 952	slg	%r9,__TIMER_IDLE_ENTER(%r2)
 953	stg	%r9,__LC_SYSTEM_TIMER
 954	mvc	__LC_LAST_UPDATE_TIMER(8),__TIMER_IDLE_EXIT(%r2)
 955	# prepare return psw
 956	nihh	%r8,0xfcfd		# clear irq & wait state bits
 957	lg	%r9,48(%r11)		# return from psw_idle
 958	br	%r14
 959cleanup_idle_insn:
 960	.quad	psw_idle_lpsw
 961
 962/*
 963 * Integer constants
 964 */
 965	.align	8
 966.Lcritical_start:
 967	.quad	__critical_start
 968.Lcritical_length:
 969	.quad	__critical_end - __critical_start
 970
 971
 972#if IS_ENABLED(CONFIG_KVM)
 973/*
 974 * sie64a calling convention:
 975 * %r2 pointer to sie control block
 976 * %r3 guest register save area
 977 */
 978ENTRY(sie64a)
 979	stmg	%r6,%r14,__SF_GPRS(%r15)	# save kernel registers
 980	stg	%r2,__SF_EMPTY(%r15)		# save control block pointer
 981	stg	%r3,__SF_EMPTY+8(%r15)		# save guest register save area
 982	xc	__SF_EMPTY+16(16,%r15),__SF_EMPTY+16(%r15) # host id & reason
 983	lmg	%r0,%r13,0(%r3)			# load guest gprs 0-13
 984	lg	%r14,__LC_GMAP			# get gmap pointer
 985	ltgr	%r14,%r14
 986	jz	sie_gmap
 987	lctlg	%c1,%c1,__GMAP_ASCE(%r14)	# load primary asce
 988sie_gmap:
 989	lg	%r14,__SF_EMPTY(%r15)		# get control block pointer
 990	oi	__SIE_PROG0C+3(%r14),1		# we are going into SIE now
 991	tm	__SIE_PROG20+3(%r14),1		# last exit...
 992	jnz	sie_done
 993	LPP	__SF_EMPTY(%r15)		# set guest id
 994	sie	0(%r14)
 995sie_done:
 996	LPP	__SF_EMPTY+16(%r15)		# set host id
 997	ni	__SIE_PROG0C+3(%r14),0xfe	# no longer in SIE
 998	lctlg	%c1,%c1,__LC_USER_ASCE		# load primary asce
 999# some program checks are suppressing. C code (e.g. do_protection_exception)
1000# will rewind the PSW by the ILC, which is 4 bytes in case of SIE. Other
1001# instructions between sie64a and sie_done should not cause program
1002# interrupts. So lets use a nop (47 00 00 00) as a landing pad.
1003# See also HANDLE_SIE_INTERCEPT
1004rewind_pad:
1005	nop	0
1006	.globl sie_exit
1007sie_exit:
1008	lg	%r14,__SF_EMPTY+8(%r15)		# load guest register save area
1009	stmg	%r0,%r13,0(%r14)		# save guest gprs 0-13
1010	lmg	%r6,%r14,__SF_GPRS(%r15)	# restore kernel registers
1011	lg	%r2,__SF_EMPTY+24(%r15)		# return exit reason code
1012	br	%r14
1013sie_fault:
1014	lghi	%r14,-EFAULT
1015	stg	%r14,__SF_EMPTY+24(%r15)	# set exit reason code
1016	j	sie_exit
1017
1018	.align	8
1019.Lsie_critical:
1020	.quad	sie_gmap
1021.Lsie_critical_length:
1022	.quad	sie_done - sie_gmap
1023
1024	EX_TABLE(rewind_pad,sie_fault)
1025	EX_TABLE(sie_exit,sie_fault)
1026#endif
1027
1028		.section .rodata, "a"
1029#define SYSCALL(esa,esame,emu)	.long esame
1030	.globl	sys_call_table
1031sys_call_table:
1032#include "syscalls.S"
1033#undef SYSCALL
1034
1035#ifdef CONFIG_COMPAT
1036
1037#define SYSCALL(esa,esame,emu)	.long emu
1038	.globl	sys_call_table_emu
1039sys_call_table_emu:
1040#include "syscalls.S"
1041#undef SYSCALL
1042#endif