1b2441318SGreg Kroah-Hartman/* SPDX-License-Identifier: GPL-2.0 */ 24bfc86ceSHeiko Carstens/* 34bfc86ceSHeiko Carstens * S390 low-level entry points. 44bfc86ceSHeiko Carstens * 54bfc86ceSHeiko Carstens * Copyright IBM Corp. 1999, 2012 64bfc86ceSHeiko Carstens * Author(s): Martin Schwidefsky (schwidefsky@de.ibm.com), 74bfc86ceSHeiko Carstens * Hartmut Penner (hp@de.ibm.com), 84bfc86ceSHeiko Carstens * Denis Joseph Barrow (djbarrow@de.ibm.com,barrow_dj@yahoo.com), 94bfc86ceSHeiko Carstens * Heiko Carstens <heiko.carstens@de.ibm.com> 104bfc86ceSHeiko Carstens */ 114bfc86ceSHeiko Carstens 124bfc86ceSHeiko Carstens#include <linux/init.h> 134bfc86ceSHeiko Carstens#include <linux/linkage.h> 14b058661aSMartin Schwidefsky#include <asm/alternative-asm.h> 154bfc86ceSHeiko Carstens#include <asm/processor.h> 164bfc86ceSHeiko Carstens#include <asm/cache.h> 173037a52fSMartin Schwidefsky#include <asm/ctl_reg.h> 18dc24b7b4SHendrik Brueckner#include <asm/dwarf.h> 194bfc86ceSHeiko Carstens#include <asm/errno.h> 204bfc86ceSHeiko Carstens#include <asm/ptrace.h> 214bfc86ceSHeiko Carstens#include <asm/thread_info.h> 224bfc86ceSHeiko Carstens#include <asm/asm-offsets.h> 234bfc86ceSHeiko Carstens#include <asm/unistd.h> 244bfc86ceSHeiko Carstens#include <asm/page.h> 254bfc86ceSHeiko Carstens#include <asm/sigp.h> 264bfc86ceSHeiko Carstens#include <asm/irq.h> 279977e886SHendrik Brueckner#include <asm/vx-insn.h> 2883abeffbSHendrik Brueckner#include <asm/setup.h> 2983abeffbSHendrik Brueckner#include <asm/nmi.h> 30711f5df7SAl Viro#include <asm/export.h> 316dd85fbbSMartin Schwidefsky#include <asm/nospec-insn.h> 324bfc86ceSHeiko Carstens 334bfc86ceSHeiko Carstens__PT_R0 = __PT_GPRS 344bfc86ceSHeiko Carstens__PT_R1 = __PT_GPRS + 8 354bfc86ceSHeiko Carstens__PT_R2 = __PT_GPRS + 16 364bfc86ceSHeiko Carstens__PT_R3 = __PT_GPRS + 24 374bfc86ceSHeiko Carstens__PT_R4 = __PT_GPRS + 32 384bfc86ceSHeiko Carstens__PT_R5 = __PT_GPRS + 40 394bfc86ceSHeiko Carstens__PT_R6 = __PT_GPRS + 48 404bfc86ceSHeiko Carstens__PT_R7 = __PT_GPRS + 56 414bfc86ceSHeiko Carstens__PT_R8 = __PT_GPRS + 64 424bfc86ceSHeiko Carstens__PT_R9 = __PT_GPRS + 72 434bfc86ceSHeiko Carstens__PT_R10 = __PT_GPRS + 80 444bfc86ceSHeiko Carstens__PT_R11 = __PT_GPRS + 88 454bfc86ceSHeiko Carstens__PT_R12 = __PT_GPRS + 96 464bfc86ceSHeiko Carstens__PT_R13 = __PT_GPRS + 104 474bfc86ceSHeiko Carstens__PT_R14 = __PT_GPRS + 112 484bfc86ceSHeiko Carstens__PT_R15 = __PT_GPRS + 120 494bfc86ceSHeiko Carstens 503a890380SHeiko CarstensSTACK_SHIFT = PAGE_SHIFT + THREAD_SIZE_ORDER 514bfc86ceSHeiko CarstensSTACK_SIZE = 1 << STACK_SHIFT 524bfc86ceSHeiko CarstensSTACK_INIT = STACK_SIZE - STACK_FRAME_OVERHEAD - __PT_SIZE 534bfc86ceSHeiko Carstens 544bfc86ceSHeiko Carstens_TIF_WORK = (_TIF_SIGPENDING | _TIF_NOTIFY_RESUME | _TIF_NEED_RESCHED | \ 5576f1948aSLinus Torvalds _TIF_UPROBE | _TIF_GUARDED_STORAGE | _TIF_PATCH_PENDING) 564bfc86ceSHeiko Carstens_TIF_TRACE = (_TIF_SYSCALL_TRACE | _TIF_SYSCALL_AUDIT | _TIF_SECCOMP | \ 574bfc86ceSHeiko Carstens _TIF_SYSCALL_TRACEPOINT) 58b5a882fcSHeiko Carstens_CIF_WORK = (_CIF_MCCK_PENDING | _CIF_ASCE_PRIMARY | \ 59b5a882fcSHeiko Carstens _CIF_ASCE_SECONDARY | _CIF_FPU) 6023fefe11SMartin Schwidefsky_PIF_WORK = (_PIF_PER_TRAP | _PIF_SYSCALL_RESTART) 614bfc86ceSHeiko Carstens 62e5b98199SMartin Schwidefsky_LPP_OFFSET = __LC_LPP 63e5b98199SMartin Schwidefsky 649977e886SHendrik Brueckner#define BASED(name) name-cleanup_critical(%r13) 654bfc86ceSHeiko Carstens 664bfc86ceSHeiko Carstens .macro TRACE_IRQS_ON 674bfc86ceSHeiko Carstens#ifdef CONFIG_TRACE_IRQFLAGS 684bfc86ceSHeiko Carstens basr %r2,%r0 694bfc86ceSHeiko Carstens brasl %r14,trace_hardirqs_on_caller 704bfc86ceSHeiko Carstens#endif 714bfc86ceSHeiko Carstens .endm 724bfc86ceSHeiko Carstens 734bfc86ceSHeiko Carstens .macro TRACE_IRQS_OFF 744bfc86ceSHeiko Carstens#ifdef CONFIG_TRACE_IRQFLAGS 754bfc86ceSHeiko Carstens basr %r2,%r0 764bfc86ceSHeiko Carstens brasl %r14,trace_hardirqs_off_caller 774bfc86ceSHeiko Carstens#endif 784bfc86ceSHeiko Carstens .endm 794bfc86ceSHeiko Carstens 804bfc86ceSHeiko Carstens .macro LOCKDEP_SYS_EXIT 814bfc86ceSHeiko Carstens#ifdef CONFIG_LOCKDEP 824bfc86ceSHeiko Carstens tm __PT_PSW+1(%r11),0x01 # returning to user ? 834bfc86ceSHeiko Carstens jz .+10 844bfc86ceSHeiko Carstens brasl %r14,lockdep_sys_exit 854bfc86ceSHeiko Carstens#endif 864bfc86ceSHeiko Carstens .endm 874bfc86ceSHeiko Carstens 88*ce3dc447SMartin Schwidefsky .macro CHECK_STACK savearea 894bfc86ceSHeiko Carstens#ifdef CONFIG_CHECK_STACK 90*ce3dc447SMartin Schwidefsky tml %r15,STACK_SIZE - CONFIG_STACK_GUARD 914bfc86ceSHeiko Carstens lghi %r14,\savearea 924bfc86ceSHeiko Carstens jz stack_overflow 934bfc86ceSHeiko Carstens#endif 944bfc86ceSHeiko Carstens .endm 954bfc86ceSHeiko Carstens 96*ce3dc447SMartin Schwidefsky .macro CHECK_VMAP_STACK savearea,oklabel 97*ce3dc447SMartin Schwidefsky#ifdef CONFIG_VMAP_STACK 98*ce3dc447SMartin Schwidefsky lgr %r14,%r15 99*ce3dc447SMartin Schwidefsky nill %r14,0x10000 - STACK_SIZE 100*ce3dc447SMartin Schwidefsky oill %r14,STACK_INIT 101*ce3dc447SMartin Schwidefsky clg %r14,__LC_KERNEL_STACK 102*ce3dc447SMartin Schwidefsky je \oklabel 103*ce3dc447SMartin Schwidefsky clg %r14,__LC_ASYNC_STACK 104*ce3dc447SMartin Schwidefsky je \oklabel 105*ce3dc447SMartin Schwidefsky clg %r14,__LC_NODAT_STACK 106*ce3dc447SMartin Schwidefsky je \oklabel 107*ce3dc447SMartin Schwidefsky clg %r14,__LC_RESTART_STACK 108*ce3dc447SMartin Schwidefsky je \oklabel 109*ce3dc447SMartin Schwidefsky lghi %r14,\savearea 110*ce3dc447SMartin Schwidefsky j stack_overflow 111*ce3dc447SMartin Schwidefsky#else 112*ce3dc447SMartin Schwidefsky j \oklabel 113*ce3dc447SMartin Schwidefsky#endif 114*ce3dc447SMartin Schwidefsky .endm 115*ce3dc447SMartin Schwidefsky 1162acb94f4SMartin Schwidefsky .macro SWITCH_ASYNC savearea,timer 1174bfc86ceSHeiko Carstens tmhh %r8,0x0001 # interrupting from user ? 1184bfc86ceSHeiko Carstens jnz 1f 1194bfc86ceSHeiko Carstens lgr %r14,%r9 1204bfc86ceSHeiko Carstens slg %r14,BASED(.Lcritical_start) 1214bfc86ceSHeiko Carstens clg %r14,BASED(.Lcritical_length) 1224bfc86ceSHeiko Carstens jhe 0f 1234bfc86ceSHeiko Carstens lghi %r11,\savearea # inside critical section, do cleanup 1244bfc86ceSHeiko Carstens brasl %r14,cleanup_critical 1254bfc86ceSHeiko Carstens tmhh %r8,0x0001 # retest problem state after cleanup 1264bfc86ceSHeiko Carstens jnz 1f 127*ce3dc447SMartin Schwidefsky0: lg %r14,__LC_ASYNC_STACK # are we already on the target stack? 1284bfc86ceSHeiko Carstens slgr %r14,%r15 1292acb94f4SMartin Schwidefsky srag %r14,%r14,STACK_SHIFT 130a359bb11SMartin Schwidefsky jnz 2f 131*ce3dc447SMartin Schwidefsky CHECK_STACK \savearea 1324bfc86ceSHeiko Carstens aghi %r15,-(STACK_FRAME_OVERHEAD + __PT_SIZE) 133a359bb11SMartin Schwidefsky j 3f 13434525e1fSMartin Schwidefsky1: UPDATE_VTIME %r14,%r15,\timer 1356b73044bSMartin Schwidefsky BPENTER __TI_flags(%r12),_TIF_ISOLATE_BP 1362acb94f4SMartin Schwidefsky2: lg %r15,__LC_ASYNC_STACK # load async stack 137a359bb11SMartin Schwidefsky3: la %r11,STACK_FRAME_OVERHEAD(%r15) 1384bfc86ceSHeiko Carstens .endm 1394bfc86ceSHeiko Carstens 140a359bb11SMartin Schwidefsky .macro UPDATE_VTIME w1,w2,enter_timer 141a359bb11SMartin Schwidefsky lg \w1,__LC_EXIT_TIMER 142a359bb11SMartin Schwidefsky lg \w2,__LC_LAST_UPDATE_TIMER 143a359bb11SMartin Schwidefsky slg \w1,\enter_timer 144a359bb11SMartin Schwidefsky slg \w2,__LC_EXIT_TIMER 145a359bb11SMartin Schwidefsky alg \w1,__LC_USER_TIMER 146a359bb11SMartin Schwidefsky alg \w2,__LC_SYSTEM_TIMER 147a359bb11SMartin Schwidefsky stg \w1,__LC_USER_TIMER 148a359bb11SMartin Schwidefsky stg \w2,__LC_SYSTEM_TIMER 1494bfc86ceSHeiko Carstens mvc __LC_LAST_UPDATE_TIMER(8),\enter_timer 1504bfc86ceSHeiko Carstens .endm 1514bfc86ceSHeiko Carstens 1524bfc86ceSHeiko Carstens .macro REENABLE_IRQS 1534bfc86ceSHeiko Carstens stg %r8,__LC_RETURN_PSW 1544bfc86ceSHeiko Carstens ni __LC_RETURN_PSW,0xbf 1554bfc86ceSHeiko Carstens ssm __LC_RETURN_PSW 1564bfc86ceSHeiko Carstens .endm 1574bfc86ceSHeiko Carstens 1584bfc86ceSHeiko Carstens .macro STCK savearea 1594bfc86ceSHeiko Carstens#ifdef CONFIG_HAVE_MARCH_Z9_109_FEATURES 1604bfc86ceSHeiko Carstens .insn s,0xb27c0000,\savearea # store clock fast 1614bfc86ceSHeiko Carstens#else 1624bfc86ceSHeiko Carstens .insn s,0xb2050000,\savearea # store clock 1634bfc86ceSHeiko Carstens#endif 1644bfc86ceSHeiko Carstens .endm 1654bfc86ceSHeiko Carstens 16683abeffbSHendrik Brueckner /* 16783abeffbSHendrik Brueckner * The TSTMSK macro generates a test-under-mask instruction by 16883abeffbSHendrik Brueckner * calculating the memory offset for the specified mask value. 16983abeffbSHendrik Brueckner * Mask value can be any constant. The macro shifts the mask 17083abeffbSHendrik Brueckner * value to calculate the memory offset for the test-under-mask 17183abeffbSHendrik Brueckner * instruction. 17283abeffbSHendrik Brueckner */ 17383abeffbSHendrik Brueckner .macro TSTMSK addr, mask, size=8, bytepos=0 17483abeffbSHendrik Brueckner .if (\bytepos < \size) && (\mask >> 8) 17583abeffbSHendrik Brueckner .if (\mask & 0xff) 17683abeffbSHendrik Brueckner .error "Mask exceeds byte boundary" 17783abeffbSHendrik Brueckner .endif 17883abeffbSHendrik Brueckner TSTMSK \addr, "(\mask >> 8)", \size, "(\bytepos + 1)" 17983abeffbSHendrik Brueckner .exitm 18083abeffbSHendrik Brueckner .endif 18183abeffbSHendrik Brueckner .ifeq \mask 18283abeffbSHendrik Brueckner .error "Mask must not be zero" 18383abeffbSHendrik Brueckner .endif 18483abeffbSHendrik Brueckner off = \size - \bytepos - 1 18583abeffbSHendrik Brueckner tm off+\addr, \mask 18683abeffbSHendrik Brueckner .endm 18783abeffbSHendrik Brueckner 188d768bd89SMartin Schwidefsky .macro BPOFF 189b058661aSMartin Schwidefsky ALTERNATIVE "", ".long 0xb2e8c000", 82 190d768bd89SMartin Schwidefsky .endm 191d768bd89SMartin Schwidefsky 192d768bd89SMartin Schwidefsky .macro BPON 193b058661aSMartin Schwidefsky ALTERNATIVE "", ".long 0xb2e8d000", 82 194d768bd89SMartin Schwidefsky .endm 195d768bd89SMartin Schwidefsky 1966b73044bSMartin Schwidefsky .macro BPENTER tif_ptr,tif_mask 197b058661aSMartin Schwidefsky ALTERNATIVE "TSTMSK \tif_ptr,\tif_mask; jz .+8; .long 0xb2e8d000", \ 198b058661aSMartin Schwidefsky "", 82 1996b73044bSMartin Schwidefsky .endm 2006b73044bSMartin Schwidefsky 2016b73044bSMartin Schwidefsky .macro BPEXIT tif_ptr,tif_mask 2026b73044bSMartin Schwidefsky TSTMSK \tif_ptr,\tif_mask 203b058661aSMartin Schwidefsky ALTERNATIVE "jz .+8; .long 0xb2e8c000", \ 204b058661aSMartin Schwidefsky "jnz .+8; .long 0xb2e8d000", 82 2056b73044bSMartin Schwidefsky .endm 2066b73044bSMartin Schwidefsky 2076dd85fbbSMartin Schwidefsky GEN_BR_THUNK %r9 2086dd85fbbSMartin Schwidefsky GEN_BR_THUNK %r14 2096dd85fbbSMartin Schwidefsky GEN_BR_THUNK %r14,%r11 210f19fbd5eSMartin Schwidefsky 2114bfc86ceSHeiko Carstens .section .kprobes.text, "ax" 21246210c44SHeiko Carstens.Ldummy: 21346210c44SHeiko Carstens /* 21446210c44SHeiko Carstens * This nop exists only in order to avoid that __switch_to starts at 21546210c44SHeiko Carstens * the beginning of the kprobes text section. In that case we would 21646210c44SHeiko Carstens * have several symbols at the same address. E.g. objdump would take 21746210c44SHeiko Carstens * an arbitrary symbol name when disassembling this code. 21846210c44SHeiko Carstens * With the added nop in between the __switch_to symbol is unique 21946210c44SHeiko Carstens * again. 22046210c44SHeiko Carstens */ 22146210c44SHeiko Carstens nop 0 2224bfc86ceSHeiko Carstens 223d768bd89SMartin SchwidefskyENTRY(__bpon) 224d768bd89SMartin Schwidefsky .globl __bpon 225d768bd89SMartin Schwidefsky BPON 2266dd85fbbSMartin Schwidefsky BR_EX %r14 227d768bd89SMartin Schwidefsky 2284bfc86ceSHeiko Carstens/* 2294bfc86ceSHeiko Carstens * Scheduler resume function, called by switch_to 2304bfc86ceSHeiko Carstens * gpr2 = (task_struct *) prev 2314bfc86ceSHeiko Carstens * gpr3 = (task_struct *) next 2324bfc86ceSHeiko Carstens * Returns: 2334bfc86ceSHeiko Carstens * gpr2 = prev 2344bfc86ceSHeiko Carstens */ 2354bfc86ceSHeiko CarstensENTRY(__switch_to) 2364bfc86ceSHeiko Carstens stmg %r6,%r15,__SF_GPRS(%r15) # store gprs of prev task 2373241d3ebSHeiko Carstens lghi %r4,__TASK_stack 2383241d3ebSHeiko Carstens lghi %r1,__TASK_thread 2393241d3ebSHeiko Carstens lg %r5,0(%r4,%r3) # start of kernel stack of next 2403241d3ebSHeiko Carstens stg %r15,__THREAD_ksp(%r1,%r2) # store kernel stack of prev 2414bfc86ceSHeiko Carstens lgr %r15,%r5 2424bfc86ceSHeiko Carstens aghi %r15,STACK_INIT # end of kernel stack of next 2434bfc86ceSHeiko Carstens stg %r3,__LC_CURRENT # store task struct of next 2444bfc86ceSHeiko Carstens stg %r15,__LC_KERNEL_STACK # store end of kernel stack 2453241d3ebSHeiko Carstens lg %r15,__THREAD_ksp(%r1,%r3) # load kernel stack of next 2463241d3ebSHeiko Carstens aghi %r3,__TASK_pid 2473241d3ebSHeiko Carstens mvc __LC_CURRENT_PID(4,%r0),0(%r3) # store pid of next 2484bfc86ceSHeiko Carstens lmg %r6,%r15,__SF_GPRS(%r15) # load gprs of next task 249e5b98199SMartin Schwidefsky ALTERNATIVE "", ".insn s,0xb2800000,_LPP_OFFSET", 40 2506dd85fbbSMartin Schwidefsky BR_EX %r14 2514bfc86ceSHeiko Carstens 2524bfc86ceSHeiko Carstens.L__critical_start: 253d0fc4107SMartin Schwidefsky 254d0fc4107SMartin Schwidefsky#if IS_ENABLED(CONFIG_KVM) 255d0fc4107SMartin Schwidefsky/* 256d0fc4107SMartin Schwidefsky * sie64a calling convention: 257d0fc4107SMartin Schwidefsky * %r2 pointer to sie control block 258d0fc4107SMartin Schwidefsky * %r3 guest register save area 259d0fc4107SMartin Schwidefsky */ 260d0fc4107SMartin SchwidefskyENTRY(sie64a) 261d0fc4107SMartin Schwidefsky stmg %r6,%r14,__SF_GPRS(%r15) # save kernel registers 2626b73044bSMartin Schwidefsky lg %r12,__LC_CURRENT 26392fa7a13SMartin Schwidefsky stg %r2,__SF_SIE_CONTROL(%r15) # save control block pointer 26492fa7a13SMartin Schwidefsky stg %r3,__SF_SIE_SAVEAREA(%r15) # save guest register save area 26592fa7a13SMartin Schwidefsky xc __SF_SIE_REASON(8,%r15),__SF_SIE_REASON(%r15) # reason code = 0 26692fa7a13SMartin Schwidefsky mvc __SF_SIE_FLAGS(8,%r15),__TI_flags(%r12) # copy thread flags 26783abeffbSHendrik Brueckner TSTMSK __LC_CPU_FLAGS,_CIF_FPU # load guest fp/vx registers ? 268d0fc4107SMartin Schwidefsky jno .Lsie_load_guest_gprs 269d0fc4107SMartin Schwidefsky brasl %r14,load_fpu_regs # load guest fp/vx regs 270d0fc4107SMartin Schwidefsky.Lsie_load_guest_gprs: 271d0fc4107SMartin Schwidefsky lmg %r0,%r13,0(%r3) # load guest gprs 0-13 272d0fc4107SMartin Schwidefsky lg %r14,__LC_GMAP # get gmap pointer 273d0fc4107SMartin Schwidefsky ltgr %r14,%r14 274d0fc4107SMartin Schwidefsky jz .Lsie_gmap 275d0fc4107SMartin Schwidefsky lctlg %c1,%c1,__GMAP_ASCE(%r14) # load primary asce 276d0fc4107SMartin Schwidefsky.Lsie_gmap: 27792fa7a13SMartin Schwidefsky lg %r14,__SF_SIE_CONTROL(%r15) # get control block pointer 278d0fc4107SMartin Schwidefsky oi __SIE_PROG0C+3(%r14),1 # we are going into SIE now 279d0fc4107SMartin Schwidefsky tm __SIE_PROG20+3(%r14),3 # last exit... 280d0fc4107SMartin Schwidefsky jnz .Lsie_skip 28183abeffbSHendrik Brueckner TSTMSK __LC_CPU_FLAGS,_CIF_FPU 282d0fc4107SMartin Schwidefsky jo .Lsie_skip # exit if fp/vx regs changed 28392fa7a13SMartin Schwidefsky BPEXIT __SF_SIE_FLAGS(%r15),(_TIF_ISOLATE_BP|_TIF_ISOLATE_BP_GUEST) 284c929500dSQingFeng Hao.Lsie_entry: 285d0fc4107SMartin Schwidefsky sie 0(%r14) 286d768bd89SMartin Schwidefsky.Lsie_exit: 287d768bd89SMartin Schwidefsky BPOFF 28892fa7a13SMartin Schwidefsky BPENTER __SF_SIE_FLAGS(%r15),(_TIF_ISOLATE_BP|_TIF_ISOLATE_BP_GUEST) 289d0fc4107SMartin Schwidefsky.Lsie_skip: 290d0fc4107SMartin Schwidefsky ni __SIE_PROG0C+3(%r14),0xfe # no longer in SIE 291d0fc4107SMartin Schwidefsky lctlg %c1,%c1,__LC_USER_ASCE # load primary asce 292d0fc4107SMartin Schwidefsky.Lsie_done: 293d0fc4107SMartin Schwidefsky# some program checks are suppressing. C code (e.g. do_protection_exception) 294c0e7bb38SChristian Borntraeger# will rewind the PSW by the ILC, which is often 4 bytes in case of SIE. There 295c0e7bb38SChristian Borntraeger# are some corner cases (e.g. runtime instrumentation) where ILC is unpredictable. 296c0e7bb38SChristian Borntraeger# Other instructions between sie64a and .Lsie_done should not cause program 297c0e7bb38SChristian Borntraeger# interrupts. So lets use 3 nops as a landing pad for all possible rewinds. 298d0fc4107SMartin Schwidefsky# See also .Lcleanup_sie 299c0e7bb38SChristian Borntraeger.Lrewind_pad6: 300c0e7bb38SChristian Borntraeger nopr 7 301c0e7bb38SChristian Borntraeger.Lrewind_pad4: 302c0e7bb38SChristian Borntraeger nopr 7 303c0e7bb38SChristian Borntraeger.Lrewind_pad2: 304c0e7bb38SChristian Borntraeger nopr 7 305d0fc4107SMartin Schwidefsky .globl sie_exit 306d0fc4107SMartin Schwidefskysie_exit: 30792fa7a13SMartin Schwidefsky lg %r14,__SF_SIE_SAVEAREA(%r15) # load guest register save area 308d0fc4107SMartin Schwidefsky stmg %r0,%r13,0(%r14) # save guest gprs 0-13 3097041d281SMartin Schwidefsky xgr %r0,%r0 # clear guest registers to 3107041d281SMartin Schwidefsky xgr %r1,%r1 # prevent speculative use 3117041d281SMartin Schwidefsky xgr %r2,%r2 3127041d281SMartin Schwidefsky xgr %r3,%r3 3137041d281SMartin Schwidefsky xgr %r4,%r4 3147041d281SMartin Schwidefsky xgr %r5,%r5 315d0fc4107SMartin Schwidefsky lmg %r6,%r14,__SF_GPRS(%r15) # restore kernel registers 31692fa7a13SMartin Schwidefsky lg %r2,__SF_SIE_REASON(%r15) # return exit reason code 3176dd85fbbSMartin Schwidefsky BR_EX %r14 318d0fc4107SMartin Schwidefsky.Lsie_fault: 319d0fc4107SMartin Schwidefsky lghi %r14,-EFAULT 32092fa7a13SMartin Schwidefsky stg %r14,__SF_SIE_REASON(%r15) # set exit reason code 321d0fc4107SMartin Schwidefsky j sie_exit 322d0fc4107SMartin Schwidefsky 323c0e7bb38SChristian Borntraeger EX_TABLE(.Lrewind_pad6,.Lsie_fault) 324c0e7bb38SChristian Borntraeger EX_TABLE(.Lrewind_pad4,.Lsie_fault) 325c0e7bb38SChristian Borntraeger EX_TABLE(.Lrewind_pad2,.Lsie_fault) 326d0fc4107SMartin Schwidefsky EX_TABLE(sie_exit,.Lsie_fault) 327711f5df7SAl ViroEXPORT_SYMBOL(sie64a) 328711f5df7SAl ViroEXPORT_SYMBOL(sie_exit) 329d0fc4107SMartin Schwidefsky#endif 330d0fc4107SMartin Schwidefsky 3314bfc86ceSHeiko Carstens/* 3324bfc86ceSHeiko Carstens * SVC interrupt handler routine. System calls are synchronous events and 3334bfc86ceSHeiko Carstens * are executed with interrupts enabled. 3344bfc86ceSHeiko Carstens */ 3354bfc86ceSHeiko Carstens 3364bfc86ceSHeiko CarstensENTRY(system_call) 3374bfc86ceSHeiko Carstens stpt __LC_SYNC_ENTER_TIMER 3384bfc86ceSHeiko Carstens.Lsysc_stmg: 3394bfc86ceSHeiko Carstens stmg %r8,%r15,__LC_SAVE_AREA_SYNC 340d768bd89SMartin Schwidefsky BPOFF 341d5c352cdSHeiko Carstens lg %r12,__LC_CURRENT 34234525e1fSMartin Schwidefsky lghi %r13,__TASK_thread 3434bfc86ceSHeiko Carstens lghi %r14,_PIF_SYSCALL 3444bfc86ceSHeiko Carstens.Lsysc_per: 3454bfc86ceSHeiko Carstens lg %r15,__LC_KERNEL_STACK 3464bfc86ceSHeiko Carstens la %r11,STACK_FRAME_OVERHEAD(%r15) # pointer to pt_regs 347a359bb11SMartin Schwidefsky.Lsysc_vtime: 34834525e1fSMartin Schwidefsky UPDATE_VTIME %r8,%r9,__LC_SYNC_ENTER_TIMER 3496b73044bSMartin Schwidefsky BPENTER __TI_flags(%r12),_TIF_ISOLATE_BP 3504bfc86ceSHeiko Carstens stmg %r0,%r7,__PT_R0(%r11) 3514bfc86ceSHeiko Carstens mvc __PT_R8(64,%r11),__LC_SAVE_AREA_SYNC 3524bfc86ceSHeiko Carstens mvc __PT_PSW(16,%r11),__LC_SVC_OLD_PSW 3534bfc86ceSHeiko Carstens mvc __PT_INT_CODE(4,%r11),__LC_SVC_ILC 3544bfc86ceSHeiko Carstens stg %r14,__PT_FLAGS(%r11) 3554bfc86ceSHeiko Carstens.Lsysc_do_svc: 356d3f46896SChristian Borntraeger # clear user controlled register to prevent speculative use 357d3f46896SChristian Borntraeger xgr %r0,%r0 358ef280c85SMartin Schwidefsky # load address of system call table 359ef280c85SMartin Schwidefsky lg %r10,__THREAD_sysc_table(%r13,%r12) 3604bfc86ceSHeiko Carstens llgh %r8,__PT_INT_CODE+2(%r11) 3614bfc86ceSHeiko Carstens slag %r8,%r8,2 # shift and test for svc 0 3624bfc86ceSHeiko Carstens jnz .Lsysc_nr_ok 3634bfc86ceSHeiko Carstens # svc 0: system call number in %r1 3644bfc86ceSHeiko Carstens llgfr %r1,%r1 # clear high word in r1 3654bfc86ceSHeiko Carstens cghi %r1,NR_syscalls 3664bfc86ceSHeiko Carstens jnl .Lsysc_nr_ok 3674bfc86ceSHeiko Carstens sth %r1,__PT_INT_CODE+2(%r11) 3684bfc86ceSHeiko Carstens slag %r8,%r1,2 3694bfc86ceSHeiko Carstens.Lsysc_nr_ok: 3704bfc86ceSHeiko Carstens xc __SF_BACKCHAIN(8,%r15),__SF_BACKCHAIN(%r15) 3714bfc86ceSHeiko Carstens stg %r2,__PT_ORIG_GPR2(%r11) 3724bfc86ceSHeiko Carstens stg %r7,STACK_FRAME_OVERHEAD(%r15) 3734bfc86ceSHeiko Carstens lgf %r9,0(%r8,%r10) # get system call add. 37483abeffbSHendrik Brueckner TSTMSK __TI_flags(%r12),_TIF_TRACE 3754bfc86ceSHeiko Carstens jnz .Lsysc_tracesys 3766dd85fbbSMartin Schwidefsky BASR_EX %r14,%r9 # call sys_xxxx 3774bfc86ceSHeiko Carstens stg %r2,__PT_R2(%r11) # store return value 3784bfc86ceSHeiko Carstens 3794bfc86ceSHeiko Carstens.Lsysc_return: 3809d6d99e3SHeiko Carstens#ifdef CONFIG_DEBUG_RSEQ 3819d6d99e3SHeiko Carstens lgr %r2,%r11 3829d6d99e3SHeiko Carstens brasl %r14,rseq_syscall 3839d6d99e3SHeiko Carstens#endif 3844bfc86ceSHeiko Carstens LOCKDEP_SYS_EXIT 3854bfc86ceSHeiko Carstens.Lsysc_tif: 38683abeffbSHendrik Brueckner TSTMSK __PT_FLAGS(%r11),_PIF_WORK 3874bfc86ceSHeiko Carstens jnz .Lsysc_work 38883abeffbSHendrik Brueckner TSTMSK __TI_flags(%r12),_TIF_WORK 3894bfc86ceSHeiko Carstens jnz .Lsysc_work # check for work 39083abeffbSHendrik Brueckner TSTMSK __LC_CPU_FLAGS,_CIF_WORK 3914bfc86ceSHeiko Carstens jnz .Lsysc_work 3926b73044bSMartin Schwidefsky BPEXIT __TI_flags(%r12),_TIF_ISOLATE_BP 3934bfc86ceSHeiko Carstens.Lsysc_restore: 3944bfc86ceSHeiko Carstens lg %r14,__LC_VDSO_PER_CPU 3954bfc86ceSHeiko Carstens lmg %r0,%r10,__PT_R0(%r11) 3964bfc86ceSHeiko Carstens mvc __LC_RETURN_PSW(16),__PT_PSW(%r11) 39707a63cbeSMartin Schwidefsky.Lsysc_exit_timer: 3984bfc86ceSHeiko Carstens stpt __LC_EXIT_TIMER 3994bfc86ceSHeiko Carstens mvc __VDSO_ECTG_BASE(16,%r14),__LC_EXIT_TIMER 4004bfc86ceSHeiko Carstens lmg %r11,%r15,__PT_R11(%r11) 4014bfc86ceSHeiko Carstens lpswe __LC_RETURN_PSW 4024bfc86ceSHeiko Carstens.Lsysc_done: 4034bfc86ceSHeiko Carstens 4044bfc86ceSHeiko Carstens# 4054bfc86ceSHeiko Carstens# One of the work bits is on. Find out which one. 4064bfc86ceSHeiko Carstens# 4074bfc86ceSHeiko Carstens.Lsysc_work: 40883abeffbSHendrik Brueckner TSTMSK __LC_CPU_FLAGS,_CIF_MCCK_PENDING 4094bfc86ceSHeiko Carstens jo .Lsysc_mcck_pending 41083abeffbSHendrik Brueckner TSTMSK __TI_flags(%r12),_TIF_NEED_RESCHED 4114bfc86ceSHeiko Carstens jo .Lsysc_reschedule 41223fefe11SMartin Schwidefsky TSTMSK __PT_FLAGS(%r11),_PIF_SYSCALL_RESTART 41323fefe11SMartin Schwidefsky jo .Lsysc_syscall_restart 4144bfc86ceSHeiko Carstens#ifdef CONFIG_UPROBES 41583abeffbSHendrik Brueckner TSTMSK __TI_flags(%r12),_TIF_UPROBE 4164bfc86ceSHeiko Carstens jo .Lsysc_uprobe_notify 4174bfc86ceSHeiko Carstens#endif 418916cda1aSMartin Schwidefsky TSTMSK __TI_flags(%r12),_TIF_GUARDED_STORAGE 419916cda1aSMartin Schwidefsky jo .Lsysc_guarded_storage 42083abeffbSHendrik Brueckner TSTMSK __PT_FLAGS(%r11),_PIF_PER_TRAP 4214bfc86ceSHeiko Carstens jo .Lsysc_singlestep 4222f09ca60SMiroslav Benes#ifdef CONFIG_LIVEPATCH 4232f09ca60SMiroslav Benes TSTMSK __TI_flags(%r12),_TIF_PATCH_PENDING 4242f09ca60SMiroslav Benes jo .Lsysc_patch_pending # handle live patching just before 4252f09ca60SMiroslav Benes # signals and possible syscall restart 4262f09ca60SMiroslav Benes#endif 42723fefe11SMartin Schwidefsky TSTMSK __PT_FLAGS(%r11),_PIF_SYSCALL_RESTART 42823fefe11SMartin Schwidefsky jo .Lsysc_syscall_restart 42983abeffbSHendrik Brueckner TSTMSK __TI_flags(%r12),_TIF_SIGPENDING 4304bfc86ceSHeiko Carstens jo .Lsysc_sigpending 43183abeffbSHendrik Brueckner TSTMSK __TI_flags(%r12),_TIF_NOTIFY_RESUME 4324bfc86ceSHeiko Carstens jo .Lsysc_notify_resume 43383abeffbSHendrik Brueckner TSTMSK __LC_CPU_FLAGS,_CIF_FPU 4349977e886SHendrik Brueckner jo .Lsysc_vxrs 435b5a882fcSHeiko Carstens TSTMSK __LC_CPU_FLAGS,(_CIF_ASCE_PRIMARY|_CIF_ASCE_SECONDARY) 436b5a882fcSHeiko Carstens jnz .Lsysc_asce 4374bfc86ceSHeiko Carstens j .Lsysc_return # beware of critical section cleanup 4384bfc86ceSHeiko Carstens 4394bfc86ceSHeiko Carstens# 4404bfc86ceSHeiko Carstens# _TIF_NEED_RESCHED is set, call schedule 4414bfc86ceSHeiko Carstens# 4424bfc86ceSHeiko Carstens.Lsysc_reschedule: 4434bfc86ceSHeiko Carstens larl %r14,.Lsysc_return 4444bfc86ceSHeiko Carstens jg schedule 4454bfc86ceSHeiko Carstens 4464bfc86ceSHeiko Carstens# 4474bfc86ceSHeiko Carstens# _CIF_MCCK_PENDING is set, call handler 4484bfc86ceSHeiko Carstens# 4494bfc86ceSHeiko Carstens.Lsysc_mcck_pending: 4504bfc86ceSHeiko Carstens larl %r14,.Lsysc_return 4514bfc86ceSHeiko Carstens jg s390_handle_mcck # TIF bit will be cleared by handler 4524bfc86ceSHeiko Carstens 4534bfc86ceSHeiko Carstens# 4540aaba41bSMartin Schwidefsky# _CIF_ASCE_PRIMARY and/or _CIF_ASCE_SECONDARY set, load user space asce 4554bfc86ceSHeiko Carstens# 456b5a882fcSHeiko Carstens.Lsysc_asce: 4570aaba41bSMartin Schwidefsky ni __LC_CPU_FLAGS+7,255-_CIF_ASCE_SECONDARY 4580aaba41bSMartin Schwidefsky lctlg %c7,%c7,__LC_VDSO_ASCE # load secondary asce 4590aaba41bSMartin Schwidefsky TSTMSK __LC_CPU_FLAGS,_CIF_ASCE_PRIMARY 4600aaba41bSMartin Schwidefsky jz .Lsysc_return 4610aaba41bSMartin Schwidefsky#ifndef CONFIG_HAVE_MARCH_Z10_FEATURES 4620aaba41bSMartin Schwidefsky tm __LC_STFLE_FAC_LIST+3,0x10 # has MVCOS ? 4630aaba41bSMartin Schwidefsky jnz .Lsysc_set_fs_fixup 464606aa4aaSHeiko Carstens ni __LC_CPU_FLAGS+7,255-_CIF_ASCE_PRIMARY 4654bfc86ceSHeiko Carstens lctlg %c1,%c1,__LC_USER_ASCE # load primary asce 4660aaba41bSMartin Schwidefsky j .Lsysc_return 4670aaba41bSMartin Schwidefsky.Lsysc_set_fs_fixup: 4680aaba41bSMartin Schwidefsky#endif 469b5a882fcSHeiko Carstens larl %r14,.Lsysc_return 470b5a882fcSHeiko Carstens jg set_fs_fixup 4714bfc86ceSHeiko Carstens 4724bfc86ceSHeiko Carstens# 4739977e886SHendrik Brueckner# CIF_FPU is set, restore floating-point controls and floating-point registers. 4749977e886SHendrik Brueckner# 4759977e886SHendrik Brueckner.Lsysc_vxrs: 4769977e886SHendrik Brueckner larl %r14,.Lsysc_return 4779977e886SHendrik Brueckner jg load_fpu_regs 4789977e886SHendrik Brueckner 4799977e886SHendrik Brueckner# 4804bfc86ceSHeiko Carstens# _TIF_SIGPENDING is set, call do_signal 4814bfc86ceSHeiko Carstens# 4824bfc86ceSHeiko Carstens.Lsysc_sigpending: 4834bfc86ceSHeiko Carstens lgr %r2,%r11 # pass pointer to pt_regs 4844bfc86ceSHeiko Carstens brasl %r14,do_signal 48583abeffbSHendrik Brueckner TSTMSK __PT_FLAGS(%r11),_PIF_SYSCALL 4864bfc86ceSHeiko Carstens jno .Lsysc_return 48757d7f939SMartin Schwidefsky.Lsysc_do_syscall: 48857d7f939SMartin Schwidefsky lghi %r13,__TASK_thread 4894bfc86ceSHeiko Carstens lmg %r2,%r7,__PT_R2(%r11) # load svc arguments 49057d7f939SMartin Schwidefsky lghi %r1,0 # svc 0 returns -ENOSYS 49157d7f939SMartin Schwidefsky j .Lsysc_do_svc 4924bfc86ceSHeiko Carstens 4934bfc86ceSHeiko Carstens# 4944bfc86ceSHeiko Carstens# _TIF_NOTIFY_RESUME is set, call do_notify_resume 4954bfc86ceSHeiko Carstens# 4964bfc86ceSHeiko Carstens.Lsysc_notify_resume: 4974bfc86ceSHeiko Carstens lgr %r2,%r11 # pass pointer to pt_regs 4984bfc86ceSHeiko Carstens larl %r14,.Lsysc_return 4994bfc86ceSHeiko Carstens jg do_notify_resume 5004bfc86ceSHeiko Carstens 5014bfc86ceSHeiko Carstens# 5024bfc86ceSHeiko Carstens# _TIF_UPROBE is set, call uprobe_notify_resume 5034bfc86ceSHeiko Carstens# 5044bfc86ceSHeiko Carstens#ifdef CONFIG_UPROBES 5054bfc86ceSHeiko Carstens.Lsysc_uprobe_notify: 5064bfc86ceSHeiko Carstens lgr %r2,%r11 # pass pointer to pt_regs 5074bfc86ceSHeiko Carstens larl %r14,.Lsysc_return 5084bfc86ceSHeiko Carstens jg uprobe_notify_resume 5094bfc86ceSHeiko Carstens#endif 5104bfc86ceSHeiko Carstens 5114bfc86ceSHeiko Carstens# 512916cda1aSMartin Schwidefsky# _TIF_GUARDED_STORAGE is set, call guarded_storage_load 513916cda1aSMartin Schwidefsky# 514916cda1aSMartin Schwidefsky.Lsysc_guarded_storage: 515916cda1aSMartin Schwidefsky lgr %r2,%r11 # pass pointer to pt_regs 516916cda1aSMartin Schwidefsky larl %r14,.Lsysc_return 517916cda1aSMartin Schwidefsky jg gs_load_bc_cb 51876f1948aSLinus Torvalds# 5192f09ca60SMiroslav Benes# _TIF_PATCH_PENDING is set, call klp_update_patch_state 5202f09ca60SMiroslav Benes# 5212f09ca60SMiroslav Benes#ifdef CONFIG_LIVEPATCH 5222f09ca60SMiroslav Benes.Lsysc_patch_pending: 5232f09ca60SMiroslav Benes lg %r2,__LC_CURRENT # pass pointer to task struct 5242f09ca60SMiroslav Benes larl %r14,.Lsysc_return 5252f09ca60SMiroslav Benes jg klp_update_patch_state 5262f09ca60SMiroslav Benes#endif 527916cda1aSMartin Schwidefsky 528916cda1aSMartin Schwidefsky# 5294bfc86ceSHeiko Carstens# _PIF_PER_TRAP is set, call do_per_trap 5304bfc86ceSHeiko Carstens# 5314bfc86ceSHeiko Carstens.Lsysc_singlestep: 5324bfc86ceSHeiko Carstens ni __PT_FLAGS+7(%r11),255-_PIF_PER_TRAP 5334bfc86ceSHeiko Carstens lgr %r2,%r11 # pass pointer to pt_regs 5344bfc86ceSHeiko Carstens larl %r14,.Lsysc_return 5354bfc86ceSHeiko Carstens jg do_per_trap 5364bfc86ceSHeiko Carstens 5374bfc86ceSHeiko Carstens# 53823fefe11SMartin Schwidefsky# _PIF_SYSCALL_RESTART is set, repeat the current system call 53923fefe11SMartin Schwidefsky# 54023fefe11SMartin Schwidefsky.Lsysc_syscall_restart: 54123fefe11SMartin Schwidefsky ni __PT_FLAGS+7(%r11),255-_PIF_SYSCALL_RESTART 54223fefe11SMartin Schwidefsky lmg %r1,%r7,__PT_R1(%r11) # load svc arguments 54323fefe11SMartin Schwidefsky lg %r2,__PT_ORIG_GPR2(%r11) 54423fefe11SMartin Schwidefsky j .Lsysc_do_svc 54523fefe11SMartin Schwidefsky 54623fefe11SMartin Schwidefsky# 5474bfc86ceSHeiko Carstens# call tracehook_report_syscall_entry/tracehook_report_syscall_exit before 5484bfc86ceSHeiko Carstens# and after the system call 5494bfc86ceSHeiko Carstens# 5504bfc86ceSHeiko Carstens.Lsysc_tracesys: 5514bfc86ceSHeiko Carstens lgr %r2,%r11 # pass pointer to pt_regs 5524bfc86ceSHeiko Carstens la %r3,0 5534bfc86ceSHeiko Carstens llgh %r0,__PT_INT_CODE+2(%r11) 5544bfc86ceSHeiko Carstens stg %r0,__PT_R2(%r11) 5554bfc86ceSHeiko Carstens brasl %r14,do_syscall_trace_enter 5564bfc86ceSHeiko Carstens lghi %r0,NR_syscalls 5574bfc86ceSHeiko Carstens clgr %r0,%r2 5584bfc86ceSHeiko Carstens jnh .Lsysc_tracenogo 5594bfc86ceSHeiko Carstens sllg %r8,%r2,2 5604bfc86ceSHeiko Carstens lgf %r9,0(%r8,%r10) 5614bfc86ceSHeiko Carstens.Lsysc_tracego: 5624bfc86ceSHeiko Carstens lmg %r3,%r7,__PT_R3(%r11) 5634bfc86ceSHeiko Carstens stg %r7,STACK_FRAME_OVERHEAD(%r15) 5644bfc86ceSHeiko Carstens lg %r2,__PT_ORIG_GPR2(%r11) 5656dd85fbbSMartin Schwidefsky BASR_EX %r14,%r9 # call sys_xxx 5664bfc86ceSHeiko Carstens stg %r2,__PT_R2(%r11) # store return value 5674bfc86ceSHeiko Carstens.Lsysc_tracenogo: 56883abeffbSHendrik Brueckner TSTMSK __TI_flags(%r12),_TIF_TRACE 5694bfc86ceSHeiko Carstens jz .Lsysc_return 5704bfc86ceSHeiko Carstens lgr %r2,%r11 # pass pointer to pt_regs 5714bfc86ceSHeiko Carstens larl %r14,.Lsysc_return 5724bfc86ceSHeiko Carstens jg do_syscall_trace_exit 5734bfc86ceSHeiko Carstens 5744bfc86ceSHeiko Carstens# 5754bfc86ceSHeiko Carstens# a new process exits the kernel with ret_from_fork 5764bfc86ceSHeiko Carstens# 5774bfc86ceSHeiko CarstensENTRY(ret_from_fork) 5784bfc86ceSHeiko Carstens la %r11,STACK_FRAME_OVERHEAD(%r15) 579d5c352cdSHeiko Carstens lg %r12,__LC_CURRENT 5804bfc86ceSHeiko Carstens brasl %r14,schedule_tail 5814bfc86ceSHeiko Carstens TRACE_IRQS_ON 5824bfc86ceSHeiko Carstens ssm __LC_SVC_NEW_PSW # reenable interrupts 5834bfc86ceSHeiko Carstens tm __PT_PSW+1(%r11),0x01 # forking a kernel thread ? 5844bfc86ceSHeiko Carstens jne .Lsysc_tracenogo 5854bfc86ceSHeiko Carstens # it's a kernel thread 5864bfc86ceSHeiko Carstens lmg %r9,%r10,__PT_R9(%r11) # load gprs 5874bfc86ceSHeiko CarstensENTRY(kernel_thread_starter) 5884bfc86ceSHeiko Carstens la %r2,0(%r10) 5896dd85fbbSMartin Schwidefsky BASR_EX %r14,%r9 5904bfc86ceSHeiko Carstens j .Lsysc_tracenogo 5914bfc86ceSHeiko Carstens 5924bfc86ceSHeiko Carstens/* 5934bfc86ceSHeiko Carstens * Program check handler routine 5944bfc86ceSHeiko Carstens */ 5954bfc86ceSHeiko Carstens 5964bfc86ceSHeiko CarstensENTRY(pgm_check_handler) 5974bfc86ceSHeiko Carstens stpt __LC_SYNC_ENTER_TIMER 598d768bd89SMartin Schwidefsky BPOFF 5994bfc86ceSHeiko Carstens stmg %r8,%r15,__LC_SAVE_AREA_SYNC 6004bfc86ceSHeiko Carstens lg %r10,__LC_LAST_BREAK 601d5c352cdSHeiko Carstens lg %r12,__LC_CURRENT 602c771320eSMartin Schwidefsky lghi %r11,0 6039977e886SHendrik Brueckner larl %r13,cleanup_critical 6044bfc86ceSHeiko Carstens lmg %r8,%r9,__LC_PGM_OLD_PSW 6054bfc86ceSHeiko Carstens tmhh %r8,0x0001 # test problem state bit 606d0fc4107SMartin Schwidefsky jnz 2f # -> fault in user space 607d0fc4107SMartin Schwidefsky#if IS_ENABLED(CONFIG_KVM) 6080a5e2ec2SMartin Schwidefsky # cleanup critical section for program checks in sie64a 609d0fc4107SMartin Schwidefsky lgr %r14,%r9 610d0fc4107SMartin Schwidefsky slg %r14,BASED(.Lsie_critical_start) 611d0fc4107SMartin Schwidefsky clg %r14,BASED(.Lsie_critical_length) 612d0fc4107SMartin Schwidefsky jhe 0f 61392fa7a13SMartin Schwidefsky lg %r14,__SF_SIE_CONTROL(%r15) # get control block pointer 6140a5e2ec2SMartin Schwidefsky ni __SIE_PROG0C+3(%r14),0xfe # no longer in SIE 6150a5e2ec2SMartin Schwidefsky lctlg %c1,%c1,__LC_USER_ASCE # load primary asce 6160a5e2ec2SMartin Schwidefsky larl %r9,sie_exit # skip forward to sie_exit 617c771320eSMartin Schwidefsky lghi %r11,_PIF_GUEST_FAULT 618d0fc4107SMartin Schwidefsky#endif 619d0fc4107SMartin Schwidefsky0: tmhh %r8,0x4000 # PER bit set in old PSW ? 620d0fc4107SMartin Schwidefsky jnz 1f # -> enabled, can't be a double fault 6214bfc86ceSHeiko Carstens tm __LC_PGM_ILC+3,0x80 # check for per exception 6224bfc86ceSHeiko Carstens jnz .Lpgm_svcper # -> single stepped svc 623*ce3dc447SMartin Schwidefsky1: CHECK_STACK __LC_SAVE_AREA_SYNC 6244bfc86ceSHeiko Carstens aghi %r15,-(STACK_FRAME_OVERHEAD + __PT_SIZE) 625*ce3dc447SMartin Schwidefsky # CHECK_VMAP_STACK branches to stack_overflow or 4f 626*ce3dc447SMartin Schwidefsky CHECK_VMAP_STACK __LC_SAVE_AREA_SYNC,4f 62734525e1fSMartin Schwidefsky2: UPDATE_VTIME %r14,%r15,__LC_SYNC_ENTER_TIMER 6286b73044bSMartin Schwidefsky BPENTER __TI_flags(%r12),_TIF_ISOLATE_BP 6294bfc86ceSHeiko Carstens lg %r15,__LC_KERNEL_STACK 630d5c352cdSHeiko Carstens lgr %r14,%r12 6313827ec3dSMartin Schwidefsky aghi %r14,__TASK_thread # pointer to thread_struct 6324bfc86ceSHeiko Carstens lghi %r13,__LC_PGM_TDB 6334bfc86ceSHeiko Carstens tm __LC_PGM_ILC+2,0x02 # check for transaction abort 634d0fc4107SMartin Schwidefsky jz 3f 6354bfc86ceSHeiko Carstens mvc __THREAD_trap_tdb(256,%r14),0(%r13) 636d9fcf2a1SMartin Schwidefsky3: stg %r10,__THREAD_last_break(%r14) 637c771320eSMartin Schwidefsky4: lgr %r13,%r11 638c771320eSMartin Schwidefsky la %r11,STACK_FRAME_OVERHEAD(%r15) 6394bfc86ceSHeiko Carstens stmg %r0,%r7,__PT_R0(%r11) 6407041d281SMartin Schwidefsky # clear user controlled registers to prevent speculative use 6417041d281SMartin Schwidefsky xgr %r0,%r0 6427041d281SMartin Schwidefsky xgr %r1,%r1 6437041d281SMartin Schwidefsky xgr %r2,%r2 6447041d281SMartin Schwidefsky xgr %r3,%r3 6457041d281SMartin Schwidefsky xgr %r4,%r4 6467041d281SMartin Schwidefsky xgr %r5,%r5 6477041d281SMartin Schwidefsky xgr %r6,%r6 6487041d281SMartin Schwidefsky xgr %r7,%r7 6494bfc86ceSHeiko Carstens mvc __PT_R8(64,%r11),__LC_SAVE_AREA_SYNC 6504bfc86ceSHeiko Carstens stmg %r8,%r9,__PT_PSW(%r11) 6514bfc86ceSHeiko Carstens mvc __PT_INT_CODE(4,%r11),__LC_PGM_ILC 6524bfc86ceSHeiko Carstens mvc __PT_INT_PARM_LONG(8,%r11),__LC_TRANS_EXC_CODE 653c771320eSMartin Schwidefsky stg %r13,__PT_FLAGS(%r11) 6544bfc86ceSHeiko Carstens stg %r10,__PT_ARGS(%r11) 6554bfc86ceSHeiko Carstens tm __LC_PGM_ILC+3,0x80 # check for per exception 656d9fcf2a1SMartin Schwidefsky jz 5f 6574bfc86ceSHeiko Carstens tmhh %r8,0x0001 # kernel per event ? 6584bfc86ceSHeiko Carstens jz .Lpgm_kprobe 6594bfc86ceSHeiko Carstens oi __PT_FLAGS+7(%r11),_PIF_PER_TRAP 6604bfc86ceSHeiko Carstens mvc __THREAD_per_address(8,%r14),__LC_PER_ADDRESS 6614bfc86ceSHeiko Carstens mvc __THREAD_per_cause(2,%r14),__LC_PER_CODE 6624bfc86ceSHeiko Carstens mvc __THREAD_per_paid(1,%r14),__LC_PER_ACCESS_ID 663d9fcf2a1SMartin Schwidefsky5: REENABLE_IRQS 6644bfc86ceSHeiko Carstens xc __SF_BACKCHAIN(8,%r15),__SF_BACKCHAIN(%r15) 6654bfc86ceSHeiko Carstens larl %r1,pgm_check_table 6664bfc86ceSHeiko Carstens llgh %r10,__PT_INT_CODE+2(%r11) 6674bfc86ceSHeiko Carstens nill %r10,0x007f 6684bfc86ceSHeiko Carstens sll %r10,2 669a359bb11SMartin Schwidefsky je .Lpgm_return 670f19fbd5eSMartin Schwidefsky lgf %r9,0(%r10,%r1) # load address of handler routine 6714bfc86ceSHeiko Carstens lgr %r2,%r11 # pass pointer to pt_regs 6726dd85fbbSMartin Schwidefsky BASR_EX %r14,%r9 # branch to interrupt-handler 673a359bb11SMartin Schwidefsky.Lpgm_return: 674a359bb11SMartin Schwidefsky LOCKDEP_SYS_EXIT 675a359bb11SMartin Schwidefsky tm __PT_PSW+1(%r11),0x01 # returning to user ? 676a359bb11SMartin Schwidefsky jno .Lsysc_restore 67757d7f939SMartin Schwidefsky TSTMSK __PT_FLAGS(%r11),_PIF_SYSCALL 67857d7f939SMartin Schwidefsky jo .Lsysc_do_syscall 679a359bb11SMartin Schwidefsky j .Lsysc_tif 6804bfc86ceSHeiko Carstens 6814bfc86ceSHeiko Carstens# 6824bfc86ceSHeiko Carstens# PER event in supervisor state, must be kprobes 6834bfc86ceSHeiko Carstens# 6844bfc86ceSHeiko Carstens.Lpgm_kprobe: 6854bfc86ceSHeiko Carstens REENABLE_IRQS 6864bfc86ceSHeiko Carstens xc __SF_BACKCHAIN(8,%r15),__SF_BACKCHAIN(%r15) 6874bfc86ceSHeiko Carstens lgr %r2,%r11 # pass pointer to pt_regs 6884bfc86ceSHeiko Carstens brasl %r14,do_per_trap 689a359bb11SMartin Schwidefsky j .Lpgm_return 6904bfc86ceSHeiko Carstens 6914bfc86ceSHeiko Carstens# 6924bfc86ceSHeiko Carstens# single stepped system call 6934bfc86ceSHeiko Carstens# 6944bfc86ceSHeiko Carstens.Lpgm_svcper: 6954bfc86ceSHeiko Carstens mvc __LC_RETURN_PSW(8),__LC_SVC_NEW_PSW 696d24b98e3SMartin Schwidefsky lghi %r13,__TASK_thread 6974bfc86ceSHeiko Carstens larl %r14,.Lsysc_per 6984bfc86ceSHeiko Carstens stg %r14,__LC_RETURN_PSW+8 6994bfc86ceSHeiko Carstens lghi %r14,_PIF_SYSCALL | _PIF_PER_TRAP 7004bfc86ceSHeiko Carstens lpswe __LC_RETURN_PSW # branch to .Lsysc_per and enable irqs 7014bfc86ceSHeiko Carstens 7024bfc86ceSHeiko Carstens/* 7034bfc86ceSHeiko Carstens * IO interrupt handler routine 7044bfc86ceSHeiko Carstens */ 7054bfc86ceSHeiko CarstensENTRY(io_int_handler) 7064bfc86ceSHeiko Carstens STCK __LC_INT_CLOCK 7074bfc86ceSHeiko Carstens stpt __LC_ASYNC_ENTER_TIMER 708d768bd89SMartin Schwidefsky BPOFF 7094bfc86ceSHeiko Carstens stmg %r8,%r15,__LC_SAVE_AREA_ASYNC 710d5c352cdSHeiko Carstens lg %r12,__LC_CURRENT 7119977e886SHendrik Brueckner larl %r13,cleanup_critical 7124bfc86ceSHeiko Carstens lmg %r8,%r9,__LC_IO_OLD_PSW 7132acb94f4SMartin Schwidefsky SWITCH_ASYNC __LC_SAVE_AREA_ASYNC,__LC_ASYNC_ENTER_TIMER 7144bfc86ceSHeiko Carstens stmg %r0,%r7,__PT_R0(%r11) 7157041d281SMartin Schwidefsky # clear user controlled registers to prevent speculative use 7167041d281SMartin Schwidefsky xgr %r0,%r0 7177041d281SMartin Schwidefsky xgr %r1,%r1 7187041d281SMartin Schwidefsky xgr %r2,%r2 7197041d281SMartin Schwidefsky xgr %r3,%r3 7207041d281SMartin Schwidefsky xgr %r4,%r4 7217041d281SMartin Schwidefsky xgr %r5,%r5 7227041d281SMartin Schwidefsky xgr %r6,%r6 7237041d281SMartin Schwidefsky xgr %r7,%r7 7247041d281SMartin Schwidefsky xgr %r10,%r10 7254bfc86ceSHeiko Carstens mvc __PT_R8(64,%r11),__LC_SAVE_AREA_ASYNC 7264bfc86ceSHeiko Carstens stmg %r8,%r9,__PT_PSW(%r11) 7274bfc86ceSHeiko Carstens mvc __PT_INT_CODE(12,%r11),__LC_SUBCHANNEL_ID 7284bfc86ceSHeiko Carstens xc __PT_FLAGS(8,%r11),__PT_FLAGS(%r11) 729db7e007fSHeiko Carstens TSTMSK __LC_CPU_FLAGS,_CIF_IGNORE_IRQ 730db7e007fSHeiko Carstens jo .Lio_restore 7314bfc86ceSHeiko Carstens TRACE_IRQS_OFF 7324bfc86ceSHeiko Carstens xc __SF_BACKCHAIN(8,%r15),__SF_BACKCHAIN(%r15) 7334bfc86ceSHeiko Carstens.Lio_loop: 7344bfc86ceSHeiko Carstens lgr %r2,%r11 # pass pointer to pt_regs 7354bfc86ceSHeiko Carstens lghi %r3,IO_INTERRUPT 7364bfc86ceSHeiko Carstens tm __PT_INT_CODE+8(%r11),0x80 # adapter interrupt ? 7374bfc86ceSHeiko Carstens jz .Lio_call 7384bfc86ceSHeiko Carstens lghi %r3,THIN_INTERRUPT 7394bfc86ceSHeiko Carstens.Lio_call: 7404bfc86ceSHeiko Carstens brasl %r14,do_IRQ 74183abeffbSHendrik Brueckner TSTMSK __LC_MACHINE_FLAGS,MACHINE_FLAG_LPAR 7424bfc86ceSHeiko Carstens jz .Lio_return 7434bfc86ceSHeiko Carstens tpi 0 7444bfc86ceSHeiko Carstens jz .Lio_return 7454bfc86ceSHeiko Carstens mvc __PT_INT_CODE(12,%r11),__LC_SUBCHANNEL_ID 7464bfc86ceSHeiko Carstens j .Lio_loop 7474bfc86ceSHeiko Carstens.Lio_return: 7484bfc86ceSHeiko Carstens LOCKDEP_SYS_EXIT 7494bfc86ceSHeiko Carstens TRACE_IRQS_ON 7504bfc86ceSHeiko Carstens.Lio_tif: 75183abeffbSHendrik Brueckner TSTMSK __TI_flags(%r12),_TIF_WORK 7524bfc86ceSHeiko Carstens jnz .Lio_work # there is work to do (signals etc.) 75383abeffbSHendrik Brueckner TSTMSK __LC_CPU_FLAGS,_CIF_WORK 7544bfc86ceSHeiko Carstens jnz .Lio_work 7554bfc86ceSHeiko Carstens.Lio_restore: 7564bfc86ceSHeiko Carstens lg %r14,__LC_VDSO_PER_CPU 7574bfc86ceSHeiko Carstens lmg %r0,%r10,__PT_R0(%r11) 7584bfc86ceSHeiko Carstens mvc __LC_RETURN_PSW(16),__PT_PSW(%r11) 759d768bd89SMartin Schwidefsky tm __PT_PSW+1(%r11),0x01 # returning to user ? 760d768bd89SMartin Schwidefsky jno .Lio_exit_kernel 7616b73044bSMartin Schwidefsky BPEXIT __TI_flags(%r12),_TIF_ISOLATE_BP 76207a63cbeSMartin Schwidefsky.Lio_exit_timer: 7634bfc86ceSHeiko Carstens stpt __LC_EXIT_TIMER 7644bfc86ceSHeiko Carstens mvc __VDSO_ECTG_BASE(16,%r14),__LC_EXIT_TIMER 765d768bd89SMartin Schwidefsky.Lio_exit_kernel: 7664bfc86ceSHeiko Carstens lmg %r11,%r15,__PT_R11(%r11) 7674bfc86ceSHeiko Carstens lpswe __LC_RETURN_PSW 7684bfc86ceSHeiko Carstens.Lio_done: 7694bfc86ceSHeiko Carstens 7704bfc86ceSHeiko Carstens# 7714bfc86ceSHeiko Carstens# There is work todo, find out in which context we have been interrupted: 7724bfc86ceSHeiko Carstens# 1) if we return to user space we can do all _TIF_WORK work 7734bfc86ceSHeiko Carstens# 2) if we return to kernel code and kvm is enabled check if we need to 7744bfc86ceSHeiko Carstens# modify the psw to leave SIE 7754bfc86ceSHeiko Carstens# 3) if we return to kernel code and preemptive scheduling is enabled check 7764bfc86ceSHeiko Carstens# the preemption counter and if it is zero call preempt_schedule_irq 7774bfc86ceSHeiko Carstens# Before any work can be done, a switch to the kernel stack is required. 7784bfc86ceSHeiko Carstens# 7794bfc86ceSHeiko Carstens.Lio_work: 7804bfc86ceSHeiko Carstens tm __PT_PSW+1(%r11),0x01 # returning to user ? 7814bfc86ceSHeiko Carstens jo .Lio_work_user # yes -> do resched & signal 7824bfc86ceSHeiko Carstens#ifdef CONFIG_PREEMPT 7834bfc86ceSHeiko Carstens # check for preemptive scheduling 784c360192bSMartin Schwidefsky icm %r0,15,__LC_PREEMPT_COUNT 7854bfc86ceSHeiko Carstens jnz .Lio_restore # preemption is disabled 78683abeffbSHendrik Brueckner TSTMSK __TI_flags(%r12),_TIF_NEED_RESCHED 7874bfc86ceSHeiko Carstens jno .Lio_restore 7884bfc86ceSHeiko Carstens # switch to kernel stack 7894bfc86ceSHeiko Carstens lg %r1,__PT_R15(%r11) 7904bfc86ceSHeiko Carstens aghi %r1,-(STACK_FRAME_OVERHEAD + __PT_SIZE) 7914bfc86ceSHeiko Carstens mvc STACK_FRAME_OVERHEAD(__PT_SIZE,%r1),0(%r11) 7924bfc86ceSHeiko Carstens xc __SF_BACKCHAIN(8,%r1),__SF_BACKCHAIN(%r1) 7934bfc86ceSHeiko Carstens la %r11,STACK_FRAME_OVERHEAD(%r1) 7944bfc86ceSHeiko Carstens lgr %r15,%r1 7954bfc86ceSHeiko Carstens # TRACE_IRQS_ON already done at .Lio_return, call 7964bfc86ceSHeiko Carstens # TRACE_IRQS_OFF to keep things symmetrical 7974bfc86ceSHeiko Carstens TRACE_IRQS_OFF 7984bfc86ceSHeiko Carstens brasl %r14,preempt_schedule_irq 7994bfc86ceSHeiko Carstens j .Lio_return 8004bfc86ceSHeiko Carstens#else 8014bfc86ceSHeiko Carstens j .Lio_restore 8024bfc86ceSHeiko Carstens#endif 8034bfc86ceSHeiko Carstens 8044bfc86ceSHeiko Carstens# 8054bfc86ceSHeiko Carstens# Need to do work before returning to userspace, switch to kernel stack 8064bfc86ceSHeiko Carstens# 8074bfc86ceSHeiko Carstens.Lio_work_user: 8084bfc86ceSHeiko Carstens lg %r1,__LC_KERNEL_STACK 8094bfc86ceSHeiko Carstens mvc STACK_FRAME_OVERHEAD(__PT_SIZE,%r1),0(%r11) 8104bfc86ceSHeiko Carstens xc __SF_BACKCHAIN(8,%r1),__SF_BACKCHAIN(%r1) 8114bfc86ceSHeiko Carstens la %r11,STACK_FRAME_OVERHEAD(%r1) 8124bfc86ceSHeiko Carstens lgr %r15,%r1 8134bfc86ceSHeiko Carstens 8144bfc86ceSHeiko Carstens# 8154bfc86ceSHeiko Carstens# One of the work bits is on. Find out which one. 8164bfc86ceSHeiko Carstens# 8174bfc86ceSHeiko Carstens.Lio_work_tif: 81883abeffbSHendrik Brueckner TSTMSK __LC_CPU_FLAGS,_CIF_MCCK_PENDING 8194bfc86ceSHeiko Carstens jo .Lio_mcck_pending 82083abeffbSHendrik Brueckner TSTMSK __TI_flags(%r12),_TIF_NEED_RESCHED 8214bfc86ceSHeiko Carstens jo .Lio_reschedule 8222f09ca60SMiroslav Benes#ifdef CONFIG_LIVEPATCH 8232f09ca60SMiroslav Benes TSTMSK __TI_flags(%r12),_TIF_PATCH_PENDING 8242f09ca60SMiroslav Benes jo .Lio_patch_pending 8252f09ca60SMiroslav Benes#endif 82683abeffbSHendrik Brueckner TSTMSK __TI_flags(%r12),_TIF_SIGPENDING 8274bfc86ceSHeiko Carstens jo .Lio_sigpending 82883abeffbSHendrik Brueckner TSTMSK __TI_flags(%r12),_TIF_NOTIFY_RESUME 8294bfc86ceSHeiko Carstens jo .Lio_notify_resume 830916cda1aSMartin Schwidefsky TSTMSK __TI_flags(%r12),_TIF_GUARDED_STORAGE 831916cda1aSMartin Schwidefsky jo .Lio_guarded_storage 83283abeffbSHendrik Brueckner TSTMSK __LC_CPU_FLAGS,_CIF_FPU 8339977e886SHendrik Brueckner jo .Lio_vxrs 834b5a882fcSHeiko Carstens TSTMSK __LC_CPU_FLAGS,(_CIF_ASCE_PRIMARY|_CIF_ASCE_SECONDARY) 835b5a882fcSHeiko Carstens jnz .Lio_asce 8364bfc86ceSHeiko Carstens j .Lio_return # beware of critical section cleanup 8374bfc86ceSHeiko Carstens 8384bfc86ceSHeiko Carstens# 8394bfc86ceSHeiko Carstens# _CIF_MCCK_PENDING is set, call handler 8404bfc86ceSHeiko Carstens# 8414bfc86ceSHeiko Carstens.Lio_mcck_pending: 8424bfc86ceSHeiko Carstens # TRACE_IRQS_ON already done at .Lio_return 8434bfc86ceSHeiko Carstens brasl %r14,s390_handle_mcck # TIF bit will be cleared by handler 8444bfc86ceSHeiko Carstens TRACE_IRQS_OFF 8454bfc86ceSHeiko Carstens j .Lio_return 8464bfc86ceSHeiko Carstens 8474bfc86ceSHeiko Carstens# 848b5a882fcSHeiko Carstens# _CIF_ASCE_PRIMARY and/or CIF_ASCE_SECONDARY set, load user space asce 8494bfc86ceSHeiko Carstens# 850b5a882fcSHeiko Carstens.Lio_asce: 8510aaba41bSMartin Schwidefsky ni __LC_CPU_FLAGS+7,255-_CIF_ASCE_SECONDARY 8520aaba41bSMartin Schwidefsky lctlg %c7,%c7,__LC_VDSO_ASCE # load secondary asce 8530aaba41bSMartin Schwidefsky TSTMSK __LC_CPU_FLAGS,_CIF_ASCE_PRIMARY 8540aaba41bSMartin Schwidefsky jz .Lio_return 8550aaba41bSMartin Schwidefsky#ifndef CONFIG_HAVE_MARCH_Z10_FEATURES 8560aaba41bSMartin Schwidefsky tm __LC_STFLE_FAC_LIST+3,0x10 # has MVCOS ? 8570aaba41bSMartin Schwidefsky jnz .Lio_set_fs_fixup 858606aa4aaSHeiko Carstens ni __LC_CPU_FLAGS+7,255-_CIF_ASCE_PRIMARY 8594bfc86ceSHeiko Carstens lctlg %c1,%c1,__LC_USER_ASCE # load primary asce 8600aaba41bSMartin Schwidefsky j .Lio_return 8610aaba41bSMartin Schwidefsky.Lio_set_fs_fixup: 8620aaba41bSMartin Schwidefsky#endif 863b5a882fcSHeiko Carstens larl %r14,.Lio_return 864b5a882fcSHeiko Carstens jg set_fs_fixup 8654bfc86ceSHeiko Carstens 8664bfc86ceSHeiko Carstens# 8679977e886SHendrik Brueckner# CIF_FPU is set, restore floating-point controls and floating-point registers. 8689977e886SHendrik Brueckner# 8699977e886SHendrik Brueckner.Lio_vxrs: 8709977e886SHendrik Brueckner larl %r14,.Lio_return 8719977e886SHendrik Brueckner jg load_fpu_regs 8729977e886SHendrik Brueckner 8739977e886SHendrik Brueckner# 874916cda1aSMartin Schwidefsky# _TIF_GUARDED_STORAGE is set, call guarded_storage_load 875916cda1aSMartin Schwidefsky# 876916cda1aSMartin Schwidefsky.Lio_guarded_storage: 877916cda1aSMartin Schwidefsky # TRACE_IRQS_ON already done at .Lio_return 878916cda1aSMartin Schwidefsky ssm __LC_SVC_NEW_PSW # reenable interrupts 879916cda1aSMartin Schwidefsky lgr %r2,%r11 # pass pointer to pt_regs 880916cda1aSMartin Schwidefsky brasl %r14,gs_load_bc_cb 881916cda1aSMartin Schwidefsky ssm __LC_PGM_NEW_PSW # disable I/O and ext. interrupts 882916cda1aSMartin Schwidefsky TRACE_IRQS_OFF 883916cda1aSMartin Schwidefsky j .Lio_return 884916cda1aSMartin Schwidefsky 885916cda1aSMartin Schwidefsky# 8864bfc86ceSHeiko Carstens# _TIF_NEED_RESCHED is set, call schedule 8874bfc86ceSHeiko Carstens# 8884bfc86ceSHeiko Carstens.Lio_reschedule: 8894bfc86ceSHeiko Carstens # TRACE_IRQS_ON already done at .Lio_return 8904bfc86ceSHeiko Carstens ssm __LC_SVC_NEW_PSW # reenable interrupts 8914bfc86ceSHeiko Carstens brasl %r14,schedule # call scheduler 8924bfc86ceSHeiko Carstens ssm __LC_PGM_NEW_PSW # disable I/O and ext. interrupts 8934bfc86ceSHeiko Carstens TRACE_IRQS_OFF 8944bfc86ceSHeiko Carstens j .Lio_return 8954bfc86ceSHeiko Carstens 8964bfc86ceSHeiko Carstens# 8972f09ca60SMiroslav Benes# _TIF_PATCH_PENDING is set, call klp_update_patch_state 8982f09ca60SMiroslav Benes# 8992f09ca60SMiroslav Benes#ifdef CONFIG_LIVEPATCH 9002f09ca60SMiroslav Benes.Lio_patch_pending: 9012f09ca60SMiroslav Benes lg %r2,__LC_CURRENT # pass pointer to task struct 9022f09ca60SMiroslav Benes larl %r14,.Lio_return 9032f09ca60SMiroslav Benes jg klp_update_patch_state 9042f09ca60SMiroslav Benes#endif 9052f09ca60SMiroslav Benes 9062f09ca60SMiroslav Benes# 9074bfc86ceSHeiko Carstens# _TIF_SIGPENDING or is set, call do_signal 9084bfc86ceSHeiko Carstens# 9094bfc86ceSHeiko Carstens.Lio_sigpending: 9104bfc86ceSHeiko Carstens # TRACE_IRQS_ON already done at .Lio_return 9114bfc86ceSHeiko Carstens ssm __LC_SVC_NEW_PSW # reenable interrupts 9124bfc86ceSHeiko Carstens lgr %r2,%r11 # pass pointer to pt_regs 9134bfc86ceSHeiko Carstens brasl %r14,do_signal 9144bfc86ceSHeiko Carstens ssm __LC_PGM_NEW_PSW # disable I/O and ext. interrupts 9154bfc86ceSHeiko Carstens TRACE_IRQS_OFF 9164bfc86ceSHeiko Carstens j .Lio_return 9174bfc86ceSHeiko Carstens 9184bfc86ceSHeiko Carstens# 9194bfc86ceSHeiko Carstens# _TIF_NOTIFY_RESUME or is set, call do_notify_resume 9204bfc86ceSHeiko Carstens# 9214bfc86ceSHeiko Carstens.Lio_notify_resume: 9224bfc86ceSHeiko Carstens # TRACE_IRQS_ON already done at .Lio_return 9234bfc86ceSHeiko Carstens ssm __LC_SVC_NEW_PSW # reenable interrupts 9244bfc86ceSHeiko Carstens lgr %r2,%r11 # pass pointer to pt_regs 9254bfc86ceSHeiko Carstens brasl %r14,do_notify_resume 9264bfc86ceSHeiko Carstens ssm __LC_PGM_NEW_PSW # disable I/O and ext. interrupts 9274bfc86ceSHeiko Carstens TRACE_IRQS_OFF 9284bfc86ceSHeiko Carstens j .Lio_return 9294bfc86ceSHeiko Carstens 9304bfc86ceSHeiko Carstens/* 9314bfc86ceSHeiko Carstens * External interrupt handler routine 9324bfc86ceSHeiko Carstens */ 9334bfc86ceSHeiko CarstensENTRY(ext_int_handler) 9344bfc86ceSHeiko Carstens STCK __LC_INT_CLOCK 9354bfc86ceSHeiko Carstens stpt __LC_ASYNC_ENTER_TIMER 936d768bd89SMartin Schwidefsky BPOFF 9374bfc86ceSHeiko Carstens stmg %r8,%r15,__LC_SAVE_AREA_ASYNC 938d5c352cdSHeiko Carstens lg %r12,__LC_CURRENT 9399977e886SHendrik Brueckner larl %r13,cleanup_critical 9404bfc86ceSHeiko Carstens lmg %r8,%r9,__LC_EXT_OLD_PSW 9412acb94f4SMartin Schwidefsky SWITCH_ASYNC __LC_SAVE_AREA_ASYNC,__LC_ASYNC_ENTER_TIMER 9424bfc86ceSHeiko Carstens stmg %r0,%r7,__PT_R0(%r11) 9437041d281SMartin Schwidefsky # clear user controlled registers to prevent speculative use 9447041d281SMartin Schwidefsky xgr %r0,%r0 9457041d281SMartin Schwidefsky xgr %r1,%r1 9467041d281SMartin Schwidefsky xgr %r2,%r2 9477041d281SMartin Schwidefsky xgr %r3,%r3 9487041d281SMartin Schwidefsky xgr %r4,%r4 9497041d281SMartin Schwidefsky xgr %r5,%r5 9507041d281SMartin Schwidefsky xgr %r6,%r6 9517041d281SMartin Schwidefsky xgr %r7,%r7 9527041d281SMartin Schwidefsky xgr %r10,%r10 9534bfc86ceSHeiko Carstens mvc __PT_R8(64,%r11),__LC_SAVE_AREA_ASYNC 9544bfc86ceSHeiko Carstens stmg %r8,%r9,__PT_PSW(%r11) 9554bfc86ceSHeiko Carstens lghi %r1,__LC_EXT_PARAMS2 9564bfc86ceSHeiko Carstens mvc __PT_INT_CODE(4,%r11),__LC_EXT_CPU_ADDR 9574bfc86ceSHeiko Carstens mvc __PT_INT_PARM(4,%r11),__LC_EXT_PARAMS 9584bfc86ceSHeiko Carstens mvc __PT_INT_PARM_LONG(8,%r11),0(%r1) 9594bfc86ceSHeiko Carstens xc __PT_FLAGS(8,%r11),__PT_FLAGS(%r11) 960db7e007fSHeiko Carstens TSTMSK __LC_CPU_FLAGS,_CIF_IGNORE_IRQ 961db7e007fSHeiko Carstens jo .Lio_restore 9624bfc86ceSHeiko Carstens TRACE_IRQS_OFF 9634bfc86ceSHeiko Carstens xc __SF_BACKCHAIN(8,%r15),__SF_BACKCHAIN(%r15) 9644bfc86ceSHeiko Carstens lgr %r2,%r11 # pass pointer to pt_regs 9654bfc86ceSHeiko Carstens lghi %r3,EXT_INTERRUPT 9664bfc86ceSHeiko Carstens brasl %r14,do_IRQ 9674bfc86ceSHeiko Carstens j .Lio_return 9684bfc86ceSHeiko Carstens 9694bfc86ceSHeiko Carstens/* 9704bfc86ceSHeiko Carstens * Load idle PSW. The second "half" of this function is in .Lcleanup_idle. 9714bfc86ceSHeiko Carstens */ 9724bfc86ceSHeiko CarstensENTRY(psw_idle) 9734bfc86ceSHeiko Carstens stg %r3,__SF_EMPTY(%r15) 9744bfc86ceSHeiko Carstens larl %r1,.Lpsw_idle_lpsw+4 9754bfc86ceSHeiko Carstens stg %r1,__SF_EMPTY+8(%r15) 97672d38b19SMartin Schwidefsky#ifdef CONFIG_SMP 97772d38b19SMartin Schwidefsky larl %r1,smp_cpu_mtid 97872d38b19SMartin Schwidefsky llgf %r1,0(%r1) 97972d38b19SMartin Schwidefsky ltgr %r1,%r1 98072d38b19SMartin Schwidefsky jz .Lpsw_idle_stcctm 98172d38b19SMartin Schwidefsky .insn rsy,0xeb0000000017,%r1,5,__SF_EMPTY+16(%r15) 98272d38b19SMartin Schwidefsky.Lpsw_idle_stcctm: 98372d38b19SMartin Schwidefsky#endif 984419123f9SMartin Schwidefsky oi __LC_CPU_FLAGS+7,_CIF_ENABLED_WAIT 985d768bd89SMartin Schwidefsky BPON 9864bfc86ceSHeiko Carstens STCK __CLOCK_IDLE_ENTER(%r2) 9874bfc86ceSHeiko Carstens stpt __TIMER_IDLE_ENTER(%r2) 9884bfc86ceSHeiko Carstens.Lpsw_idle_lpsw: 9894bfc86ceSHeiko Carstens lpswe __SF_EMPTY(%r15) 9906dd85fbbSMartin Schwidefsky BR_EX %r14 9914bfc86ceSHeiko Carstens.Lpsw_idle_end: 9924bfc86ceSHeiko Carstens 993b5510d9bSHendrik Brueckner/* 994b5510d9bSHendrik Brueckner * Store floating-point controls and floating-point or vector register 995b5510d9bSHendrik Brueckner * depending whether the vector facility is available. A critical section 996b5510d9bSHendrik Brueckner * cleanup assures that the registers are stored even if interrupted for 997b5510d9bSHendrik Brueckner * some other work. The CIF_FPU flag is set to trigger a lazy restore 998b5510d9bSHendrik Brueckner * of the register contents at return from io or a system call. 9999977e886SHendrik Brueckner */ 10009977e886SHendrik BruecknerENTRY(save_fpu_regs) 1001d0164ee2SHendrik Brueckner lg %r2,__LC_CURRENT 1002d0164ee2SHendrik Brueckner aghi %r2,__TASK_thread 100383abeffbSHendrik Brueckner TSTMSK __LC_CPU_FLAGS,_CIF_FPU 1004f19fbd5eSMartin Schwidefsky jo .Lsave_fpu_regs_exit 1005d0164ee2SHendrik Brueckner stfpc __THREAD_FPU_fpc(%r2) 1006d0164ee2SHendrik Brueckner lg %r3,__THREAD_FPU_regs(%r2) 100783abeffbSHendrik Brueckner TSTMSK __LC_MACHINE_FLAGS,MACHINE_FLAG_VX 10089977e886SHendrik Brueckner jz .Lsave_fpu_regs_fp # no -> store FP regs 10099977e886SHendrik Brueckner VSTM %v0,%v15,0,%r3 # vstm 0,15,0(3) 10109977e886SHendrik Brueckner VSTM %v16,%v31,256,%r3 # vstm 16,31,256(3) 10119977e886SHendrik Brueckner j .Lsave_fpu_regs_done # -> set CIF_FPU flag 10129977e886SHendrik Brueckner.Lsave_fpu_regs_fp: 10139977e886SHendrik Brueckner std 0,0(%r3) 10149977e886SHendrik Brueckner std 1,8(%r3) 10159977e886SHendrik Brueckner std 2,16(%r3) 10169977e886SHendrik Brueckner std 3,24(%r3) 10179977e886SHendrik Brueckner std 4,32(%r3) 10189977e886SHendrik Brueckner std 5,40(%r3) 10199977e886SHendrik Brueckner std 6,48(%r3) 10209977e886SHendrik Brueckner std 7,56(%r3) 10219977e886SHendrik Brueckner std 8,64(%r3) 10229977e886SHendrik Brueckner std 9,72(%r3) 10239977e886SHendrik Brueckner std 10,80(%r3) 10249977e886SHendrik Brueckner std 11,88(%r3) 10259977e886SHendrik Brueckner std 12,96(%r3) 10269977e886SHendrik Brueckner std 13,104(%r3) 10279977e886SHendrik Brueckner std 14,112(%r3) 10289977e886SHendrik Brueckner std 15,120(%r3) 10299977e886SHendrik Brueckner.Lsave_fpu_regs_done: 10309977e886SHendrik Brueckner oi __LC_CPU_FLAGS+7,_CIF_FPU 1031f19fbd5eSMartin Schwidefsky.Lsave_fpu_regs_exit: 10326dd85fbbSMartin Schwidefsky BR_EX %r14 10339977e886SHendrik Brueckner.Lsave_fpu_regs_end: 1034711f5df7SAl ViroEXPORT_SYMBOL(save_fpu_regs) 10359977e886SHendrik Brueckner 1036b5510d9bSHendrik Brueckner/* 1037b5510d9bSHendrik Brueckner * Load floating-point controls and floating-point or vector registers. 1038b5510d9bSHendrik Brueckner * A critical section cleanup assures that the register contents are 1039b5510d9bSHendrik Brueckner * loaded even if interrupted for some other work. 10409977e886SHendrik Brueckner * 10419977e886SHendrik Brueckner * There are special calling conventions to fit into sysc and io return work: 10429977e886SHendrik Brueckner * %r15: <kernel stack> 10439977e886SHendrik Brueckner * The function requires: 1044b5510d9bSHendrik Brueckner * %r4 10459977e886SHendrik Brueckner */ 10469977e886SHendrik Bruecknerload_fpu_regs: 1047d0164ee2SHendrik Brueckner lg %r4,__LC_CURRENT 1048d0164ee2SHendrik Brueckner aghi %r4,__TASK_thread 104983abeffbSHendrik Brueckner TSTMSK __LC_CPU_FLAGS,_CIF_FPU 1050f19fbd5eSMartin Schwidefsky jno .Lload_fpu_regs_exit 1051d0164ee2SHendrik Brueckner lfpc __THREAD_FPU_fpc(%r4) 105283abeffbSHendrik Brueckner TSTMSK __LC_MACHINE_FLAGS,MACHINE_FLAG_VX 1053d0164ee2SHendrik Brueckner lg %r4,__THREAD_FPU_regs(%r4) # %r4 <- reg save area 1054b5510d9bSHendrik Brueckner jz .Lload_fpu_regs_fp # -> no VX, load FP regs 10559977e886SHendrik Brueckner VLM %v0,%v15,0,%r4 10569977e886SHendrik Brueckner VLM %v16,%v31,256,%r4 10579977e886SHendrik Brueckner j .Lload_fpu_regs_done 10589977e886SHendrik Brueckner.Lload_fpu_regs_fp: 10599977e886SHendrik Brueckner ld 0,0(%r4) 10609977e886SHendrik Brueckner ld 1,8(%r4) 10619977e886SHendrik Brueckner ld 2,16(%r4) 10629977e886SHendrik Brueckner ld 3,24(%r4) 10639977e886SHendrik Brueckner ld 4,32(%r4) 10649977e886SHendrik Brueckner ld 5,40(%r4) 10659977e886SHendrik Brueckner ld 6,48(%r4) 10669977e886SHendrik Brueckner ld 7,56(%r4) 10679977e886SHendrik Brueckner ld 8,64(%r4) 10689977e886SHendrik Brueckner ld 9,72(%r4) 10699977e886SHendrik Brueckner ld 10,80(%r4) 10709977e886SHendrik Brueckner ld 11,88(%r4) 10719977e886SHendrik Brueckner ld 12,96(%r4) 10729977e886SHendrik Brueckner ld 13,104(%r4) 10739977e886SHendrik Brueckner ld 14,112(%r4) 10749977e886SHendrik Brueckner ld 15,120(%r4) 10759977e886SHendrik Brueckner.Lload_fpu_regs_done: 10769977e886SHendrik Brueckner ni __LC_CPU_FLAGS+7,255-_CIF_FPU 1077f19fbd5eSMartin Schwidefsky.Lload_fpu_regs_exit: 10786dd85fbbSMartin Schwidefsky BR_EX %r14 10799977e886SHendrik Brueckner.Lload_fpu_regs_end: 10809977e886SHendrik Brueckner 10814bfc86ceSHeiko Carstens.L__critical_end: 10824bfc86ceSHeiko Carstens 10834bfc86ceSHeiko Carstens/* 10844bfc86ceSHeiko Carstens * Machine check handler routines 10854bfc86ceSHeiko Carstens */ 10864bfc86ceSHeiko CarstensENTRY(mcck_int_handler) 10874bfc86ceSHeiko Carstens STCK __LC_MCCK_CLOCK 1088d768bd89SMartin Schwidefsky BPOFF 10893037a52fSMartin Schwidefsky la %r1,4095 # validate r1 10903037a52fSMartin Schwidefsky spt __LC_CPU_TIMER_SAVE_AREA-4095(%r1) # validate cpu timer 10913037a52fSMartin Schwidefsky sckc __LC_CLOCK_COMPARATOR # validate comparator 10923037a52fSMartin Schwidefsky lam %a0,%a15,__LC_AREGS_SAVE_AREA-4095(%r1) # validate acrs 10933037a52fSMartin Schwidefsky lmg %r0,%r15,__LC_GPREGS_SAVE_AREA-4095(%r1)# validate gprs 1094d5c352cdSHeiko Carstens lg %r12,__LC_CURRENT 10959977e886SHendrik Brueckner larl %r13,cleanup_critical 10964bfc86ceSHeiko Carstens lmg %r8,%r9,__LC_MCK_OLD_PSW 109783abeffbSHendrik Brueckner TSTMSK __LC_MCCK_CODE,MCCK_CODE_SYSTEM_DAMAGE 10984bfc86ceSHeiko Carstens jo .Lmcck_panic # yes -> rest of mcck code invalid 10993037a52fSMartin Schwidefsky TSTMSK __LC_MCCK_CODE,MCCK_CODE_CR_VALID 11003037a52fSMartin Schwidefsky jno .Lmcck_panic # control registers invalid -> panic 11013037a52fSMartin Schwidefsky la %r14,4095 11023037a52fSMartin Schwidefsky lctlg %c0,%c15,__LC_CREGS_SAVE_AREA-4095(%r14) # validate ctl regs 11033037a52fSMartin Schwidefsky ptlb 11042a2d7befSVasily Gorbik lg %r11,__LC_MCESAD-4095(%r14) # extended machine check save area 11053037a52fSMartin Schwidefsky nill %r11,0xfc00 # MCESA_ORIGIN_MASK 11063037a52fSMartin Schwidefsky TSTMSK __LC_CREGS_SAVE_AREA+16-4095(%r14),CR2_GUARDED_STORAGE 11073037a52fSMartin Schwidefsky jno 0f 11083037a52fSMartin Schwidefsky TSTMSK __LC_MCCK_CODE,MCCK_CODE_GS_VALID 11093037a52fSMartin Schwidefsky jno 0f 11103037a52fSMartin Schwidefsky .insn rxy,0xe3000000004d,0,__MCESA_GS_SAVE_AREA(%r11) # LGSC 11113037a52fSMartin Schwidefsky0: l %r14,__LC_FP_CREG_SAVE_AREA-4095(%r14) 11123037a52fSMartin Schwidefsky TSTMSK __LC_MCCK_CODE,MCCK_CODE_FC_VALID 11133037a52fSMartin Schwidefsky jo 0f 11143037a52fSMartin Schwidefsky sr %r14,%r14 11153037a52fSMartin Schwidefsky0: sfpc %r14 11163037a52fSMartin Schwidefsky TSTMSK __LC_MACHINE_FLAGS,MACHINE_FLAG_VX 11173037a52fSMartin Schwidefsky jo 0f 11183037a52fSMartin Schwidefsky lghi %r14,__LC_FPREGS_SAVE_AREA 11193037a52fSMartin Schwidefsky ld %f0,0(%r14) 11203037a52fSMartin Schwidefsky ld %f1,8(%r14) 11213037a52fSMartin Schwidefsky ld %f2,16(%r14) 11223037a52fSMartin Schwidefsky ld %f3,24(%r14) 11233037a52fSMartin Schwidefsky ld %f4,32(%r14) 11243037a52fSMartin Schwidefsky ld %f5,40(%r14) 11253037a52fSMartin Schwidefsky ld %f6,48(%r14) 11263037a52fSMartin Schwidefsky ld %f7,56(%r14) 11273037a52fSMartin Schwidefsky ld %f8,64(%r14) 11283037a52fSMartin Schwidefsky ld %f9,72(%r14) 11293037a52fSMartin Schwidefsky ld %f10,80(%r14) 11303037a52fSMartin Schwidefsky ld %f11,88(%r14) 11313037a52fSMartin Schwidefsky ld %f12,96(%r14) 11323037a52fSMartin Schwidefsky ld %f13,104(%r14) 11333037a52fSMartin Schwidefsky ld %f14,112(%r14) 11343037a52fSMartin Schwidefsky ld %f15,120(%r14) 11353037a52fSMartin Schwidefsky j 1f 11363037a52fSMartin Schwidefsky0: VLM %v0,%v15,0,%r11 11373037a52fSMartin Schwidefsky VLM %v16,%v31,256,%r11 11383037a52fSMartin Schwidefsky1: lghi %r14,__LC_CPU_TIMER_SAVE_AREA 11394bfc86ceSHeiko Carstens mvc __LC_MCCK_ENTER_TIMER(8),0(%r14) 114083abeffbSHendrik Brueckner TSTMSK __LC_MCCK_CODE,MCCK_CODE_CPU_TIMER_VALID 11414bfc86ceSHeiko Carstens jo 3f 11424bfc86ceSHeiko Carstens la %r14,__LC_SYNC_ENTER_TIMER 11434bfc86ceSHeiko Carstens clc 0(8,%r14),__LC_ASYNC_ENTER_TIMER 11444bfc86ceSHeiko Carstens jl 0f 11454bfc86ceSHeiko Carstens la %r14,__LC_ASYNC_ENTER_TIMER 11464bfc86ceSHeiko Carstens0: clc 0(8,%r14),__LC_EXIT_TIMER 11474bfc86ceSHeiko Carstens jl 1f 11484bfc86ceSHeiko Carstens la %r14,__LC_EXIT_TIMER 11494bfc86ceSHeiko Carstens1: clc 0(8,%r14),__LC_LAST_UPDATE_TIMER 11504bfc86ceSHeiko Carstens jl 2f 11514bfc86ceSHeiko Carstens la %r14,__LC_LAST_UPDATE_TIMER 11524bfc86ceSHeiko Carstens2: spt 0(%r14) 11534bfc86ceSHeiko Carstens mvc __LC_MCCK_ENTER_TIMER(8),0(%r14) 11543037a52fSMartin Schwidefsky3: TSTMSK __LC_MCCK_CODE,MCCK_CODE_PSW_MWP_VALID 11553037a52fSMartin Schwidefsky jno .Lmcck_panic 11563037a52fSMartin Schwidefsky tmhh %r8,0x0001 # interrupting from user ? 11573037a52fSMartin Schwidefsky jnz 4f 11583037a52fSMartin Schwidefsky TSTMSK __LC_MCCK_CODE,MCCK_CODE_PSW_IA_VALID 11593037a52fSMartin Schwidefsky jno .Lmcck_panic 1160*ce3dc447SMartin Schwidefsky4: ssm __LC_PGM_NEW_PSW # turn dat on, keep irqs off 1161*ce3dc447SMartin Schwidefsky SWITCH_ASYNC __LC_GPREGS_SAVE_AREA+64,__LC_MCCK_ENTER_TIMER 11624bfc86ceSHeiko Carstens.Lmcck_skip: 11634bfc86ceSHeiko Carstens lghi %r14,__LC_GPREGS_SAVE_AREA+64 11644bfc86ceSHeiko Carstens stmg %r0,%r7,__PT_R0(%r11) 11657041d281SMartin Schwidefsky # clear user controlled registers to prevent speculative use 11667041d281SMartin Schwidefsky xgr %r0,%r0 11677041d281SMartin Schwidefsky xgr %r1,%r1 11687041d281SMartin Schwidefsky xgr %r2,%r2 11697041d281SMartin Schwidefsky xgr %r3,%r3 11707041d281SMartin Schwidefsky xgr %r4,%r4 11717041d281SMartin Schwidefsky xgr %r5,%r5 11727041d281SMartin Schwidefsky xgr %r6,%r6 11737041d281SMartin Schwidefsky xgr %r7,%r7 11747041d281SMartin Schwidefsky xgr %r10,%r10 11754bfc86ceSHeiko Carstens mvc __PT_R8(64,%r11),0(%r14) 11764bfc86ceSHeiko Carstens stmg %r8,%r9,__PT_PSW(%r11) 11774bfc86ceSHeiko Carstens xc __PT_FLAGS(8,%r11),__PT_FLAGS(%r11) 11784bfc86ceSHeiko Carstens xc __SF_BACKCHAIN(8,%r15),__SF_BACKCHAIN(%r15) 11794bfc86ceSHeiko Carstens lgr %r2,%r11 # pass pointer to pt_regs 11804bfc86ceSHeiko Carstens brasl %r14,s390_do_machine_check 11814bfc86ceSHeiko Carstens tm __PT_PSW+1(%r11),0x01 # returning to user ? 11824bfc86ceSHeiko Carstens jno .Lmcck_return 11834bfc86ceSHeiko Carstens lg %r1,__LC_KERNEL_STACK # switch to kernel stack 11844bfc86ceSHeiko Carstens mvc STACK_FRAME_OVERHEAD(__PT_SIZE,%r1),0(%r11) 11854bfc86ceSHeiko Carstens xc __SF_BACKCHAIN(8,%r1),__SF_BACKCHAIN(%r1) 11864bfc86ceSHeiko Carstens la %r11,STACK_FRAME_OVERHEAD(%r1) 11874bfc86ceSHeiko Carstens lgr %r15,%r1 118883abeffbSHendrik Brueckner TSTMSK __LC_CPU_FLAGS,_CIF_MCCK_PENDING 11894bfc86ceSHeiko Carstens jno .Lmcck_return 11904bfc86ceSHeiko Carstens TRACE_IRQS_OFF 11914bfc86ceSHeiko Carstens brasl %r14,s390_handle_mcck 11924bfc86ceSHeiko Carstens TRACE_IRQS_ON 11934bfc86ceSHeiko Carstens.Lmcck_return: 11944bfc86ceSHeiko Carstens lg %r14,__LC_VDSO_PER_CPU 11954bfc86ceSHeiko Carstens lmg %r0,%r10,__PT_R0(%r11) 11964bfc86ceSHeiko Carstens mvc __LC_RETURN_MCCK_PSW(16),__PT_PSW(%r11) # move return PSW 11974bfc86ceSHeiko Carstens tm __LC_RETURN_MCCK_PSW+1,0x01 # returning to user ? 11984bfc86ceSHeiko Carstens jno 0f 11996b73044bSMartin Schwidefsky BPEXIT __TI_flags(%r12),_TIF_ISOLATE_BP 12004bfc86ceSHeiko Carstens stpt __LC_EXIT_TIMER 12014bfc86ceSHeiko Carstens mvc __VDSO_ECTG_BASE(16,%r14),__LC_EXIT_TIMER 12024bfc86ceSHeiko Carstens0: lmg %r11,%r15,__PT_R11(%r11) 12034bfc86ceSHeiko Carstens lpswe __LC_RETURN_MCCK_PSW 12044bfc86ceSHeiko Carstens 12054bfc86ceSHeiko Carstens.Lmcck_panic: 1206*ce3dc447SMartin Schwidefsky lg %r15,__LC_NODAT_STACK 1207ce4dda3fSMartin Schwidefsky la %r11,STACK_FRAME_OVERHEAD(%r15) 12084bfc86ceSHeiko Carstens j .Lmcck_skip 12094bfc86ceSHeiko Carstens 12104bfc86ceSHeiko Carstens# 12114bfc86ceSHeiko Carstens# PSW restart interrupt handler 12124bfc86ceSHeiko Carstens# 12134bfc86ceSHeiko CarstensENTRY(restart_int_handler) 1214e5b98199SMartin Schwidefsky ALTERNATIVE "", ".insn s,0xb2800000,_LPP_OFFSET", 40 1215e5b98199SMartin Schwidefsky stg %r15,__LC_SAVE_AREA_RESTART 12164bfc86ceSHeiko Carstens lg %r15,__LC_RESTART_STACK 1217*ce3dc447SMartin Schwidefsky xc STACK_FRAME_OVERHEAD(__PT_SIZE,%r15),STACK_FRAME_OVERHEAD(%r15) 1218*ce3dc447SMartin Schwidefsky stmg %r0,%r14,STACK_FRAME_OVERHEAD+__PT_R0(%r15) 1219*ce3dc447SMartin Schwidefsky mvc STACK_FRAME_OVERHEAD+__PT_R15(8,%r15),__LC_SAVE_AREA_RESTART 1220*ce3dc447SMartin Schwidefsky mvc STACK_FRAME_OVERHEAD+__PT_PSW(16,%r15),__LC_RST_OLD_PSW 12214bfc86ceSHeiko Carstens xc 0(STACK_FRAME_OVERHEAD,%r15),0(%r15) 12224bfc86ceSHeiko Carstens lg %r1,__LC_RESTART_FN # load fn, parm & source cpu 12234bfc86ceSHeiko Carstens lg %r2,__LC_RESTART_DATA 12244bfc86ceSHeiko Carstens lg %r3,__LC_RESTART_SOURCE 12254bfc86ceSHeiko Carstens ltgr %r3,%r3 # test source cpu address 12264bfc86ceSHeiko Carstens jm 1f # negative -> skip source stop 12274bfc86ceSHeiko Carstens0: sigp %r4,%r3,SIGP_SENSE # sigp sense to source cpu 12284bfc86ceSHeiko Carstens brc 10,0b # wait for status stored 12294bfc86ceSHeiko Carstens1: basr %r14,%r1 # call function 12304bfc86ceSHeiko Carstens stap __SF_EMPTY(%r15) # store cpu address 12314bfc86ceSHeiko Carstens llgh %r3,__SF_EMPTY(%r15) 12324bfc86ceSHeiko Carstens2: sigp %r4,%r3,SIGP_STOP # sigp stop to current cpu 12334bfc86ceSHeiko Carstens brc 2,2b 12344bfc86ceSHeiko Carstens3: j 3b 12354bfc86ceSHeiko Carstens 12364bfc86ceSHeiko Carstens .section .kprobes.text, "ax" 12374bfc86ceSHeiko Carstens 1238*ce3dc447SMartin Schwidefsky#if defined(CONFIG_CHECK_STACK) || defined(CONFIG_VMAP_STACK) 12394bfc86ceSHeiko Carstens/* 12404bfc86ceSHeiko Carstens * The synchronous or the asynchronous stack overflowed. We are dead. 12414bfc86ceSHeiko Carstens * No need to properly save the registers, we are going to panic anyway. 12424bfc86ceSHeiko Carstens * Setup a pt_regs so that show_trace can provide a good call trace. 12434bfc86ceSHeiko Carstens */ 12444bfc86ceSHeiko Carstensstack_overflow: 1245*ce3dc447SMartin Schwidefsky lg %r15,__LC_NODAT_STACK # change to panic stack 12464bfc86ceSHeiko Carstens la %r11,STACK_FRAME_OVERHEAD(%r15) 12474bfc86ceSHeiko Carstens stmg %r0,%r7,__PT_R0(%r11) 12484bfc86ceSHeiko Carstens stmg %r8,%r9,__PT_PSW(%r11) 12494bfc86ceSHeiko Carstens mvc __PT_R8(64,%r11),0(%r14) 12504bfc86ceSHeiko Carstens stg %r10,__PT_ORIG_GPR2(%r11) # store last break to orig_gpr2 12514bfc86ceSHeiko Carstens xc __SF_BACKCHAIN(8,%r15),__SF_BACKCHAIN(%r15) 12524bfc86ceSHeiko Carstens lgr %r2,%r11 # pass pointer to pt_regs 12534bfc86ceSHeiko Carstens jg kernel_stack_overflow 12544bfc86ceSHeiko Carstens#endif 12554bfc86ceSHeiko Carstens 12564bfc86ceSHeiko Carstenscleanup_critical: 1257d0fc4107SMartin Schwidefsky#if IS_ENABLED(CONFIG_KVM) 1258d0fc4107SMartin Schwidefsky clg %r9,BASED(.Lcleanup_table_sie) # .Lsie_gmap 1259d0fc4107SMartin Schwidefsky jl 0f 1260d0fc4107SMartin Schwidefsky clg %r9,BASED(.Lcleanup_table_sie+8)# .Lsie_done 1261d0fc4107SMartin Schwidefsky jl .Lcleanup_sie 1262d0fc4107SMartin Schwidefsky#endif 12634bfc86ceSHeiko Carstens clg %r9,BASED(.Lcleanup_table) # system_call 12644bfc86ceSHeiko Carstens jl 0f 12654bfc86ceSHeiko Carstens clg %r9,BASED(.Lcleanup_table+8) # .Lsysc_do_svc 12664bfc86ceSHeiko Carstens jl .Lcleanup_system_call 12674bfc86ceSHeiko Carstens clg %r9,BASED(.Lcleanup_table+16) # .Lsysc_tif 12684bfc86ceSHeiko Carstens jl 0f 12694bfc86ceSHeiko Carstens clg %r9,BASED(.Lcleanup_table+24) # .Lsysc_restore 12704bfc86ceSHeiko Carstens jl .Lcleanup_sysc_tif 12714bfc86ceSHeiko Carstens clg %r9,BASED(.Lcleanup_table+32) # .Lsysc_done 12724bfc86ceSHeiko Carstens jl .Lcleanup_sysc_restore 12734bfc86ceSHeiko Carstens clg %r9,BASED(.Lcleanup_table+40) # .Lio_tif 12744bfc86ceSHeiko Carstens jl 0f 12754bfc86ceSHeiko Carstens clg %r9,BASED(.Lcleanup_table+48) # .Lio_restore 12764bfc86ceSHeiko Carstens jl .Lcleanup_io_tif 12774bfc86ceSHeiko Carstens clg %r9,BASED(.Lcleanup_table+56) # .Lio_done 12784bfc86ceSHeiko Carstens jl .Lcleanup_io_restore 12794bfc86ceSHeiko Carstens clg %r9,BASED(.Lcleanup_table+64) # psw_idle 12804bfc86ceSHeiko Carstens jl 0f 12814bfc86ceSHeiko Carstens clg %r9,BASED(.Lcleanup_table+72) # .Lpsw_idle_end 12824bfc86ceSHeiko Carstens jl .Lcleanup_idle 12839977e886SHendrik Brueckner clg %r9,BASED(.Lcleanup_table+80) # save_fpu_regs 12849977e886SHendrik Brueckner jl 0f 12859977e886SHendrik Brueckner clg %r9,BASED(.Lcleanup_table+88) # .Lsave_fpu_regs_end 12869977e886SHendrik Brueckner jl .Lcleanup_save_fpu_regs 12879977e886SHendrik Brueckner clg %r9,BASED(.Lcleanup_table+96) # load_fpu_regs 12889977e886SHendrik Brueckner jl 0f 12899977e886SHendrik Brueckner clg %r9,BASED(.Lcleanup_table+104) # .Lload_fpu_regs_end 12909977e886SHendrik Brueckner jl .Lcleanup_load_fpu_regs 1291891f6a72SChristian Borntraeger0: BR_EX %r14,%r11 12924bfc86ceSHeiko Carstens 1293d0fc4107SMartin Schwidefsky .align 8 1294d0fc4107SMartin Schwidefsky.Lcleanup_table: 1295d0fc4107SMartin Schwidefsky .quad system_call 1296d0fc4107SMartin Schwidefsky .quad .Lsysc_do_svc 1297d0fc4107SMartin Schwidefsky .quad .Lsysc_tif 1298d0fc4107SMartin Schwidefsky .quad .Lsysc_restore 1299d0fc4107SMartin Schwidefsky .quad .Lsysc_done 1300d0fc4107SMartin Schwidefsky .quad .Lio_tif 1301d0fc4107SMartin Schwidefsky .quad .Lio_restore 1302d0fc4107SMartin Schwidefsky .quad .Lio_done 1303d0fc4107SMartin Schwidefsky .quad psw_idle 1304d0fc4107SMartin Schwidefsky .quad .Lpsw_idle_end 1305d0fc4107SMartin Schwidefsky .quad save_fpu_regs 1306d0fc4107SMartin Schwidefsky .quad .Lsave_fpu_regs_end 1307d0fc4107SMartin Schwidefsky .quad load_fpu_regs 1308d0fc4107SMartin Schwidefsky .quad .Lload_fpu_regs_end 1309d0fc4107SMartin Schwidefsky 1310d0fc4107SMartin Schwidefsky#if IS_ENABLED(CONFIG_KVM) 1311d0fc4107SMartin Schwidefsky.Lcleanup_table_sie: 1312d0fc4107SMartin Schwidefsky .quad .Lsie_gmap 1313d0fc4107SMartin Schwidefsky .quad .Lsie_done 1314d0fc4107SMartin Schwidefsky 1315d0fc4107SMartin Schwidefsky.Lcleanup_sie: 1316c929500dSQingFeng Hao cghi %r11,__LC_SAVE_AREA_ASYNC #Is this in normal interrupt? 1317c929500dSQingFeng Hao je 1f 1318c929500dSQingFeng Hao slg %r9,BASED(.Lsie_crit_mcck_start) 1319c929500dSQingFeng Hao clg %r9,BASED(.Lsie_crit_mcck_length) 1320c929500dSQingFeng Hao jh 1f 1321c929500dSQingFeng Hao oi __LC_CPU_FLAGS+7, _CIF_MCCK_GUEST 132292fa7a13SMartin Schwidefsky1: BPENTER __SF_SIE_FLAGS(%r15),(_TIF_ISOLATE_BP|_TIF_ISOLATE_BP_GUEST) 132392fa7a13SMartin Schwidefsky lg %r9,__SF_SIE_CONTROL(%r15) # get control block pointer 1324e22cf8caSChristian Borntraeger ni __SIE_PROG0C+3(%r9),0xfe # no longer in SIE 1325d0fc4107SMartin Schwidefsky lctlg %c1,%c1,__LC_USER_ASCE # load primary asce 1326d0fc4107SMartin Schwidefsky larl %r9,sie_exit # skip forward to sie_exit 1327891f6a72SChristian Borntraeger BR_EX %r14,%r11 1328d0fc4107SMartin Schwidefsky#endif 13294bfc86ceSHeiko Carstens 13304bfc86ceSHeiko Carstens.Lcleanup_system_call: 13314bfc86ceSHeiko Carstens # check if stpt has been executed 13324bfc86ceSHeiko Carstens clg %r9,BASED(.Lcleanup_system_call_insn) 13334bfc86ceSHeiko Carstens jh 0f 13344bfc86ceSHeiko Carstens mvc __LC_SYNC_ENTER_TIMER(8),__LC_ASYNC_ENTER_TIMER 13354bfc86ceSHeiko Carstens cghi %r11,__LC_SAVE_AREA_ASYNC 13364bfc86ceSHeiko Carstens je 0f 13374bfc86ceSHeiko Carstens mvc __LC_SYNC_ENTER_TIMER(8),__LC_MCCK_ENTER_TIMER 13384bfc86ceSHeiko Carstens0: # check if stmg has been executed 13394bfc86ceSHeiko Carstens clg %r9,BASED(.Lcleanup_system_call_insn+8) 13404bfc86ceSHeiko Carstens jh 0f 13414bfc86ceSHeiko Carstens mvc __LC_SAVE_AREA_SYNC(64),0(%r11) 13424bfc86ceSHeiko Carstens0: # check if base register setup + TIF bit load has been done 13434bfc86ceSHeiko Carstens clg %r9,BASED(.Lcleanup_system_call_insn+16) 13444bfc86ceSHeiko Carstens jhe 0f 134534525e1fSMartin Schwidefsky # set up saved register r12 task struct pointer 134634525e1fSMartin Schwidefsky stg %r12,32(%r11) 134734525e1fSMartin Schwidefsky # set up saved register r13 __TASK_thread offset 134834525e1fSMartin Schwidefsky mvc 40(8,%r11),BASED(.Lcleanup_system_call_const) 13494bfc86ceSHeiko Carstens0: # check if the user time update has been done 13504bfc86ceSHeiko Carstens clg %r9,BASED(.Lcleanup_system_call_insn+24) 13514bfc86ceSHeiko Carstens jh 0f 13524bfc86ceSHeiko Carstens lg %r15,__LC_EXIT_TIMER 13534bfc86ceSHeiko Carstens slg %r15,__LC_SYNC_ENTER_TIMER 13544bfc86ceSHeiko Carstens alg %r15,__LC_USER_TIMER 13554bfc86ceSHeiko Carstens stg %r15,__LC_USER_TIMER 13564bfc86ceSHeiko Carstens0: # check if the system time update has been done 13574bfc86ceSHeiko Carstens clg %r9,BASED(.Lcleanup_system_call_insn+32) 13584bfc86ceSHeiko Carstens jh 0f 13594bfc86ceSHeiko Carstens lg %r15,__LC_LAST_UPDATE_TIMER 13604bfc86ceSHeiko Carstens slg %r15,__LC_EXIT_TIMER 13614bfc86ceSHeiko Carstens alg %r15,__LC_SYSTEM_TIMER 13624bfc86ceSHeiko Carstens stg %r15,__LC_SYSTEM_TIMER 13634bfc86ceSHeiko Carstens0: # update accounting time stamp 13644bfc86ceSHeiko Carstens mvc __LC_LAST_UPDATE_TIMER(8),__LC_SYNC_ENTER_TIMER 1365d5feec04SMartin Schwidefsky BPENTER __TI_flags(%r12),_TIF_ISOLATE_BP 136634525e1fSMartin Schwidefsky # set up saved register r11 13674bfc86ceSHeiko Carstens lg %r15,__LC_KERNEL_STACK 13684bfc86ceSHeiko Carstens la %r9,STACK_FRAME_OVERHEAD(%r15) 13694bfc86ceSHeiko Carstens stg %r9,24(%r11) # r11 pt_regs pointer 13704bfc86ceSHeiko Carstens # fill pt_regs 13714bfc86ceSHeiko Carstens mvc __PT_R8(64,%r9),__LC_SAVE_AREA_SYNC 13724bfc86ceSHeiko Carstens stmg %r0,%r7,__PT_R0(%r9) 13734bfc86ceSHeiko Carstens mvc __PT_PSW(16,%r9),__LC_SVC_OLD_PSW 13744bfc86ceSHeiko Carstens mvc __PT_INT_CODE(4,%r9),__LC_SVC_ILC 13754bfc86ceSHeiko Carstens xc __PT_FLAGS(8,%r9),__PT_FLAGS(%r9) 13764bfc86ceSHeiko Carstens mvi __PT_FLAGS+7(%r9),_PIF_SYSCALL 13774bfc86ceSHeiko Carstens # setup saved register r15 13784bfc86ceSHeiko Carstens stg %r15,56(%r11) # r15 stack pointer 13794bfc86ceSHeiko Carstens # set new psw address and exit 13804bfc86ceSHeiko Carstens larl %r9,.Lsysc_do_svc 13816dd85fbbSMartin Schwidefsky BR_EX %r14,%r11 13824bfc86ceSHeiko Carstens.Lcleanup_system_call_insn: 13834bfc86ceSHeiko Carstens .quad system_call 13844bfc86ceSHeiko Carstens .quad .Lsysc_stmg 13854bfc86ceSHeiko Carstens .quad .Lsysc_per 1386a359bb11SMartin Schwidefsky .quad .Lsysc_vtime+36 13874bfc86ceSHeiko Carstens .quad .Lsysc_vtime+42 138834525e1fSMartin Schwidefsky.Lcleanup_system_call_const: 138934525e1fSMartin Schwidefsky .quad __TASK_thread 13904bfc86ceSHeiko Carstens 13914bfc86ceSHeiko Carstens.Lcleanup_sysc_tif: 13924bfc86ceSHeiko Carstens larl %r9,.Lsysc_tif 13936dd85fbbSMartin Schwidefsky BR_EX %r14,%r11 13944bfc86ceSHeiko Carstens 13954bfc86ceSHeiko Carstens.Lcleanup_sysc_restore: 139607a63cbeSMartin Schwidefsky # check if stpt has been executed 13974bfc86ceSHeiko Carstens clg %r9,BASED(.Lcleanup_sysc_restore_insn) 139807a63cbeSMartin Schwidefsky jh 0f 139907a63cbeSMartin Schwidefsky mvc __LC_EXIT_TIMER(8),__LC_ASYNC_ENTER_TIMER 140007a63cbeSMartin Schwidefsky cghi %r11,__LC_SAVE_AREA_ASYNC 14014bfc86ceSHeiko Carstens je 0f 140207a63cbeSMartin Schwidefsky mvc __LC_EXIT_TIMER(8),__LC_MCCK_ENTER_TIMER 140307a63cbeSMartin Schwidefsky0: clg %r9,BASED(.Lcleanup_sysc_restore_insn+8) 140407a63cbeSMartin Schwidefsky je 1f 14054bfc86ceSHeiko Carstens lg %r9,24(%r11) # get saved pointer to pt_regs 14064bfc86ceSHeiko Carstens mvc __LC_RETURN_PSW(16),__PT_PSW(%r9) 14074bfc86ceSHeiko Carstens mvc 0(64,%r11),__PT_R8(%r9) 14084bfc86ceSHeiko Carstens lmg %r0,%r7,__PT_R0(%r9) 140907a63cbeSMartin Schwidefsky1: lmg %r8,%r9,__LC_RETURN_PSW 14106dd85fbbSMartin Schwidefsky BR_EX %r14,%r11 14114bfc86ceSHeiko Carstens.Lcleanup_sysc_restore_insn: 141207a63cbeSMartin Schwidefsky .quad .Lsysc_exit_timer 14134bfc86ceSHeiko Carstens .quad .Lsysc_done - 4 14144bfc86ceSHeiko Carstens 14154bfc86ceSHeiko Carstens.Lcleanup_io_tif: 14164bfc86ceSHeiko Carstens larl %r9,.Lio_tif 14176dd85fbbSMartin Schwidefsky BR_EX %r14,%r11 14184bfc86ceSHeiko Carstens 14194bfc86ceSHeiko Carstens.Lcleanup_io_restore: 142007a63cbeSMartin Schwidefsky # check if stpt has been executed 14214bfc86ceSHeiko Carstens clg %r9,BASED(.Lcleanup_io_restore_insn) 142207a63cbeSMartin Schwidefsky jh 0f 142307a63cbeSMartin Schwidefsky mvc __LC_EXIT_TIMER(8),__LC_MCCK_ENTER_TIMER 142407a63cbeSMartin Schwidefsky0: clg %r9,BASED(.Lcleanup_io_restore_insn+8) 142507a63cbeSMartin Schwidefsky je 1f 14264bfc86ceSHeiko Carstens lg %r9,24(%r11) # get saved r11 pointer to pt_regs 14274bfc86ceSHeiko Carstens mvc __LC_RETURN_PSW(16),__PT_PSW(%r9) 14284bfc86ceSHeiko Carstens mvc 0(64,%r11),__PT_R8(%r9) 14294bfc86ceSHeiko Carstens lmg %r0,%r7,__PT_R0(%r9) 143007a63cbeSMartin Schwidefsky1: lmg %r8,%r9,__LC_RETURN_PSW 14316dd85fbbSMartin Schwidefsky BR_EX %r14,%r11 14324bfc86ceSHeiko Carstens.Lcleanup_io_restore_insn: 143307a63cbeSMartin Schwidefsky .quad .Lio_exit_timer 14344bfc86ceSHeiko Carstens .quad .Lio_done - 4 14354bfc86ceSHeiko Carstens 14364bfc86ceSHeiko Carstens.Lcleanup_idle: 1437419123f9SMartin Schwidefsky ni __LC_CPU_FLAGS+7,255-_CIF_ENABLED_WAIT 14384bfc86ceSHeiko Carstens # copy interrupt clock & cpu timer 14394bfc86ceSHeiko Carstens mvc __CLOCK_IDLE_EXIT(8,%r2),__LC_INT_CLOCK 14404bfc86ceSHeiko Carstens mvc __TIMER_IDLE_EXIT(8,%r2),__LC_ASYNC_ENTER_TIMER 14414bfc86ceSHeiko Carstens cghi %r11,__LC_SAVE_AREA_ASYNC 14424bfc86ceSHeiko Carstens je 0f 14434bfc86ceSHeiko Carstens mvc __CLOCK_IDLE_EXIT(8,%r2),__LC_MCCK_CLOCK 14444bfc86ceSHeiko Carstens mvc __TIMER_IDLE_EXIT(8,%r2),__LC_MCCK_ENTER_TIMER 14454bfc86ceSHeiko Carstens0: # check if stck & stpt have been executed 14464bfc86ceSHeiko Carstens clg %r9,BASED(.Lcleanup_idle_insn) 14474bfc86ceSHeiko Carstens jhe 1f 14484bfc86ceSHeiko Carstens mvc __CLOCK_IDLE_ENTER(8,%r2),__CLOCK_IDLE_EXIT(%r2) 14494bfc86ceSHeiko Carstens mvc __TIMER_IDLE_ENTER(8,%r2),__TIMER_IDLE_EXIT(%r2) 145072d38b19SMartin Schwidefsky1: # calculate idle cycles 145172d38b19SMartin Schwidefsky#ifdef CONFIG_SMP 145272d38b19SMartin Schwidefsky clg %r9,BASED(.Lcleanup_idle_insn) 145372d38b19SMartin Schwidefsky jl 3f 145472d38b19SMartin Schwidefsky larl %r1,smp_cpu_mtid 145572d38b19SMartin Schwidefsky llgf %r1,0(%r1) 145672d38b19SMartin Schwidefsky ltgr %r1,%r1 145772d38b19SMartin Schwidefsky jz 3f 145872d38b19SMartin Schwidefsky .insn rsy,0xeb0000000017,%r1,5,__SF_EMPTY+80(%r15) 145972d38b19SMartin Schwidefsky larl %r3,mt_cycles 146072d38b19SMartin Schwidefsky ag %r3,__LC_PERCPU_OFFSET 146172d38b19SMartin Schwidefsky la %r4,__SF_EMPTY+16(%r15) 146272d38b19SMartin Schwidefsky2: lg %r0,0(%r3) 146372d38b19SMartin Schwidefsky slg %r0,0(%r4) 146472d38b19SMartin Schwidefsky alg %r0,64(%r4) 146572d38b19SMartin Schwidefsky stg %r0,0(%r3) 146672d38b19SMartin Schwidefsky la %r3,8(%r3) 146772d38b19SMartin Schwidefsky la %r4,8(%r4) 146872d38b19SMartin Schwidefsky brct %r1,2b 146972d38b19SMartin Schwidefsky#endif 147072d38b19SMartin Schwidefsky3: # account system time going idle 14714bfc86ceSHeiko Carstens lg %r9,__LC_STEAL_TIMER 14724bfc86ceSHeiko Carstens alg %r9,__CLOCK_IDLE_ENTER(%r2) 14734bfc86ceSHeiko Carstens slg %r9,__LC_LAST_UPDATE_CLOCK 14744bfc86ceSHeiko Carstens stg %r9,__LC_STEAL_TIMER 14754bfc86ceSHeiko Carstens mvc __LC_LAST_UPDATE_CLOCK(8),__CLOCK_IDLE_EXIT(%r2) 14764bfc86ceSHeiko Carstens lg %r9,__LC_SYSTEM_TIMER 14774bfc86ceSHeiko Carstens alg %r9,__LC_LAST_UPDATE_TIMER 14784bfc86ceSHeiko Carstens slg %r9,__TIMER_IDLE_ENTER(%r2) 14794bfc86ceSHeiko Carstens stg %r9,__LC_SYSTEM_TIMER 14804bfc86ceSHeiko Carstens mvc __LC_LAST_UPDATE_TIMER(8),__TIMER_IDLE_EXIT(%r2) 14814bfc86ceSHeiko Carstens # prepare return psw 14824bfc86ceSHeiko Carstens nihh %r8,0xfcfd # clear irq & wait state bits 14834bfc86ceSHeiko Carstens lg %r9,48(%r11) # return from psw_idle 14846dd85fbbSMartin Schwidefsky BR_EX %r14,%r11 14854bfc86ceSHeiko Carstens.Lcleanup_idle_insn: 14864bfc86ceSHeiko Carstens .quad .Lpsw_idle_lpsw 14874bfc86ceSHeiko Carstens 14889977e886SHendrik Brueckner.Lcleanup_save_fpu_regs: 1489e370e476SMartin Schwidefsky larl %r9,save_fpu_regs 14906dd85fbbSMartin Schwidefsky BR_EX %r14,%r11 14919977e886SHendrik Brueckner 14929977e886SHendrik Brueckner.Lcleanup_load_fpu_regs: 1493e370e476SMartin Schwidefsky larl %r9,load_fpu_regs 14946dd85fbbSMartin Schwidefsky BR_EX %r14,%r11 14959977e886SHendrik Brueckner 14964bfc86ceSHeiko Carstens/* 14974bfc86ceSHeiko Carstens * Integer constants 14984bfc86ceSHeiko Carstens */ 14994bfc86ceSHeiko Carstens .align 8 15004bfc86ceSHeiko Carstens.Lcritical_start: 15014bfc86ceSHeiko Carstens .quad .L__critical_start 15024bfc86ceSHeiko Carstens.Lcritical_length: 15034bfc86ceSHeiko Carstens .quad .L__critical_end - .L__critical_start 15044bfc86ceSHeiko Carstens#if IS_ENABLED(CONFIG_KVM) 1505d0fc4107SMartin Schwidefsky.Lsie_critical_start: 15064bfc86ceSHeiko Carstens .quad .Lsie_gmap 15074bfc86ceSHeiko Carstens.Lsie_critical_length: 15084bfc86ceSHeiko Carstens .quad .Lsie_done - .Lsie_gmap 1509c929500dSQingFeng Hao.Lsie_crit_mcck_start: 1510c929500dSQingFeng Hao .quad .Lsie_entry 1511c929500dSQingFeng Hao.Lsie_crit_mcck_length: 1512c929500dSQingFeng Hao .quad .Lsie_skip - .Lsie_entry 15134bfc86ceSHeiko Carstens#endif 15144bfc86ceSHeiko Carstens .section .rodata, "a" 1515a876cb3fSHeiko Carstens#define SYSCALL(esame,emu) .long esame 15164bfc86ceSHeiko Carstens .globl sys_call_table 15174bfc86ceSHeiko Carstenssys_call_table: 15184381f9f1SHendrik Brueckner#include "asm/syscall_table.h" 15194bfc86ceSHeiko Carstens#undef SYSCALL 15204bfc86ceSHeiko Carstens 15214bfc86ceSHeiko Carstens#ifdef CONFIG_COMPAT 15224bfc86ceSHeiko Carstens 1523a876cb3fSHeiko Carstens#define SYSCALL(esame,emu) .long emu 15244bfc86ceSHeiko Carstens .globl sys_call_table_emu 15254bfc86ceSHeiko Carstenssys_call_table_emu: 15264381f9f1SHendrik Brueckner#include "asm/syscall_table.h" 15274bfc86ceSHeiko Carstens#undef SYSCALL 15284bfc86ceSHeiko Carstens#endif 1529