|
@@ -1165,7 +1165,7 @@ static int intel_pt_walk_tip(struct intel_pt_decoder *decoder)
|
|
decoder->pge = false;
|
|
decoder->pge = false;
|
|
decoder->continuous_period = false;
|
|
decoder->continuous_period = false;
|
|
decoder->pkt_state = INTEL_PT_STATE_IN_SYNC;
|
|
decoder->pkt_state = INTEL_PT_STATE_IN_SYNC;
|
|
- decoder->state.to_ip = 0;
|
|
|
|
|
|
+ decoder->state.type |= INTEL_PT_TRACE_END;
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
if (err == INTEL_PT_RETURN)
|
|
if (err == INTEL_PT_RETURN)
|
|
@@ -1179,9 +1179,13 @@ static int intel_pt_walk_tip(struct intel_pt_decoder *decoder)
|
|
decoder->continuous_period = false;
|
|
decoder->continuous_period = false;
|
|
decoder->pkt_state = INTEL_PT_STATE_IN_SYNC;
|
|
decoder->pkt_state = INTEL_PT_STATE_IN_SYNC;
|
|
decoder->state.from_ip = decoder->ip;
|
|
decoder->state.from_ip = decoder->ip;
|
|
- decoder->state.to_ip = 0;
|
|
|
|
- if (decoder->packet.count != 0)
|
|
|
|
|
|
+ if (decoder->packet.count == 0) {
|
|
|
|
+ decoder->state.to_ip = 0;
|
|
|
|
+ } else {
|
|
|
|
+ decoder->state.to_ip = decoder->last_ip;
|
|
decoder->ip = decoder->last_ip;
|
|
decoder->ip = decoder->last_ip;
|
|
|
|
+ }
|
|
|
|
+ decoder->state.type |= INTEL_PT_TRACE_END;
|
|
} else {
|
|
} else {
|
|
decoder->pkt_state = INTEL_PT_STATE_IN_SYNC;
|
|
decoder->pkt_state = INTEL_PT_STATE_IN_SYNC;
|
|
decoder->state.from_ip = decoder->ip;
|
|
decoder->state.from_ip = decoder->ip;
|
|
@@ -1208,7 +1212,8 @@ static int intel_pt_walk_tip(struct intel_pt_decoder *decoder)
|
|
decoder->pkt_state = INTEL_PT_STATE_IN_SYNC;
|
|
decoder->pkt_state = INTEL_PT_STATE_IN_SYNC;
|
|
decoder->ip = to_ip;
|
|
decoder->ip = to_ip;
|
|
decoder->state.from_ip = decoder->ip;
|
|
decoder->state.from_ip = decoder->ip;
|
|
- decoder->state.to_ip = 0;
|
|
|
|
|
|
+ decoder->state.to_ip = to_ip;
|
|
|
|
+ decoder->state.type |= INTEL_PT_TRACE_END;
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
intel_pt_log_at("ERROR: Conditional branch when expecting indirect branch",
|
|
intel_pt_log_at("ERROR: Conditional branch when expecting indirect branch",
|
|
@@ -1640,14 +1645,15 @@ static int intel_pt_walk_fup_tip(struct intel_pt_decoder *decoder)
|
|
|
|
|
|
case INTEL_PT_TIP_PGD:
|
|
case INTEL_PT_TIP_PGD:
|
|
decoder->state.from_ip = decoder->ip;
|
|
decoder->state.from_ip = decoder->ip;
|
|
- decoder->state.to_ip = 0;
|
|
|
|
- if (decoder->packet.count != 0) {
|
|
|
|
|
|
+ if (decoder->packet.count == 0) {
|
|
|
|
+ decoder->state.to_ip = 0;
|
|
|
|
+ } else {
|
|
intel_pt_set_ip(decoder);
|
|
intel_pt_set_ip(decoder);
|
|
- intel_pt_log("Omitting PGD ip " x64_fmt "\n",
|
|
|
|
- decoder->ip);
|
|
|
|
|
|
+ decoder->state.to_ip = decoder->ip;
|
|
}
|
|
}
|
|
decoder->pge = false;
|
|
decoder->pge = false;
|
|
decoder->continuous_period = false;
|
|
decoder->continuous_period = false;
|
|
|
|
+ decoder->state.type |= INTEL_PT_TRACE_END;
|
|
return 0;
|
|
return 0;
|
|
|
|
|
|
case INTEL_PT_TIP_PGE:
|
|
case INTEL_PT_TIP_PGE:
|
|
@@ -1661,6 +1667,7 @@ static int intel_pt_walk_fup_tip(struct intel_pt_decoder *decoder)
|
|
intel_pt_set_ip(decoder);
|
|
intel_pt_set_ip(decoder);
|
|
decoder->state.to_ip = decoder->ip;
|
|
decoder->state.to_ip = decoder->ip;
|
|
}
|
|
}
|
|
|
|
+ decoder->state.type |= INTEL_PT_TRACE_BEGIN;
|
|
return 0;
|
|
return 0;
|
|
|
|
|
|
case INTEL_PT_TIP:
|
|
case INTEL_PT_TIP:
|
|
@@ -1739,6 +1746,7 @@ next:
|
|
intel_pt_set_ip(decoder);
|
|
intel_pt_set_ip(decoder);
|
|
decoder->state.from_ip = 0;
|
|
decoder->state.from_ip = 0;
|
|
decoder->state.to_ip = decoder->ip;
|
|
decoder->state.to_ip = decoder->ip;
|
|
|
|
+ decoder->state.type |= INTEL_PT_TRACE_BEGIN;
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -2077,9 +2085,13 @@ static int intel_pt_walk_to_ip(struct intel_pt_decoder *decoder)
|
|
decoder->pge = decoder->packet.type != INTEL_PT_TIP_PGD;
|
|
decoder->pge = decoder->packet.type != INTEL_PT_TIP_PGD;
|
|
if (intel_pt_have_ip(decoder))
|
|
if (intel_pt_have_ip(decoder))
|
|
intel_pt_set_ip(decoder);
|
|
intel_pt_set_ip(decoder);
|
|
- if (decoder->ip)
|
|
|
|
- return 0;
|
|
|
|
- break;
|
|
|
|
|
|
+ if (!decoder->ip)
|
|
|
|
+ break;
|
|
|
|
+ if (decoder->packet.type == INTEL_PT_TIP_PGE)
|
|
|
|
+ decoder->state.type |= INTEL_PT_TRACE_BEGIN;
|
|
|
|
+ if (decoder->packet.type == INTEL_PT_TIP_PGD)
|
|
|
|
+ decoder->state.type |= INTEL_PT_TRACE_END;
|
|
|
|
+ return 0;
|
|
|
|
|
|
case INTEL_PT_FUP:
|
|
case INTEL_PT_FUP:
|
|
if (intel_pt_have_ip(decoder))
|
|
if (intel_pt_have_ip(decoder))
|