Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 321bb5e1 authored by Markus Metzger's avatar Markus Metzger Committed by Ingo Molnar
Browse files

x86, hw-branch-tracer: add selftest



Add a selftest for the hw-branch-tracer.

Signed-off-by: default avatarMarkus Metzger <markus.t.metzger@intel.com>
LKML-Reference: <20090313105027.A30183@sedona.ch.intel.com>
Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
parent ba9372a8
Loading
Loading
Loading
Loading
+2 −0
Original line number Original line Diff line number Diff line
@@ -576,6 +576,8 @@ extern int trace_selftest_startup_sysprof(struct tracer *trace,
					       struct trace_array *tr);
					       struct trace_array *tr);
extern int trace_selftest_startup_branch(struct tracer *trace,
extern int trace_selftest_startup_branch(struct tracer *trace,
					 struct trace_array *tr);
					 struct trace_array *tr);
extern int trace_selftest_startup_hw_branches(struct tracer *trace,
					      struct trace_array *tr);
#endif /* CONFIG_FTRACE_STARTUP_TEST */
#endif /* CONFIG_FTRACE_STARTUP_TEST */


extern void *head_page(struct trace_array_cpu *data);
extern void *head_page(struct trace_array_cpu *data);
+4 −1
Original line number Original line Diff line number Diff line
@@ -342,7 +342,10 @@ struct tracer bts_tracer __read_mostly =
	.start		= bts_trace_start,
	.start		= bts_trace_start,
	.stop		= bts_trace_stop,
	.stop		= bts_trace_stop,
	.open		= trace_bts_prepare,
	.open		= trace_bts_prepare,
	.close		= trace_bts_close
	.close		= trace_bts_close,
#ifdef CONFIG_FTRACE_SELFTEST
	.selftest	= trace_selftest_startup_hw_branches,
#endif /* CONFIG_FTRACE_SELFTEST */
};
};


__init static int init_bts_trace(void)
__init static int init_bts_trace(void)
+53 −0
Original line number Original line Diff line number Diff line
@@ -16,6 +16,7 @@ static inline int trace_valid_entry(struct trace_entry *entry)
	case TRACE_BRANCH:
	case TRACE_BRANCH:
	case TRACE_GRAPH_ENT:
	case TRACE_GRAPH_ENT:
	case TRACE_GRAPH_RET:
	case TRACE_GRAPH_RET:
	case TRACE_HW_BRANCHES:
		return 1;
		return 1;
	}
	}
	return 0;
	return 0;
@@ -691,3 +692,55 @@ trace_selftest_startup_branch(struct tracer *trace, struct trace_array *tr)
	return ret;
	return ret;
}
}
#endif /* CONFIG_BRANCH_TRACER */
#endif /* CONFIG_BRANCH_TRACER */

#ifdef CONFIG_HW_BRANCH_TRACER
int
trace_selftest_startup_hw_branches(struct tracer *trace,
				   struct trace_array *tr)
{
	unsigned long count;
	int ret;
	struct trace_iterator iter;
	struct tracer tracer;

	if (!trace->open) {
		printk(KERN_CONT "missing open function...");
		return -1;
	}

	ret = tracer_init(trace, tr);
	if (ret) {
		warn_failed_init_tracer(trace, ret);
		return ret;
	}

	/*
	 * The hw-branch tracer needs to collect the trace from the various
	 * cpu trace buffers - before tracing is stopped.
	 */
	memset(&iter, 0, sizeof(iter));
	memcpy(&tracer, trace, sizeof(tracer));

	iter.trace = &tracer;
	iter.tr = tr;
	iter.pos = -1;
	mutex_init(&iter.mutex);

	trace->open(&iter);

	mutex_destroy(&iter.mutex);

	tracing_stop();

	ret = trace_test_buffer(tr, &count);
	trace->reset(tr);
	tracing_start();

	if (!ret && !count) {
		printk(KERN_CONT "no entries found..");
		ret = -1;
	}

	return ret;
}
#endif /* CONFIG_HW_BRANCH_TRACER */