Thread (6 messages) flat view 6 messages, 3 authors, 2015-06-18

Re: [RFC PATCH] perf/kvm: Guest Symbol Resolution for powerpc

From: David Ahern <hidden>
Date: 2015-06-16 14:54:06
Also in: lkml

On 6/15/15 8:50 PM, Hemant Kumar wrote:
+/*
+ * Get the instruction pointer from the tracepoint data
+ */
+u64 arch__get_ip(struct perf_evsel *evsel, struct perf_sample *data)
+{
+	u64 tp_ip = data->ip;
+	int trap;
+
+	if (!strcmp(KVMPPC_EXIT, evsel->name)) {
+		trap = raw_field_value(evsel->tp_format, "trap", data->raw_data);
+
+		if (trap == HV_DECREMENTER)
+			tp_ip = raw_field_value(evsel->tp_format, "pc",
+						data->raw_data);
+	}
+	return tp_ip;
+}
You can tie a handler to an event; see builtin-trace.c for example 
(evsel->handler = handler). Then have the sample handler call it (e.g, 
see trace__process_sample). Then you don't have to check event names on 
each pass like this and just do event based processing.
+
+/*
+ * Get the HV and PR bits and accordingly, determine the cpumode
+ */
+u8 arch__get_cpumode(union perf_event *event, struct perf_evsel *evsel,
+		     struct perf_sample *data)
+{
+	unsigned long hv, pr, msr;
+	u8 cpumode = event->header.misc & PERF_RECORD_MISC_CPUMODE_MASK;
+
+	if (strcmp(KVMPPC_EXIT, evsel->name))
+		goto ret;
+
+	if (data->raw_data)
+		msr = raw_field_value(evsel->tp_format, "msr", data->raw_data);
+	else
+		goto ret;
+
+	hv = msr & ((long unsigned)1 << (PPC_MAX - HV_BIT));
+	pr = msr & ((long unsigned)1 << (PPC_MAX - PR_BIT));
+
+	if (!hv && pr)
+		cpumode = PERF_RECORD_MISC_GUEST_USER;
+	else
+		cpumode = PERF_RECORD_MISC_GUEST_KERNEL;
+ret:
+	return cpumode;
+}
Why isn't that set properly kernel side when the sample is generated?

David
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help