@@ -1205,61 +1205,69 @@ static int intel_pt_walk_insn(struct intel_pt_decoder *decoder,
1205
1205
1206
1206
static bool intel_pt_fup_event (struct intel_pt_decoder * decoder )
1207
1207
{
1208
+ enum intel_pt_sample_type type = decoder -> state .type ;
1208
1209
bool ret = false;
1209
1210
1211
+ decoder -> state .type &= ~INTEL_PT_BRANCH ;
1212
+
1210
1213
if (decoder -> set_fup_tx_flags ) {
1211
1214
decoder -> set_fup_tx_flags = false;
1212
1215
decoder -> tx_flags = decoder -> fup_tx_flags ;
1213
- decoder -> state .type = INTEL_PT_TRANSACTION ;
1216
+ decoder -> state .type | = INTEL_PT_TRANSACTION ;
1214
1217
if (decoder -> fup_tx_flags & INTEL_PT_ABORT_TX )
1215
1218
decoder -> state .type |= INTEL_PT_BRANCH ;
1216
- decoder -> state .from_ip = decoder -> ip ;
1217
- decoder -> state .to_ip = 0 ;
1218
1219
decoder -> state .flags = decoder -> fup_tx_flags ;
1219
- return true;
1220
+ ret = true;
1220
1221
}
1221
1222
if (decoder -> set_fup_ptw ) {
1222
1223
decoder -> set_fup_ptw = false;
1223
- decoder -> state .type = INTEL_PT_PTW ;
1224
+ decoder -> state .type | = INTEL_PT_PTW ;
1224
1225
decoder -> state .flags |= INTEL_PT_FUP_IP ;
1225
- decoder -> state .from_ip = decoder -> ip ;
1226
- decoder -> state .to_ip = 0 ;
1227
1226
decoder -> state .ptw_payload = decoder -> fup_ptw_payload ;
1228
- return true;
1227
+ ret = true;
1229
1228
}
1230
1229
if (decoder -> set_fup_mwait ) {
1231
1230
decoder -> set_fup_mwait = false;
1232
- decoder -> state .type = INTEL_PT_MWAIT_OP ;
1233
- decoder -> state .from_ip = decoder -> ip ;
1234
- decoder -> state .to_ip = 0 ;
1231
+ decoder -> state .type |= INTEL_PT_MWAIT_OP ;
1235
1232
decoder -> state .mwait_payload = decoder -> fup_mwait_payload ;
1236
1233
ret = true;
1237
1234
}
1238
1235
if (decoder -> set_fup_pwre ) {
1239
1236
decoder -> set_fup_pwre = false;
1240
1237
decoder -> state .type |= INTEL_PT_PWR_ENTRY ;
1241
- decoder -> state .type &= ~INTEL_PT_BRANCH ;
1242
- decoder -> state .from_ip = decoder -> ip ;
1243
- decoder -> state .to_ip = 0 ;
1244
1238
decoder -> state .pwre_payload = decoder -> fup_pwre_payload ;
1245
1239
ret = true;
1246
1240
}
1247
1241
if (decoder -> set_fup_exstop ) {
1248
1242
decoder -> set_fup_exstop = false;
1249
1243
decoder -> state .type |= INTEL_PT_EX_STOP ;
1250
- decoder -> state .type &= ~INTEL_PT_BRANCH ;
1251
1244
decoder -> state .flags |= INTEL_PT_FUP_IP ;
1252
- decoder -> state .from_ip = decoder -> ip ;
1253
- decoder -> state .to_ip = 0 ;
1254
1245
ret = true;
1255
1246
}
1256
1247
if (decoder -> set_fup_bep ) {
1257
1248
decoder -> set_fup_bep = false;
1258
1249
decoder -> state .type |= INTEL_PT_BLK_ITEMS ;
1259
- decoder -> state .type &= ~INTEL_PT_BRANCH ;
1250
+ ret = true;
1251
+ }
1252
+ if (decoder -> overflow ) {
1253
+ decoder -> overflow = false;
1254
+ if (!ret && !decoder -> pge ) {
1255
+ if (decoder -> hop ) {
1256
+ decoder -> state .type = 0 ;
1257
+ decoder -> pkt_state = INTEL_PT_STATE_RESAMPLE ;
1258
+ }
1259
+ decoder -> pge = true;
1260
+ decoder -> state .type |= INTEL_PT_BRANCH | INTEL_PT_TRACE_BEGIN ;
1261
+ decoder -> state .from_ip = 0 ;
1262
+ decoder -> state .to_ip = decoder -> ip ;
1263
+ return true;
1264
+ }
1265
+ }
1266
+ if (ret ) {
1260
1267
decoder -> state .from_ip = decoder -> ip ;
1261
1268
decoder -> state .to_ip = 0 ;
1262
- ret = true;
1269
+ } else {
1270
+ decoder -> state .type = type ;
1263
1271
}
1264
1272
return ret ;
1265
1273
}
@@ -1608,7 +1616,16 @@ static int intel_pt_overflow(struct intel_pt_decoder *decoder)
1608
1616
intel_pt_clear_tx_flags (decoder );
1609
1617
intel_pt_set_nr (decoder );
1610
1618
decoder -> timestamp_insn_cnt = 0 ;
1611
- decoder -> pkt_state = INTEL_PT_STATE_ERR_RESYNC ;
1619
+ decoder -> pkt_state = INTEL_PT_STATE_IN_SYNC ;
1620
+ decoder -> state .from_ip = decoder -> ip ;
1621
+ decoder -> ip = 0 ;
1622
+ decoder -> pge = false;
1623
+ decoder -> set_fup_tx_flags = false;
1624
+ decoder -> set_fup_ptw = false;
1625
+ decoder -> set_fup_mwait = false;
1626
+ decoder -> set_fup_pwre = false;
1627
+ decoder -> set_fup_exstop = false;
1628
+ decoder -> set_fup_bep = false;
1612
1629
decoder -> overflow = true;
1613
1630
return - EOVERFLOW ;
1614
1631
}
@@ -2666,6 +2683,8 @@ static int intel_pt_scan_for_psb(struct intel_pt_decoder *decoder);
2666
2683
/* Hop mode: Ignore TNT, do not walk code, but get ip from FUPs and TIPs */
2667
2684
static int intel_pt_hop_trace (struct intel_pt_decoder * decoder , bool * no_tip , int * err )
2668
2685
{
2686
+ * err = 0 ;
2687
+
2669
2688
/* Leap from PSB to PSB, getting ip from FUP within PSB+ */
2670
2689
if (decoder -> leap && !decoder -> in_psb && decoder -> packet .type != INTEL_PT_PSB ) {
2671
2690
* err = intel_pt_scan_for_psb (decoder );
@@ -2678,6 +2697,7 @@ static int intel_pt_hop_trace(struct intel_pt_decoder *decoder, bool *no_tip, in
2678
2697
return HOP_IGNORE ;
2679
2698
2680
2699
case INTEL_PT_TIP_PGD :
2700
+ decoder -> pge = false;
2681
2701
if (!decoder -> packet .count ) {
2682
2702
intel_pt_set_nr (decoder );
2683
2703
return HOP_IGNORE ;
@@ -2705,18 +2725,21 @@ static int intel_pt_hop_trace(struct intel_pt_decoder *decoder, bool *no_tip, in
2705
2725
if (!decoder -> packet .count )
2706
2726
return HOP_IGNORE ;
2707
2727
intel_pt_set_ip (decoder );
2708
- if (intel_pt_fup_event ( decoder ) )
2709
- return HOP_RETURN ;
2710
- if (!decoder -> branch_enable )
2728
+ if (decoder -> set_fup_mwait || decoder -> set_fup_pwre )
2729
+ * no_tip = true ;
2730
+ if (!decoder -> branch_enable || ! decoder -> pge )
2711
2731
* no_tip = true;
2712
2732
if (* no_tip ) {
2713
2733
decoder -> state .type = INTEL_PT_INSTRUCTION ;
2714
2734
decoder -> state .from_ip = decoder -> ip ;
2715
2735
decoder -> state .to_ip = 0 ;
2736
+ intel_pt_fup_event (decoder );
2716
2737
return HOP_RETURN ;
2717
2738
}
2739
+ intel_pt_fup_event (decoder );
2740
+ decoder -> state .type |= INTEL_PT_INSTRUCTION | INTEL_PT_BRANCH ;
2718
2741
* err = intel_pt_walk_fup_tip (decoder );
2719
- if (!* err )
2742
+ if (!* err && decoder -> state . to_ip )
2720
2743
decoder -> pkt_state = INTEL_PT_STATE_RESAMPLE ;
2721
2744
return HOP_RETURN ;
2722
2745
@@ -2897,7 +2920,7 @@ static bool intel_pt_psb_with_fup(struct intel_pt_decoder *decoder, int *err)
2897
2920
{
2898
2921
struct intel_pt_psb_info data = { .fup = false };
2899
2922
2900
- if (!decoder -> branch_enable || ! decoder -> pge )
2923
+ if (!decoder -> branch_enable )
2901
2924
return false;
2902
2925
2903
2926
intel_pt_pkt_lookahead (decoder , intel_pt_psb_lookahead_cb , & data );
@@ -2924,6 +2947,7 @@ static int intel_pt_walk_trace(struct intel_pt_decoder *decoder)
2924
2947
if (err )
2925
2948
return err ;
2926
2949
next :
2950
+ err = 0 ;
2927
2951
if (decoder -> cyc_threshold ) {
2928
2952
if (decoder -> sample_cyc && last_packet_type != INTEL_PT_CYC )
2929
2953
decoder -> sample_cyc = false;
@@ -2962,6 +2986,7 @@ static int intel_pt_walk_trace(struct intel_pt_decoder *decoder)
2962
2986
2963
2987
case INTEL_PT_TIP_PGE : {
2964
2988
decoder -> pge = true;
2989
+ decoder -> overflow = false;
2965
2990
intel_pt_mtc_cyc_cnt_pge (decoder );
2966
2991
intel_pt_set_nr (decoder );
2967
2992
if (decoder -> packet .count == 0 ) {
@@ -2999,7 +3024,7 @@ static int intel_pt_walk_trace(struct intel_pt_decoder *decoder)
2999
3024
break ;
3000
3025
}
3001
3026
intel_pt_set_last_ip (decoder );
3002
- if (!decoder -> branch_enable ) {
3027
+ if (!decoder -> branch_enable || ! decoder -> pge ) {
3003
3028
decoder -> ip = decoder -> last_ip ;
3004
3029
if (intel_pt_fup_event (decoder ))
3005
3030
return 0 ;
@@ -3467,10 +3492,10 @@ static int intel_pt_sync_ip(struct intel_pt_decoder *decoder)
3467
3492
decoder -> set_fup_pwre = false;
3468
3493
decoder -> set_fup_exstop = false;
3469
3494
decoder -> set_fup_bep = false;
3495
+ decoder -> overflow = false;
3470
3496
3471
3497
if (!decoder -> branch_enable ) {
3472
3498
decoder -> pkt_state = INTEL_PT_STATE_IN_SYNC ;
3473
- decoder -> overflow = false;
3474
3499
decoder -> state .type = 0 ; /* Do not have a sample */
3475
3500
return 0 ;
3476
3501
}
@@ -3485,7 +3510,6 @@ static int intel_pt_sync_ip(struct intel_pt_decoder *decoder)
3485
3510
decoder -> pkt_state = INTEL_PT_STATE_RESAMPLE ;
3486
3511
else
3487
3512
decoder -> pkt_state = INTEL_PT_STATE_IN_SYNC ;
3488
- decoder -> overflow = false;
3489
3513
3490
3514
decoder -> state .from_ip = 0 ;
3491
3515
decoder -> state .to_ip = decoder -> ip ;
@@ -3607,7 +3631,7 @@ static int intel_pt_sync(struct intel_pt_decoder *decoder)
3607
3631
}
3608
3632
3609
3633
decoder -> have_last_ip = true;
3610
- decoder -> pkt_state = INTEL_PT_STATE_NO_IP ;
3634
+ decoder -> pkt_state = INTEL_PT_STATE_IN_SYNC ;
3611
3635
3612
3636
err = intel_pt_walk_psb (decoder );
3613
3637
if (err )
@@ -3704,7 +3728,8 @@ const struct intel_pt_state *intel_pt_decode(struct intel_pt_decoder *decoder)
3704
3728
3705
3729
if (err ) {
3706
3730
decoder -> state .err = intel_pt_ext_err (err );
3707
- decoder -> state .from_ip = decoder -> ip ;
3731
+ if (err != - EOVERFLOW )
3732
+ decoder -> state .from_ip = decoder -> ip ;
3708
3733
intel_pt_update_sample_time (decoder );
3709
3734
decoder -> sample_tot_cyc_cnt = decoder -> tot_cyc_cnt ;
3710
3735
intel_pt_set_nr (decoder );
0 commit comments