1564b9527SAdrian Hunter# export-to-sqlite.py: export perf data to a sqlite3 database
2564b9527SAdrian Hunter# Copyright (c) 2017, Intel Corporation.
3564b9527SAdrian Hunter#
4564b9527SAdrian Hunter# This program is free software; you can redistribute it and/or modify it
5564b9527SAdrian Hunter# under the terms and conditions of the GNU General Public License,
6564b9527SAdrian Hunter# version 2, as published by the Free Software Foundation.
7564b9527SAdrian Hunter#
8564b9527SAdrian Hunter# This program is distributed in the hope it will be useful, but WITHOUT
9564b9527SAdrian Hunter# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
10564b9527SAdrian Hunter# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
11564b9527SAdrian Hunter# more details.
12564b9527SAdrian Hunter
13ebf6c5c1STony Jonesfrom __future__ import print_function
14ebf6c5c1STony Jones
15564b9527SAdrian Hunterimport os
16564b9527SAdrian Hunterimport sys
17564b9527SAdrian Hunterimport struct
18564b9527SAdrian Hunterimport datetime
19564b9527SAdrian Hunter
20564b9527SAdrian Hunter# To use this script you will need to have installed package python-pyside which
21564b9527SAdrian Hunter# provides LGPL-licensed Python bindings for Qt.  You will also need the package
22564b9527SAdrian Hunter# libqt4-sql-sqlite for Qt sqlite3 support.
23564b9527SAdrian Hunter#
24bfb3170eSAdrian Hunter# Examples of installing pyside:
25bfb3170eSAdrian Hunter#
26bfb3170eSAdrian Hunter# ubuntu:
27bfb3170eSAdrian Hunter#
28bfb3170eSAdrian Hunter#	$ sudo apt-get install python-pyside.qtsql libqt4-sql-psql
29bfb3170eSAdrian Hunter#
30bfb3170eSAdrian Hunter#	Alternately, to use Python3 and/or pyside 2, one of the following:
31bfb3170eSAdrian Hunter#
32bfb3170eSAdrian Hunter#		$ sudo apt-get install python3-pyside.qtsql libqt4-sql-psql
33bfb3170eSAdrian Hunter#		$ sudo apt-get install python-pyside2.qtsql libqt5sql5-psql
34bfb3170eSAdrian Hunter#		$ sudo apt-get install python3-pyside2.qtsql libqt5sql5-psql
35bfb3170eSAdrian Hunter# fedora:
36bfb3170eSAdrian Hunter#
37bfb3170eSAdrian Hunter#	$ sudo yum install python-pyside
38bfb3170eSAdrian Hunter#
39bfb3170eSAdrian Hunter#	Alternately, to use Python3 and/or pyside 2, one of the following:
40bfb3170eSAdrian Hunter#		$ sudo yum install python3-pyside
41bfb3170eSAdrian Hunter#		$ pip install --user PySide2
42bfb3170eSAdrian Hunter#		$ pip3 install --user PySide2
43bfb3170eSAdrian Hunter#
44564b9527SAdrian Hunter# An example of using this script with Intel PT:
45564b9527SAdrian Hunter#
46564b9527SAdrian Hunter#	$ perf record -e intel_pt//u ls
47564b9527SAdrian Hunter#	$ perf script -s ~/libexec/perf-core/scripts/python/export-to-sqlite.py pt_example branches calls
48564b9527SAdrian Hunter#	2017-07-31 14:26:07.326913 Creating database...
49564b9527SAdrian Hunter#	2017-07-31 14:26:07.538097 Writing records...
50564b9527SAdrian Hunter#	2017-07-31 14:26:09.889292 Adding indexes
51564b9527SAdrian Hunter#	2017-07-31 14:26:09.958746 Done
52564b9527SAdrian Hunter#
53564b9527SAdrian Hunter# To browse the database, sqlite3 can be used e.g.
54564b9527SAdrian Hunter#
55564b9527SAdrian Hunter#	$ sqlite3 pt_example
56564b9527SAdrian Hunter#	sqlite> .header on
57564b9527SAdrian Hunter#	sqlite> select * from samples_view where id < 10;
58564b9527SAdrian Hunter#	sqlite> .mode column
59564b9527SAdrian Hunter#	sqlite> select * from samples_view where id < 10;
60564b9527SAdrian Hunter#	sqlite> .tables
61564b9527SAdrian Hunter#	sqlite> .schema samples_view
62564b9527SAdrian Hunter#	sqlite> .quit
63564b9527SAdrian Hunter#
64564b9527SAdrian Hunter# An example of using the database is provided by the script
65031c2a00SAdrian Hunter# exported-sql-viewer.py.  Refer to that script for details.
66564b9527SAdrian Hunter#
67564b9527SAdrian Hunter# The database structure is practically the same as created by the script
68564b9527SAdrian Hunter# export-to-postgresql.py. Refer to that script for details.  A notable
69564b9527SAdrian Hunter# difference is  the 'transaction' column of the 'samples' table which is
70564b9527SAdrian Hunter# renamed 'transaction_' in sqlite because 'transaction' is a reserved word.
71564b9527SAdrian Hunter
72bfb3170eSAdrian Hunterpyside_version_1 = True
73bfb3170eSAdrian Hunterif not "pyside-version-1" in sys.argv:
74bfb3170eSAdrian Hunter	try:
75bfb3170eSAdrian Hunter		from PySide2.QtSql import *
76bfb3170eSAdrian Hunter		pyside_version_1 = False
77bfb3170eSAdrian Hunter	except:
78bfb3170eSAdrian Hunter		pass
79bfb3170eSAdrian Hunter
80bfb3170eSAdrian Hunterif pyside_version_1:
81564b9527SAdrian Hunter	from PySide.QtSql import *
82564b9527SAdrian Hunter
83564b9527SAdrian Huntersys.path.append(os.environ['PERF_EXEC_PATH'] + \
84564b9527SAdrian Hunter	'/scripts/python/Perf-Trace-Util/lib/Perf/Trace')
85564b9527SAdrian Hunter
86564b9527SAdrian Hunter# These perf imports are not used at present
87564b9527SAdrian Hunter#from perf_trace_context import *
88564b9527SAdrian Hunter#from Core import *
89564b9527SAdrian Hunter
90564b9527SAdrian Hunterperf_db_export_mode = True
91564b9527SAdrian Hunterperf_db_export_calls = False
92564b9527SAdrian Hunterperf_db_export_callchains = False
93564b9527SAdrian Hunter
94ebf6c5c1STony Jonesdef printerr(*args, **keyword_args):
95ebf6c5c1STony Jones	print(*args, file=sys.stderr, **keyword_args)
96ebf6c5c1STony Jones
9749f93bbfSTony Jonesdef printdate(*args, **kw_args):
9849f93bbfSTony Jones        print(datetime.datetime.today(), *args, sep=' ', **kw_args)
9949f93bbfSTony Jones
100564b9527SAdrian Hunterdef usage():
101bfb3170eSAdrian Hunter	printerr("Usage is: export-to-sqlite.py <database name> [<columns>] [<calls>] [<callchains>] [<pyside-version-1>]");
102ebf6c5c1STony Jones	printerr("where:  columns            'all' or 'branches'");
103ebf6c5c1STony Jones	printerr("        calls              'calls' => create calls and call_paths table");
104ebf6c5c1STony Jones	printerr("        callchains         'callchains' => create call_paths table");
105bfb3170eSAdrian Hunter	printerr("        pyside-version-1   'pyside-version-1' => use pyside version 1");
106bfb3170eSAdrian Hunter	raise Exception("Too few or bad arguments")
107564b9527SAdrian Hunter
108564b9527SAdrian Hunterif (len(sys.argv) < 2):
109564b9527SAdrian Hunter	usage()
110564b9527SAdrian Hunter
111564b9527SAdrian Hunterdbname = sys.argv[1]
112564b9527SAdrian Hunter
113564b9527SAdrian Hunterif (len(sys.argv) >= 3):
114564b9527SAdrian Hunter	columns = sys.argv[2]
115564b9527SAdrian Hunterelse:
116564b9527SAdrian Hunter	columns = "all"
117564b9527SAdrian Hunter
118564b9527SAdrian Hunterif columns not in ("all", "branches"):
119564b9527SAdrian Hunter	usage()
120564b9527SAdrian Hunter
121564b9527SAdrian Hunterbranches = (columns == "branches")
122564b9527SAdrian Hunter
123564b9527SAdrian Hunterfor i in range(3,len(sys.argv)):
124564b9527SAdrian Hunter	if (sys.argv[i] == "calls"):
125564b9527SAdrian Hunter		perf_db_export_calls = True
126564b9527SAdrian Hunter	elif (sys.argv[i] == "callchains"):
127564b9527SAdrian Hunter		perf_db_export_callchains = True
128bfb3170eSAdrian Hunter	elif (sys.argv[i] == "pyside-version-1"):
129bfb3170eSAdrian Hunter		pass
130564b9527SAdrian Hunter	else:
131564b9527SAdrian Hunter		usage()
132564b9527SAdrian Hunter
133564b9527SAdrian Hunterdef do_query(q, s):
134564b9527SAdrian Hunter	if (q.exec_(s)):
135564b9527SAdrian Hunter		return
136564b9527SAdrian Hunter	raise Exception("Query failed: " + q.lastError().text())
137564b9527SAdrian Hunter
138564b9527SAdrian Hunterdef do_query_(q):
139564b9527SAdrian Hunter	if (q.exec_()):
140564b9527SAdrian Hunter		return
141564b9527SAdrian Hunter	raise Exception("Query failed: " + q.lastError().text())
142564b9527SAdrian Hunter
14349f93bbfSTony Jonesprintdate("Creating database ...")
144564b9527SAdrian Hunter
145564b9527SAdrian Hunterdb_exists = False
146564b9527SAdrian Huntertry:
147564b9527SAdrian Hunter	f = open(dbname)
148564b9527SAdrian Hunter	f.close()
149564b9527SAdrian Hunter	db_exists = True
150564b9527SAdrian Hunterexcept:
151564b9527SAdrian Hunter	pass
152564b9527SAdrian Hunter
153564b9527SAdrian Hunterif db_exists:
154564b9527SAdrian Hunter	raise Exception(dbname + " already exists")
155564b9527SAdrian Hunter
156564b9527SAdrian Hunterdb = QSqlDatabase.addDatabase('QSQLITE')
157564b9527SAdrian Hunterdb.setDatabaseName(dbname)
158564b9527SAdrian Hunterdb.open()
159564b9527SAdrian Hunter
160564b9527SAdrian Hunterquery = QSqlQuery(db)
161564b9527SAdrian Hunter
162564b9527SAdrian Hunterdo_query(query, 'PRAGMA journal_mode = OFF')
163564b9527SAdrian Hunterdo_query(query, 'BEGIN TRANSACTION')
164564b9527SAdrian Hunter
165564b9527SAdrian Hunterdo_query(query, 'CREATE TABLE selected_events ('
166564b9527SAdrian Hunter		'id		integer		NOT NULL	PRIMARY KEY,'
167564b9527SAdrian Hunter		'name		varchar(80))')
168564b9527SAdrian Hunterdo_query(query, 'CREATE TABLE machines ('
169564b9527SAdrian Hunter		'id		integer		NOT NULL	PRIMARY KEY,'
170564b9527SAdrian Hunter		'pid		integer,'
171564b9527SAdrian Hunter		'root_dir 	varchar(4096))')
172564b9527SAdrian Hunterdo_query(query, 'CREATE TABLE threads ('
173564b9527SAdrian Hunter		'id		integer		NOT NULL	PRIMARY KEY,'
174564b9527SAdrian Hunter		'machine_id	bigint,'
175564b9527SAdrian Hunter		'process_id	bigint,'
176564b9527SAdrian Hunter		'pid		integer,'
177564b9527SAdrian Hunter		'tid		integer)')
178564b9527SAdrian Hunterdo_query(query, 'CREATE TABLE comms ('
179564b9527SAdrian Hunter		'id		integer		NOT NULL	PRIMARY KEY,'
180*41085f2bSAdrian Hunter		'comm		varchar(16),'
181*41085f2bSAdrian Hunter		'c_thread_id	bigint,'
182*41085f2bSAdrian Hunter		'c_time		bigint,'
183*41085f2bSAdrian Hunter		'exec_flag	boolean)')
184564b9527SAdrian Hunterdo_query(query, 'CREATE TABLE comm_threads ('
185564b9527SAdrian Hunter		'id		integer		NOT NULL	PRIMARY KEY,'
186564b9527SAdrian Hunter		'comm_id	bigint,'
187564b9527SAdrian Hunter		'thread_id	bigint)')
188564b9527SAdrian Hunterdo_query(query, 'CREATE TABLE dsos ('
189564b9527SAdrian Hunter		'id		integer		NOT NULL	PRIMARY KEY,'
190564b9527SAdrian Hunter		'machine_id	bigint,'
191564b9527SAdrian Hunter		'short_name	varchar(256),'
192564b9527SAdrian Hunter		'long_name	varchar(4096),'
193564b9527SAdrian Hunter		'build_id	varchar(64))')
194564b9527SAdrian Hunterdo_query(query, 'CREATE TABLE symbols ('
195564b9527SAdrian Hunter		'id		integer		NOT NULL	PRIMARY KEY,'
196564b9527SAdrian Hunter		'dso_id		bigint,'
197564b9527SAdrian Hunter		'sym_start	bigint,'
198564b9527SAdrian Hunter		'sym_end	bigint,'
199564b9527SAdrian Hunter		'binding	integer,'
200564b9527SAdrian Hunter		'name		varchar(2048))')
201564b9527SAdrian Hunterdo_query(query, 'CREATE TABLE branch_types ('
202564b9527SAdrian Hunter		'id		integer		NOT NULL	PRIMARY KEY,'
203564b9527SAdrian Hunter		'name		varchar(80))')
204564b9527SAdrian Hunter
205564b9527SAdrian Hunterif branches:
206564b9527SAdrian Hunter	do_query(query, 'CREATE TABLE samples ('
207564b9527SAdrian Hunter		'id		integer		NOT NULL	PRIMARY KEY,'
208564b9527SAdrian Hunter		'evsel_id	bigint,'
209564b9527SAdrian Hunter		'machine_id	bigint,'
210564b9527SAdrian Hunter		'thread_id	bigint,'
211564b9527SAdrian Hunter		'comm_id	bigint,'
212564b9527SAdrian Hunter		'dso_id		bigint,'
213564b9527SAdrian Hunter		'symbol_id	bigint,'
214564b9527SAdrian Hunter		'sym_offset	bigint,'
215564b9527SAdrian Hunter		'ip		bigint,'
216564b9527SAdrian Hunter		'time		bigint,'
217564b9527SAdrian Hunter		'cpu		integer,'
218564b9527SAdrian Hunter		'to_dso_id	bigint,'
219564b9527SAdrian Hunter		'to_symbol_id	bigint,'
220564b9527SAdrian Hunter		'to_sym_offset	bigint,'
221564b9527SAdrian Hunter		'to_ip		bigint,'
222564b9527SAdrian Hunter		'branch_type	integer,'
223564b9527SAdrian Hunter		'in_tx		boolean,'
22464adadb3SAdrian Hunter		'call_path_id	bigint,'
22564adadb3SAdrian Hunter		'insn_count	bigint,'
22664adadb3SAdrian Hunter		'cyc_count	bigint)')
227564b9527SAdrian Hunterelse:
228564b9527SAdrian Hunter	do_query(query, 'CREATE TABLE samples ('
229564b9527SAdrian Hunter		'id		integer		NOT NULL	PRIMARY KEY,'
230564b9527SAdrian Hunter		'evsel_id	bigint,'
231564b9527SAdrian Hunter		'machine_id	bigint,'
232564b9527SAdrian Hunter		'thread_id	bigint,'
233564b9527SAdrian Hunter		'comm_id	bigint,'
234564b9527SAdrian Hunter		'dso_id		bigint,'
235564b9527SAdrian Hunter		'symbol_id	bigint,'
236564b9527SAdrian Hunter		'sym_offset	bigint,'
237564b9527SAdrian Hunter		'ip		bigint,'
238564b9527SAdrian Hunter		'time		bigint,'
239564b9527SAdrian Hunter		'cpu		integer,'
240564b9527SAdrian Hunter		'to_dso_id	bigint,'
241564b9527SAdrian Hunter		'to_symbol_id	bigint,'
242564b9527SAdrian Hunter		'to_sym_offset	bigint,'
243564b9527SAdrian Hunter		'to_ip		bigint,'
244564b9527SAdrian Hunter		'period		bigint,'
245564b9527SAdrian Hunter		'weight		bigint,'
246564b9527SAdrian Hunter		'transaction_	bigint,'
247564b9527SAdrian Hunter		'data_src	bigint,'
248564b9527SAdrian Hunter		'branch_type	integer,'
249564b9527SAdrian Hunter		'in_tx		boolean,'
25064adadb3SAdrian Hunter		'call_path_id	bigint,'
25164adadb3SAdrian Hunter		'insn_count	bigint,'
25264adadb3SAdrian Hunter		'cyc_count	bigint)')
253564b9527SAdrian Hunter
254564b9527SAdrian Hunterif perf_db_export_calls or perf_db_export_callchains:
255564b9527SAdrian Hunter	do_query(query, 'CREATE TABLE call_paths ('
256564b9527SAdrian Hunter		'id		integer		NOT NULL	PRIMARY KEY,'
257564b9527SAdrian Hunter		'parent_id	bigint,'
258564b9527SAdrian Hunter		'symbol_id	bigint,'
259564b9527SAdrian Hunter		'ip		bigint)')
260564b9527SAdrian Hunterif perf_db_export_calls:
261564b9527SAdrian Hunter	do_query(query, 'CREATE TABLE calls ('
262564b9527SAdrian Hunter		'id		integer		NOT NULL	PRIMARY KEY,'
263564b9527SAdrian Hunter		'thread_id	bigint,'
264564b9527SAdrian Hunter		'comm_id	bigint,'
265564b9527SAdrian Hunter		'call_path_id	bigint,'
266564b9527SAdrian Hunter		'call_time	bigint,'
267564b9527SAdrian Hunter		'return_time	bigint,'
268564b9527SAdrian Hunter		'branch_count	bigint,'
269564b9527SAdrian Hunter		'call_id	bigint,'
270564b9527SAdrian Hunter		'return_id	bigint,'
271564b9527SAdrian Hunter		'parent_call_path_id	bigint,'
2728ce9a725SAdrian Hunter		'flags		integer,'
27364adadb3SAdrian Hunter		'parent_id	bigint,'
27464adadb3SAdrian Hunter		'insn_count	bigint,'
27564adadb3SAdrian Hunter		'cyc_count	bigint)')
276564b9527SAdrian Hunter
2775130c6e5SAdrian Hunterdo_query(query, 'CREATE TABLE ptwrite ('
2785130c6e5SAdrian Hunter		'id		integer		NOT NULL	PRIMARY KEY,'
2795130c6e5SAdrian Hunter		'payload	bigint,'
2805130c6e5SAdrian Hunter		'exact_ip	integer)')
2815130c6e5SAdrian Hunter
2825130c6e5SAdrian Hunterdo_query(query, 'CREATE TABLE cbr ('
2835130c6e5SAdrian Hunter		'id		integer		NOT NULL	PRIMARY KEY,'
2845130c6e5SAdrian Hunter		'cbr		integer,'
2855130c6e5SAdrian Hunter		'mhz		integer,'
2865130c6e5SAdrian Hunter		'percent	integer)')
2875130c6e5SAdrian Hunter
2885130c6e5SAdrian Hunterdo_query(query, 'CREATE TABLE mwait ('
2895130c6e5SAdrian Hunter		'id		integer		NOT NULL	PRIMARY KEY,'
2905130c6e5SAdrian Hunter		'hints		integer,'
2915130c6e5SAdrian Hunter		'extensions	integer)')
2925130c6e5SAdrian Hunter
2935130c6e5SAdrian Hunterdo_query(query, 'CREATE TABLE pwre ('
2945130c6e5SAdrian Hunter		'id		integer		NOT NULL	PRIMARY KEY,'
2955130c6e5SAdrian Hunter		'cstate		integer,'
2965130c6e5SAdrian Hunter		'subcstate	integer,'
2975130c6e5SAdrian Hunter		'hw		integer)')
2985130c6e5SAdrian Hunter
2995130c6e5SAdrian Hunterdo_query(query, 'CREATE TABLE exstop ('
3005130c6e5SAdrian Hunter		'id		integer		NOT NULL	PRIMARY KEY,'
3015130c6e5SAdrian Hunter		'exact_ip	integer)')
3025130c6e5SAdrian Hunter
3035130c6e5SAdrian Hunterdo_query(query, 'CREATE TABLE pwrx ('
3045130c6e5SAdrian Hunter		'id		integer		NOT NULL	PRIMARY KEY,'
3055130c6e5SAdrian Hunter		'deepest_cstate	integer,'
3065130c6e5SAdrian Hunter		'last_cstate	integer,'
3075130c6e5SAdrian Hunter		'wake_reason	integer)')
3085130c6e5SAdrian Hunter
309564b9527SAdrian Hunter# printf was added to sqlite in version 3.8.3
310564b9527SAdrian Huntersqlite_has_printf = False
311564b9527SAdrian Huntertry:
312564b9527SAdrian Hunter	do_query(query, 'SELECT printf("") FROM machines')
313564b9527SAdrian Hunter	sqlite_has_printf = True
314564b9527SAdrian Hunterexcept:
315564b9527SAdrian Hunter	pass
316564b9527SAdrian Hunter
317564b9527SAdrian Hunterdef emit_to_hex(x):
318564b9527SAdrian Hunter	if sqlite_has_printf:
319564b9527SAdrian Hunter		return 'printf("%x", ' + x + ')'
320564b9527SAdrian Hunter	else:
321564b9527SAdrian Hunter		return x
322564b9527SAdrian Hunter
323564b9527SAdrian Hunterdo_query(query, 'CREATE VIEW machines_view AS '
324564b9527SAdrian Hunter	'SELECT '
325564b9527SAdrian Hunter		'id,'
326564b9527SAdrian Hunter		'pid,'
327564b9527SAdrian Hunter		'root_dir,'
328564b9527SAdrian Hunter		'CASE WHEN id=0 THEN \'unknown\' WHEN pid=-1 THEN \'host\' ELSE \'guest\' END AS host_or_guest'
329564b9527SAdrian Hunter	' FROM machines')
330564b9527SAdrian Hunter
331564b9527SAdrian Hunterdo_query(query, 'CREATE VIEW dsos_view AS '
332564b9527SAdrian Hunter	'SELECT '
333564b9527SAdrian Hunter		'id,'
334564b9527SAdrian Hunter		'machine_id,'
335564b9527SAdrian Hunter		'(SELECT host_or_guest FROM machines_view WHERE id = machine_id) AS host_or_guest,'
336564b9527SAdrian Hunter		'short_name,'
337564b9527SAdrian Hunter		'long_name,'
338564b9527SAdrian Hunter		'build_id'
339564b9527SAdrian Hunter	' FROM dsos')
340564b9527SAdrian Hunter
341564b9527SAdrian Hunterdo_query(query, 'CREATE VIEW symbols_view AS '
342564b9527SAdrian Hunter	'SELECT '
343564b9527SAdrian Hunter		'id,'
344564b9527SAdrian Hunter		'name,'
345564b9527SAdrian Hunter		'(SELECT short_name FROM dsos WHERE id=dso_id) AS dso,'
346564b9527SAdrian Hunter		'dso_id,'
347564b9527SAdrian Hunter		'sym_start,'
348564b9527SAdrian Hunter		'sym_end,'
349564b9527SAdrian Hunter		'CASE WHEN binding=0 THEN \'local\' WHEN binding=1 THEN \'global\' ELSE \'weak\' END AS binding'
350564b9527SAdrian Hunter	' FROM symbols')
351564b9527SAdrian Hunter
352564b9527SAdrian Hunterdo_query(query, 'CREATE VIEW threads_view AS '
353564b9527SAdrian Hunter	'SELECT '
354564b9527SAdrian Hunter		'id,'
355564b9527SAdrian Hunter		'machine_id,'
356564b9527SAdrian Hunter		'(SELECT host_or_guest FROM machines_view WHERE id = machine_id) AS host_or_guest,'
357564b9527SAdrian Hunter		'process_id,'
358564b9527SAdrian Hunter		'pid,'
359564b9527SAdrian Hunter		'tid'
360564b9527SAdrian Hunter	' FROM threads')
361564b9527SAdrian Hunter
362564b9527SAdrian Hunterdo_query(query, 'CREATE VIEW comm_threads_view AS '
363564b9527SAdrian Hunter	'SELECT '
364564b9527SAdrian Hunter		'comm_id,'
365564b9527SAdrian Hunter		'(SELECT comm FROM comms WHERE id = comm_id) AS command,'
366564b9527SAdrian Hunter		'thread_id,'
367564b9527SAdrian Hunter		'(SELECT pid FROM threads WHERE id = thread_id) AS pid,'
368564b9527SAdrian Hunter		'(SELECT tid FROM threads WHERE id = thread_id) AS tid'
369564b9527SAdrian Hunter	' FROM comm_threads')
370564b9527SAdrian Hunter
371564b9527SAdrian Hunterif perf_db_export_calls or perf_db_export_callchains:
372564b9527SAdrian Hunter	do_query(query, 'CREATE VIEW call_paths_view AS '
373564b9527SAdrian Hunter		'SELECT '
374564b9527SAdrian Hunter			'c.id,'
375564b9527SAdrian Hunter			+ emit_to_hex('c.ip') + ' AS ip,'
376564b9527SAdrian Hunter			'c.symbol_id,'
377564b9527SAdrian Hunter			'(SELECT name FROM symbols WHERE id = c.symbol_id) AS symbol,'
378564b9527SAdrian Hunter			'(SELECT dso_id FROM symbols WHERE id = c.symbol_id) AS dso_id,'
379564b9527SAdrian Hunter			'(SELECT dso FROM symbols_view  WHERE id = c.symbol_id) AS dso_short_name,'
380564b9527SAdrian Hunter			'c.parent_id,'
381564b9527SAdrian Hunter			+ emit_to_hex('p.ip') + ' AS parent_ip,'
382564b9527SAdrian Hunter			'p.symbol_id AS parent_symbol_id,'
383564b9527SAdrian Hunter			'(SELECT name FROM symbols WHERE id = p.symbol_id) AS parent_symbol,'
384564b9527SAdrian Hunter			'(SELECT dso_id FROM symbols WHERE id = p.symbol_id) AS parent_dso_id,'
385564b9527SAdrian Hunter			'(SELECT dso FROM symbols_view  WHERE id = p.symbol_id) AS parent_dso_short_name'
386564b9527SAdrian Hunter		' FROM call_paths c INNER JOIN call_paths p ON p.id = c.parent_id')
387564b9527SAdrian Hunterif perf_db_export_calls:
388564b9527SAdrian Hunter	do_query(query, 'CREATE VIEW calls_view AS '
389564b9527SAdrian Hunter		'SELECT '
390564b9527SAdrian Hunter			'calls.id,'
391564b9527SAdrian Hunter			'thread_id,'
392564b9527SAdrian Hunter			'(SELECT pid FROM threads WHERE id = thread_id) AS pid,'
393564b9527SAdrian Hunter			'(SELECT tid FROM threads WHERE id = thread_id) AS tid,'
394564b9527SAdrian Hunter			'(SELECT comm FROM comms WHERE id = comm_id) AS command,'
395564b9527SAdrian Hunter			'call_path_id,'
396564b9527SAdrian Hunter			+ emit_to_hex('ip') + ' AS ip,'
397564b9527SAdrian Hunter			'symbol_id,'
398564b9527SAdrian Hunter			'(SELECT name FROM symbols WHERE id = symbol_id) AS symbol,'
399564b9527SAdrian Hunter			'call_time,'
400564b9527SAdrian Hunter			'return_time,'
401564b9527SAdrian Hunter			'return_time - call_time AS elapsed_time,'
402564b9527SAdrian Hunter			'branch_count,'
40364adadb3SAdrian Hunter			'insn_count,'
40464adadb3SAdrian Hunter			'cyc_count,'
40564adadb3SAdrian Hunter			'CASE WHEN cyc_count=0 THEN CAST(0 AS FLOAT) ELSE ROUND(CAST(insn_count AS FLOAT) / cyc_count, 2) END AS IPC,'
406564b9527SAdrian Hunter			'call_id,'
407564b9527SAdrian Hunter			'return_id,'
408f08046cbSAdrian Hunter			'CASE WHEN flags=0 THEN \'\' WHEN flags=1 THEN \'no call\' WHEN flags=2 THEN \'no return\' WHEN flags=3 THEN \'no call/return\' WHEN flags=6 THEN \'jump\' ELSE flags END AS flags,'
4098ce9a725SAdrian Hunter			'parent_call_path_id,'
4106e4b1cacSAdrian Hunter			'calls.parent_id'
411564b9527SAdrian Hunter		' FROM calls INNER JOIN call_paths ON call_paths.id = call_path_id')
412564b9527SAdrian Hunter
413564b9527SAdrian Hunterdo_query(query, 'CREATE VIEW samples_view AS '
414564b9527SAdrian Hunter	'SELECT '
415564b9527SAdrian Hunter		'id,'
416564b9527SAdrian Hunter		'time,'
417564b9527SAdrian Hunter		'cpu,'
418564b9527SAdrian Hunter		'(SELECT pid FROM threads WHERE id = thread_id) AS pid,'
419564b9527SAdrian Hunter		'(SELECT tid FROM threads WHERE id = thread_id) AS tid,'
420564b9527SAdrian Hunter		'(SELECT comm FROM comms WHERE id = comm_id) AS command,'
421564b9527SAdrian Hunter		'(SELECT name FROM selected_events WHERE id = evsel_id) AS event,'
422564b9527SAdrian Hunter		+ emit_to_hex('ip') + ' AS ip_hex,'
423564b9527SAdrian Hunter		'(SELECT name FROM symbols WHERE id = symbol_id) AS symbol,'
424564b9527SAdrian Hunter		'sym_offset,'
425564b9527SAdrian Hunter		'(SELECT short_name FROM dsos WHERE id = dso_id) AS dso_short_name,'
426564b9527SAdrian Hunter		+ emit_to_hex('to_ip') + ' AS to_ip_hex,'
427564b9527SAdrian Hunter		'(SELECT name FROM symbols WHERE id = to_symbol_id) AS to_symbol,'
428564b9527SAdrian Hunter		'to_sym_offset,'
429564b9527SAdrian Hunter		'(SELECT short_name FROM dsos WHERE id = to_dso_id) AS to_dso_short_name,'
430564b9527SAdrian Hunter		'(SELECT name FROM branch_types WHERE id = branch_type) AS branch_type_name,'
43164adadb3SAdrian Hunter		'in_tx,'
43264adadb3SAdrian Hunter		'insn_count,'
43364adadb3SAdrian Hunter		'cyc_count,'
43464adadb3SAdrian Hunter		'CASE WHEN cyc_count=0 THEN CAST(0 AS FLOAT) ELSE ROUND(CAST(insn_count AS FLOAT) / cyc_count, 2) END AS IPC'
435564b9527SAdrian Hunter	' FROM samples')
436564b9527SAdrian Hunter
4375130c6e5SAdrian Hunterdo_query(query, 'CREATE VIEW ptwrite_view AS '
4385130c6e5SAdrian Hunter	'SELECT '
4395130c6e5SAdrian Hunter		'ptwrite.id,'
4405130c6e5SAdrian Hunter		'time,'
4415130c6e5SAdrian Hunter		'cpu,'
4425130c6e5SAdrian Hunter		+ emit_to_hex('payload') + ' AS payload_hex,'
4435130c6e5SAdrian Hunter		'CASE WHEN exact_ip=0 THEN \'False\' ELSE \'True\' END AS exact_ip'
4445130c6e5SAdrian Hunter	' FROM ptwrite'
4455130c6e5SAdrian Hunter	' INNER JOIN samples ON samples.id = ptwrite.id')
4465130c6e5SAdrian Hunter
4475130c6e5SAdrian Hunterdo_query(query, 'CREATE VIEW cbr_view AS '
4485130c6e5SAdrian Hunter	'SELECT '
4495130c6e5SAdrian Hunter		'cbr.id,'
4505130c6e5SAdrian Hunter		'time,'
4515130c6e5SAdrian Hunter		'cpu,'
4525130c6e5SAdrian Hunter		'cbr,'
4535130c6e5SAdrian Hunter		'mhz,'
4545130c6e5SAdrian Hunter		'percent'
4555130c6e5SAdrian Hunter	' FROM cbr'
4565130c6e5SAdrian Hunter	' INNER JOIN samples ON samples.id = cbr.id')
4575130c6e5SAdrian Hunter
4585130c6e5SAdrian Hunterdo_query(query, 'CREATE VIEW mwait_view AS '
4595130c6e5SAdrian Hunter	'SELECT '
4605130c6e5SAdrian Hunter		'mwait.id,'
4615130c6e5SAdrian Hunter		'time,'
4625130c6e5SAdrian Hunter		'cpu,'
4635130c6e5SAdrian Hunter		+ emit_to_hex('hints') + ' AS hints_hex,'
4645130c6e5SAdrian Hunter		+ emit_to_hex('extensions') + ' AS extensions_hex'
4655130c6e5SAdrian Hunter	' FROM mwait'
4665130c6e5SAdrian Hunter	' INNER JOIN samples ON samples.id = mwait.id')
4675130c6e5SAdrian Hunter
4685130c6e5SAdrian Hunterdo_query(query, 'CREATE VIEW pwre_view AS '
4695130c6e5SAdrian Hunter	'SELECT '
4705130c6e5SAdrian Hunter		'pwre.id,'
4715130c6e5SAdrian Hunter		'time,'
4725130c6e5SAdrian Hunter		'cpu,'
4735130c6e5SAdrian Hunter		'cstate,'
4745130c6e5SAdrian Hunter		'subcstate,'
4755130c6e5SAdrian Hunter		'CASE WHEN hw=0 THEN \'False\' ELSE \'True\' END AS hw'
4765130c6e5SAdrian Hunter	' FROM pwre'
4775130c6e5SAdrian Hunter	' INNER JOIN samples ON samples.id = pwre.id')
4785130c6e5SAdrian Hunter
4795130c6e5SAdrian Hunterdo_query(query, 'CREATE VIEW exstop_view AS '
4805130c6e5SAdrian Hunter	'SELECT '
4815130c6e5SAdrian Hunter		'exstop.id,'
4825130c6e5SAdrian Hunter		'time,'
4835130c6e5SAdrian Hunter		'cpu,'
4845130c6e5SAdrian Hunter		'CASE WHEN exact_ip=0 THEN \'False\' ELSE \'True\' END AS exact_ip'
4855130c6e5SAdrian Hunter	' FROM exstop'
4865130c6e5SAdrian Hunter	' INNER JOIN samples ON samples.id = exstop.id')
4875130c6e5SAdrian Hunter
4885130c6e5SAdrian Hunterdo_query(query, 'CREATE VIEW pwrx_view AS '
4895130c6e5SAdrian Hunter	'SELECT '
4905130c6e5SAdrian Hunter		'pwrx.id,'
4915130c6e5SAdrian Hunter		'time,'
4925130c6e5SAdrian Hunter		'cpu,'
4935130c6e5SAdrian Hunter		'deepest_cstate,'
4945130c6e5SAdrian Hunter		'last_cstate,'
4955130c6e5SAdrian Hunter		'CASE     WHEN wake_reason=1 THEN \'Interrupt\''
4965130c6e5SAdrian Hunter			' WHEN wake_reason=2 THEN \'Timer Deadline\''
4975130c6e5SAdrian Hunter			' WHEN wake_reason=4 THEN \'Monitored Address\''
4985130c6e5SAdrian Hunter			' WHEN wake_reason=8 THEN \'HW\''
4995130c6e5SAdrian Hunter			' ELSE wake_reason '
5005130c6e5SAdrian Hunter		'END AS wake_reason'
5015130c6e5SAdrian Hunter	' FROM pwrx'
5025130c6e5SAdrian Hunter	' INNER JOIN samples ON samples.id = pwrx.id')
5035130c6e5SAdrian Hunter
5045130c6e5SAdrian Hunterdo_query(query, 'CREATE VIEW power_events_view AS '
5055130c6e5SAdrian Hunter	'SELECT '
5065130c6e5SAdrian Hunter		'samples.id,'
5075130c6e5SAdrian Hunter		'time,'
5085130c6e5SAdrian Hunter		'cpu,'
5095130c6e5SAdrian Hunter		'selected_events.name AS event,'
5105130c6e5SAdrian Hunter		'CASE WHEN selected_events.name=\'cbr\' THEN (SELECT cbr FROM cbr WHERE cbr.id = samples.id) ELSE "" END AS cbr,'
5115130c6e5SAdrian Hunter		'CASE WHEN selected_events.name=\'cbr\' THEN (SELECT mhz FROM cbr WHERE cbr.id = samples.id) ELSE "" END AS mhz,'
5125130c6e5SAdrian Hunter		'CASE WHEN selected_events.name=\'cbr\' THEN (SELECT percent FROM cbr WHERE cbr.id = samples.id) ELSE "" END AS percent,'
5135130c6e5SAdrian Hunter		'CASE WHEN selected_events.name=\'mwait\' THEN (SELECT ' + emit_to_hex('hints') + ' FROM mwait WHERE mwait.id = samples.id) ELSE "" END AS hints_hex,'
5145130c6e5SAdrian Hunter		'CASE WHEN selected_events.name=\'mwait\' THEN (SELECT ' + emit_to_hex('extensions') + ' FROM mwait WHERE mwait.id = samples.id) ELSE "" END AS extensions_hex,'
5155130c6e5SAdrian Hunter		'CASE WHEN selected_events.name=\'pwre\' THEN (SELECT cstate FROM pwre WHERE pwre.id = samples.id) ELSE "" END AS cstate,'
5165130c6e5SAdrian Hunter		'CASE WHEN selected_events.name=\'pwre\' THEN (SELECT subcstate FROM pwre WHERE pwre.id = samples.id) ELSE "" END AS subcstate,'
5175130c6e5SAdrian Hunter		'CASE WHEN selected_events.name=\'pwre\' THEN (SELECT hw FROM pwre WHERE pwre.id = samples.id) ELSE "" END AS hw,'
5185130c6e5SAdrian Hunter		'CASE WHEN selected_events.name=\'exstop\' THEN (SELECT exact_ip FROM exstop WHERE exstop.id = samples.id) ELSE "" END AS exact_ip,'
5195130c6e5SAdrian Hunter		'CASE WHEN selected_events.name=\'pwrx\' THEN (SELECT deepest_cstate FROM pwrx WHERE pwrx.id = samples.id) ELSE "" END AS deepest_cstate,'
5205130c6e5SAdrian Hunter		'CASE WHEN selected_events.name=\'pwrx\' THEN (SELECT last_cstate FROM pwrx WHERE pwrx.id = samples.id) ELSE "" END AS last_cstate,'
5215130c6e5SAdrian Hunter		'CASE WHEN selected_events.name=\'pwrx\' THEN (SELECT '
5225130c6e5SAdrian Hunter			'CASE     WHEN wake_reason=1 THEN \'Interrupt\''
5235130c6e5SAdrian Hunter				' WHEN wake_reason=2 THEN \'Timer Deadline\''
5245130c6e5SAdrian Hunter				' WHEN wake_reason=4 THEN \'Monitored Address\''
5255130c6e5SAdrian Hunter				' WHEN wake_reason=8 THEN \'HW\''
5265130c6e5SAdrian Hunter				' ELSE wake_reason '
5275130c6e5SAdrian Hunter			'END'
5285130c6e5SAdrian Hunter		' FROM pwrx WHERE pwrx.id = samples.id) ELSE "" END AS wake_reason'
5295130c6e5SAdrian Hunter	' FROM samples'
5305130c6e5SAdrian Hunter	' INNER JOIN selected_events ON selected_events.id = evsel_id'
5315130c6e5SAdrian Hunter	' WHERE selected_events.name IN (\'cbr\',\'mwait\',\'exstop\',\'pwre\',\'pwrx\')')
5325130c6e5SAdrian Hunter
533564b9527SAdrian Hunterdo_query(query, 'END TRANSACTION')
534564b9527SAdrian Hunter
535564b9527SAdrian Hunterevsel_query = QSqlQuery(db)
536564b9527SAdrian Hunterevsel_query.prepare("INSERT INTO selected_events VALUES (?, ?)")
537564b9527SAdrian Huntermachine_query = QSqlQuery(db)
538564b9527SAdrian Huntermachine_query.prepare("INSERT INTO machines VALUES (?, ?, ?)")
539564b9527SAdrian Hunterthread_query = QSqlQuery(db)
540564b9527SAdrian Hunterthread_query.prepare("INSERT INTO threads VALUES (?, ?, ?, ?, ?)")
541564b9527SAdrian Huntercomm_query = QSqlQuery(db)
542*41085f2bSAdrian Huntercomm_query.prepare("INSERT INTO comms VALUES (?, ?, ?, ?, ?)")
543564b9527SAdrian Huntercomm_thread_query = QSqlQuery(db)
544564b9527SAdrian Huntercomm_thread_query.prepare("INSERT INTO comm_threads VALUES (?, ?, ?)")
545564b9527SAdrian Hunterdso_query = QSqlQuery(db)
546564b9527SAdrian Hunterdso_query.prepare("INSERT INTO dsos VALUES (?, ?, ?, ?, ?)")
547564b9527SAdrian Huntersymbol_query = QSqlQuery(db)
548564b9527SAdrian Huntersymbol_query.prepare("INSERT INTO symbols VALUES (?, ?, ?, ?, ?, ?)")
549564b9527SAdrian Hunterbranch_type_query = QSqlQuery(db)
550564b9527SAdrian Hunterbranch_type_query.prepare("INSERT INTO branch_types VALUES (?, ?)")
551564b9527SAdrian Huntersample_query = QSqlQuery(db)
552564b9527SAdrian Hunterif branches:
55364adadb3SAdrian Hunter	sample_query.prepare("INSERT INTO samples VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)")
554564b9527SAdrian Hunterelse:
55564adadb3SAdrian Hunter	sample_query.prepare("INSERT INTO samples VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)")
556564b9527SAdrian Hunterif perf_db_export_calls or perf_db_export_callchains:
557564b9527SAdrian Hunter	call_path_query = QSqlQuery(db)
558564b9527SAdrian Hunter	call_path_query.prepare("INSERT INTO call_paths VALUES (?, ?, ?, ?)")
559564b9527SAdrian Hunterif perf_db_export_calls:
560564b9527SAdrian Hunter	call_query = QSqlQuery(db)
56164adadb3SAdrian Hunter	call_query.prepare("INSERT INTO calls VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)")
5625130c6e5SAdrian Hunterptwrite_query = QSqlQuery(db)
5635130c6e5SAdrian Hunterptwrite_query.prepare("INSERT INTO ptwrite VALUES (?, ?, ?)")
5645130c6e5SAdrian Huntercbr_query = QSqlQuery(db)
5655130c6e5SAdrian Huntercbr_query.prepare("INSERT INTO cbr VALUES (?, ?, ?, ?)")
5665130c6e5SAdrian Huntermwait_query = QSqlQuery(db)
5675130c6e5SAdrian Huntermwait_query.prepare("INSERT INTO mwait VALUES (?, ?, ?)")
5685130c6e5SAdrian Hunterpwre_query = QSqlQuery(db)
5695130c6e5SAdrian Hunterpwre_query.prepare("INSERT INTO pwre VALUES (?, ?, ?, ?)")
5705130c6e5SAdrian Hunterexstop_query = QSqlQuery(db)
5715130c6e5SAdrian Hunterexstop_query.prepare("INSERT INTO exstop VALUES (?, ?)")
5725130c6e5SAdrian Hunterpwrx_query = QSqlQuery(db)
5735130c6e5SAdrian Hunterpwrx_query.prepare("INSERT INTO pwrx VALUES (?, ?, ?, ?)")
574564b9527SAdrian Hunter
575564b9527SAdrian Hunterdef trace_begin():
57649f93bbfSTony Jones	printdate("Writing records...")
577564b9527SAdrian Hunter	do_query(query, 'BEGIN TRANSACTION')
578564b9527SAdrian Hunter	# id == 0 means unknown.  It is easier to create records for them than replace the zeroes with NULLs
579564b9527SAdrian Hunter	evsel_table(0, "unknown")
580564b9527SAdrian Hunter	machine_table(0, 0, "unknown")
581564b9527SAdrian Hunter	thread_table(0, 0, 0, -1, -1)
582*41085f2bSAdrian Hunter	comm_table(0, "unknown", 0, 0, 0)
583564b9527SAdrian Hunter	dso_table(0, 0, "unknown", "unknown", "")
584564b9527SAdrian Hunter	symbol_table(0, 0, 0, 0, 0, "unknown")
58564adadb3SAdrian Hunter	sample_table(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
586564b9527SAdrian Hunter	if perf_db_export_calls or perf_db_export_callchains:
587564b9527SAdrian Hunter		call_path_table(0, 0, 0, 0)
58864adadb3SAdrian Hunter		call_return_table(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
589564b9527SAdrian Hunter
590564b9527SAdrian Hunterunhandled_count = 0
591564b9527SAdrian Hunter
5925130c6e5SAdrian Hunterdef is_table_empty(table_name):
5935130c6e5SAdrian Hunter	do_query(query, 'SELECT * FROM ' + table_name + ' LIMIT 1');
5945130c6e5SAdrian Hunter	if query.next():
5955130c6e5SAdrian Hunter		return False
5965130c6e5SAdrian Hunter	return True
5975130c6e5SAdrian Hunter
5985130c6e5SAdrian Hunterdef drop(table_name):
5995130c6e5SAdrian Hunter	do_query(query, 'DROP VIEW ' + table_name + '_view');
6005130c6e5SAdrian Hunter	do_query(query, 'DROP TABLE ' + table_name);
6015130c6e5SAdrian Hunter
602564b9527SAdrian Hunterdef trace_end():
603564b9527SAdrian Hunter	do_query(query, 'END TRANSACTION')
604564b9527SAdrian Hunter
60549f93bbfSTony Jones	printdate("Adding indexes")
606564b9527SAdrian Hunter	if perf_db_export_calls:
607564b9527SAdrian Hunter		do_query(query, 'CREATE INDEX pcpid_idx ON calls (parent_call_path_id)')
6088ce9a725SAdrian Hunter		do_query(query, 'CREATE INDEX pid_idx ON calls (parent_id)')
609564b9527SAdrian Hunter
6105130c6e5SAdrian Hunter	printdate("Dropping unused tables")
6115130c6e5SAdrian Hunter	if is_table_empty("ptwrite"):
6125130c6e5SAdrian Hunter		drop("ptwrite")
6135130c6e5SAdrian Hunter	if is_table_empty("mwait") and is_table_empty("pwre") and is_table_empty("exstop") and is_table_empty("pwrx"):
6141334bb94SAdrian Hunter		do_query(query, 'DROP VIEW power_events_view');
6155130c6e5SAdrian Hunter		drop("mwait")
6165130c6e5SAdrian Hunter		drop("pwre")
6175130c6e5SAdrian Hunter		drop("exstop")
6185130c6e5SAdrian Hunter		drop("pwrx")
6195130c6e5SAdrian Hunter		if is_table_empty("cbr"):
6205130c6e5SAdrian Hunter			drop("cbr")
6215130c6e5SAdrian Hunter
622564b9527SAdrian Hunter	if (unhandled_count):
62349f93bbfSTony Jones		printdate("Warning: ", unhandled_count, " unhandled events")
62449f93bbfSTony Jones	printdate("Done")
625564b9527SAdrian Hunter
626564b9527SAdrian Hunterdef trace_unhandled(event_name, context, event_fields_dict):
627564b9527SAdrian Hunter	global unhandled_count
628564b9527SAdrian Hunter	unhandled_count += 1
629564b9527SAdrian Hunter
630564b9527SAdrian Hunterdef sched__sched_switch(*x):
631564b9527SAdrian Hunter	pass
632564b9527SAdrian Hunter
633564b9527SAdrian Hunterdef bind_exec(q, n, x):
634564b9527SAdrian Hunter	for xx in x[0:n]:
635564b9527SAdrian Hunter		q.addBindValue(str(xx))
636564b9527SAdrian Hunter	do_query_(q)
637564b9527SAdrian Hunter
638564b9527SAdrian Hunterdef evsel_table(*x):
639564b9527SAdrian Hunter	bind_exec(evsel_query, 2, x)
640564b9527SAdrian Hunter
641564b9527SAdrian Hunterdef machine_table(*x):
642564b9527SAdrian Hunter	bind_exec(machine_query, 3, x)
643564b9527SAdrian Hunter
644564b9527SAdrian Hunterdef thread_table(*x):
645564b9527SAdrian Hunter	bind_exec(thread_query, 5, x)
646564b9527SAdrian Hunter
647564b9527SAdrian Hunterdef comm_table(*x):
648*41085f2bSAdrian Hunter	bind_exec(comm_query, 5, x)
649564b9527SAdrian Hunter
650564b9527SAdrian Hunterdef comm_thread_table(*x):
651564b9527SAdrian Hunter	bind_exec(comm_thread_query, 3, x)
652564b9527SAdrian Hunter
653564b9527SAdrian Hunterdef dso_table(*x):
654564b9527SAdrian Hunter	bind_exec(dso_query, 5, x)
655564b9527SAdrian Hunter
656564b9527SAdrian Hunterdef symbol_table(*x):
657564b9527SAdrian Hunter	bind_exec(symbol_query, 6, x)
658564b9527SAdrian Hunter
659564b9527SAdrian Hunterdef branch_type_table(*x):
660564b9527SAdrian Hunter	bind_exec(branch_type_query, 2, x)
661564b9527SAdrian Hunter
662564b9527SAdrian Hunterdef sample_table(*x):
663564b9527SAdrian Hunter	if branches:
664d005efe1SAdrian Hunter		for xx in x[0:15]:
665d005efe1SAdrian Hunter			sample_query.addBindValue(str(xx))
66664adadb3SAdrian Hunter		for xx in x[19:24]:
667d005efe1SAdrian Hunter			sample_query.addBindValue(str(xx))
668d005efe1SAdrian Hunter		do_query_(sample_query)
669564b9527SAdrian Hunter	else:
67064adadb3SAdrian Hunter		bind_exec(sample_query, 24, x)
671564b9527SAdrian Hunter
672564b9527SAdrian Hunterdef call_path_table(*x):
673564b9527SAdrian Hunter	bind_exec(call_path_query, 4, x)
674564b9527SAdrian Hunter
675564b9527SAdrian Hunterdef call_return_table(*x):
67664adadb3SAdrian Hunter	bind_exec(call_query, 14, x)
6775130c6e5SAdrian Hunter
6785130c6e5SAdrian Hunterdef ptwrite(id, raw_buf):
6795130c6e5SAdrian Hunter	data = struct.unpack_from("<IQ", raw_buf)
6805130c6e5SAdrian Hunter	flags = data[0]
6815130c6e5SAdrian Hunter	payload = data[1]
6825130c6e5SAdrian Hunter	exact_ip = flags & 1
6835130c6e5SAdrian Hunter	ptwrite_query.addBindValue(str(id))
6845130c6e5SAdrian Hunter	ptwrite_query.addBindValue(str(payload))
6855130c6e5SAdrian Hunter	ptwrite_query.addBindValue(str(exact_ip))
6865130c6e5SAdrian Hunter	do_query_(ptwrite_query)
6875130c6e5SAdrian Hunter
6885130c6e5SAdrian Hunterdef cbr(id, raw_buf):
6895130c6e5SAdrian Hunter	data = struct.unpack_from("<BBBBII", raw_buf)
6905130c6e5SAdrian Hunter	cbr = data[0]
6915130c6e5SAdrian Hunter	MHz = (data[4] + 500) / 1000
6925130c6e5SAdrian Hunter	percent = ((cbr * 1000 / data[2]) + 5) / 10
6935130c6e5SAdrian Hunter	cbr_query.addBindValue(str(id))
6945130c6e5SAdrian Hunter	cbr_query.addBindValue(str(cbr))
6955130c6e5SAdrian Hunter	cbr_query.addBindValue(str(MHz))
6965130c6e5SAdrian Hunter	cbr_query.addBindValue(str(percent))
6975130c6e5SAdrian Hunter	do_query_(cbr_query)
6985130c6e5SAdrian Hunter
6995130c6e5SAdrian Hunterdef mwait(id, raw_buf):
7005130c6e5SAdrian Hunter	data = struct.unpack_from("<IQ", raw_buf)
7015130c6e5SAdrian Hunter	payload = data[1]
7025130c6e5SAdrian Hunter	hints = payload & 0xff
7035130c6e5SAdrian Hunter	extensions = (payload >> 32) & 0x3
7045130c6e5SAdrian Hunter	mwait_query.addBindValue(str(id))
7055130c6e5SAdrian Hunter	mwait_query.addBindValue(str(hints))
7065130c6e5SAdrian Hunter	mwait_query.addBindValue(str(extensions))
7075130c6e5SAdrian Hunter	do_query_(mwait_query)
7085130c6e5SAdrian Hunter
7095130c6e5SAdrian Hunterdef pwre(id, raw_buf):
7105130c6e5SAdrian Hunter	data = struct.unpack_from("<IQ", raw_buf)
7115130c6e5SAdrian Hunter	payload = data[1]
7125130c6e5SAdrian Hunter	hw = (payload >> 7) & 1
7135130c6e5SAdrian Hunter	cstate = (payload >> 12) & 0xf
7145130c6e5SAdrian Hunter	subcstate = (payload >> 8) & 0xf
7155130c6e5SAdrian Hunter	pwre_query.addBindValue(str(id))
7165130c6e5SAdrian Hunter	pwre_query.addBindValue(str(cstate))
7175130c6e5SAdrian Hunter	pwre_query.addBindValue(str(subcstate))
7185130c6e5SAdrian Hunter	pwre_query.addBindValue(str(hw))
7195130c6e5SAdrian Hunter	do_query_(pwre_query)
7205130c6e5SAdrian Hunter
7215130c6e5SAdrian Hunterdef exstop(id, raw_buf):
7225130c6e5SAdrian Hunter	data = struct.unpack_from("<I", raw_buf)
7235130c6e5SAdrian Hunter	flags = data[0]
7245130c6e5SAdrian Hunter	exact_ip = flags & 1
7255130c6e5SAdrian Hunter	exstop_query.addBindValue(str(id))
7265130c6e5SAdrian Hunter	exstop_query.addBindValue(str(exact_ip))
7275130c6e5SAdrian Hunter	do_query_(exstop_query)
7285130c6e5SAdrian Hunter
7295130c6e5SAdrian Hunterdef pwrx(id, raw_buf):
7305130c6e5SAdrian Hunter	data = struct.unpack_from("<IQ", raw_buf)
7315130c6e5SAdrian Hunter	payload = data[1]
7325130c6e5SAdrian Hunter	deepest_cstate = payload & 0xf
7335130c6e5SAdrian Hunter	last_cstate = (payload >> 4) & 0xf
7345130c6e5SAdrian Hunter	wake_reason = (payload >> 8) & 0xf
7355130c6e5SAdrian Hunter	pwrx_query.addBindValue(str(id))
7365130c6e5SAdrian Hunter	pwrx_query.addBindValue(str(deepest_cstate))
7375130c6e5SAdrian Hunter	pwrx_query.addBindValue(str(last_cstate))
7385130c6e5SAdrian Hunter	pwrx_query.addBindValue(str(wake_reason))
7395130c6e5SAdrian Hunter	do_query_(pwrx_query)
7405130c6e5SAdrian Hunter
7415130c6e5SAdrian Hunterdef synth_data(id, config, raw_buf, *x):
7425130c6e5SAdrian Hunter	if config == 0:
7435130c6e5SAdrian Hunter		ptwrite(id, raw_buf)
7445130c6e5SAdrian Hunter	elif config == 1:
7455130c6e5SAdrian Hunter		mwait(id, raw_buf)
7465130c6e5SAdrian Hunter	elif config == 2:
7475130c6e5SAdrian Hunter		pwre(id, raw_buf)
7485130c6e5SAdrian Hunter	elif config == 3:
7495130c6e5SAdrian Hunter		exstop(id, raw_buf)
7505130c6e5SAdrian Hunter	elif config == 4:
7515130c6e5SAdrian Hunter		pwrx(id, raw_buf)
7525130c6e5SAdrian Hunter	elif config == 5:
7535130c6e5SAdrian Hunter		cbr(id, raw_buf)
754