@@ -107,6 +107,7 @@ _PIF_WORK = (_PIF_PER_TRAP | _PIF_SYSCALL_RESTART)
107107 aghi %r15 ,-(STACK_FRAME_OVERHEAD + __PT_SIZE)
108108 j 3f
1091091: UPDATE_VTIME %r14 ,%r15 ,\timer
110+ BPENTER __TI_flags(%r12 ),_TIF_ISOLATE_BP
1101112: lg %r15 ,__LC_ASYNC_STACK # load async stack
1111123: la %r11 ,STACK_FRAME_OVERHEAD(%r15 )
112113 .endm
@@ -187,6 +188,40 @@ _PIF_WORK = (_PIF_PER_TRAP | _PIF_SYSCALL_RESTART)
187188 .popsection
188189 .endm
189190
191+ .macro BPENTER tif_ptr,tif_mask
192+ .pushsection .altinstr_replacement, "ax"
193+ 662: .word 0xc004 , 0x0000 , 0x0000 # 6 byte nop
194+ .word 0xc004 , 0x0000 , 0x0000 # 6 byte nop
195+ .popsection
196+ 664: TSTMSK \tif_ptr,\tif_mask
197+ jz . + 8
198+ .long 0xb2e8d000
199+ .pushsection .altinstructions, "a"
200+ .long 664b - .
201+ .long 662b - .
202+ .word 82
203+ .byte 12
204+ .byte 12
205+ .popsection
206+ .endm
207+
208+ .macro BPEXIT tif_ptr,tif_mask
209+ TSTMSK \tif_ptr,\tif_mask
210+ .pushsection .altinstr_replacement, "ax"
211+ 662: jnz . + 8
212+ .long 0xb2e8d000
213+ .popsection
214+ 664: jz . + 8
215+ .long 0xb2e8c000
216+ .pushsection .altinstructions, "a"
217+ .long 664b - .
218+ .long 662b - .
219+ .word 82
220+ .byte 8
221+ .byte 8
222+ .popsection
223+ .endm
224+
190225 .section .kprobes.text, "ax"
191226.Ldummy:
192227 /*
@@ -240,9 +275,11 @@ ENTRY(__switch_to)
240275 */
241276ENTRY(sie64a)
242277 stmg %r6,%r14 ,__SF_GPRS(%r15 ) # save kernel registers
278+ lg %r12 ,__LC_CURRENT
243279 stg %r2,__SF_EMPTY(%r15 ) # save control block pointer
244280 stg %r3,__SF_EMPTY+8 (%r15 ) # save guest register save area
245281 xc __SF_EMPTY+16 (8 ,%r15 ),__SF_EMPTY+16 (%r15 ) # reason code = 0
282+ mvc __SF_EMPTY+24 (8 ,%r15 ),__TI_flags(%r12 ) # copy thread flags
246283 TSTMSK __LC_CPU_FLAGS,_CIF_FPU # load guest fp/vx registers ?
247284 jno .Lsie_load_guest_gprs
248285 brasl %r14 ,load_fpu_regs # load guest fp/vx regs
@@ -259,11 +296,12 @@ ENTRY(sie64a)
259296 jnz .Lsie_skip
260297 TSTMSK __LC_CPU_FLAGS,_CIF_FPU
261298 jo .Lsie_skip # exit if fp/vx regs changed
262- BPON
299+ BPEXIT __SF_EMPTY+ 24 ( %r15 ),(_TIF_ISOLATE_BP|_TIF_ISOLATE_BP_GUEST)
263300.Lsie_entry:
264301 sie 0 (%r14 )
265302.Lsie_exit:
266303 BPOFF
304+ BPENTER __SF_EMPTY+24 (%r15 ),(_TIF_ISOLATE_BP|_TIF_ISOLATE_BP_GUEST)
267305.Lsie_skip:
268306 ni __SIE_PROG0C+3 (%r14 ),0xfe # no longer in SIE
269307 lctlg %c1,%c1,__LC_USER_ASCE # load primary asce
@@ -324,6 +362,7 @@ ENTRY(system_call)
324362 la %r11 ,STACK_FRAME_OVERHEAD(%r15 ) # pointer to pt_regs
325363.Lsysc_vtime:
326364 UPDATE_VTIME %r8 ,%r9 ,__LC_SYNC_ENTER_TIMER
365+ BPENTER __TI_flags(%r12 ),_TIF_ISOLATE_BP
327366 stmg %r0,%r7,__PT_R0(%r11 )
328367 # clear user controlled register to prevent speculative use
329368 xgr %r0,%r0
@@ -362,7 +401,7 @@ ENTRY(system_call)
362401 jnz .Lsysc_work # check for work
363402 TSTMSK __LC_CPU_FLAGS,_CIF_WORK
364403 jnz .Lsysc_work
365- BPON
404+ BPEXIT __TI_flags( %r12 ),_TIF_ISOLATE_BP
366405.Lsysc_restore:
367406 lg %r14 ,__LC_VDSO_PER_CPU
368407 lmg %r0,%r10 ,__PT_R0(%r11 )
@@ -597,6 +636,7 @@ ENTRY(pgm_check_handler)
597636 aghi %r15 ,-(STACK_FRAME_OVERHEAD + __PT_SIZE)
598637 j 4f
5996382: UPDATE_VTIME %r14 ,%r15 ,__LC_SYNC_ENTER_TIMER
639+ BPENTER __TI_flags(%r12 ),_TIF_ISOLATE_BP
600640 lg %r15 ,__LC_KERNEL_STACK
601641 lgr %r14 ,%r12
602642 aghi %r14 ,__TASK_thread # pointer to thread_struct
@@ -729,7 +769,7 @@ ENTRY(io_int_handler)
729769 mvc __LC_RETURN_PSW(16 ),__PT_PSW(%r11 )
730770 tm __PT_PSW+1 (%r11 ),0x01 # returning to user ?
731771 jno .Lio_exit_kernel
732- BPON
772+ BPEXIT __TI_flags( %r12 ),_TIF_ISOLATE_BP
733773.Lio_exit_timer:
734774 stpt __LC_EXIT_TIMER
735775 mvc __VDSO_ECTG_BASE(16 ,%r14 ),__LC_EXIT_TIMER
@@ -1165,7 +1205,7 @@ ENTRY(mcck_int_handler)
11651205 mvc __LC_RETURN_MCCK_PSW(16 ),__PT_PSW(%r11 ) # move return PSW
11661206 tm __LC_RETURN_MCCK_PSW+1 ,0x01 # returning to user ?
11671207 jno 0f
1168- BPON
1208+ BPEXIT __TI_flags( %r12 ),_TIF_ISOLATE_BP
11691209 stpt __LC_EXIT_TIMER
11701210 mvc __VDSO_ECTG_BASE(16 ,%r14 ),__LC_EXIT_TIMER
117112110: lmg %r11 ,%r15 ,__PT_R11(%r11 )
@@ -1292,7 +1332,8 @@ cleanup_critical:
12921332 clg %r9 ,BASED(.Lsie_crit_mcck_length)
12931333 jh 1f
12941334 oi __LC_CPU_FLAGS+7 , _CIF_MCCK_GUEST
1295- 1: lg %r9 ,__SF_EMPTY(%r15 ) # get control block pointer
1335+ 1: BPENTER __SF_EMPTY+24 (%r15 ),(_TIF_ISOLATE_BP|_TIF_ISOLATE_BP_GUEST)
1336+ lg %r9 ,__SF_EMPTY(%r15 ) # get control block pointer
12961337 ni __SIE_PROG0C+3 (%r9 ),0xfe # no longer in SIE
12971338 lctlg %c1,%c1,__LC_USER_ASCE # load primary asce
12981339 larl %r9 ,sie_exit # skip forward to sie_exit
0 commit comments