Skip to content

Commit 9e1e275

Browse files
svens-s390Vasily Gorbik
authored andcommitted
s390/entry: Make pgm_check_handler() ready for lowcore relocation
In preparation of having lowcore at different address than zero, add the base register to all lowcore accesses in pgm_check_handler(). Reviewed-by: Heiko Carstens <hca@linux.ibm.com> Signed-off-by: Sven Schnelle <svens@linux.ibm.com> Signed-off-by: Vasily Gorbik <gor@linux.ibm.com>
1 parent 86e08d6 commit 9e1e275

2 files changed

Lines changed: 32 additions & 21 deletions

File tree

arch/s390/include/asm/lowcore.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -244,5 +244,11 @@ static inline void set_prefix(__u32 address)
244244
ALT_LOWCORE
245245
.endm
246246

247+
.macro STMG_LC start, end, savearea
248+
ALTERNATIVE "stmg \start, \end, \savearea", \
249+
__stringify(stmg \start, \end, LOWCORE_ALT_ADDRESS + \savearea), \
250+
ALT_LOWCORE
251+
.endm
252+
247253
#endif /* __ASSEMBLY__ */
248254
#endif /* _ASM_S390_LOWCORE_H */

arch/s390/kernel/entry.S

Lines changed: 26 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -40,8 +40,11 @@ _LPP_OFFSET = __LC_LPP
4040
ALTERNATIVE "nop", ".insn s,0xb2000000,\address", ALT_FACILITY(193)
4141
.endm
4242

43-
.macro LPSWEY address,lpswe
44-
ALTERNATIVE "b \lpswe; nopr", ".insn siy,0xeb0000000071,\address,0", ALT_FACILITY(193)
43+
.macro LPSWEY address, lpswe
44+
ALTERNATIVE_2 "b \lpswe;nopr", \
45+
".insn siy,0xeb0000000071,\address,0", ALT_FACILITY_EARLY(193), \
46+
__stringify(.insn siy,0xeb0000000071,LOWCORE_ALT_ADDRESS+\address,0), \
47+
ALT_LOWCORE
4548
.endm
4649

4750
.macro MBEAR reg, lowcore
@@ -317,39 +320,40 @@ SYM_CODE_END(ret_from_fork)
317320
*/
318321

319322
SYM_CODE_START(pgm_check_handler)
320-
stpt __LC_SYS_ENTER_TIMER
323+
STMG_LC %r8,%r15,__LC_SAVE_AREA_SYNC
324+
GET_LC %r13
325+
stpt __LC_SYS_ENTER_TIMER(%r13)
321326
BPOFF
322-
stmg %r8,%r15,__LC_SAVE_AREA_SYNC
323327
lgr %r10,%r15
324-
lmg %r8,%r9,__LC_PGM_OLD_PSW
328+
lmg %r8,%r9,__LC_PGM_OLD_PSW(%r13)
325329
tmhh %r8,0x0001 # coming from user space?
326330
jno .Lpgm_skip_asce
327-
lctlg %c1,%c1,__LC_KERNEL_ASCE
331+
lctlg %c1,%c1,__LC_KERNEL_ASCE(%r13)
328332
j 3f # -> fault in user space
329333
.Lpgm_skip_asce:
330334
1: tmhh %r8,0x4000 # PER bit set in old PSW ?
331335
jnz 2f # -> enabled, can't be a double fault
332-
tm __LC_PGM_ILC+3,0x80 # check for per exception
336+
tm __LC_PGM_ILC+3(%r13),0x80 # check for per exception
333337
jnz .Lpgm_svcper # -> single stepped svc
334-
2: CHECK_STACK __LC_SAVE_AREA_SYNC,%r0
338+
2: CHECK_STACK __LC_SAVE_AREA_SYNC,%r13
335339
aghi %r15,-(STACK_FRAME_OVERHEAD + __PT_SIZE)
336340
# CHECK_VMAP_STACK branches to stack_overflow or 4f
337-
CHECK_VMAP_STACK __LC_SAVE_AREA_SYNC,%r0,4f
338-
3: lg %r15,__LC_KERNEL_STACK
341+
CHECK_VMAP_STACK __LC_SAVE_AREA_SYNC,%r13,4f
342+
3: lg %r15,__LC_KERNEL_STACK(%r13)
339343
4: la %r11,STACK_FRAME_OVERHEAD(%r15)
340344
xc __PT_FLAGS(8,%r11),__PT_FLAGS(%r11)
341345
xc __SF_BACKCHAIN(8,%r15),__SF_BACKCHAIN(%r15)
342346
stmg %r0,%r7,__PT_R0(%r11)
343-
mvc __PT_R8(64,%r11),__LC_SAVE_AREA_SYNC
344-
mvc __PT_LAST_BREAK(8,%r11),__LC_PGM_LAST_BREAK
347+
mvc __PT_R8(64,%r11),__LC_SAVE_AREA_SYNC(%r13)
348+
mvc __PT_LAST_BREAK(8,%r11),__LC_PGM_LAST_BREAK(%r13)
345349
stctg %c1,%c1,__PT_CR1(%r11)
346350
#if IS_ENABLED(CONFIG_KVM)
347-
ltg %r12,__LC_GMAP
351+
ltg %r12,__LC_GMAP(%r13)
348352
jz 5f
349353
clc __GMAP_ASCE(8,%r12), __PT_CR1(%r11)
350354
jne 5f
351355
BPENTER __SF_SIE_FLAGS(%r10),_TIF_ISOLATE_BP_GUEST
352-
SIEEXIT __SF_SIE_CONTROL(%r10),%r0
356+
SIEEXIT __SF_SIE_CONTROL(%r10),%r13
353357
#endif
354358
5: stmg %r8,%r9,__PT_PSW(%r11)
355359
# clear user controlled registers to prevent speculative use
@@ -365,11 +369,11 @@ SYM_CODE_START(pgm_check_handler)
365369
tmhh %r8,0x0001 # returning to user space?
366370
jno .Lpgm_exit_kernel
367371
STACKLEAK_ERASE
368-
lctlg %c1,%c1,__LC_USER_ASCE
372+
lctlg %c1,%c1,__LC_USER_ASCE(%r13)
369373
BPON
370-
stpt __LC_EXIT_TIMER
374+
stpt __LC_EXIT_TIMER(%r13)
371375
.Lpgm_exit_kernel:
372-
mvc __LC_RETURN_PSW(16),STACK_FRAME_OVERHEAD+__PT_PSW(%r15)
376+
mvc __LC_RETURN_PSW(16,%r13),STACK_FRAME_OVERHEAD+__PT_PSW(%r15)
373377
LBEAR STACK_FRAME_OVERHEAD+__PT_LAST_BREAK(%r15)
374378
lmg %r0,%r15,STACK_FRAME_OVERHEAD+__PT_R0(%r15)
375379
LPSWEY __LC_RETURN_PSW,__LC_RETURN_LPSWE
@@ -378,11 +382,11 @@ SYM_CODE_START(pgm_check_handler)
378382
# single stepped system call
379383
#
380384
.Lpgm_svcper:
381-
mvc __LC_RETURN_PSW(8),__LC_SVC_NEW_PSW
385+
mvc __LC_RETURN_PSW(8,%r13),__LC_SVC_NEW_PSW(%r13)
382386
larl %r14,.Lsysc_per
383-
stg %r14,__LC_RETURN_PSW+8
387+
stg %r14,__LC_RETURN_PSW+8(%r13)
384388
lghi %r14,1
385-
LBEAR __LC_PGM_LAST_BREAK
389+
LBEAR __LC_PGM_LAST_BREAK(%r13)
386390
LPSWEY __LC_RETURN_PSW,__LC_RETURN_LPSWE # branch to .Lsysc_per
387391
SYM_CODE_END(pgm_check_handler)
388392

@@ -596,7 +600,8 @@ SYM_CODE_END(restart_int_handler)
596600
* Setup a pt_regs so that show_trace can provide a good call trace.
597601
*/
598602
SYM_CODE_START(stack_overflow)
599-
lg %r15,__LC_NODAT_STACK # change to panic stack
603+
GET_LC %r15
604+
lg %r15,__LC_NODAT_STACK(%r15) # change to panic stack
600605
la %r11,STACK_FRAME_OVERHEAD(%r15)
601606
stmg %r0,%r7,__PT_R0(%r11)
602607
stmg %r8,%r9,__PT_PSW(%r11)

0 commit comments

Comments
 (0)