do_query(query, 'CREATE VIEW pwrx_view AS ' 'SELECT ' 'pwrx.id,' 'time,' 'cpu,' 'deepest_cstate,' 'last_cstate,' 'CASE WHEN wake_reason=1 THEN \'Interrupt\'' ' WHEN wake_reason=2 THEN \'Timer Deadline\'' ' WHEN wake_reason=4 THEN \'Monitored Address\'' ' WHEN wake_reason=8 THEN \'HW\'' ' ELSE wake_reason ' 'END AS wake_reason' ' FROM pwrx' ' INNER JOIN samples ON samples.id = pwrx.id') do_query(query, 'CREATE VIEW power_events_view AS ' 'SELECT ' 'samples.id,' 'time,' 'cpu,' 'selected_events.name AS event,' 'CASE WHEN selected_events.name=\'cbr\' THEN (SELECT cbr FROM cbr WHERE cbr.id = samples.id) ELSE "" END AS cbr,' 'CASE WHEN selected_events.name=\'cbr\' THEN (SELECT mhz FROM cbr WHERE cbr.id = samples.id) ELSE "" END AS mhz,' 'CASE WHEN selected_events.name=\'cbr\' THEN (SELECT percent FROM cbr WHERE cbr.id = samples.id) ELSE "" END AS percent,' 'CASE WHEN selected_events.name=\'mwait\' THEN (SELECT ' + emit_to_hex('hints') + ' FROM mwait WHERE mwait.id = samples.id) ELSE "" END AS hints_hex,' 'CASE WHEN selected_events.name=\'mwait\' THEN (SELECT ' + emit_to_hex('extensions') + ' FROM mwait WHERE mwait.id = samples.id) ELSE "" END AS extensions_hex,' 'CASE WHEN selected_events.name=\'pwre\' THEN (SELECT cstate FROM pwre WHERE pwre.id = samples.id) ELSE "" END AS cstate,' 'CASE WHEN selected_events.name=\'pwre\' THEN (SELECT subcstate FROM pwre WHERE pwre.id = samples.id) ELSE "" END AS subcstate,' 'CASE WHEN selected_events.name=\'pwre\' THEN (SELECT hw FROM pwre WHERE pwre.id = samples.id) ELSE "" END AS hw,' 'CASE WHEN selected_events.name=\'exstop\' THEN (SELECT exact_ip FROM exstop WHERE exstop.id = samples.id) ELSE "" END AS exact_ip,' 'CASE WHEN selected_events.name=\'pwrx\' THEN (SELECT deepest_cstate FROM pwrx WHERE pwrx.id = samples.id) ELSE "" END AS deepest_cstate,' 'CASE WHEN selected_events.name=\'pwrx\' THEN (SELECT last_cstate FROM pwrx WHERE pwrx.id = samples.id) ELSE "" END AS last_cstate,' 'CASE WHEN selected_events.name=\'pwrx\' THEN (SELECT ' 'CASE WHEN wake_reason=1 THEN \'Interrupt\'' ' WHEN wake_reason=2 THEN \'Timer Deadline\'' ' WHEN wake_reason=4 THEN \'Monitored Address\'' ' WHEN wake_reason=8 THEN \'HW\'' ' ELSE wake_reason ' 'END' ' FROM pwrx WHERE pwrx.id = samples.id) ELSE "" END AS wake_reason' ' FROM samples' ' INNER JOIN selected_events ON selected_events.id = evsel_id' ' WHERE selected_events.name IN (\'cbr\',\'mwait\',\'exstop\',\'pwre\',\'pwrx\')') do_query(query, 'CREATE VIEW context_switches_view AS ' 'SELECT ' 'context_switches.id,' 'context_switches.machine_id,' 'context_switches.time,' 'context_switches.cpu,' 'th_out.pid AS pid_out,' 'th_out.tid AS tid_out,' 'comm_out.comm AS comm_out,' 'th_in.pid AS pid_in,' 'th_in.tid AS tid_in,' 'comm_in.comm AS comm_in,' 'CASE WHEN context_switches.flags = 0 THEN \'in\'' ' WHEN context_switches.flags = 1 THEN \'out\'' ' WHEN context_switches.flags = 3 THEN \'out preempt\'' ' ELSE context_switches.flags ' 'END AS flags' ' FROM context_switches' ' INNER JOIN threads AS th_out ON th_out.id = context_switches.thread_out_id' ' INNER JOIN threads AS th_in ON th_in.id = context_switches.thread_in_id' ' INNER JOIN comms AS comm_out ON comm_out.id = context_switches.comm_out_id' ' INNER JOIN comms AS comm_in ON comm_in.id = context_switches.comm_in_id') do_query(query, 'END TRANSACTION') evsel_query = QSqlQuery(db)evsel_query.prepare("INSERT INTO selected_events VALUES (?, ?)")machine_query = QSqlQuery(db)machine_query.prepare("INSERT INTO machines VALUES (?, ?, ?)")thread_query = QSqlQuery(db)thread_query.prepare("INSERT INTO threads VALUES (?, ?, ?, ?, ?)")comm_query = QSqlQuery(db)comm_query.prepare("INSERT INTO comms VALUES (?, ?, ?, ?, ?)")comm_thread_query = QSqlQuery(db)comm_thread_query.prepare("INSERT INTO comm_threads VALUES (?, ?, ?)")dso_query = QSqlQuery(db)dso_query.prepare("INSERT INTO dsos VALUES (?, ?, ?, ?, ?)")symbol_query = QSqlQuery(db)symbol_query.prepare("INSERT INTO symbols VALUES (?, ?, ?, ?, ?, ?)")branch_type_query = QSqlQuery(db)branch_type_query.prepare("INSERT INTO branch_types VALUES (?, ?)")sample_query = QSqlQuery(db)if branches: sample_query.prepare("INSERT INTO samples VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)")else: sample_query.prepare("INSERT INTO samples VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)")if perf_db_export_calls or perf_db_export_callchains: call_path_query = QSqlQuery(db) call_path_query.prepare("INSERT INTO call_paths VALUES (?, ?, ?, ?)")if perf_db_export_calls: call_query = QSqlQuery(db) call_query.prepare("INSERT INTO calls VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)")ptwrite_query = QSqlQuery(db)ptwrite_query.prepare("INSERT INTO ptwrite VALUES (?, ?, ?)")cbr_query = QSqlQuery(db)cbr_query.prepare("INSERT INTO cbr VALUES (?, ?, ?, ?)")mwait_query = QSqlQuery(db)mwait_query.prepare("INSERT INTO mwait VALUES (?, ?, ?)")pwre_query = QSqlQuery(db)pwre_query.prepare("INSERT INTO pwre VALUES (?, ?, ?, ?)")exstop_query = QSqlQuery(db)exstop_query.prepare("INSERT INTO exstop VALUES (?, ?)")pwrx_query = QSqlQuery(db)pwrx_query.prepare("INSERT INTO pwrx VALUES (?, ?, ?, ?)")context_switch_query = QSqlQuery(db)context_switch_query.prepare("INSERT INTO context_switches VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)") def trace_begin(): printdate("Writing records...") do_query(query, 'BEGIN TRANSACTION') # id == 0 means unknown. It is easier to create records for them than replace the zeroes with NULLs evsel_table(0, "unknown") machine_table(0, 0, "unknown") thread_table(0, 0, 0, -1, -1) comm_table(0, "unknown", 0, 0, 0) dso_table(0, 0, "unknown", "unknown", "") symbol_table(0, 0, 0, 0, 0, "unknown") 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, 0) if perf_db_export_calls or perf_db_export_callchains: call_path_table(0, 0, 0, 0) call_return_table(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0) unhandled_count = 0 def is_table_empty(table_name): do_query(query, 'SELECT * FROM ' + table_name + ' LIMIT 1'); if query.next(): return False return True def drop(table_name): do_query(query, 'DROP VIEW ' + table_name + '_view'); do_query(query, 'DROP TABLE ' + table_name); def trace_end(): do_query(query, 'END TRANSACTION') printdate("Adding indexes") if perf_db_export_calls: do_query(query, 'CREATE INDEX pcpid_idx ON calls (parent_call_path_id)') do_query(query, 'CREATE INDEX pid_idx ON calls (parent_id)') do_query(query, 'ALTER TABLE comms ADD has_calls boolean') do_query(query, 'UPDATE comms SET has_calls = 1 WHERE comms.id IN (SELECT DISTINCT comm_id FROM calls)') printdate("Dropping unused tables") if is_table_empty("ptwrite"): drop("ptwrite") if is_table_empty("mwait") and is_table_empty("pwre") and is_table_empty("exstop") and is_table_empty("pwrx"): do_query(query, 'DROP VIEW power_events_view'); drop("mwait") drop("pwre") drop("exstop") drop("pwrx") if is_table_empty("cbr"): drop("cbr") if is_table_empty("context_switches"): drop("context_switches") if (unhandled_count): printdate("Warning: ", unhandled_count, " unhandled events") printdate("Done") def trace_unhandled(event_name, context, event_fields_dict): global unhandled_count unhandled_count += 1 def sched__sched_switch(*x): pass def bind_exec(q, n, x): for xx in x[0:n]: q.addBindValue(str(xx)) do_query_(q) def evsel_table(*x): bind_exec(evsel_query, 2, x) def machine_table(*x): bind_exec(machine_query, 3, x) def thread_table(*x): bind_exec(thread_query, 5, x) def comm_table(*x): bind_exec(comm_query, 5, x) def comm_thread_table(*x): bind_exec(comm_thread_query, 3, x) def dso_table(*x): bind_exec(dso_query, 5, x) def symbol_table(*x): bind_exec(symbol_query, 6, x) def branch_type_table(*x): bind_exec(branch_type_query, 2, x) def sample_table(*x): if branches: for xx in x[0:15]: sample_query.addBindValue(str(xx)) for xx in x[19:25]: sample_query.addBindValue(str(xx)) do_query_(sample_query) else: bind_exec(sample_query, 25, x) def call_path_table(*x): bind_exec(call_path_query, 4, x) def call_return_table(*x): bind_exec(call_query, 14, x) def ptwrite(id, raw_buf): data = struct.unpack_from("<IQ", raw_buf) flags = data[0] payload = data[1] exact_ip = flags & 1 ptwrite_query.addBindValue(str(id)) ptwrite_query.addBindValue(str(payload)) ptwrite_query.addBindValue(str(exact_ip)) do_query_(ptwrite_query) def cbr(id, raw_buf): data = struct.unpack_from("<BBBBII", raw_buf) cbr = data[0] MHz = (data[4] + 500) / 1000 percent = ((cbr * 1000 / data[2]) + 5) / 10 cbr_query.addBindValue(str(id)) cbr_query.addBindValue(str(cbr)) cbr_query.addBindValue(str(MHz)) cbr_query.addBindValue(str(percent)) do_query_(cbr_query) def mwait(id, raw_buf): data = struct.unpack_from("<IQ", raw_buf) payload = data[1] hints = payload & 0xff extensions = (payload >> 32) & 0x3 mwait_query.addBindValue(str(id)) mwait_query.addBindValue(str(hints)) mwait_query.addBindValue(str(extensions)) do_query_(mwait_query) def pwre(id, raw_buf): data = struct.unpack_from("<IQ", raw_buf) payload = data[1] hw = (payload >> 7) & 1 cstate = (payload >> 12) & 0xf subcstate = (payload >> 8) & 0xf pwre_query.addBindValue(str(id)) pwre_query.addBindValue(str(cstate)) pwre_query.addBindValue(str(subcstate)) pwre_query.addBindValue(str(hw)) do_query_(pwre_query) def exstop(id, raw_buf): data = struct.unpack_from("<I", raw_buf) flags = data[0] exact_ip = flags & 1 exstop_query.addBindValue(str(id)) exstop_query.addBindValue(str(exact_ip)) do_query_(exstop_query) def pwrx(id, raw_buf): data = struct.unpack_from("<IQ", raw_buf) payload = data[1] deepest_cstate = payload & 0xf last_cstate = (payload >> 4) & 0xf wake_reason = (payload >> 8) & 0xf pwrx_query.addBindValue(str(id)) pwrx_query.addBindValue(str(deepest_cstate)) pwrx_query.addBindValue(str(last_cstate)) pwrx_query.addBindValue(str(wake_reason)) do_query_(pwrx_query) def synth_data(id, config, raw_buf, *x): if config == 0: ptwrite(id, raw_buf) elif config == 1: mwait(id, raw_buf) elif config == 2: pwre(id, raw_buf) elif config == 3: exstop(id, raw_buf) elif config == 4: pwrx(id, raw_buf) elif config == 5: cbr(id, raw_buf) def context_switch_table(*x): bind_exec(context_switch_query, 9, x)Lines 501–799 of 799. Previous lines
do_query(query, 'CREATE VIEW pwrx_view AS ' 'SELECT ' 'pwrx.id,' 'time,' 'cpu,' 'deepest_cstate,' 'last_cstate,' 'CASE WHEN wake_reason=1 THEN \'Interrupt\'' ' WHEN wake_reason=2 THEN \'Timer Deadline\'' ' WHEN wake_reason=4 THEN \'Monitored Address\'' ' WHEN wake_reason=8 THEN \'HW\'' ' ELSE wake_reason ' 'END AS wake_reason' ' FROM pwrx' ' INNER JOIN samples ON samples.id = pwrx.id') do_query(query, 'CREATE VIEW power_events_view AS ' 'SELECT ' 'samples.id,' 'time,' 'cpu,' 'selected_events.name AS event,' 'CASE WHEN selected_events.name=\'cbr\' THEN (SELECT cbr FROM cbr WHERE cbr.id = samples.id) ELSE "" END AS cbr,' 'CASE WHEN selected_events.name=\'cbr\' THEN (SELECT mhz FROM cbr WHERE cbr.id = samples.id) ELSE "" END AS mhz,' 'CASE WHEN selected_events.name=\'cbr\' THEN (SELECT percent FROM cbr WHERE cbr.id = samples.id) ELSE "" END AS percent,' 'CASE WHEN selected_events.name=\'mwait\' THEN (SELECT ' + emit_to_hex('hints') + ' FROM mwait WHERE mwait.id = samples.id) ELSE "" END AS hints_hex,' 'CASE WHEN selected_events.name=\'mwait\' THEN (SELECT ' + emit_to_hex('extensions') + ' FROM mwait WHERE mwait.id = samples.id) ELSE "" END AS extensions_hex,' 'CASE WHEN selected_events.name=\'pwre\' THEN (SELECT cstate FROM pwre WHERE pwre.id = samples.id) ELSE "" END AS cstate,' 'CASE WHEN selected_events.name=\'pwre\' THEN (SELECT subcstate FROM pwre WHERE pwre.id = samples.id) ELSE "" END AS subcstate,' 'CASE WHEN selected_events.name=\'pwre\' THEN (SELECT hw FROM pwre WHERE pwre.id = samples.id) ELSE "" END AS hw,' 'CASE WHEN selected_events.name=\'exstop\' THEN (SELECT exact_ip FROM exstop WHERE exstop.id = samples.id) ELSE "" END AS exact_ip,' 'CASE WHEN selected_events.name=\'pwrx\' THEN (SELECT deepest_cstate FROM pwrx WHERE pwrx.id = samples.id) ELSE "" END AS deepest_cstate,' 'CASE WHEN selected_events.name=\'pwrx\' THEN (SELECT last_cstate FROM pwrx WHERE pwrx.id = samples.id) ELSE "" END AS last_cstate,' 'CASE WHEN selected_events.name=\'pwrx\' THEN (SELECT ' 'CASE WHEN wake_reason=1 THEN \'Interrupt\'' ' WHEN wake_reason=2 THEN \'Timer Deadline\'' ' WHEN wake_reason=4 THEN \'Monitored Address\'' ' WHEN wake_reason=8 THEN \'HW\'' ' ELSE wake_reason ' 'END' ' FROM pwrx WHERE pwrx.id = samples.id) ELSE "" END AS wake_reason' ' FROM samples' ' INNER JOIN selected_events ON selected_events.id = evsel_id' ' WHERE selected_events.name IN (\'cbr\',\'mwait\',\'exstop\',\'pwre\',\'pwrx\')') do_query(query, 'CREATE VIEW context_switches_view AS ' 'SELECT ' 'context_switches.id,' 'context_switches.machine_id,' 'context_switches.time,' 'context_switches.cpu,' 'th_out.pid AS pid_out,' 'th_out.tid AS tid_out,' 'comm_out.comm AS comm_out,' 'th_in.pid AS pid_in,' 'th_in.tid AS tid_in,' 'comm_in.comm AS comm_in,' 'CASE WHEN context_switches.flags = 0 THEN \'in\'' ' WHEN context_switches.flags = 1 THEN \'out\'' ' WHEN context_switches.flags = 3 THEN \'out preempt\'' ' ELSE context_switches.flags ' 'END AS flags' ' FROM context_switches' ' INNER JOIN threads AS th_out ON th_out.id = context_switches.thread_out_id' ' INNER JOIN threads AS th_in ON th_in.id = context_switches.thread_in_id' ' INNER JOIN comms AS comm_out ON comm_out.id = context_switches.comm_out_id' ' INNER JOIN comms AS comm_in ON comm_in.id = context_switches.comm_in_id') do_query(query, 'END TRANSACTION') evsel_query = QSqlQuery(db) evsel_query.prepare("INSERT INTO selected_events VALUES (?, ?)") machine_query = QSqlQuery(db) machine_query.prepare("INSERT INTO machines VALUES (?, ?, ?)") thread_query = QSqlQuery(db) thread_query.prepare("INSERT INTO threads VALUES (?, ?, ?, ?, ?)") comm_query = QSqlQuery(db) comm_query.prepare("INSERT INTO comms VALUES (?, ?, ?, ?, ?)") comm_thread_query = QSqlQuery(db) comm_thread_query.prepare("INSERT INTO comm_threads VALUES (?, ?, ?)") dso_query = QSqlQuery(db) dso_query.prepare("INSERT INTO dsos VALUES (?, ?, ?, ?, ?)") symbol_query = QSqlQuery(db) symbol_query.prepare("INSERT INTO symbols VALUES (?, ?, ?, ?, ?, ?)") branch_type_query = QSqlQuery(db) branch_type_query.prepare("INSERT INTO branch_types VALUES (?, ?)") sample_query = QSqlQuery(db) if branches: sample_query.prepare("INSERT INTO samples VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)") else: sample_query.prepare("INSERT INTO samples VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)") if perf_db_export_calls or perf_db_export_callchains: call_path_query = QSqlQuery(db) call_path_query.prepare("INSERT INTO call_paths VALUES (?, ?, ?, ?)") if perf_db_export_calls: call_query = QSqlQuery(db) call_query.prepare("INSERT INTO calls VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)") ptwrite_query = QSqlQuery(db) ptwrite_query.prepare("INSERT INTO ptwrite VALUES (?, ?, ?)") cbr_query = QSqlQuery(db) cbr_query.prepare("INSERT INTO cbr VALUES (?, ?, ?, ?)") mwait_query = QSqlQuery(db) mwait_query.prepare("INSERT INTO mwait VALUES (?, ?, ?)") pwre_query = QSqlQuery(db) pwre_query.prepare("INSERT INTO pwre VALUES (?, ?, ?, ?)") exstop_query = QSqlQuery(db) exstop_query.prepare("INSERT INTO exstop VALUES (?, ?)") pwrx_query = QSqlQuery(db) pwrx_query.prepare("INSERT INTO pwrx VALUES (?, ?, ?, ?)") context_switch_query = QSqlQuery(db) context_switch_query.prepare("INSERT INTO context_switches VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)") def trace_begin(): printdate("Writing records...") do_query(query, 'BEGIN TRANSACTION') # id == 0 means unknown. It is easier to create records for them than replace the zeroes with NULLs evsel_table(0, "unknown") machine_table(0, 0, "unknown") thread_table(0, 0, 0, -1, -1) comm_table(0, "unknown", 0, 0, 0) dso_table(0, 0, "unknown", "unknown", "") symbol_table(0, 0, 0, 0, 0, "unknown") 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, 0) if perf_db_export_calls or perf_db_export_callchains: call_path_table(0, 0, 0, 0) call_return_table(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0) unhandled_count = 0 def is_table_empty(table_name): do_query(query, 'SELECT * FROM ' + table_name + ' LIMIT 1'); if query.next(): return False return True def drop(table_name): do_query(query, 'DROP VIEW ' + table_name + '_view'); do_query(query, 'DROP TABLE ' + table_name); def trace_end(): do_query(query, 'END TRANSACTION') printdate("Adding indexes") if perf_db_export_calls: do_query(query, 'CREATE INDEX pcpid_idx ON calls (parent_call_path_id)') do_query(query, 'CREATE INDEX pid_idx ON calls (parent_id)') do_query(query, 'ALTER TABLE comms ADD has_calls boolean') do_query(query, 'UPDATE comms SET has_calls = 1 WHERE comms.id IN (SELECT DISTINCT comm_id FROM calls)') printdate("Dropping unused tables") if is_table_empty("ptwrite"): drop("ptwrite") if is_table_empty("mwait") and is_table_empty("pwre") and is_table_empty("exstop") and is_table_empty("pwrx"): do_query(query, 'DROP VIEW power_events_view'); drop("mwait") drop("pwre") drop("exstop") drop("pwrx") if is_table_empty("cbr"): drop("cbr") if is_table_empty("context_switches"): drop("context_switches") if (unhandled_count): printdate("Warning: ", unhandled_count, " unhandled events") printdate("Done") def trace_unhandled(event_name, context, event_fields_dict): global unhandled_count unhandled_count += 1 def sched__sched_switch(*x): pass def bind_exec(q, n, x): for xx in x[0:n]: q.addBindValue(str(xx)) do_query_(q) def evsel_table(*x): bind_exec(evsel_query, 2, x) def machine_table(*x): bind_exec(machine_query, 3, x) def thread_table(*x): bind_exec(thread_query, 5, x) def comm_table(*x): bind_exec(comm_query, 5, x) def comm_thread_table(*x): bind_exec(comm_thread_query, 3, x) def dso_table(*x): bind_exec(dso_query, 5, x) def symbol_table(*x): bind_exec(symbol_query, 6, x) def branch_type_table(*x): bind_exec(branch_type_query, 2, x) def sample_table(*x): if branches: for xx in x[0:15]: sample_query.addBindValue(str(xx)) for xx in x[19:25]: sample_query.addBindValue(str(xx)) do_query_(sample_query) else: bind_exec(sample_query, 25, x) def call_path_table(*x): bind_exec(call_path_query, 4, x) def call_return_table(*x): bind_exec(call_query, 14, x) def ptwrite(id, raw_buf): data = struct.unpack_from("<IQ", raw_buf) flags = data[0] payload = data[1] exact_ip = flags & 1 ptwrite_query.addBindValue(str(id)) ptwrite_query.addBindValue(str(payload)) ptwrite_query.addBindValue(str(exact_ip)) do_query_(ptwrite_query) def cbr(id, raw_buf): data = struct.unpack_from("<BBBBII", raw_buf) cbr = data[0] MHz = (data[4] + 500) / 1000 percent = ((cbr * 1000 / data[2]) + 5) / 10 cbr_query.addBindValue(str(id)) cbr_query.addBindValue(str(cbr)) cbr_query.addBindValue(str(MHz)) cbr_query.addBindValue(str(percent)) do_query_(cbr_query) def mwait(id, raw_buf): data = struct.unpack_from("<IQ", raw_buf) payload = data[1] hints = payload & 0xff extensions = (payload >> 32) & 0x3 mwait_query.addBindValue(str(id)) mwait_query.addBindValue(str(hints)) mwait_query.addBindValue(str(extensions)) do_query_(mwait_query) def pwre(id, raw_buf): data = struct.unpack_from("<IQ", raw_buf) payload = data[1] hw = (payload >> 7) & 1 cstate = (payload >> 12) & 0xf subcstate = (payload >> 8) & 0xf pwre_query.addBindValue(str(id)) pwre_query.addBindValue(str(cstate)) pwre_query.addBindValue(str(subcstate)) pwre_query.addBindValue(str(hw)) do_query_(pwre_query) def exstop(id, raw_buf): data = struct.unpack_from("<I", raw_buf) flags = data[0] exact_ip = flags & 1 exstop_query.addBindValue(str(id)) exstop_query.addBindValue(str(exact_ip)) do_query_(exstop_query) def pwrx(id, raw_buf): data = struct.unpack_from("<IQ", raw_buf) payload = data[1] deepest_cstate = payload & 0xf last_cstate = (payload >> 4) & 0xf wake_reason = (payload >> 8) & 0xf pwrx_query.addBindValue(str(id)) pwrx_query.addBindValue(str(deepest_cstate)) pwrx_query.addBindValue(str(last_cstate)) pwrx_query.addBindValue(str(wake_reason)) do_query_(pwrx_query) def synth_data(id, config, raw_buf, *x): if config == 0: ptwrite(id, raw_buf) elif config == 1: mwait(id, raw_buf) elif config == 2: pwre(id, raw_buf) elif config == 3: exstop(id, raw_buf) elif config == 4: pwrx(id, raw_buf) elif config == 5: cbr(id, raw_buf) def context_switch_table(*x): bind_exec(context_switch_query, 9, x)