|
@@ -407,6 +407,13 @@ intel_pt_cache_lookup(struct dso *dso, struct machine *machine, u64 offset)
|
|
|
return auxtrace_cache__lookup(dso->auxtrace_cache, offset);
|
|
|
}
|
|
|
|
|
|
+static inline u8 intel_pt_cpumode(struct intel_pt *pt, uint64_t ip)
|
|
|
+{
|
|
|
+ return ip >= pt->kernel_start ?
|
|
|
+ PERF_RECORD_MISC_KERNEL :
|
|
|
+ PERF_RECORD_MISC_USER;
|
|
|
+}
|
|
|
+
|
|
|
static int intel_pt_walk_next_insn(struct intel_pt_insn *intel_pt_insn,
|
|
|
uint64_t *insn_cnt_ptr, uint64_t *ip,
|
|
|
uint64_t to_ip, uint64_t max_insn_cnt,
|
|
@@ -429,10 +436,7 @@ static int intel_pt_walk_next_insn(struct intel_pt_insn *intel_pt_insn,
|
|
|
if (to_ip && *ip == to_ip)
|
|
|
goto out_no_cache;
|
|
|
|
|
|
- if (*ip >= ptq->pt->kernel_start)
|
|
|
- cpumode = PERF_RECORD_MISC_KERNEL;
|
|
|
- else
|
|
|
- cpumode = PERF_RECORD_MISC_USER;
|
|
|
+ cpumode = intel_pt_cpumode(ptq->pt, *ip);
|
|
|
|
|
|
thread = ptq->thread;
|
|
|
if (!thread) {
|
|
@@ -1059,15 +1063,11 @@ static void intel_pt_prep_b_sample(struct intel_pt *pt,
|
|
|
union perf_event *event,
|
|
|
struct perf_sample *sample)
|
|
|
{
|
|
|
- event->sample.header.type = PERF_RECORD_SAMPLE;
|
|
|
- event->sample.header.misc = PERF_RECORD_MISC_USER;
|
|
|
- event->sample.header.size = sizeof(struct perf_event_header);
|
|
|
-
|
|
|
if (!pt->timeless_decoding)
|
|
|
sample->time = tsc_to_perf_time(ptq->timestamp, &pt->tc);
|
|
|
|
|
|
- sample->cpumode = PERF_RECORD_MISC_USER;
|
|
|
sample->ip = ptq->state->from_ip;
|
|
|
+ sample->cpumode = intel_pt_cpumode(pt, sample->ip);
|
|
|
sample->pid = ptq->pid;
|
|
|
sample->tid = ptq->tid;
|
|
|
sample->addr = ptq->state->to_ip;
|
|
@@ -1076,6 +1076,10 @@ static void intel_pt_prep_b_sample(struct intel_pt *pt,
|
|
|
sample->flags = ptq->flags;
|
|
|
sample->insn_len = ptq->insn_len;
|
|
|
memcpy(sample->insn, ptq->insn, INTEL_PT_INSN_BUF_SZ);
|
|
|
+
|
|
|
+ event->sample.header.type = PERF_RECORD_SAMPLE;
|
|
|
+ event->sample.header.misc = sample->cpumode;
|
|
|
+ event->sample.header.size = sizeof(struct perf_event_header);
|
|
|
}
|
|
|
|
|
|
static int intel_pt_inject_event(union perf_event *event,
|