Skip to content

Commit 7041d28

Browse files
author
Martin Schwidefsky
committed
s390: scrub registers on kernel entry and KVM exit
Clear all user space registers on entry to the kernel and all KVM guest registers on KVM guest exit if the register does not contain either a parameter or a result value. Reviewed-by: Christian Borntraeger <borntraeger@de.ibm.com> Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
1 parent 364e3f9 commit 7041d28

File tree

1 file changed

+47
-0
lines changed

1 file changed

+47
-0
lines changed

arch/s390/kernel/entry.S

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -248,6 +248,12 @@ ENTRY(sie64a)
248248
sie_exit:
249249
lg %r14,__SF_EMPTY+8(%r15) # load guest register save area
250250
stmg %r0,%r13,0(%r14) # save guest gprs 0-13
251+
xgr %r0,%r0 # clear guest registers to
252+
xgr %r1,%r1 # prevent speculative use
253+
xgr %r2,%r2
254+
xgr %r3,%r3
255+
xgr %r4,%r4
256+
xgr %r5,%r5
251257
lmg %r6,%r14,__SF_GPRS(%r15) # restore kernel registers
252258
lg %r2,__SF_EMPTY+16(%r15) # return exit reason code
253259
br %r14
@@ -282,6 +288,8 @@ ENTRY(system_call)
282288
.Lsysc_vtime:
283289
UPDATE_VTIME %r8,%r9,__LC_SYNC_ENTER_TIMER
284290
stmg %r0,%r7,__PT_R0(%r11)
291+
# clear user controlled register to prevent speculative use
292+
xgr %r0,%r0
285293
mvc __PT_R8(64,%r11),__LC_SAVE_AREA_SYNC
286294
mvc __PT_PSW(16,%r11),__LC_SVC_OLD_PSW
287295
mvc __PT_INT_CODE(4,%r11),__LC_SVC_ILC
@@ -561,6 +569,15 @@ ENTRY(pgm_check_handler)
561569
4: lgr %r13,%r11
562570
la %r11,STACK_FRAME_OVERHEAD(%r15)
563571
stmg %r0,%r7,__PT_R0(%r11)
572+
# clear user controlled registers to prevent speculative use
573+
xgr %r0,%r0
574+
xgr %r1,%r1
575+
xgr %r2,%r2
576+
xgr %r3,%r3
577+
xgr %r4,%r4
578+
xgr %r5,%r5
579+
xgr %r6,%r6
580+
xgr %r7,%r7
564581
mvc __PT_R8(64,%r11),__LC_SAVE_AREA_SYNC
565582
stmg %r8,%r9,__PT_PSW(%r11)
566583
mvc __PT_INT_CODE(4,%r11),__LC_PGM_ILC
@@ -626,6 +643,16 @@ ENTRY(io_int_handler)
626643
lmg %r8,%r9,__LC_IO_OLD_PSW
627644
SWITCH_ASYNC __LC_SAVE_AREA_ASYNC,__LC_ASYNC_ENTER_TIMER
628645
stmg %r0,%r7,__PT_R0(%r11)
646+
# clear user controlled registers to prevent speculative use
647+
xgr %r0,%r0
648+
xgr %r1,%r1
649+
xgr %r2,%r2
650+
xgr %r3,%r3
651+
xgr %r4,%r4
652+
xgr %r5,%r5
653+
xgr %r6,%r6
654+
xgr %r7,%r7
655+
xgr %r10,%r10
629656
mvc __PT_R8(64,%r11),__LC_SAVE_AREA_ASYNC
630657
stmg %r8,%r9,__PT_PSW(%r11)
631658
mvc __PT_INT_CODE(12,%r11),__LC_SUBCHANNEL_ID
@@ -839,6 +866,16 @@ ENTRY(ext_int_handler)
839866
lmg %r8,%r9,__LC_EXT_OLD_PSW
840867
SWITCH_ASYNC __LC_SAVE_AREA_ASYNC,__LC_ASYNC_ENTER_TIMER
841868
stmg %r0,%r7,__PT_R0(%r11)
869+
# clear user controlled registers to prevent speculative use
870+
xgr %r0,%r0
871+
xgr %r1,%r1
872+
xgr %r2,%r2
873+
xgr %r3,%r3
874+
xgr %r4,%r4
875+
xgr %r5,%r5
876+
xgr %r6,%r6
877+
xgr %r7,%r7
878+
xgr %r10,%r10
842879
mvc __PT_R8(64,%r11),__LC_SAVE_AREA_ASYNC
843880
stmg %r8,%r9,__PT_PSW(%r11)
844881
lghi %r1,__LC_EXT_PARAMS2
@@ -1046,6 +1083,16 @@ ENTRY(mcck_int_handler)
10461083
.Lmcck_skip:
10471084
lghi %r14,__LC_GPREGS_SAVE_AREA+64
10481085
stmg %r0,%r7,__PT_R0(%r11)
1086+
# clear user controlled registers to prevent speculative use
1087+
xgr %r0,%r0
1088+
xgr %r1,%r1
1089+
xgr %r2,%r2
1090+
xgr %r3,%r3
1091+
xgr %r4,%r4
1092+
xgr %r5,%r5
1093+
xgr %r6,%r6
1094+
xgr %r7,%r7
1095+
xgr %r10,%r10
10491096
mvc __PT_R8(64,%r11),0(%r14)
10501097
stmg %r8,%r9,__PT_PSW(%r11)
10511098
xc __PT_FLAGS(8,%r11),__PT_FLAGS(%r11)

0 commit comments

Comments
 (0)