@@ -107,6 +107,7 @@ _PIF_WORK = (_PIF_PER_TRAP | _PIF_SYSCALL_RESTART)
107
107
aghi %r15 ,-(STACK_FRAME_OVERHEAD + __PT_SIZE)
108
108
j 3f
109
109
1: UPDATE_VTIME %r14 ,%r15 ,\timer
110
+ BPENTER __TI_flags(%r12 ),_TIF_ISOLATE_BP
110
111
2: lg %r15 ,__LC_ASYNC_STACK # load async stack
111
112
3: la %r11 ,STACK_FRAME_OVERHEAD(%r15 )
112
113
.endm
@@ -187,6 +188,40 @@ _PIF_WORK = (_PIF_PER_TRAP | _PIF_SYSCALL_RESTART)
187
188
.popsection
188
189
.endm
189
190
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
+
190
225
.section .kprobes.text, "ax"
191
226
.Ldummy:
192
227
/*
@@ -240,9 +275,11 @@ ENTRY(__switch_to)
240
275
*/
241
276
ENTRY(sie64a)
242
277
stmg %r6,%r14 ,__SF_GPRS(%r15 ) # save kernel registers
278
+ lg %r12 ,__LC_CURRENT
243
279
stg %r2,__SF_EMPTY(%r15 ) # save control block pointer
244
280
stg %r3,__SF_EMPTY+8 (%r15 ) # save guest register save area
245
281
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
246
283
TSTMSK __LC_CPU_FLAGS,_CIF_FPU # load guest fp/vx registers ?
247
284
jno .Lsie_load_guest_gprs
248
285
brasl %r14 ,load_fpu_regs # load guest fp/vx regs
@@ -259,11 +296,12 @@ ENTRY(sie64a)
259
296
jnz .Lsie_skip
260
297
TSTMSK __LC_CPU_FLAGS,_CIF_FPU
261
298
jo .Lsie_skip # exit if fp/vx regs changed
262
- BPON
299
+ BPEXIT __SF_EMPTY+ 24 ( %r15 ),(_TIF_ISOLATE_BP|_TIF_ISOLATE_BP_GUEST)
263
300
.Lsie_entry:
264
301
sie 0 (%r14 )
265
302
.Lsie_exit:
266
303
BPOFF
304
+ BPENTER __SF_EMPTY+24 (%r15 ),(_TIF_ISOLATE_BP|_TIF_ISOLATE_BP_GUEST)
267
305
.Lsie_skip:
268
306
ni __SIE_PROG0C+3 (%r14 ),0xfe # no longer in SIE
269
307
lctlg %c1,%c1,__LC_USER_ASCE # load primary asce
@@ -324,6 +362,7 @@ ENTRY(system_call)
324
362
la %r11 ,STACK_FRAME_OVERHEAD(%r15 ) # pointer to pt_regs
325
363
.Lsysc_vtime:
326
364
UPDATE_VTIME %r8 ,%r9 ,__LC_SYNC_ENTER_TIMER
365
+ BPENTER __TI_flags(%r12 ),_TIF_ISOLATE_BP
327
366
stmg %r0,%r7,__PT_R0(%r11 )
328
367
# clear user controlled register to prevent speculative use
329
368
xgr %r0,%r0
@@ -362,7 +401,7 @@ ENTRY(system_call)
362
401
jnz .Lsysc_work # check for work
363
402
TSTMSK __LC_CPU_FLAGS,_CIF_WORK
364
403
jnz .Lsysc_work
365
- BPON
404
+ BPEXIT __TI_flags( %r12 ),_TIF_ISOLATE_BP
366
405
.Lsysc_restore:
367
406
lg %r14 ,__LC_VDSO_PER_CPU
368
407
lmg %r0,%r10 ,__PT_R0(%r11 )
@@ -597,6 +636,7 @@ ENTRY(pgm_check_handler)
597
636
aghi %r15 ,-(STACK_FRAME_OVERHEAD + __PT_SIZE)
598
637
j 4f
599
638
2: UPDATE_VTIME %r14 ,%r15 ,__LC_SYNC_ENTER_TIMER
639
+ BPENTER __TI_flags(%r12 ),_TIF_ISOLATE_BP
600
640
lg %r15 ,__LC_KERNEL_STACK
601
641
lgr %r14 ,%r12
602
642
aghi %r14 ,__TASK_thread # pointer to thread_struct
@@ -729,7 +769,7 @@ ENTRY(io_int_handler)
729
769
mvc __LC_RETURN_PSW(16 ),__PT_PSW(%r11 )
730
770
tm __PT_PSW+1 (%r11 ),0x01 # returning to user ?
731
771
jno .Lio_exit_kernel
732
- BPON
772
+ BPEXIT __TI_flags( %r12 ),_TIF_ISOLATE_BP
733
773
.Lio_exit_timer:
734
774
stpt __LC_EXIT_TIMER
735
775
mvc __VDSO_ECTG_BASE(16 ,%r14 ),__LC_EXIT_TIMER
@@ -1165,7 +1205,7 @@ ENTRY(mcck_int_handler)
1165
1205
mvc __LC_RETURN_MCCK_PSW(16 ),__PT_PSW(%r11 ) # move return PSW
1166
1206
tm __LC_RETURN_MCCK_PSW+1 ,0x01 # returning to user ?
1167
1207
jno 0f
1168
- BPON
1208
+ BPEXIT __TI_flags( %r12 ),_TIF_ISOLATE_BP
1169
1209
stpt __LC_EXIT_TIMER
1170
1210
mvc __VDSO_ECTG_BASE(16 ,%r14 ),__LC_EXIT_TIMER
1171
1211
0: lmg %r11 ,%r15 ,__PT_R11(%r11 )
@@ -1292,7 +1332,8 @@ cleanup_critical:
1292
1332
clg %r9 ,BASED(.Lsie_crit_mcck_length)
1293
1333
jh 1f
1294
1334
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
1296
1337
ni __SIE_PROG0C+3 (%r9 ),0xfe # no longer in SIE
1297
1338
lctlg %c1,%c1,__LC_USER_ASCE # load primary asce
1298
1339
larl %r9 ,sie_exit # skip forward to sie_exit
0 commit comments