| .. | .. |
|---|
| 52 | 52 | STACK_INIT = STACK_SIZE - STACK_FRAME_OVERHEAD - __PT_SIZE |
|---|
| 53 | 53 | |
|---|
| 54 | 54 | _TIF_WORK = (_TIF_SIGPENDING | _TIF_NOTIFY_RESUME | _TIF_NEED_RESCHED | \ |
|---|
| 55 | | - _TIF_UPROBE | _TIF_GUARDED_STORAGE | _TIF_PATCH_PENDING) |
|---|
| 55 | + _TIF_UPROBE | _TIF_GUARDED_STORAGE | _TIF_PATCH_PENDING | \ |
|---|
| 56 | + _TIF_NOTIFY_SIGNAL) |
|---|
| 56 | 57 | _TIF_TRACE = (_TIF_SYSCALL_TRACE | _TIF_SYSCALL_AUDIT | _TIF_SECCOMP | \ |
|---|
| 57 | 58 | _TIF_SYSCALL_TRACEPOINT) |
|---|
| 58 | | -_CIF_WORK = (_CIF_MCCK_PENDING | _CIF_ASCE_PRIMARY | \ |
|---|
| 59 | | - _CIF_ASCE_SECONDARY | _CIF_FPU) |
|---|
| 59 | +_CIF_WORK = (_CIF_ASCE_PRIMARY | _CIF_ASCE_SECONDARY | _CIF_FPU) |
|---|
| 60 | 60 | _PIF_WORK = (_PIF_PER_TRAP | _PIF_SYSCALL_RESTART) |
|---|
| 61 | 61 | |
|---|
| 62 | 62 | _LPP_OFFSET = __LC_LPP |
|---|
| 63 | | - |
|---|
| 64 | | -#define BASED(name) name-cleanup_critical(%r13) |
|---|
| 65 | 63 | |
|---|
| 66 | 64 | .macro TRACE_IRQS_ON |
|---|
| 67 | 65 | #ifdef CONFIG_TRACE_IRQFLAGS |
|---|
| .. | .. |
|---|
| 85 | 83 | #endif |
|---|
| 86 | 84 | .endm |
|---|
| 87 | 85 | |
|---|
| 88 | | - .macro CHECK_STACK stacksize,savearea |
|---|
| 86 | + .macro CHECK_STACK savearea |
|---|
| 89 | 87 | #ifdef CONFIG_CHECK_STACK |
|---|
| 90 | | - tml %r15,\stacksize - CONFIG_STACK_GUARD |
|---|
| 88 | + tml %r15,STACK_SIZE - CONFIG_STACK_GUARD |
|---|
| 91 | 89 | lghi %r14,\savearea |
|---|
| 92 | 90 | jz stack_overflow |
|---|
| 93 | 91 | #endif |
|---|
| 94 | 92 | .endm |
|---|
| 95 | 93 | |
|---|
| 96 | | - .macro SWITCH_ASYNC savearea,timer |
|---|
| 94 | + .macro CHECK_VMAP_STACK savearea,oklabel |
|---|
| 95 | +#ifdef CONFIG_VMAP_STACK |
|---|
| 96 | + lgr %r14,%r15 |
|---|
| 97 | + nill %r14,0x10000 - STACK_SIZE |
|---|
| 98 | + oill %r14,STACK_INIT |
|---|
| 99 | + clg %r14,__LC_KERNEL_STACK |
|---|
| 100 | + je \oklabel |
|---|
| 101 | + clg %r14,__LC_ASYNC_STACK |
|---|
| 102 | + je \oklabel |
|---|
| 103 | + clg %r14,__LC_NODAT_STACK |
|---|
| 104 | + je \oklabel |
|---|
| 105 | + clg %r14,__LC_RESTART_STACK |
|---|
| 106 | + je \oklabel |
|---|
| 107 | + lghi %r14,\savearea |
|---|
| 108 | + j stack_overflow |
|---|
| 109 | +#else |
|---|
| 110 | + j \oklabel |
|---|
| 111 | +#endif |
|---|
| 112 | + .endm |
|---|
| 113 | + |
|---|
| 114 | + .macro SWITCH_ASYNC savearea,timer,clock |
|---|
| 97 | 115 | tmhh %r8,0x0001 # interrupting from user ? |
|---|
| 98 | | - jnz 1f |
|---|
| 116 | + jnz 4f |
|---|
| 117 | +#if IS_ENABLED(CONFIG_KVM) |
|---|
| 99 | 118 | lgr %r14,%r9 |
|---|
| 100 | | - slg %r14,BASED(.Lcritical_start) |
|---|
| 101 | | - clg %r14,BASED(.Lcritical_length) |
|---|
| 119 | + larl %r13,.Lsie_gmap |
|---|
| 120 | + slgr %r14,%r13 |
|---|
| 121 | + lghi %r13,.Lsie_done - .Lsie_gmap |
|---|
| 122 | + clgr %r14,%r13 |
|---|
| 102 | 123 | jhe 0f |
|---|
| 103 | 124 | lghi %r11,\savearea # inside critical section, do cleanup |
|---|
| 104 | | - brasl %r14,cleanup_critical |
|---|
| 105 | | - tmhh %r8,0x0001 # retest problem state after cleanup |
|---|
| 106 | | - jnz 1f |
|---|
| 107 | | -0: lg %r14,__LC_ASYNC_STACK # are we already on the async stack? |
|---|
| 125 | + brasl %r14,.Lcleanup_sie |
|---|
| 126 | +#endif |
|---|
| 127 | +0: larl %r13,.Lpsw_idle_exit |
|---|
| 128 | + cgr %r13,%r9 |
|---|
| 129 | + jne 3f |
|---|
| 130 | + |
|---|
| 131 | + larl %r1,smp_cpu_mtid |
|---|
| 132 | + llgf %r1,0(%r1) |
|---|
| 133 | + ltgr %r1,%r1 |
|---|
| 134 | + jz 2f # no SMT, skip mt_cycles calculation |
|---|
| 135 | + .insn rsy,0xeb0000000017,%r1,5,__SF_EMPTY+80(%r15) |
|---|
| 136 | + larl %r3,mt_cycles |
|---|
| 137 | + ag %r3,__LC_PERCPU_OFFSET |
|---|
| 138 | + la %r4,__SF_EMPTY+16(%r15) |
|---|
| 139 | +1: lg %r0,0(%r3) |
|---|
| 140 | + slg %r0,0(%r4) |
|---|
| 141 | + alg %r0,64(%r4) |
|---|
| 142 | + stg %r0,0(%r3) |
|---|
| 143 | + la %r3,8(%r3) |
|---|
| 144 | + la %r4,8(%r4) |
|---|
| 145 | + brct %r1,1b |
|---|
| 146 | + |
|---|
| 147 | +2: mvc __CLOCK_IDLE_EXIT(8,%r2), \clock |
|---|
| 148 | + mvc __TIMER_IDLE_EXIT(8,%r2), \timer |
|---|
| 149 | + # account system time going idle |
|---|
| 150 | + ni __LC_CPU_FLAGS+7,255-_CIF_ENABLED_WAIT |
|---|
| 151 | + |
|---|
| 152 | + lg %r13,__LC_STEAL_TIMER |
|---|
| 153 | + alg %r13,__CLOCK_IDLE_ENTER(%r2) |
|---|
| 154 | + slg %r13,__LC_LAST_UPDATE_CLOCK |
|---|
| 155 | + stg %r13,__LC_STEAL_TIMER |
|---|
| 156 | + |
|---|
| 157 | + mvc __LC_LAST_UPDATE_CLOCK(8),__CLOCK_IDLE_EXIT(%r2) |
|---|
| 158 | + |
|---|
| 159 | + lg %r13,__LC_SYSTEM_TIMER |
|---|
| 160 | + alg %r13,__LC_LAST_UPDATE_TIMER |
|---|
| 161 | + slg %r13,__TIMER_IDLE_ENTER(%r2) |
|---|
| 162 | + stg %r13,__LC_SYSTEM_TIMER |
|---|
| 163 | + mvc __LC_LAST_UPDATE_TIMER(8),__TIMER_IDLE_EXIT(%r2) |
|---|
| 164 | + |
|---|
| 165 | + nihh %r8,0xfcfd # clear wait state and irq bits |
|---|
| 166 | +3: lg %r14,__LC_ASYNC_STACK # are we already on the target stack? |
|---|
| 108 | 167 | slgr %r14,%r15 |
|---|
| 109 | 168 | srag %r14,%r14,STACK_SHIFT |
|---|
| 110 | | - jnz 2f |
|---|
| 111 | | - CHECK_STACK 1<<STACK_SHIFT,\savearea |
|---|
| 169 | + jnz 5f |
|---|
| 170 | + CHECK_STACK \savearea |
|---|
| 112 | 171 | aghi %r15,-(STACK_FRAME_OVERHEAD + __PT_SIZE) |
|---|
| 113 | | - j 3f |
|---|
| 114 | | -1: UPDATE_VTIME %r14,%r15,\timer |
|---|
| 172 | + j 6f |
|---|
| 173 | +4: UPDATE_VTIME %r14,%r15,\timer |
|---|
| 115 | 174 | BPENTER __TI_flags(%r12),_TIF_ISOLATE_BP |
|---|
| 116 | | -2: lg %r15,__LC_ASYNC_STACK # load async stack |
|---|
| 117 | | -3: la %r11,STACK_FRAME_OVERHEAD(%r15) |
|---|
| 175 | +5: lg %r15,__LC_ASYNC_STACK # load async stack |
|---|
| 176 | +6: la %r11,STACK_FRAME_OVERHEAD(%r15) |
|---|
| 118 | 177 | .endm |
|---|
| 119 | 178 | |
|---|
| 120 | 179 | .macro UPDATE_VTIME w1,w2,enter_timer |
|---|
| .. | .. |
|---|
| 129 | 188 | mvc __LC_LAST_UPDATE_TIMER(8),\enter_timer |
|---|
| 130 | 189 | .endm |
|---|
| 131 | 190 | |
|---|
| 132 | | - .macro REENABLE_IRQS |
|---|
| 191 | + .macro RESTORE_SM_CLEAR_PER |
|---|
| 133 | 192 | stg %r8,__LC_RETURN_PSW |
|---|
| 134 | 193 | ni __LC_RETURN_PSW,0xbf |
|---|
| 135 | 194 | ssm __LC_RETURN_PSW |
|---|
| 195 | + .endm |
|---|
| 196 | + |
|---|
| 197 | + .macro ENABLE_INTS |
|---|
| 198 | + stosm __SF_EMPTY(%r15),3 |
|---|
| 199 | + .endm |
|---|
| 200 | + |
|---|
| 201 | + .macro ENABLE_INTS_TRACE |
|---|
| 202 | + TRACE_IRQS_ON |
|---|
| 203 | + ENABLE_INTS |
|---|
| 204 | + .endm |
|---|
| 205 | + |
|---|
| 206 | + .macro DISABLE_INTS |
|---|
| 207 | + stnsm __SF_EMPTY(%r15),0xfc |
|---|
| 208 | + .endm |
|---|
| 209 | + |
|---|
| 210 | + .macro DISABLE_INTS_TRACE |
|---|
| 211 | + DISABLE_INTS |
|---|
| 212 | + TRACE_IRQS_OFF |
|---|
| 136 | 213 | .endm |
|---|
| 137 | 214 | |
|---|
| 138 | 215 | .macro STCK savearea |
|---|
| .. | .. |
|---|
| 204 | 281 | .globl __bpon |
|---|
| 205 | 282 | BPON |
|---|
| 206 | 283 | BR_EX %r14 |
|---|
| 284 | +ENDPROC(__bpon) |
|---|
| 207 | 285 | |
|---|
| 208 | 286 | /* |
|---|
| 209 | 287 | * Scheduler resume function, called by switch_to |
|---|
| .. | .. |
|---|
| 216 | 294 | stmg %r6,%r15,__SF_GPRS(%r15) # store gprs of prev task |
|---|
| 217 | 295 | lghi %r4,__TASK_stack |
|---|
| 218 | 296 | lghi %r1,__TASK_thread |
|---|
| 219 | | - lg %r5,0(%r4,%r3) # start of kernel stack of next |
|---|
| 297 | + llill %r5,STACK_INIT |
|---|
| 220 | 298 | stg %r15,__THREAD_ksp(%r1,%r2) # store kernel stack of prev |
|---|
| 221 | | - lgr %r15,%r5 |
|---|
| 222 | | - aghi %r15,STACK_INIT # end of kernel stack of next |
|---|
| 299 | + lg %r15,0(%r4,%r3) # start of kernel stack of next |
|---|
| 300 | + agr %r15,%r5 # end of kernel stack of next |
|---|
| 223 | 301 | stg %r3,__LC_CURRENT # store task struct of next |
|---|
| 224 | 302 | stg %r15,__LC_KERNEL_STACK # store end of kernel stack |
|---|
| 225 | 303 | lg %r15,__THREAD_ksp(%r1,%r3) # load kernel stack of next |
|---|
| .. | .. |
|---|
| 228 | 306 | lmg %r6,%r15,__SF_GPRS(%r15) # load gprs of next task |
|---|
| 229 | 307 | ALTERNATIVE "", ".insn s,0xb2800000,_LPP_OFFSET", 40 |
|---|
| 230 | 308 | BR_EX %r14 |
|---|
| 231 | | - |
|---|
| 232 | | -.L__critical_start: |
|---|
| 309 | +ENDPROC(__switch_to) |
|---|
| 233 | 310 | |
|---|
| 234 | 311 | #if IS_ENABLED(CONFIG_KVM) |
|---|
| 235 | 312 | /* |
|---|
| .. | .. |
|---|
| 263 | 340 | BPEXIT __SF_SIE_FLAGS(%r15),(_TIF_ISOLATE_BP|_TIF_ISOLATE_BP_GUEST) |
|---|
| 264 | 341 | .Lsie_entry: |
|---|
| 265 | 342 | sie 0(%r14) |
|---|
| 266 | | -.Lsie_exit: |
|---|
| 267 | 343 | BPOFF |
|---|
| 268 | 344 | BPENTER __SF_SIE_FLAGS(%r15),(_TIF_ISOLATE_BP|_TIF_ISOLATE_BP_GUEST) |
|---|
| 269 | 345 | .Lsie_skip: |
|---|
| .. | .. |
|---|
| 304 | 380 | EX_TABLE(.Lrewind_pad4,.Lsie_fault) |
|---|
| 305 | 381 | EX_TABLE(.Lrewind_pad2,.Lsie_fault) |
|---|
| 306 | 382 | EX_TABLE(sie_exit,.Lsie_fault) |
|---|
| 383 | +ENDPROC(sie64a) |
|---|
| 307 | 384 | EXPORT_SYMBOL(sie64a) |
|---|
| 308 | 385 | EXPORT_SYMBOL(sie_exit) |
|---|
| 309 | 386 | #endif |
|---|
| 310 | 387 | |
|---|
| 311 | 388 | /* |
|---|
| 312 | 389 | * SVC interrupt handler routine. System calls are synchronous events and |
|---|
| 313 | | - * are executed with interrupts enabled. |
|---|
| 390 | + * are entered with interrupts disabled. |
|---|
| 314 | 391 | */ |
|---|
| 315 | 392 | |
|---|
| 316 | 393 | ENTRY(system_call) |
|---|
| 317 | 394 | stpt __LC_SYNC_ENTER_TIMER |
|---|
| 318 | | -.Lsysc_stmg: |
|---|
| 319 | 395 | stmg %r8,%r15,__LC_SAVE_AREA_SYNC |
|---|
| 320 | 396 | BPOFF |
|---|
| 321 | 397 | lg %r12,__LC_CURRENT |
|---|
| 322 | | - lghi %r13,__TASK_thread |
|---|
| 323 | 398 | lghi %r14,_PIF_SYSCALL |
|---|
| 324 | 399 | .Lsysc_per: |
|---|
| 400 | + lghi %r13,__TASK_thread |
|---|
| 325 | 401 | lg %r15,__LC_KERNEL_STACK |
|---|
| 326 | 402 | la %r11,STACK_FRAME_OVERHEAD(%r15) # pointer to pt_regs |
|---|
| 327 | | -.Lsysc_vtime: |
|---|
| 328 | 403 | UPDATE_VTIME %r8,%r9,__LC_SYNC_ENTER_TIMER |
|---|
| 329 | 404 | BPENTER __TI_flags(%r12),_TIF_ISOLATE_BP |
|---|
| 330 | 405 | stmg %r0,%r7,__PT_R0(%r11) |
|---|
| .. | .. |
|---|
| 332 | 407 | mvc __PT_PSW(16,%r11),__LC_SVC_OLD_PSW |
|---|
| 333 | 408 | mvc __PT_INT_CODE(4,%r11),__LC_SVC_ILC |
|---|
| 334 | 409 | stg %r14,__PT_FLAGS(%r11) |
|---|
| 410 | + xc __SF_BACKCHAIN(8,%r15),__SF_BACKCHAIN(%r15) |
|---|
| 411 | + ENABLE_INTS |
|---|
| 335 | 412 | .Lsysc_do_svc: |
|---|
| 336 | 413 | # clear user controlled register to prevent speculative use |
|---|
| 337 | 414 | xgr %r0,%r0 |
|---|
| 338 | 415 | # load address of system call table |
|---|
| 339 | 416 | lg %r10,__THREAD_sysc_table(%r13,%r12) |
|---|
| 340 | 417 | llgh %r8,__PT_INT_CODE+2(%r11) |
|---|
| 341 | | - slag %r8,%r8,2 # shift and test for svc 0 |
|---|
| 418 | + slag %r8,%r8,3 # shift and test for svc 0 |
|---|
| 342 | 419 | jnz .Lsysc_nr_ok |
|---|
| 343 | 420 | # svc 0: system call number in %r1 |
|---|
| 344 | 421 | llgfr %r1,%r1 # clear high word in r1 |
|---|
| 422 | + sth %r1,__PT_INT_CODE+2(%r11) |
|---|
| 345 | 423 | cghi %r1,NR_syscalls |
|---|
| 346 | 424 | jnl .Lsysc_nr_ok |
|---|
| 347 | | - sth %r1,__PT_INT_CODE+2(%r11) |
|---|
| 348 | | - slag %r8,%r1,2 |
|---|
| 425 | + slag %r8,%r1,3 |
|---|
| 349 | 426 | .Lsysc_nr_ok: |
|---|
| 350 | | - xc __SF_BACKCHAIN(8,%r15),__SF_BACKCHAIN(%r15) |
|---|
| 351 | 427 | stg %r2,__PT_ORIG_GPR2(%r11) |
|---|
| 352 | 428 | stg %r7,STACK_FRAME_OVERHEAD(%r15) |
|---|
| 353 | | - lgf %r9,0(%r8,%r10) # get system call add. |
|---|
| 429 | + lg %r9,0(%r8,%r10) # get system call add. |
|---|
| 354 | 430 | TSTMSK __TI_flags(%r12),_TIF_TRACE |
|---|
| 355 | 431 | jnz .Lsysc_tracesys |
|---|
| 356 | 432 | BASR_EX %r14,%r9 # call sys_xxxx |
|---|
| .. | .. |
|---|
| 363 | 439 | #endif |
|---|
| 364 | 440 | LOCKDEP_SYS_EXIT |
|---|
| 365 | 441 | .Lsysc_tif: |
|---|
| 442 | + DISABLE_INTS |
|---|
| 366 | 443 | TSTMSK __PT_FLAGS(%r11),_PIF_WORK |
|---|
| 367 | 444 | jnz .Lsysc_work |
|---|
| 368 | 445 | TSTMSK __TI_flags(%r12),_TIF_WORK |
|---|
| 369 | 446 | jnz .Lsysc_work # check for work |
|---|
| 370 | | - TSTMSK __LC_CPU_FLAGS,_CIF_WORK |
|---|
| 447 | + TSTMSK __LC_CPU_FLAGS,(_CIF_WORK-_CIF_FPU) |
|---|
| 371 | 448 | jnz .Lsysc_work |
|---|
| 372 | 449 | BPEXIT __TI_flags(%r12),_TIF_ISOLATE_BP |
|---|
| 373 | 450 | .Lsysc_restore: |
|---|
| 374 | | - lg %r14,__LC_VDSO_PER_CPU |
|---|
| 375 | | - lmg %r0,%r10,__PT_R0(%r11) |
|---|
| 451 | + DISABLE_INTS |
|---|
| 452 | + TSTMSK __LC_CPU_FLAGS, _CIF_FPU |
|---|
| 453 | + jz .Lsysc_skip_fpu |
|---|
| 454 | + brasl %r14,load_fpu_regs |
|---|
| 455 | +.Lsysc_skip_fpu: |
|---|
| 376 | 456 | mvc __LC_RETURN_PSW(16),__PT_PSW(%r11) |
|---|
| 377 | | -.Lsysc_exit_timer: |
|---|
| 378 | 457 | stpt __LC_EXIT_TIMER |
|---|
| 379 | | - mvc __VDSO_ECTG_BASE(16,%r14),__LC_EXIT_TIMER |
|---|
| 380 | | - lmg %r11,%r15,__PT_R11(%r11) |
|---|
| 381 | | - lpswe __LC_RETURN_PSW |
|---|
| 382 | | -.Lsysc_done: |
|---|
| 458 | + lmg %r0,%r15,__PT_R0(%r11) |
|---|
| 459 | + b __LC_RETURN_LPSWE |
|---|
| 383 | 460 | |
|---|
| 384 | 461 | # |
|---|
| 385 | 462 | # One of the work bits is on. Find out which one. |
|---|
| 386 | 463 | # |
|---|
| 387 | 464 | .Lsysc_work: |
|---|
| 388 | | - TSTMSK __LC_CPU_FLAGS,_CIF_MCCK_PENDING |
|---|
| 389 | | - jo .Lsysc_mcck_pending |
|---|
| 465 | + ENABLE_INTS |
|---|
| 390 | 466 | TSTMSK __TI_flags(%r12),_TIF_NEED_RESCHED |
|---|
| 391 | 467 | jo .Lsysc_reschedule |
|---|
| 392 | 468 | TSTMSK __PT_FLAGS(%r11),_PIF_SYSCALL_RESTART |
|---|
| .. | .. |
|---|
| 406 | 482 | #endif |
|---|
| 407 | 483 | TSTMSK __PT_FLAGS(%r11),_PIF_SYSCALL_RESTART |
|---|
| 408 | 484 | jo .Lsysc_syscall_restart |
|---|
| 409 | | - TSTMSK __TI_flags(%r12),_TIF_SIGPENDING |
|---|
| 410 | | - jo .Lsysc_sigpending |
|---|
| 485 | + TSTMSK __TI_flags(%r12),(_TIF_SIGPENDING|_TIF_NOTIFY_SIGNAL) |
|---|
| 486 | + jnz .Lsysc_sigpending |
|---|
| 411 | 487 | TSTMSK __TI_flags(%r12),_TIF_NOTIFY_RESUME |
|---|
| 412 | 488 | jo .Lsysc_notify_resume |
|---|
| 413 | | - TSTMSK __LC_CPU_FLAGS,_CIF_FPU |
|---|
| 414 | | - jo .Lsysc_vxrs |
|---|
| 415 | 489 | TSTMSK __LC_CPU_FLAGS,(_CIF_ASCE_PRIMARY|_CIF_ASCE_SECONDARY) |
|---|
| 416 | 490 | jnz .Lsysc_asce |
|---|
| 417 | | - j .Lsysc_return # beware of critical section cleanup |
|---|
| 491 | + j .Lsysc_return |
|---|
| 418 | 492 | |
|---|
| 419 | 493 | # |
|---|
| 420 | 494 | # _TIF_NEED_RESCHED is set, call schedule |
|---|
| .. | .. |
|---|
| 422 | 496 | .Lsysc_reschedule: |
|---|
| 423 | 497 | larl %r14,.Lsysc_return |
|---|
| 424 | 498 | jg schedule |
|---|
| 425 | | - |
|---|
| 426 | | -# |
|---|
| 427 | | -# _CIF_MCCK_PENDING is set, call handler |
|---|
| 428 | | -# |
|---|
| 429 | | -.Lsysc_mcck_pending: |
|---|
| 430 | | - larl %r14,.Lsysc_return |
|---|
| 431 | | - jg s390_handle_mcck # TIF bit will be cleared by handler |
|---|
| 432 | 499 | |
|---|
| 433 | 500 | # |
|---|
| 434 | 501 | # _CIF_ASCE_PRIMARY and/or _CIF_ASCE_SECONDARY set, load user space asce |
|---|
| .. | .. |
|---|
| 449 | 516 | larl %r14,.Lsysc_return |
|---|
| 450 | 517 | jg set_fs_fixup |
|---|
| 451 | 518 | |
|---|
| 452 | | -# |
|---|
| 453 | | -# CIF_FPU is set, restore floating-point controls and floating-point registers. |
|---|
| 454 | | -# |
|---|
| 455 | | -.Lsysc_vxrs: |
|---|
| 456 | | - larl %r14,.Lsysc_return |
|---|
| 457 | | - jg load_fpu_regs |
|---|
| 458 | 519 | |
|---|
| 459 | 520 | # |
|---|
| 460 | 521 | # _TIF_SIGPENDING is set, call do_signal |
|---|
| .. | .. |
|---|
| 536 | 597 | lghi %r0,NR_syscalls |
|---|
| 537 | 598 | clgr %r0,%r2 |
|---|
| 538 | 599 | jnh .Lsysc_tracenogo |
|---|
| 539 | | - sllg %r8,%r2,2 |
|---|
| 540 | | - lgf %r9,0(%r8,%r10) |
|---|
| 541 | | -.Lsysc_tracego: |
|---|
| 600 | + sllg %r8,%r2,3 |
|---|
| 601 | + lg %r9,0(%r8,%r10) |
|---|
| 542 | 602 | lmg %r3,%r7,__PT_R3(%r11) |
|---|
| 543 | 603 | stg %r7,STACK_FRAME_OVERHEAD(%r15) |
|---|
| 544 | 604 | lg %r2,__PT_ORIG_GPR2(%r11) |
|---|
| .. | .. |
|---|
| 550 | 610 | lgr %r2,%r11 # pass pointer to pt_regs |
|---|
| 551 | 611 | larl %r14,.Lsysc_return |
|---|
| 552 | 612 | jg do_syscall_trace_exit |
|---|
| 613 | +ENDPROC(system_call) |
|---|
| 553 | 614 | |
|---|
| 554 | 615 | # |
|---|
| 555 | 616 | # a new process exits the kernel with ret_from_fork |
|---|
| .. | .. |
|---|
| 558 | 619 | la %r11,STACK_FRAME_OVERHEAD(%r15) |
|---|
| 559 | 620 | lg %r12,__LC_CURRENT |
|---|
| 560 | 621 | brasl %r14,schedule_tail |
|---|
| 561 | | - TRACE_IRQS_ON |
|---|
| 562 | | - ssm __LC_SVC_NEW_PSW # reenable interrupts |
|---|
| 563 | 622 | tm __PT_PSW+1(%r11),0x01 # forking a kernel thread ? |
|---|
| 564 | 623 | jne .Lsysc_tracenogo |
|---|
| 565 | 624 | # it's a kernel thread |
|---|
| 566 | 625 | lmg %r9,%r10,__PT_R9(%r11) # load gprs |
|---|
| 626 | + la %r2,0(%r10) |
|---|
| 627 | + BASR_EX %r14,%r9 |
|---|
| 628 | + j .Lsysc_tracenogo |
|---|
| 629 | +ENDPROC(ret_from_fork) |
|---|
| 630 | + |
|---|
| 567 | 631 | ENTRY(kernel_thread_starter) |
|---|
| 568 | 632 | la %r2,0(%r10) |
|---|
| 569 | 633 | BASR_EX %r14,%r9 |
|---|
| 570 | 634 | j .Lsysc_tracenogo |
|---|
| 635 | +ENDPROC(kernel_thread_starter) |
|---|
| 571 | 636 | |
|---|
| 572 | 637 | /* |
|---|
| 573 | 638 | * Program check handler routine |
|---|
| .. | .. |
|---|
| 578 | 643 | BPOFF |
|---|
| 579 | 644 | stmg %r8,%r15,__LC_SAVE_AREA_SYNC |
|---|
| 580 | 645 | lg %r10,__LC_LAST_BREAK |
|---|
| 581 | | - lg %r12,__LC_CURRENT |
|---|
| 646 | + srag %r11,%r10,12 |
|---|
| 647 | + jnz 0f |
|---|
| 648 | + /* if __LC_LAST_BREAK is < 4096, it contains one of |
|---|
| 649 | + * the lpswe addresses in lowcore. Set it to 1 (initial state) |
|---|
| 650 | + * to prevent leaking that address to userspace. |
|---|
| 651 | + */ |
|---|
| 652 | + lghi %r10,1 |
|---|
| 653 | +0: lg %r12,__LC_CURRENT |
|---|
| 582 | 654 | lghi %r11,0 |
|---|
| 583 | | - larl %r13,cleanup_critical |
|---|
| 584 | 655 | lmg %r8,%r9,__LC_PGM_OLD_PSW |
|---|
| 585 | 656 | tmhh %r8,0x0001 # test problem state bit |
|---|
| 586 | | - jnz 2f # -> fault in user space |
|---|
| 657 | + jnz 3f # -> fault in user space |
|---|
| 587 | 658 | #if IS_ENABLED(CONFIG_KVM) |
|---|
| 588 | 659 | # cleanup critical section for program checks in sie64a |
|---|
| 589 | 660 | lgr %r14,%r9 |
|---|
| 590 | | - slg %r14,BASED(.Lsie_critical_start) |
|---|
| 591 | | - clg %r14,BASED(.Lsie_critical_length) |
|---|
| 592 | | - jhe 0f |
|---|
| 661 | + larl %r13,.Lsie_gmap |
|---|
| 662 | + slgr %r14,%r13 |
|---|
| 663 | + lghi %r13,.Lsie_done - .Lsie_gmap |
|---|
| 664 | + clgr %r14,%r13 |
|---|
| 665 | + jhe 1f |
|---|
| 593 | 666 | lg %r14,__SF_SIE_CONTROL(%r15) # get control block pointer |
|---|
| 594 | 667 | ni __SIE_PROG0C+3(%r14),0xfe # no longer in SIE |
|---|
| 595 | 668 | lctlg %c1,%c1,__LC_USER_ASCE # load primary asce |
|---|
| 596 | 669 | larl %r9,sie_exit # skip forward to sie_exit |
|---|
| 597 | 670 | lghi %r11,_PIF_GUEST_FAULT |
|---|
| 598 | 671 | #endif |
|---|
| 599 | | -0: tmhh %r8,0x4000 # PER bit set in old PSW ? |
|---|
| 600 | | - jnz 1f # -> enabled, can't be a double fault |
|---|
| 672 | +1: tmhh %r8,0x4000 # PER bit set in old PSW ? |
|---|
| 673 | + jnz 2f # -> enabled, can't be a double fault |
|---|
| 601 | 674 | tm __LC_PGM_ILC+3,0x80 # check for per exception |
|---|
| 602 | 675 | jnz .Lpgm_svcper # -> single stepped svc |
|---|
| 603 | | -1: CHECK_STACK STACK_SIZE,__LC_SAVE_AREA_SYNC |
|---|
| 676 | +2: CHECK_STACK __LC_SAVE_AREA_SYNC |
|---|
| 604 | 677 | aghi %r15,-(STACK_FRAME_OVERHEAD + __PT_SIZE) |
|---|
| 605 | | - j 4f |
|---|
| 606 | | -2: UPDATE_VTIME %r14,%r15,__LC_SYNC_ENTER_TIMER |
|---|
| 678 | + # CHECK_VMAP_STACK branches to stack_overflow or 5f |
|---|
| 679 | + CHECK_VMAP_STACK __LC_SAVE_AREA_SYNC,5f |
|---|
| 680 | +3: UPDATE_VTIME %r14,%r15,__LC_SYNC_ENTER_TIMER |
|---|
| 607 | 681 | BPENTER __TI_flags(%r12),_TIF_ISOLATE_BP |
|---|
| 608 | 682 | lg %r15,__LC_KERNEL_STACK |
|---|
| 609 | 683 | lgr %r14,%r12 |
|---|
| 610 | 684 | aghi %r14,__TASK_thread # pointer to thread_struct |
|---|
| 611 | 685 | lghi %r13,__LC_PGM_TDB |
|---|
| 612 | 686 | tm __LC_PGM_ILC+2,0x02 # check for transaction abort |
|---|
| 613 | | - jz 3f |
|---|
| 687 | + jz 4f |
|---|
| 614 | 688 | mvc __THREAD_trap_tdb(256,%r14),0(%r13) |
|---|
| 615 | | -3: stg %r10,__THREAD_last_break(%r14) |
|---|
| 616 | | -4: lgr %r13,%r11 |
|---|
| 689 | +4: stg %r10,__THREAD_last_break(%r14) |
|---|
| 690 | +5: lgr %r13,%r11 |
|---|
| 617 | 691 | la %r11,STACK_FRAME_OVERHEAD(%r15) |
|---|
| 618 | 692 | stmg %r0,%r7,__PT_R0(%r11) |
|---|
| 619 | 693 | # clear user controlled registers to prevent speculative use |
|---|
| .. | .. |
|---|
| 632 | 706 | stg %r13,__PT_FLAGS(%r11) |
|---|
| 633 | 707 | stg %r10,__PT_ARGS(%r11) |
|---|
| 634 | 708 | tm __LC_PGM_ILC+3,0x80 # check for per exception |
|---|
| 635 | | - jz 5f |
|---|
| 709 | + jz 6f |
|---|
| 636 | 710 | tmhh %r8,0x0001 # kernel per event ? |
|---|
| 637 | 711 | jz .Lpgm_kprobe |
|---|
| 638 | 712 | oi __PT_FLAGS+7(%r11),_PIF_PER_TRAP |
|---|
| 639 | 713 | mvc __THREAD_per_address(8,%r14),__LC_PER_ADDRESS |
|---|
| 640 | 714 | mvc __THREAD_per_cause(2,%r14),__LC_PER_CODE |
|---|
| 641 | 715 | mvc __THREAD_per_paid(1,%r14),__LC_PER_ACCESS_ID |
|---|
| 642 | | -5: REENABLE_IRQS |
|---|
| 643 | | - xc __SF_BACKCHAIN(8,%r15),__SF_BACKCHAIN(%r15) |
|---|
| 716 | +6: xc __SF_BACKCHAIN(8,%r15),__SF_BACKCHAIN(%r15) |
|---|
| 717 | + RESTORE_SM_CLEAR_PER |
|---|
| 644 | 718 | larl %r1,pgm_check_table |
|---|
| 645 | 719 | llgh %r10,__PT_INT_CODE+2(%r11) |
|---|
| 646 | 720 | nill %r10,0x007f |
|---|
| 647 | | - sll %r10,2 |
|---|
| 721 | + sll %r10,3 |
|---|
| 648 | 722 | je .Lpgm_return |
|---|
| 649 | | - lgf %r9,0(%r10,%r1) # load address of handler routine |
|---|
| 723 | + lg %r9,0(%r10,%r1) # load address of handler routine |
|---|
| 650 | 724 | lgr %r2,%r11 # pass pointer to pt_regs |
|---|
| 651 | 725 | BASR_EX %r14,%r9 # branch to interrupt-handler |
|---|
| 652 | 726 | .Lpgm_return: |
|---|
| .. | .. |
|---|
| 661 | 735 | # PER event in supervisor state, must be kprobes |
|---|
| 662 | 736 | # |
|---|
| 663 | 737 | .Lpgm_kprobe: |
|---|
| 664 | | - REENABLE_IRQS |
|---|
| 665 | 738 | xc __SF_BACKCHAIN(8,%r15),__SF_BACKCHAIN(%r15) |
|---|
| 739 | + RESTORE_SM_CLEAR_PER |
|---|
| 666 | 740 | lgr %r2,%r11 # pass pointer to pt_regs |
|---|
| 667 | 741 | brasl %r14,do_per_trap |
|---|
| 668 | 742 | j .Lpgm_return |
|---|
| .. | .. |
|---|
| 672 | 746 | # |
|---|
| 673 | 747 | .Lpgm_svcper: |
|---|
| 674 | 748 | mvc __LC_RETURN_PSW(8),__LC_SVC_NEW_PSW |
|---|
| 675 | | - lghi %r13,__TASK_thread |
|---|
| 676 | 749 | larl %r14,.Lsysc_per |
|---|
| 677 | 750 | stg %r14,__LC_RETURN_PSW+8 |
|---|
| 678 | 751 | lghi %r14,_PIF_SYSCALL | _PIF_PER_TRAP |
|---|
| 679 | | - lpswe __LC_RETURN_PSW # branch to .Lsysc_per and enable irqs |
|---|
| 752 | + lpswe __LC_RETURN_PSW # branch to .Lsysc_per |
|---|
| 753 | +ENDPROC(pgm_check_handler) |
|---|
| 680 | 754 | |
|---|
| 681 | 755 | /* |
|---|
| 682 | 756 | * IO interrupt handler routine |
|---|
| .. | .. |
|---|
| 687 | 761 | BPOFF |
|---|
| 688 | 762 | stmg %r8,%r15,__LC_SAVE_AREA_ASYNC |
|---|
| 689 | 763 | lg %r12,__LC_CURRENT |
|---|
| 690 | | - larl %r13,cleanup_critical |
|---|
| 691 | 764 | lmg %r8,%r9,__LC_IO_OLD_PSW |
|---|
| 692 | | - SWITCH_ASYNC __LC_SAVE_AREA_ASYNC,__LC_ASYNC_ENTER_TIMER |
|---|
| 765 | + SWITCH_ASYNC __LC_SAVE_AREA_ASYNC,__LC_ASYNC_ENTER_TIMER,__LC_INT_CLOCK |
|---|
| 693 | 766 | stmg %r0,%r7,__PT_R0(%r11) |
|---|
| 694 | 767 | # clear user controlled registers to prevent speculative use |
|---|
| 695 | 768 | xgr %r0,%r0 |
|---|
| .. | .. |
|---|
| 705 | 778 | stmg %r8,%r9,__PT_PSW(%r11) |
|---|
| 706 | 779 | mvc __PT_INT_CODE(12,%r11),__LC_SUBCHANNEL_ID |
|---|
| 707 | 780 | xc __PT_FLAGS(8,%r11),__PT_FLAGS(%r11) |
|---|
| 781 | + xc __SF_BACKCHAIN(8,%r15),__SF_BACKCHAIN(%r15) |
|---|
| 708 | 782 | TSTMSK __LC_CPU_FLAGS,_CIF_IGNORE_IRQ |
|---|
| 709 | 783 | jo .Lio_restore |
|---|
| 710 | 784 | TRACE_IRQS_OFF |
|---|
| 711 | | - xc __SF_BACKCHAIN(8,%r15),__SF_BACKCHAIN(%r15) |
|---|
| 712 | 785 | .Lio_loop: |
|---|
| 713 | 786 | lgr %r2,%r11 # pass pointer to pt_regs |
|---|
| 714 | 787 | lghi %r3,IO_INTERRUPT |
|---|
| .. | .. |
|---|
| 725 | 798 | j .Lio_loop |
|---|
| 726 | 799 | .Lio_return: |
|---|
| 727 | 800 | LOCKDEP_SYS_EXIT |
|---|
| 728 | | - TRACE_IRQS_ON |
|---|
| 729 | | -.Lio_tif: |
|---|
| 730 | 801 | TSTMSK __TI_flags(%r12),_TIF_WORK |
|---|
| 731 | 802 | jnz .Lio_work # there is work to do (signals etc.) |
|---|
| 732 | 803 | TSTMSK __LC_CPU_FLAGS,_CIF_WORK |
|---|
| 733 | 804 | jnz .Lio_work |
|---|
| 734 | 805 | .Lio_restore: |
|---|
| 735 | | - lg %r14,__LC_VDSO_PER_CPU |
|---|
| 736 | | - lmg %r0,%r10,__PT_R0(%r11) |
|---|
| 806 | + TRACE_IRQS_ON |
|---|
| 737 | 807 | mvc __LC_RETURN_PSW(16),__PT_PSW(%r11) |
|---|
| 738 | 808 | tm __PT_PSW+1(%r11),0x01 # returning to user ? |
|---|
| 739 | 809 | jno .Lio_exit_kernel |
|---|
| 740 | 810 | BPEXIT __TI_flags(%r12),_TIF_ISOLATE_BP |
|---|
| 741 | | -.Lio_exit_timer: |
|---|
| 742 | 811 | stpt __LC_EXIT_TIMER |
|---|
| 743 | | - mvc __VDSO_ECTG_BASE(16,%r14),__LC_EXIT_TIMER |
|---|
| 744 | 812 | .Lio_exit_kernel: |
|---|
| 745 | | - lmg %r11,%r15,__PT_R11(%r11) |
|---|
| 746 | | - lpswe __LC_RETURN_PSW |
|---|
| 813 | + lmg %r0,%r15,__PT_R0(%r11) |
|---|
| 814 | + b __LC_RETURN_LPSWE |
|---|
| 747 | 815 | .Lio_done: |
|---|
| 748 | 816 | |
|---|
| 749 | 817 | # |
|---|
| .. | .. |
|---|
| 758 | 826 | .Lio_work: |
|---|
| 759 | 827 | tm __PT_PSW+1(%r11),0x01 # returning to user ? |
|---|
| 760 | 828 | jo .Lio_work_user # yes -> do resched & signal |
|---|
| 761 | | -#ifdef CONFIG_PREEMPT |
|---|
| 829 | +#ifdef CONFIG_PREEMPTION |
|---|
| 762 | 830 | # check for preemptive scheduling |
|---|
| 763 | 831 | icm %r0,15,__LC_PREEMPT_COUNT |
|---|
| 764 | 832 | jnz .Lio_restore # preemption is disabled |
|---|
| .. | .. |
|---|
| 771 | 839 | xc __SF_BACKCHAIN(8,%r1),__SF_BACKCHAIN(%r1) |
|---|
| 772 | 840 | la %r11,STACK_FRAME_OVERHEAD(%r1) |
|---|
| 773 | 841 | lgr %r15,%r1 |
|---|
| 774 | | - # TRACE_IRQS_ON already done at .Lio_return, call |
|---|
| 775 | | - # TRACE_IRQS_OFF to keep things symmetrical |
|---|
| 776 | | - TRACE_IRQS_OFF |
|---|
| 777 | 842 | brasl %r14,preempt_schedule_irq |
|---|
| 778 | 843 | j .Lio_return |
|---|
| 779 | 844 | #else |
|---|
| .. | .. |
|---|
| 793 | 858 | # |
|---|
| 794 | 859 | # One of the work bits is on. Find out which one. |
|---|
| 795 | 860 | # |
|---|
| 796 | | -.Lio_work_tif: |
|---|
| 797 | | - TSTMSK __LC_CPU_FLAGS,_CIF_MCCK_PENDING |
|---|
| 798 | | - jo .Lio_mcck_pending |
|---|
| 799 | 861 | TSTMSK __TI_flags(%r12),_TIF_NEED_RESCHED |
|---|
| 800 | 862 | jo .Lio_reschedule |
|---|
| 801 | 863 | #ifdef CONFIG_LIVEPATCH |
|---|
| 802 | 864 | TSTMSK __TI_flags(%r12),_TIF_PATCH_PENDING |
|---|
| 803 | 865 | jo .Lio_patch_pending |
|---|
| 804 | 866 | #endif |
|---|
| 805 | | - TSTMSK __TI_flags(%r12),_TIF_SIGPENDING |
|---|
| 806 | | - jo .Lio_sigpending |
|---|
| 867 | + TSTMSK __TI_flags(%r12),(_TIF_SIGPENDING|_TIF_NOTIFY_SIGNAL) |
|---|
| 868 | + jnz .Lio_sigpending |
|---|
| 807 | 869 | TSTMSK __TI_flags(%r12),_TIF_NOTIFY_RESUME |
|---|
| 808 | 870 | jo .Lio_notify_resume |
|---|
| 809 | 871 | TSTMSK __TI_flags(%r12),_TIF_GUARDED_STORAGE |
|---|
| .. | .. |
|---|
| 812 | 874 | jo .Lio_vxrs |
|---|
| 813 | 875 | TSTMSK __LC_CPU_FLAGS,(_CIF_ASCE_PRIMARY|_CIF_ASCE_SECONDARY) |
|---|
| 814 | 876 | jnz .Lio_asce |
|---|
| 815 | | - j .Lio_return # beware of critical section cleanup |
|---|
| 816 | | - |
|---|
| 817 | | -# |
|---|
| 818 | | -# _CIF_MCCK_PENDING is set, call handler |
|---|
| 819 | | -# |
|---|
| 820 | | -.Lio_mcck_pending: |
|---|
| 821 | | - # TRACE_IRQS_ON already done at .Lio_return |
|---|
| 822 | | - brasl %r14,s390_handle_mcck # TIF bit will be cleared by handler |
|---|
| 823 | | - TRACE_IRQS_OFF |
|---|
| 824 | 877 | j .Lio_return |
|---|
| 825 | 878 | |
|---|
| 826 | 879 | # |
|---|
| .. | .. |
|---|
| 853 | 906 | # _TIF_GUARDED_STORAGE is set, call guarded_storage_load |
|---|
| 854 | 907 | # |
|---|
| 855 | 908 | .Lio_guarded_storage: |
|---|
| 856 | | - # TRACE_IRQS_ON already done at .Lio_return |
|---|
| 857 | | - ssm __LC_SVC_NEW_PSW # reenable interrupts |
|---|
| 909 | + ENABLE_INTS_TRACE |
|---|
| 858 | 910 | lgr %r2,%r11 # pass pointer to pt_regs |
|---|
| 859 | 911 | brasl %r14,gs_load_bc_cb |
|---|
| 860 | | - ssm __LC_PGM_NEW_PSW # disable I/O and ext. interrupts |
|---|
| 861 | | - TRACE_IRQS_OFF |
|---|
| 912 | + DISABLE_INTS_TRACE |
|---|
| 862 | 913 | j .Lio_return |
|---|
| 863 | 914 | |
|---|
| 864 | 915 | # |
|---|
| 865 | 916 | # _TIF_NEED_RESCHED is set, call schedule |
|---|
| 866 | 917 | # |
|---|
| 867 | 918 | .Lio_reschedule: |
|---|
| 868 | | - # TRACE_IRQS_ON already done at .Lio_return |
|---|
| 869 | | - ssm __LC_SVC_NEW_PSW # reenable interrupts |
|---|
| 919 | + ENABLE_INTS_TRACE |
|---|
| 870 | 920 | brasl %r14,schedule # call scheduler |
|---|
| 871 | | - ssm __LC_PGM_NEW_PSW # disable I/O and ext. interrupts |
|---|
| 872 | | - TRACE_IRQS_OFF |
|---|
| 921 | + DISABLE_INTS_TRACE |
|---|
| 873 | 922 | j .Lio_return |
|---|
| 874 | 923 | |
|---|
| 875 | 924 | # |
|---|
| .. | .. |
|---|
| 886 | 935 | # _TIF_SIGPENDING or is set, call do_signal |
|---|
| 887 | 936 | # |
|---|
| 888 | 937 | .Lio_sigpending: |
|---|
| 889 | | - # TRACE_IRQS_ON already done at .Lio_return |
|---|
| 890 | | - ssm __LC_SVC_NEW_PSW # reenable interrupts |
|---|
| 938 | + ENABLE_INTS_TRACE |
|---|
| 891 | 939 | lgr %r2,%r11 # pass pointer to pt_regs |
|---|
| 892 | 940 | brasl %r14,do_signal |
|---|
| 893 | | - ssm __LC_PGM_NEW_PSW # disable I/O and ext. interrupts |
|---|
| 894 | | - TRACE_IRQS_OFF |
|---|
| 941 | + DISABLE_INTS_TRACE |
|---|
| 895 | 942 | j .Lio_return |
|---|
| 896 | 943 | |
|---|
| 897 | 944 | # |
|---|
| 898 | 945 | # _TIF_NOTIFY_RESUME or is set, call do_notify_resume |
|---|
| 899 | 946 | # |
|---|
| 900 | 947 | .Lio_notify_resume: |
|---|
| 901 | | - # TRACE_IRQS_ON already done at .Lio_return |
|---|
| 902 | | - ssm __LC_SVC_NEW_PSW # reenable interrupts |
|---|
| 948 | + ENABLE_INTS_TRACE |
|---|
| 903 | 949 | lgr %r2,%r11 # pass pointer to pt_regs |
|---|
| 904 | 950 | brasl %r14,do_notify_resume |
|---|
| 905 | | - ssm __LC_PGM_NEW_PSW # disable I/O and ext. interrupts |
|---|
| 906 | | - TRACE_IRQS_OFF |
|---|
| 951 | + DISABLE_INTS_TRACE |
|---|
| 907 | 952 | j .Lio_return |
|---|
| 953 | +ENDPROC(io_int_handler) |
|---|
| 908 | 954 | |
|---|
| 909 | 955 | /* |
|---|
| 910 | 956 | * External interrupt handler routine |
|---|
| .. | .. |
|---|
| 915 | 961 | BPOFF |
|---|
| 916 | 962 | stmg %r8,%r15,__LC_SAVE_AREA_ASYNC |
|---|
| 917 | 963 | lg %r12,__LC_CURRENT |
|---|
| 918 | | - larl %r13,cleanup_critical |
|---|
| 919 | 964 | lmg %r8,%r9,__LC_EXT_OLD_PSW |
|---|
| 920 | | - SWITCH_ASYNC __LC_SAVE_AREA_ASYNC,__LC_ASYNC_ENTER_TIMER |
|---|
| 965 | + SWITCH_ASYNC __LC_SAVE_AREA_ASYNC,__LC_ASYNC_ENTER_TIMER,__LC_INT_CLOCK |
|---|
| 921 | 966 | stmg %r0,%r7,__PT_R0(%r11) |
|---|
| 922 | 967 | # clear user controlled registers to prevent speculative use |
|---|
| 923 | 968 | xgr %r0,%r0 |
|---|
| .. | .. |
|---|
| 936 | 981 | mvc __PT_INT_PARM(4,%r11),__LC_EXT_PARAMS |
|---|
| 937 | 982 | mvc __PT_INT_PARM_LONG(8,%r11),0(%r1) |
|---|
| 938 | 983 | xc __PT_FLAGS(8,%r11),__PT_FLAGS(%r11) |
|---|
| 984 | + xc __SF_BACKCHAIN(8,%r15),__SF_BACKCHAIN(%r15) |
|---|
| 939 | 985 | TSTMSK __LC_CPU_FLAGS,_CIF_IGNORE_IRQ |
|---|
| 940 | 986 | jo .Lio_restore |
|---|
| 941 | 987 | TRACE_IRQS_OFF |
|---|
| 942 | | - xc __SF_BACKCHAIN(8,%r15),__SF_BACKCHAIN(%r15) |
|---|
| 943 | 988 | lgr %r2,%r11 # pass pointer to pt_regs |
|---|
| 944 | 989 | lghi %r3,EXT_INTERRUPT |
|---|
| 945 | 990 | brasl %r14,do_IRQ |
|---|
| 946 | 991 | j .Lio_return |
|---|
| 992 | +ENDPROC(ext_int_handler) |
|---|
| 947 | 993 | |
|---|
| 948 | 994 | /* |
|---|
| 949 | | - * Load idle PSW. The second "half" of this function is in .Lcleanup_idle. |
|---|
| 995 | + * Load idle PSW. |
|---|
| 950 | 996 | */ |
|---|
| 951 | 997 | ENTRY(psw_idle) |
|---|
| 952 | 998 | stg %r14,(__SF_GPRS+8*8)(%r15) |
|---|
| 953 | 999 | stg %r3,__SF_EMPTY(%r15) |
|---|
| 954 | | - larl %r1,.Lpsw_idle_lpsw+4 |
|---|
| 1000 | + larl %r1,.Lpsw_idle_exit |
|---|
| 955 | 1001 | stg %r1,__SF_EMPTY+8(%r15) |
|---|
| 956 | | -#ifdef CONFIG_SMP |
|---|
| 957 | 1002 | larl %r1,smp_cpu_mtid |
|---|
| 958 | 1003 | llgf %r1,0(%r1) |
|---|
| 959 | 1004 | ltgr %r1,%r1 |
|---|
| 960 | 1005 | jz .Lpsw_idle_stcctm |
|---|
| 961 | 1006 | .insn rsy,0xeb0000000017,%r1,5,__SF_EMPTY+16(%r15) |
|---|
| 962 | 1007 | .Lpsw_idle_stcctm: |
|---|
| 963 | | -#endif |
|---|
| 964 | 1008 | oi __LC_CPU_FLAGS+7,_CIF_ENABLED_WAIT |
|---|
| 965 | 1009 | BPON |
|---|
| 966 | 1010 | STCK __CLOCK_IDLE_ENTER(%r2) |
|---|
| 967 | 1011 | stpt __TIMER_IDLE_ENTER(%r2) |
|---|
| 968 | | -.Lpsw_idle_lpsw: |
|---|
| 969 | 1012 | lpswe __SF_EMPTY(%r15) |
|---|
| 1013 | +.Lpsw_idle_exit: |
|---|
| 970 | 1014 | BR_EX %r14 |
|---|
| 971 | | -.Lpsw_idle_end: |
|---|
| 1015 | +ENDPROC(psw_idle) |
|---|
| 972 | 1016 | |
|---|
| 973 | 1017 | /* |
|---|
| 974 | 1018 | * Store floating-point controls and floating-point or vector register |
|---|
| .. | .. |
|---|
| 978 | 1022 | * of the register contents at return from io or a system call. |
|---|
| 979 | 1023 | */ |
|---|
| 980 | 1024 | ENTRY(save_fpu_regs) |
|---|
| 1025 | + stnsm __SF_EMPTY(%r15),0xfc |
|---|
| 981 | 1026 | lg %r2,__LC_CURRENT |
|---|
| 982 | 1027 | aghi %r2,__TASK_thread |
|---|
| 983 | 1028 | TSTMSK __LC_CPU_FLAGS,_CIF_FPU |
|---|
| .. | .. |
|---|
| 1009 | 1054 | .Lsave_fpu_regs_done: |
|---|
| 1010 | 1055 | oi __LC_CPU_FLAGS+7,_CIF_FPU |
|---|
| 1011 | 1056 | .Lsave_fpu_regs_exit: |
|---|
| 1057 | + ssm __SF_EMPTY(%r15) |
|---|
| 1012 | 1058 | BR_EX %r14 |
|---|
| 1013 | 1059 | .Lsave_fpu_regs_end: |
|---|
| 1060 | +ENDPROC(save_fpu_regs) |
|---|
| 1014 | 1061 | EXPORT_SYMBOL(save_fpu_regs) |
|---|
| 1015 | 1062 | |
|---|
| 1016 | 1063 | /* |
|---|
| .. | .. |
|---|
| 1024 | 1071 | * %r4 |
|---|
| 1025 | 1072 | */ |
|---|
| 1026 | 1073 | load_fpu_regs: |
|---|
| 1074 | + stnsm __SF_EMPTY(%r15),0xfc |
|---|
| 1027 | 1075 | lg %r4,__LC_CURRENT |
|---|
| 1028 | 1076 | aghi %r4,__TASK_thread |
|---|
| 1029 | 1077 | TSTMSK __LC_CPU_FLAGS,_CIF_FPU |
|---|
| .. | .. |
|---|
| 1055 | 1103 | .Lload_fpu_regs_done: |
|---|
| 1056 | 1104 | ni __LC_CPU_FLAGS+7,255-_CIF_FPU |
|---|
| 1057 | 1105 | .Lload_fpu_regs_exit: |
|---|
| 1106 | + ssm __SF_EMPTY(%r15) |
|---|
| 1058 | 1107 | BR_EX %r14 |
|---|
| 1059 | 1108 | .Lload_fpu_regs_end: |
|---|
| 1060 | | - |
|---|
| 1061 | | -.L__critical_end: |
|---|
| 1109 | +ENDPROC(load_fpu_regs) |
|---|
| 1062 | 1110 | |
|---|
| 1063 | 1111 | /* |
|---|
| 1064 | 1112 | * Machine check handler routines |
|---|
| .. | .. |
|---|
| 1072 | 1120 | lam %a0,%a15,__LC_AREGS_SAVE_AREA-4095(%r1) # validate acrs |
|---|
| 1073 | 1121 | lmg %r0,%r15,__LC_GPREGS_SAVE_AREA-4095(%r1)# validate gprs |
|---|
| 1074 | 1122 | lg %r12,__LC_CURRENT |
|---|
| 1075 | | - larl %r13,cleanup_critical |
|---|
| 1076 | 1123 | lmg %r8,%r9,__LC_MCK_OLD_PSW |
|---|
| 1077 | 1124 | TSTMSK __LC_MCCK_CODE,MCCK_CODE_SYSTEM_DAMAGE |
|---|
| 1078 | 1125 | jo .Lmcck_panic # yes -> rest of mcck code invalid |
|---|
| .. | .. |
|---|
| 1137 | 1184 | jnz 4f |
|---|
| 1138 | 1185 | TSTMSK __LC_MCCK_CODE,MCCK_CODE_PSW_IA_VALID |
|---|
| 1139 | 1186 | jno .Lmcck_panic |
|---|
| 1140 | | -4: SWITCH_ASYNC __LC_GPREGS_SAVE_AREA+64,__LC_MCCK_ENTER_TIMER |
|---|
| 1187 | +4: ssm __LC_PGM_NEW_PSW # turn dat on, keep irqs off |
|---|
| 1188 | + SWITCH_ASYNC __LC_GPREGS_SAVE_AREA+64,__LC_MCCK_ENTER_TIMER,__LC_MCCK_CLOCK |
|---|
| 1141 | 1189 | .Lmcck_skip: |
|---|
| 1142 | 1190 | lghi %r14,__LC_GPREGS_SAVE_AREA+64 |
|---|
| 1143 | 1191 | stmg %r0,%r7,__PT_R0(%r11) |
|---|
| .. | .. |
|---|
| 1157 | 1205 | xc __SF_BACKCHAIN(8,%r15),__SF_BACKCHAIN(%r15) |
|---|
| 1158 | 1206 | lgr %r2,%r11 # pass pointer to pt_regs |
|---|
| 1159 | 1207 | brasl %r14,s390_do_machine_check |
|---|
| 1160 | | - tm __PT_PSW+1(%r11),0x01 # returning to user ? |
|---|
| 1161 | | - jno .Lmcck_return |
|---|
| 1208 | + cghi %r2,0 |
|---|
| 1209 | + je .Lmcck_return |
|---|
| 1162 | 1210 | lg %r1,__LC_KERNEL_STACK # switch to kernel stack |
|---|
| 1163 | 1211 | mvc STACK_FRAME_OVERHEAD(__PT_SIZE,%r1),0(%r11) |
|---|
| 1164 | 1212 | xc __SF_BACKCHAIN(8,%r1),__SF_BACKCHAIN(%r1) |
|---|
| 1165 | 1213 | la %r11,STACK_FRAME_OVERHEAD(%r1) |
|---|
| 1166 | 1214 | lgr %r15,%r1 |
|---|
| 1167 | | - ssm __LC_PGM_NEW_PSW # turn dat on, keep irqs off |
|---|
| 1168 | | - TSTMSK __LC_CPU_FLAGS,_CIF_MCCK_PENDING |
|---|
| 1169 | | - jno .Lmcck_return |
|---|
| 1170 | 1215 | TRACE_IRQS_OFF |
|---|
| 1171 | 1216 | brasl %r14,s390_handle_mcck |
|---|
| 1172 | 1217 | TRACE_IRQS_ON |
|---|
| 1173 | 1218 | .Lmcck_return: |
|---|
| 1174 | | - lg %r14,__LC_VDSO_PER_CPU |
|---|
| 1175 | 1219 | lmg %r0,%r10,__PT_R0(%r11) |
|---|
| 1176 | 1220 | mvc __LC_RETURN_MCCK_PSW(16),__PT_PSW(%r11) # move return PSW |
|---|
| 1177 | 1221 | tm __LC_RETURN_MCCK_PSW+1,0x01 # returning to user ? |
|---|
| 1178 | 1222 | jno 0f |
|---|
| 1179 | 1223 | BPEXIT __TI_flags(%r12),_TIF_ISOLATE_BP |
|---|
| 1180 | 1224 | stpt __LC_EXIT_TIMER |
|---|
| 1181 | | - mvc __VDSO_ECTG_BASE(16,%r14),__LC_EXIT_TIMER |
|---|
| 1182 | 1225 | 0: lmg %r11,%r15,__PT_R11(%r11) |
|---|
| 1183 | | - lpswe __LC_RETURN_MCCK_PSW |
|---|
| 1226 | + b __LC_RETURN_MCCK_LPSWE |
|---|
| 1184 | 1227 | |
|---|
| 1185 | 1228 | .Lmcck_panic: |
|---|
| 1186 | | - lg %r15,__LC_PANIC_STACK |
|---|
| 1229 | + lg %r15,__LC_NODAT_STACK |
|---|
| 1187 | 1230 | la %r11,STACK_FRAME_OVERHEAD(%r15) |
|---|
| 1188 | 1231 | j .Lmcck_skip |
|---|
| 1232 | +ENDPROC(mcck_int_handler) |
|---|
| 1189 | 1233 | |
|---|
| 1190 | 1234 | # |
|---|
| 1191 | 1235 | # PSW restart interrupt handler |
|---|
| .. | .. |
|---|
| 1194 | 1238 | ALTERNATIVE "", ".insn s,0xb2800000,_LPP_OFFSET", 40 |
|---|
| 1195 | 1239 | stg %r15,__LC_SAVE_AREA_RESTART |
|---|
| 1196 | 1240 | lg %r15,__LC_RESTART_STACK |
|---|
| 1197 | | - aghi %r15,-__PT_SIZE # create pt_regs on stack |
|---|
| 1198 | | - xc 0(__PT_SIZE,%r15),0(%r15) |
|---|
| 1199 | | - stmg %r0,%r14,__PT_R0(%r15) |
|---|
| 1200 | | - mvc __PT_R15(8,%r15),__LC_SAVE_AREA_RESTART |
|---|
| 1201 | | - mvc __PT_PSW(16,%r15),__LC_RST_OLD_PSW # store restart old psw |
|---|
| 1202 | | - aghi %r15,-STACK_FRAME_OVERHEAD # create stack frame on stack |
|---|
| 1241 | + xc STACK_FRAME_OVERHEAD(__PT_SIZE,%r15),STACK_FRAME_OVERHEAD(%r15) |
|---|
| 1242 | + stmg %r0,%r14,STACK_FRAME_OVERHEAD+__PT_R0(%r15) |
|---|
| 1243 | + mvc STACK_FRAME_OVERHEAD+__PT_R15(8,%r15),__LC_SAVE_AREA_RESTART |
|---|
| 1244 | + mvc STACK_FRAME_OVERHEAD+__PT_PSW(16,%r15),__LC_RST_OLD_PSW |
|---|
| 1203 | 1245 | xc 0(STACK_FRAME_OVERHEAD,%r15),0(%r15) |
|---|
| 1204 | 1246 | lg %r1,__LC_RESTART_FN # load fn, parm & source cpu |
|---|
| 1205 | 1247 | lg %r2,__LC_RESTART_DATA |
|---|
| .. | .. |
|---|
| 1214 | 1256 | 2: sigp %r4,%r3,SIGP_STOP # sigp stop to current cpu |
|---|
| 1215 | 1257 | brc 2,2b |
|---|
| 1216 | 1258 | 3: j 3b |
|---|
| 1259 | +ENDPROC(restart_int_handler) |
|---|
| 1217 | 1260 | |
|---|
| 1218 | 1261 | .section .kprobes.text, "ax" |
|---|
| 1219 | 1262 | |
|---|
| 1220 | | -#ifdef CONFIG_CHECK_STACK |
|---|
| 1263 | +#if defined(CONFIG_CHECK_STACK) || defined(CONFIG_VMAP_STACK) |
|---|
| 1221 | 1264 | /* |
|---|
| 1222 | 1265 | * The synchronous or the asynchronous stack overflowed. We are dead. |
|---|
| 1223 | 1266 | * No need to properly save the registers, we are going to panic anyway. |
|---|
| 1224 | 1267 | * Setup a pt_regs so that show_trace can provide a good call trace. |
|---|
| 1225 | 1268 | */ |
|---|
| 1226 | | -stack_overflow: |
|---|
| 1227 | | - lg %r15,__LC_PANIC_STACK # change to panic stack |
|---|
| 1269 | +ENTRY(stack_overflow) |
|---|
| 1270 | + lg %r15,__LC_NODAT_STACK # change to panic stack |
|---|
| 1228 | 1271 | la %r11,STACK_FRAME_OVERHEAD(%r15) |
|---|
| 1229 | 1272 | stmg %r0,%r7,__PT_R0(%r11) |
|---|
| 1230 | 1273 | stmg %r8,%r9,__PT_PSW(%r11) |
|---|
| .. | .. |
|---|
| 1233 | 1276 | xc __SF_BACKCHAIN(8,%r15),__SF_BACKCHAIN(%r15) |
|---|
| 1234 | 1277 | lgr %r2,%r11 # pass pointer to pt_regs |
|---|
| 1235 | 1278 | jg kernel_stack_overflow |
|---|
| 1279 | +ENDPROC(stack_overflow) |
|---|
| 1236 | 1280 | #endif |
|---|
| 1237 | 1281 | |
|---|
| 1238 | | -cleanup_critical: |
|---|
| 1239 | 1282 | #if IS_ENABLED(CONFIG_KVM) |
|---|
| 1240 | | - clg %r9,BASED(.Lcleanup_table_sie) # .Lsie_gmap |
|---|
| 1241 | | - jl 0f |
|---|
| 1242 | | - clg %r9,BASED(.Lcleanup_table_sie+8)# .Lsie_done |
|---|
| 1243 | | - jl .Lcleanup_sie |
|---|
| 1244 | | -#endif |
|---|
| 1245 | | - clg %r9,BASED(.Lcleanup_table) # system_call |
|---|
| 1246 | | - jl 0f |
|---|
| 1247 | | - clg %r9,BASED(.Lcleanup_table+8) # .Lsysc_do_svc |
|---|
| 1248 | | - jl .Lcleanup_system_call |
|---|
| 1249 | | - clg %r9,BASED(.Lcleanup_table+16) # .Lsysc_tif |
|---|
| 1250 | | - jl 0f |
|---|
| 1251 | | - clg %r9,BASED(.Lcleanup_table+24) # .Lsysc_restore |
|---|
| 1252 | | - jl .Lcleanup_sysc_tif |
|---|
| 1253 | | - clg %r9,BASED(.Lcleanup_table+32) # .Lsysc_done |
|---|
| 1254 | | - jl .Lcleanup_sysc_restore |
|---|
| 1255 | | - clg %r9,BASED(.Lcleanup_table+40) # .Lio_tif |
|---|
| 1256 | | - jl 0f |
|---|
| 1257 | | - clg %r9,BASED(.Lcleanup_table+48) # .Lio_restore |
|---|
| 1258 | | - jl .Lcleanup_io_tif |
|---|
| 1259 | | - clg %r9,BASED(.Lcleanup_table+56) # .Lio_done |
|---|
| 1260 | | - jl .Lcleanup_io_restore |
|---|
| 1261 | | - clg %r9,BASED(.Lcleanup_table+64) # psw_idle |
|---|
| 1262 | | - jl 0f |
|---|
| 1263 | | - clg %r9,BASED(.Lcleanup_table+72) # .Lpsw_idle_end |
|---|
| 1264 | | - jl .Lcleanup_idle |
|---|
| 1265 | | - clg %r9,BASED(.Lcleanup_table+80) # save_fpu_regs |
|---|
| 1266 | | - jl 0f |
|---|
| 1267 | | - clg %r9,BASED(.Lcleanup_table+88) # .Lsave_fpu_regs_end |
|---|
| 1268 | | - jl .Lcleanup_save_fpu_regs |
|---|
| 1269 | | - clg %r9,BASED(.Lcleanup_table+96) # load_fpu_regs |
|---|
| 1270 | | - jl 0f |
|---|
| 1271 | | - clg %r9,BASED(.Lcleanup_table+104) # .Lload_fpu_regs_end |
|---|
| 1272 | | - jl .Lcleanup_load_fpu_regs |
|---|
| 1273 | | -0: BR_EX %r14,%r11 |
|---|
| 1274 | | - |
|---|
| 1275 | | - .align 8 |
|---|
| 1276 | | -.Lcleanup_table: |
|---|
| 1277 | | - .quad system_call |
|---|
| 1278 | | - .quad .Lsysc_do_svc |
|---|
| 1279 | | - .quad .Lsysc_tif |
|---|
| 1280 | | - .quad .Lsysc_restore |
|---|
| 1281 | | - .quad .Lsysc_done |
|---|
| 1282 | | - .quad .Lio_tif |
|---|
| 1283 | | - .quad .Lio_restore |
|---|
| 1284 | | - .quad .Lio_done |
|---|
| 1285 | | - .quad psw_idle |
|---|
| 1286 | | - .quad .Lpsw_idle_end |
|---|
| 1287 | | - .quad save_fpu_regs |
|---|
| 1288 | | - .quad .Lsave_fpu_regs_end |
|---|
| 1289 | | - .quad load_fpu_regs |
|---|
| 1290 | | - .quad .Lload_fpu_regs_end |
|---|
| 1291 | | - |
|---|
| 1292 | | -#if IS_ENABLED(CONFIG_KVM) |
|---|
| 1293 | | -.Lcleanup_table_sie: |
|---|
| 1294 | | - .quad .Lsie_gmap |
|---|
| 1295 | | - .quad .Lsie_done |
|---|
| 1296 | | - |
|---|
| 1297 | 1283 | .Lcleanup_sie: |
|---|
| 1298 | | - cghi %r11,__LC_SAVE_AREA_ASYNC #Is this in normal interrupt? |
|---|
| 1299 | | - je 1f |
|---|
| 1300 | | - slg %r9,BASED(.Lsie_crit_mcck_start) |
|---|
| 1301 | | - clg %r9,BASED(.Lsie_crit_mcck_length) |
|---|
| 1302 | | - jh 1f |
|---|
| 1303 | | - oi __LC_CPU_FLAGS+7, _CIF_MCCK_GUEST |
|---|
| 1304 | | -1: BPENTER __SF_SIE_FLAGS(%r15),(_TIF_ISOLATE_BP|_TIF_ISOLATE_BP_GUEST) |
|---|
| 1284 | + cghi %r11,__LC_SAVE_AREA_ASYNC #Is this in normal interrupt? |
|---|
| 1285 | + je 1f |
|---|
| 1286 | + larl %r13,.Lsie_entry |
|---|
| 1287 | + slgr %r9,%r13 |
|---|
| 1288 | + lghi %r13,.Lsie_skip - .Lsie_entry |
|---|
| 1289 | + clgr %r9,%r13 |
|---|
| 1290 | + jh 1f |
|---|
| 1291 | + oi __LC_CPU_FLAGS+7, _CIF_MCCK_GUEST |
|---|
| 1292 | +1: BPENTER __SF_SIE_FLAGS(%r15),(_TIF_ISOLATE_BP|_TIF_ISOLATE_BP_GUEST) |
|---|
| 1305 | 1293 | lg %r9,__SF_SIE_CONTROL(%r15) # get control block pointer |
|---|
| 1306 | 1294 | ni __SIE_PROG0C+3(%r9),0xfe # no longer in SIE |
|---|
| 1307 | 1295 | lctlg %c1,%c1,__LC_USER_ASCE # load primary asce |
|---|
| 1308 | 1296 | larl %r9,sie_exit # skip forward to sie_exit |
|---|
| 1309 | 1297 | BR_EX %r14,%r11 |
|---|
| 1310 | | -#endif |
|---|
| 1311 | 1298 | |
|---|
| 1312 | | -.Lcleanup_system_call: |
|---|
| 1313 | | - # check if stpt has been executed |
|---|
| 1314 | | - clg %r9,BASED(.Lcleanup_system_call_insn) |
|---|
| 1315 | | - jh 0f |
|---|
| 1316 | | - mvc __LC_SYNC_ENTER_TIMER(8),__LC_ASYNC_ENTER_TIMER |
|---|
| 1317 | | - cghi %r11,__LC_SAVE_AREA_ASYNC |
|---|
| 1318 | | - je 0f |
|---|
| 1319 | | - mvc __LC_SYNC_ENTER_TIMER(8),__LC_MCCK_ENTER_TIMER |
|---|
| 1320 | | -0: # check if stmg has been executed |
|---|
| 1321 | | - clg %r9,BASED(.Lcleanup_system_call_insn+8) |
|---|
| 1322 | | - jh 0f |
|---|
| 1323 | | - mvc __LC_SAVE_AREA_SYNC(64),0(%r11) |
|---|
| 1324 | | -0: # check if base register setup + TIF bit load has been done |
|---|
| 1325 | | - clg %r9,BASED(.Lcleanup_system_call_insn+16) |
|---|
| 1326 | | - jhe 0f |
|---|
| 1327 | | - # set up saved register r12 task struct pointer |
|---|
| 1328 | | - stg %r12,32(%r11) |
|---|
| 1329 | | - # set up saved register r13 __TASK_thread offset |
|---|
| 1330 | | - mvc 40(8,%r11),BASED(.Lcleanup_system_call_const) |
|---|
| 1331 | | -0: # check if the user time update has been done |
|---|
| 1332 | | - clg %r9,BASED(.Lcleanup_system_call_insn+24) |
|---|
| 1333 | | - jh 0f |
|---|
| 1334 | | - lg %r15,__LC_EXIT_TIMER |
|---|
| 1335 | | - slg %r15,__LC_SYNC_ENTER_TIMER |
|---|
| 1336 | | - alg %r15,__LC_USER_TIMER |
|---|
| 1337 | | - stg %r15,__LC_USER_TIMER |
|---|
| 1338 | | -0: # check if the system time update has been done |
|---|
| 1339 | | - clg %r9,BASED(.Lcleanup_system_call_insn+32) |
|---|
| 1340 | | - jh 0f |
|---|
| 1341 | | - lg %r15,__LC_LAST_UPDATE_TIMER |
|---|
| 1342 | | - slg %r15,__LC_EXIT_TIMER |
|---|
| 1343 | | - alg %r15,__LC_SYSTEM_TIMER |
|---|
| 1344 | | - stg %r15,__LC_SYSTEM_TIMER |
|---|
| 1345 | | -0: # update accounting time stamp |
|---|
| 1346 | | - mvc __LC_LAST_UPDATE_TIMER(8),__LC_SYNC_ENTER_TIMER |
|---|
| 1347 | | - BPENTER __TI_flags(%r12),_TIF_ISOLATE_BP |
|---|
| 1348 | | - # set up saved register r11 |
|---|
| 1349 | | - lg %r15,__LC_KERNEL_STACK |
|---|
| 1350 | | - la %r9,STACK_FRAME_OVERHEAD(%r15) |
|---|
| 1351 | | - stg %r9,24(%r11) # r11 pt_regs pointer |
|---|
| 1352 | | - # fill pt_regs |
|---|
| 1353 | | - mvc __PT_R8(64,%r9),__LC_SAVE_AREA_SYNC |
|---|
| 1354 | | - stmg %r0,%r7,__PT_R0(%r9) |
|---|
| 1355 | | - mvc __PT_PSW(16,%r9),__LC_SVC_OLD_PSW |
|---|
| 1356 | | - mvc __PT_INT_CODE(4,%r9),__LC_SVC_ILC |
|---|
| 1357 | | - xc __PT_FLAGS(8,%r9),__PT_FLAGS(%r9) |
|---|
| 1358 | | - mvi __PT_FLAGS+7(%r9),_PIF_SYSCALL |
|---|
| 1359 | | - # setup saved register r15 |
|---|
| 1360 | | - stg %r15,56(%r11) # r15 stack pointer |
|---|
| 1361 | | - # set new psw address and exit |
|---|
| 1362 | | - larl %r9,.Lsysc_do_svc |
|---|
| 1363 | | - BR_EX %r14,%r11 |
|---|
| 1364 | | -.Lcleanup_system_call_insn: |
|---|
| 1365 | | - .quad system_call |
|---|
| 1366 | | - .quad .Lsysc_stmg |
|---|
| 1367 | | - .quad .Lsysc_per |
|---|
| 1368 | | - .quad .Lsysc_vtime+36 |
|---|
| 1369 | | - .quad .Lsysc_vtime+42 |
|---|
| 1370 | | -.Lcleanup_system_call_const: |
|---|
| 1371 | | - .quad __TASK_thread |
|---|
| 1372 | | - |
|---|
| 1373 | | -.Lcleanup_sysc_tif: |
|---|
| 1374 | | - larl %r9,.Lsysc_tif |
|---|
| 1375 | | - BR_EX %r14,%r11 |
|---|
| 1376 | | - |
|---|
| 1377 | | -.Lcleanup_sysc_restore: |
|---|
| 1378 | | - # check if stpt has been executed |
|---|
| 1379 | | - clg %r9,BASED(.Lcleanup_sysc_restore_insn) |
|---|
| 1380 | | - jh 0f |
|---|
| 1381 | | - mvc __LC_EXIT_TIMER(8),__LC_ASYNC_ENTER_TIMER |
|---|
| 1382 | | - cghi %r11,__LC_SAVE_AREA_ASYNC |
|---|
| 1383 | | - je 0f |
|---|
| 1384 | | - mvc __LC_EXIT_TIMER(8),__LC_MCCK_ENTER_TIMER |
|---|
| 1385 | | -0: clg %r9,BASED(.Lcleanup_sysc_restore_insn+8) |
|---|
| 1386 | | - je 1f |
|---|
| 1387 | | - lg %r9,24(%r11) # get saved pointer to pt_regs |
|---|
| 1388 | | - mvc __LC_RETURN_PSW(16),__PT_PSW(%r9) |
|---|
| 1389 | | - mvc 0(64,%r11),__PT_R8(%r9) |
|---|
| 1390 | | - lmg %r0,%r7,__PT_R0(%r9) |
|---|
| 1391 | | -1: lmg %r8,%r9,__LC_RETURN_PSW |
|---|
| 1392 | | - BR_EX %r14,%r11 |
|---|
| 1393 | | -.Lcleanup_sysc_restore_insn: |
|---|
| 1394 | | - .quad .Lsysc_exit_timer |
|---|
| 1395 | | - .quad .Lsysc_done - 4 |
|---|
| 1396 | | - |
|---|
| 1397 | | -.Lcleanup_io_tif: |
|---|
| 1398 | | - larl %r9,.Lio_tif |
|---|
| 1399 | | - BR_EX %r14,%r11 |
|---|
| 1400 | | - |
|---|
| 1401 | | -.Lcleanup_io_restore: |
|---|
| 1402 | | - # check if stpt has been executed |
|---|
| 1403 | | - clg %r9,BASED(.Lcleanup_io_restore_insn) |
|---|
| 1404 | | - jh 0f |
|---|
| 1405 | | - mvc __LC_EXIT_TIMER(8),__LC_MCCK_ENTER_TIMER |
|---|
| 1406 | | -0: clg %r9,BASED(.Lcleanup_io_restore_insn+8) |
|---|
| 1407 | | - je 1f |
|---|
| 1408 | | - lg %r9,24(%r11) # get saved r11 pointer to pt_regs |
|---|
| 1409 | | - mvc __LC_RETURN_PSW(16),__PT_PSW(%r9) |
|---|
| 1410 | | - mvc 0(64,%r11),__PT_R8(%r9) |
|---|
| 1411 | | - lmg %r0,%r7,__PT_R0(%r9) |
|---|
| 1412 | | -1: lmg %r8,%r9,__LC_RETURN_PSW |
|---|
| 1413 | | - BR_EX %r14,%r11 |
|---|
| 1414 | | -.Lcleanup_io_restore_insn: |
|---|
| 1415 | | - .quad .Lio_exit_timer |
|---|
| 1416 | | - .quad .Lio_done - 4 |
|---|
| 1417 | | - |
|---|
| 1418 | | -.Lcleanup_idle: |
|---|
| 1419 | | - ni __LC_CPU_FLAGS+7,255-_CIF_ENABLED_WAIT |
|---|
| 1420 | | - # copy interrupt clock & cpu timer |
|---|
| 1421 | | - mvc __CLOCK_IDLE_EXIT(8,%r2),__LC_INT_CLOCK |
|---|
| 1422 | | - mvc __TIMER_IDLE_EXIT(8,%r2),__LC_ASYNC_ENTER_TIMER |
|---|
| 1423 | | - cghi %r11,__LC_SAVE_AREA_ASYNC |
|---|
| 1424 | | - je 0f |
|---|
| 1425 | | - mvc __CLOCK_IDLE_EXIT(8,%r2),__LC_MCCK_CLOCK |
|---|
| 1426 | | - mvc __TIMER_IDLE_EXIT(8,%r2),__LC_MCCK_ENTER_TIMER |
|---|
| 1427 | | -0: # check if stck & stpt have been executed |
|---|
| 1428 | | - clg %r9,BASED(.Lcleanup_idle_insn) |
|---|
| 1429 | | - jhe 1f |
|---|
| 1430 | | - mvc __CLOCK_IDLE_ENTER(8,%r2),__CLOCK_IDLE_EXIT(%r2) |
|---|
| 1431 | | - mvc __TIMER_IDLE_ENTER(8,%r2),__TIMER_IDLE_EXIT(%r2) |
|---|
| 1432 | | -1: # calculate idle cycles |
|---|
| 1433 | | -#ifdef CONFIG_SMP |
|---|
| 1434 | | - clg %r9,BASED(.Lcleanup_idle_insn) |
|---|
| 1435 | | - jl 3f |
|---|
| 1436 | | - larl %r1,smp_cpu_mtid |
|---|
| 1437 | | - llgf %r1,0(%r1) |
|---|
| 1438 | | - ltgr %r1,%r1 |
|---|
| 1439 | | - jz 3f |
|---|
| 1440 | | - .insn rsy,0xeb0000000017,%r1,5,__SF_EMPTY+80(%r15) |
|---|
| 1441 | | - larl %r3,mt_cycles |
|---|
| 1442 | | - ag %r3,__LC_PERCPU_OFFSET |
|---|
| 1443 | | - la %r4,__SF_EMPTY+16(%r15) |
|---|
| 1444 | | -2: lg %r0,0(%r3) |
|---|
| 1445 | | - slg %r0,0(%r4) |
|---|
| 1446 | | - alg %r0,64(%r4) |
|---|
| 1447 | | - stg %r0,0(%r3) |
|---|
| 1448 | | - la %r3,8(%r3) |
|---|
| 1449 | | - la %r4,8(%r4) |
|---|
| 1450 | | - brct %r1,2b |
|---|
| 1451 | | -#endif |
|---|
| 1452 | | -3: # account system time going idle |
|---|
| 1453 | | - lg %r9,__LC_STEAL_TIMER |
|---|
| 1454 | | - alg %r9,__CLOCK_IDLE_ENTER(%r2) |
|---|
| 1455 | | - slg %r9,__LC_LAST_UPDATE_CLOCK |
|---|
| 1456 | | - stg %r9,__LC_STEAL_TIMER |
|---|
| 1457 | | - mvc __LC_LAST_UPDATE_CLOCK(8),__CLOCK_IDLE_EXIT(%r2) |
|---|
| 1458 | | - lg %r9,__LC_SYSTEM_TIMER |
|---|
| 1459 | | - alg %r9,__LC_LAST_UPDATE_TIMER |
|---|
| 1460 | | - slg %r9,__TIMER_IDLE_ENTER(%r2) |
|---|
| 1461 | | - stg %r9,__LC_SYSTEM_TIMER |
|---|
| 1462 | | - mvc __LC_LAST_UPDATE_TIMER(8),__TIMER_IDLE_EXIT(%r2) |
|---|
| 1463 | | - # prepare return psw |
|---|
| 1464 | | - nihh %r8,0xfcfd # clear irq & wait state bits |
|---|
| 1465 | | - lg %r9,48(%r11) # return from psw_idle |
|---|
| 1466 | | - BR_EX %r14,%r11 |
|---|
| 1467 | | -.Lcleanup_idle_insn: |
|---|
| 1468 | | - .quad .Lpsw_idle_lpsw |
|---|
| 1469 | | - |
|---|
| 1470 | | -.Lcleanup_save_fpu_regs: |
|---|
| 1471 | | - larl %r9,save_fpu_regs |
|---|
| 1472 | | - BR_EX %r14,%r11 |
|---|
| 1473 | | - |
|---|
| 1474 | | -.Lcleanup_load_fpu_regs: |
|---|
| 1475 | | - larl %r9,load_fpu_regs |
|---|
| 1476 | | - BR_EX %r14,%r11 |
|---|
| 1477 | | - |
|---|
| 1478 | | -/* |
|---|
| 1479 | | - * Integer constants |
|---|
| 1480 | | - */ |
|---|
| 1481 | | - .align 8 |
|---|
| 1482 | | -.Lcritical_start: |
|---|
| 1483 | | - .quad .L__critical_start |
|---|
| 1484 | | -.Lcritical_length: |
|---|
| 1485 | | - .quad .L__critical_end - .L__critical_start |
|---|
| 1486 | | -#if IS_ENABLED(CONFIG_KVM) |
|---|
| 1487 | | -.Lsie_critical_start: |
|---|
| 1488 | | - .quad .Lsie_gmap |
|---|
| 1489 | | -.Lsie_critical_length: |
|---|
| 1490 | | - .quad .Lsie_done - .Lsie_gmap |
|---|
| 1491 | | -.Lsie_crit_mcck_start: |
|---|
| 1492 | | - .quad .Lsie_entry |
|---|
| 1493 | | -.Lsie_crit_mcck_length: |
|---|
| 1494 | | - .quad .Lsie_skip - .Lsie_entry |
|---|
| 1495 | 1299 | #endif |
|---|
| 1496 | 1300 | .section .rodata, "a" |
|---|
| 1497 | | -#define SYSCALL(esame,emu) .long esame |
|---|
| 1301 | +#define SYSCALL(esame,emu) .quad __s390x_ ## esame |
|---|
| 1498 | 1302 | .globl sys_call_table |
|---|
| 1499 | 1303 | sys_call_table: |
|---|
| 1500 | 1304 | #include "asm/syscall_table.h" |
|---|
| .. | .. |
|---|
| 1502 | 1306 | |
|---|
| 1503 | 1307 | #ifdef CONFIG_COMPAT |
|---|
| 1504 | 1308 | |
|---|
| 1505 | | -#define SYSCALL(esame,emu) .long emu |
|---|
| 1309 | +#define SYSCALL(esame,emu) .quad __s390_ ## emu |
|---|
| 1506 | 1310 | .globl sys_call_table_emu |
|---|
| 1507 | 1311 | sys_call_table_emu: |
|---|
| 1508 | 1312 | #include "asm/syscall_table.h" |
|---|