oprofile 0.9.6

Copy in the rest of the oprofile 0.9.6 tree so we have a source
copy to match the prebuilt binaries that are checked into
external/.

Change-Id: Iaac327571d5d583594a4194973bf256569061048
diff --git a/gui/oprof_start.h b/gui/oprof_start.h
new file mode 100644
index 0000000..c2910ee
--- /dev/null
+++ b/gui/oprof_start.h
@@ -0,0 +1,164 @@
+/**
+ * @file oprof_start.h
+ * The GUI start main class
+ *
+ * @remark Copyright 2002 OProfile authors
+ * @remark Read the file COPYING
+ *
+ * @author Philippe Elie
+ * @author John Levon
+ */
+
+#ifndef OPROF_START_H
+#define OPROF_START_H
+
+#include <vector>
+#include <map>
+#include <set>
+
+#include "ui/oprof_start.base.h"
+#include "oprof_start_config.h"
+
+#include "op_events.h"
+
+class QIntValidator;
+class QListViewItem;
+class QTimerEvent;
+
+/// a struct describing a particular event type
+struct op_event_descr {
+	op_event_descr();
+
+	/// bit mask of allowed counters
+	uint counter_mask;
+	/// hardware event number
+	u32 val;
+	/// unit mask values if applicable
+	op_unit_mask const * unit;
+	/// name of event
+	std::string name;
+	/// description of event
+	std::string help_str;
+	/// minimum counter value
+	uint min_count;
+};
+
+class oprof_start : public oprof_start_base
+{
+	Q_OBJECT
+
+public:
+	oprof_start();
+
+protected slots:
+	/// select the kernel image filename
+	void choose_kernel_filename();
+	/// flush profiler
+	void on_flush_profiler_data();
+	/// start profiler
+	void on_start_profiler();
+	/// stop profiler
+	void on_stop_profiler();
+	/// events selection change
+	void event_selected();
+	/// the mouse is over an event
+	void event_over(QListViewItem *);
+	/// state of separate_kernel_cb changed
+	void on_separate_kernel_cb_changed(int);
+	/// reset sample files
+	void on_reset_sample_files();
+
+	/// close the dialog
+	void accept();
+
+	/// WM hide event
+	void closeEvent(QCloseEvent * e);
+
+	/// timer event
+	void timerEvent(QTimerEvent * e);
+
+private:
+	/// the counter combo has been activated
+	void fill_events_listbox();
+
+	/// fill the event details and gui setup
+	void fill_events();
+
+	/// find an event description by name
+	op_event_descr const & locate_event(std::string const & name) const;
+
+	/// update config on user change
+	void record_selected_event_config();
+	/// update config and validate
+	bool record_config();
+
+	/// calculate unit mask for given event and unit mask part
+	void get_unit_mask_part(op_event_descr const & descr, uint num, bool selected, uint & mask);
+	/// calculate unit mask for given event
+	uint get_unit_mask(op_event_descr const & descr);
+	/// set the unit mask widgets for given event
+	void setup_unit_masks(op_event_descr const & descr);
+
+	/// return the maximum perf counter value for the current cpu type
+	uint max_perf_count() const;
+
+	/// show an event's settings
+	void display_event(op_event_descr const & descrp);
+
+	/// hide unit mask widgets
+	void hide_masks(void);
+
+	/// read the events set in daemonrc
+	void read_set_events();
+	/// use the default event
+	void setup_default_event();
+	/// load the extra config file
+	void load_config_file();
+	/// save the config
+	bool save_config();
+
+	/// redraw the event list by changing icon status
+	void draw_event_list();
+
+	/// return true if item is selectable or already selected
+	bool is_selectable_event(QListViewItem * item);
+
+	/// try to alloc counters for the selected_events
+	bool alloc_selected_events() const;
+
+	/// validator for event count
+	QIntValidator* event_count_validator;
+
+	/// all available events for this hardware
+	std::vector<op_event_descr> v_events;
+
+	/// current event configs for each counter
+	typedef std::map<std::string, event_setting> event_setting_map;
+	event_setting_map event_cfgs;
+
+	/// The currently selected events. We must track this because
+	/// with multiple selection listbox QT doesn't allow to know
+	/// what is the last selected item. events_selected() update it
+	std::set<QListViewItem *> selected_events;
+	QListViewItem * current_event;
+
+	/// current config
+	config_setting config;
+
+	/// the expansion of "~" directory
+	std::string user_dir;
+
+	/// CPU type
+	op_cpu cpu_type;
+
+	/// CPU speed in MHz
+	double cpu_speed;
+
+	/// total number of available HW counters
+	uint op_nr_counters;
+
+	/// Total number of samples for this run
+	unsigned long total_nr_interrupts;
+};
+
+#endif // OPROF_START_H