]> Git Repo - linux.git/blobdiff - tools/perf/scripts/python/export-to-postgresql.py
Merge tag 's390-5.3-2' of git://git.kernel.org/pub/scm/linux/kernel/git/s390/linux
[linux.git] / tools / perf / scripts / python / export-to-postgresql.py
index c3eae1d77d366d0819a4b7d39df87099d2342307..4447f0d7c754727f8a100caee6a0e703e33f27fb 100644 (file)
@@ -27,18 +27,31 @@ import datetime
 #
 # fedora:
 #
-#      $ sudo yum install postgresql postgresql-server python-pyside qt-postgresql
+#      $ sudo yum install postgresql postgresql-server qt-postgresql
 #      $ sudo su - postgres -c initdb
 #      $ sudo service postgresql start
 #      $ sudo su - postgres
-#      $ createuser <your user id here>
+#      $ createuser -s <your user id here>    # Older versions may not support -s, in which case answer the prompt below:
 #      Shall the new role be a superuser? (y/n) y
+#      $ sudo yum install python-pyside
+#
+#      Alternately, to use Python3 and/or pyside 2, one of the following:
+#              $ sudo yum install python3-pyside
+#              $ pip install --user PySide2
+#              $ pip3 install --user PySide2
 #
 # ubuntu:
 #
-#      $ sudo apt-get install postgresql python-pyside.qtsql libqt4-sql-psql
+#      $ sudo apt-get install postgresql
 #      $ sudo su - postgres
 #      $ createuser -s <your user id here>
+#      $ sudo apt-get install python-pyside.qtsql libqt4-sql-psql
+#
+#      Alternately, to use Python3 and/or pyside 2, one of the following:
+#
+#              $ sudo apt-get install python3-pyside.qtsql libqt4-sql-psql
+#              $ sudo apt-get install python-pyside2.qtsql libqt5sql5-psql
+#              $ sudo apt-get install python3-pyside2.qtsql libqt5sql5-psql
 #
 # An example of using this script with Intel PT:
 #
@@ -199,7 +212,16 @@ import datetime
 #                   print "{0:>6}  {1:>10}  {2:>9}  {3:<30}  {4:>6}  {5:<30}".format(query.value(0), query.value(1), query.value(2), query.value(3), query.value(4), query.value(5))
 #                   call_path_id = query.value(6)
 
-from PySide.QtSql import *
+pyside_version_1 = True
+if not "pyside-version-1" in sys.argv:
+       try:
+               from PySide2.QtSql import *
+               pyside_version_1 = False
+       except:
+               pass
+
+if pyside_version_1:
+       from PySide.QtSql import *
 
 if sys.version_info < (3, 0):
        def toserverstr(str):
@@ -255,11 +277,12 @@ def printdate(*args, **kw_args):
         print(datetime.datetime.today(), *args, sep=' ', **kw_args)
 
 def usage():
-       printerr("Usage is: export-to-postgresql.py <database name> [<columns>] [<calls>] [<callchains>]")
-       printerr("where:        columns         'all' or 'branches'")
-       printerr("              calls           'calls' => create calls and call_paths table")
-       printerr("              callchains      'callchains' => create call_paths table")
-       raise Exception("Too few arguments")
+       printerr("Usage is: export-to-postgresql.py <database name> [<columns>] [<calls>] [<callchains>] [<pyside-version-1>]");
+       printerr("where:  columns            'all' or 'branches'");
+       printerr("        calls              'calls' => create calls and call_paths table");
+       printerr("        callchains         'callchains' => create call_paths table");
+       printerr("        pyside-version-1   'pyside-version-1' => use pyside version 1");
+       raise Exception("Too few or bad arguments")
 
 if (len(sys.argv) < 2):
        usage()
@@ -281,6 +304,8 @@ for i in range(3,len(sys.argv)):
                perf_db_export_calls = True
        elif (sys.argv[i] == "callchains"):
                perf_db_export_callchains = True
+       elif (sys.argv[i] == "pyside-version-1"):
+               pass
        else:
                usage()
 
@@ -369,7 +394,9 @@ if branches:
                'to_ip          bigint,'
                'branch_type    integer,'
                'in_tx          boolean,'
-               'call_path_id   bigint)')
+               'call_path_id   bigint,'
+               'insn_count     bigint,'
+               'cyc_count      bigint)')
 else:
        do_query(query, 'CREATE TABLE samples ('
                'id             bigint          NOT NULL,'
@@ -393,7 +420,9 @@ else:
                'data_src       bigint,'
                'branch_type    integer,'
                'in_tx          boolean,'
-               'call_path_id   bigint)')
+               'call_path_id   bigint,'
+               'insn_count     bigint,'
+               'cyc_count      bigint)')
 
 if perf_db_export_calls or perf_db_export_callchains:
        do_query(query, 'CREATE TABLE call_paths ('
@@ -414,7 +443,41 @@ if perf_db_export_calls:
                'return_id      bigint,'
                'parent_call_path_id    bigint,'
                'flags          integer,'
-               'parent_id      bigint)')
+               'parent_id      bigint,'
+               'insn_count     bigint,'
+               'cyc_count      bigint)')
+
+do_query(query, 'CREATE TABLE ptwrite ('
+       'id             bigint          NOT NULL,'
+       'payload        bigint,'
+       'exact_ip       boolean)')
+
+do_query(query, 'CREATE TABLE cbr ('
+       'id             bigint          NOT NULL,'
+       'cbr            integer,'
+       'mhz            integer,'
+       'percent        integer)')
+
+do_query(query, 'CREATE TABLE mwait ('
+       'id             bigint          NOT NULL,'
+       'hints          integer,'
+       'extensions     integer)')
+
+do_query(query, 'CREATE TABLE pwre ('
+       'id             bigint          NOT NULL,'
+       'cstate         integer,'
+       'subcstate      integer,'
+       'hw             boolean)')
+
+do_query(query, 'CREATE TABLE exstop ('
+       'id             bigint          NOT NULL,'
+       'exact_ip       boolean)')
+
+do_query(query, 'CREATE TABLE pwrx ('
+       'id             bigint          NOT NULL,'
+       'deepest_cstate integer,'
+       'last_cstate    integer,'
+       'wake_reason    integer)')
 
 do_query(query, 'CREATE VIEW machines_view AS '
        'SELECT '
@@ -496,6 +559,9 @@ if perf_db_export_calls:
                        'return_time,'
                        'return_time - call_time AS elapsed_time,'
                        'branch_count,'
+                       'insn_count,'
+                       'cyc_count,'
+                       'CASE WHEN cyc_count=0 THEN CAST(0 AS NUMERIC(20, 2)) ELSE CAST((CAST(insn_count AS FLOAT) / cyc_count) AS NUMERIC(20, 2)) END AS IPC,'
                        'call_id,'
                        'return_id,'
                        '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 CAST ( flags AS VARCHAR(6) ) END AS flags,'
@@ -521,9 +587,110 @@ do_query(query, 'CREATE VIEW samples_view AS '
                'to_sym_offset,'
                '(SELECT short_name FROM dsos WHERE id = to_dso_id) AS to_dso_short_name,'
                '(SELECT name FROM branch_types WHERE id = branch_type) AS branch_type_name,'
-               'in_tx'
+               'in_tx,'
+               'insn_count,'
+               'cyc_count,'
+               'CASE WHEN cyc_count=0 THEN CAST(0 AS NUMERIC(20, 2)) ELSE CAST((CAST(insn_count AS FLOAT) / cyc_count) AS NUMERIC(20, 2)) END AS IPC'
        ' FROM samples')
 
+do_query(query, 'CREATE VIEW ptwrite_view AS '
+       'SELECT '
+               'ptwrite.id,'
+               'time,'
+               'cpu,'
+               'to_hex(payload) AS payload_hex,'
+               'CASE WHEN exact_ip=FALSE THEN \'False\' ELSE \'True\' END AS exact_ip'
+       ' FROM ptwrite'
+       ' INNER JOIN samples ON samples.id = ptwrite.id')
+
+do_query(query, 'CREATE VIEW cbr_view AS '
+       'SELECT '
+               'cbr.id,'
+               'time,'
+               'cpu,'
+               'cbr,'
+               'mhz,'
+               'percent'
+       ' FROM cbr'
+       ' INNER JOIN samples ON samples.id = cbr.id')
+
+do_query(query, 'CREATE VIEW mwait_view AS '
+       'SELECT '
+               'mwait.id,'
+               'time,'
+               'cpu,'
+               'to_hex(hints) AS hints_hex,'
+               'to_hex(extensions) AS extensions_hex'
+       ' FROM mwait'
+       ' INNER JOIN samples ON samples.id = mwait.id')
+
+do_query(query, 'CREATE VIEW pwre_view AS '
+       'SELECT '
+               'pwre.id,'
+               'time,'
+               'cpu,'
+               'cstate,'
+               'subcstate,'
+               'CASE WHEN hw=FALSE THEN \'False\' ELSE \'True\' END AS hw'
+       ' FROM pwre'
+       ' INNER JOIN samples ON samples.id = pwre.id')
+
+do_query(query, 'CREATE VIEW exstop_view AS '
+       'SELECT '
+               'exstop.id,'
+               'time,'
+               'cpu,'
+               'CASE WHEN exact_ip=FALSE THEN \'False\' ELSE \'True\' END AS exact_ip'
+       ' FROM exstop'
+       ' INNER JOIN samples ON samples.id = exstop.id')
+
+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 CAST ( wake_reason AS VARCHAR(2) )'
+               '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,'
+               'samples.time,'
+               'samples.cpu,'
+               'selected_events.name AS event,'
+               'FORMAT(\'%6s\', cbr.cbr) AS cbr,'
+               'FORMAT(\'%6s\', cbr.mhz) AS MHz,'
+               'FORMAT(\'%5s\', cbr.percent) AS percent,'
+               'to_hex(mwait.hints) AS hints_hex,'
+               'to_hex(mwait.extensions) AS extensions_hex,'
+               'FORMAT(\'%3s\', pwre.cstate) AS cstate,'
+               'FORMAT(\'%3s\', pwre.subcstate) AS subcstate,'
+               'CASE WHEN pwre.hw=FALSE THEN \'False\' WHEN pwre.hw=TRUE THEN \'True\' ELSE NULL END AS hw,'
+               'CASE WHEN exstop.exact_ip=FALSE THEN \'False\' WHEN exstop.exact_ip=TRUE THEN \'True\' ELSE NULL END AS exact_ip,'
+               'FORMAT(\'%3s\', pwrx.deepest_cstate) AS deepest_cstate,'
+               'FORMAT(\'%3s\', pwrx.last_cstate) AS last_cstate,'
+               'CASE     WHEN pwrx.wake_reason=1 THEN \'Interrupt\''
+                       ' WHEN pwrx.wake_reason=2 THEN \'Timer Deadline\''
+                       ' WHEN pwrx.wake_reason=4 THEN \'Monitored Address\''
+                       ' WHEN pwrx.wake_reason=8 THEN \'HW\''
+                       ' ELSE FORMAT(\'%2s\', pwrx.wake_reason)'
+               'END AS wake_reason'
+       ' FROM cbr'
+       ' FULL JOIN mwait ON mwait.id = cbr.id'
+       ' FULL JOIN pwre ON pwre.id = cbr.id'
+       ' FULL JOIN exstop ON exstop.id = cbr.id'
+       ' FULL JOIN pwrx ON pwrx.id = cbr.id'
+       ' INNER JOIN samples ON samples.id = coalesce(cbr.id, mwait.id, pwre.id, exstop.id, pwrx.id)'
+       ' INNER JOIN selected_events ON selected_events.id = samples.evsel_id'
+       ' ORDER BY samples.id')
 
 file_header = struct.pack("!11sii", b"PGCOPY\n\377\r\n\0", 0, 0)
 file_trailer = b"\377\377"
@@ -583,6 +750,12 @@ if perf_db_export_calls or perf_db_export_callchains:
        call_path_file          = open_output_file("call_path_table.bin")
 if perf_db_export_calls:
        call_file               = open_output_file("call_table.bin")
+ptwrite_file           = open_output_file("ptwrite_table.bin")
+cbr_file               = open_output_file("cbr_table.bin")
+mwait_file             = open_output_file("mwait_table.bin")
+pwre_file              = open_output_file("pwre_table.bin")
+exstop_file            = open_output_file("exstop_table.bin")
+pwrx_file              = open_output_file("pwrx_table.bin")
 
 def trace_begin():
        printdate("Writing to intermediate files...")
@@ -593,13 +766,23 @@ def trace_begin():
        comm_table(0, "unknown")
        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)
+       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)
        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)
+               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():
        printdate("Copying to database...")
        copy_output_file(evsel_file,            "selected_events")
@@ -615,6 +798,12 @@ def trace_end():
                copy_output_file(call_path_file,        "call_paths")
        if perf_db_export_calls:
                copy_output_file(call_file,             "calls")
+       copy_output_file(ptwrite_file,          "ptwrite")
+       copy_output_file(cbr_file,              "cbr")
+       copy_output_file(mwait_file,            "mwait")
+       copy_output_file(pwre_file,             "pwre")
+       copy_output_file(exstop_file,           "exstop")
+       copy_output_file(pwrx_file,             "pwrx")
 
        printdate("Removing intermediate files...")
        remove_output_file(evsel_file)
@@ -630,6 +819,12 @@ def trace_end():
                remove_output_file(call_path_file)
        if perf_db_export_calls:
                remove_output_file(call_file)
+       remove_output_file(ptwrite_file)
+       remove_output_file(cbr_file)
+       remove_output_file(mwait_file)
+       remove_output_file(pwre_file)
+       remove_output_file(exstop_file)
+       remove_output_file(pwrx_file)
        os.rmdir(output_dir_name)
        printdate("Adding primary keys")
        do_query(query, 'ALTER TABLE selected_events ADD PRIMARY KEY (id)')
@@ -645,6 +840,12 @@ def trace_end():
                do_query(query, 'ALTER TABLE call_paths      ADD PRIMARY KEY (id)')
        if perf_db_export_calls:
                do_query(query, 'ALTER TABLE calls           ADD PRIMARY KEY (id)')
+       do_query(query, 'ALTER TABLE ptwrite         ADD PRIMARY KEY (id)')
+       do_query(query, 'ALTER TABLE cbr             ADD PRIMARY KEY (id)')
+       do_query(query, 'ALTER TABLE mwait           ADD PRIMARY KEY (id)')
+       do_query(query, 'ALTER TABLE pwre            ADD PRIMARY KEY (id)')
+       do_query(query, 'ALTER TABLE exstop          ADD PRIMARY KEY (id)')
+       do_query(query, 'ALTER TABLE pwrx            ADD PRIMARY KEY (id)')
 
        printdate("Adding foreign keys")
        do_query(query, 'ALTER TABLE threads '
@@ -680,6 +881,30 @@ def trace_end():
                                        'ADD CONSTRAINT parent_call_pathfk FOREIGN KEY (parent_call_path_id) REFERENCES call_paths (id)')
                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 ptwrite '
+                                       'ADD CONSTRAINT idfk        FOREIGN KEY (id)           REFERENCES samples   (id)')
+       do_query(query, 'ALTER TABLE  cbr '
+                                       'ADD CONSTRAINT idfk        FOREIGN KEY (id)           REFERENCES samples   (id)')
+       do_query(query, 'ALTER TABLE  mwait '
+                                       'ADD CONSTRAINT idfk        FOREIGN KEY (id)           REFERENCES samples   (id)')
+       do_query(query, 'ALTER TABLE  pwre '
+                                       'ADD CONSTRAINT idfk        FOREIGN KEY (id)           REFERENCES samples   (id)')
+       do_query(query, 'ALTER TABLE  exstop '
+                                       'ADD CONSTRAINT idfk        FOREIGN KEY (id)           REFERENCES samples   (id)')
+       do_query(query, 'ALTER TABLE  pwrx '
+                                       'ADD CONSTRAINT idfk        FOREIGN KEY (id)           REFERENCES samples   (id)')
+
+       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"):
+               drop("mwait")
+               drop("pwre")
+               drop("exstop")
+               drop("pwrx")
+               do_query(query, 'DROP VIEW power_events_view');
+               if is_table_empty("cbr"):
+                       drop("cbr")
 
        if (unhandled_count):
                printdate("Warning: ", unhandled_count, " unhandled events")
@@ -747,11 +972,11 @@ def branch_type_table(branch_type, name, *x):
        value = struct.pack(fmt, 2, 4, branch_type, n, name)
        branch_type_file.write(value)
 
-def sample_table(sample_id, evsel_id, machine_id, thread_id, comm_id, dso_id, symbol_id, sym_offset, ip, time, cpu, to_dso_id, to_symbol_id, to_sym_offset, to_ip, period, weight, transaction, data_src, branch_type, in_tx, call_path_id, *x):
+def sample_table(sample_id, evsel_id, machine_id, thread_id, comm_id, dso_id, symbol_id, sym_offset, ip, time, cpu, to_dso_id, to_symbol_id, to_sym_offset, to_ip, period, weight, transaction, data_src, branch_type, in_tx, call_path_id, insn_cnt, cyc_cnt, *x):
        if branches:
-               value = struct.pack("!hiqiqiqiqiqiqiqiqiqiqiiiqiqiqiqiiiBiq", 18, 8, sample_id, 8, evsel_id, 8, machine_id, 8, thread_id, 8, comm_id, 8, dso_id, 8, symbol_id, 8, sym_offset, 8, ip, 8, time, 4, cpu, 8, to_dso_id, 8, to_symbol_id, 8, to_sym_offset, 8, to_ip, 4, branch_type, 1, in_tx, 8, call_path_id)
+               value = struct.pack("!hiqiqiqiqiqiqiqiqiqiqiiiqiqiqiqiiiBiqiqiq", 20, 8, sample_id, 8, evsel_id, 8, machine_id, 8, thread_id, 8, comm_id, 8, dso_id, 8, symbol_id, 8, sym_offset, 8, ip, 8, time, 4, cpu, 8, to_dso_id, 8, to_symbol_id, 8, to_sym_offset, 8, to_ip, 4, branch_type, 1, in_tx, 8, call_path_id, 8, insn_cnt, 8, cyc_cnt)
        else:
-               value = struct.pack("!hiqiqiqiqiqiqiqiqiqiqiiiqiqiqiqiqiqiqiqiiiBiq", 22, 8, sample_id, 8, evsel_id, 8, machine_id, 8, thread_id, 8, comm_id, 8, dso_id, 8, symbol_id, 8, sym_offset, 8, ip, 8, time, 4, cpu, 8, to_dso_id, 8, to_symbol_id, 8, to_sym_offset, 8, to_ip, 8, period, 8, weight, 8, transaction, 8, data_src, 4, branch_type, 1, in_tx, 8, call_path_id)
+               value = struct.pack("!hiqiqiqiqiqiqiqiqiqiqiiiqiqiqiqiqiqiqiqiiiBiqiqiq", 24, 8, sample_id, 8, evsel_id, 8, machine_id, 8, thread_id, 8, comm_id, 8, dso_id, 8, symbol_id, 8, sym_offset, 8, ip, 8, time, 4, cpu, 8, to_dso_id, 8, to_symbol_id, 8, to_sym_offset, 8, to_ip, 8, period, 8, weight, 8, transaction, 8, data_src, 4, branch_type, 1, in_tx, 8, call_path_id, 8, insn_cnt, 8, cyc_cnt)
        sample_file.write(value)
 
 def call_path_table(cp_id, parent_id, symbol_id, ip, *x):
@@ -759,7 +984,70 @@ def call_path_table(cp_id, parent_id, symbol_id, ip, *x):
        value = struct.pack(fmt, 4, 8, cp_id, 8, parent_id, 8, symbol_id, 8, ip)
        call_path_file.write(value)
 
-def call_return_table(cr_id, thread_id, comm_id, call_path_id, call_time, return_time, branch_count, call_id, return_id, parent_call_path_id, flags, parent_id, *x):
-       fmt = "!hiqiqiqiqiqiqiqiqiqiqiiiq"
-       value = struct.pack(fmt, 12, 8, cr_id, 8, thread_id, 8, comm_id, 8, call_path_id, 8, call_time, 8, return_time, 8, branch_count, 8, call_id, 8, return_id, 8, parent_call_path_id, 4, flags, 8, parent_id)
+def call_return_table(cr_id, thread_id, comm_id, call_path_id, call_time, return_time, branch_count, call_id, return_id, parent_call_path_id, flags, parent_id, insn_cnt, cyc_cnt, *x):
+       fmt = "!hiqiqiqiqiqiqiqiqiqiqiiiqiqiq"
+       value = struct.pack(fmt, 14, 8, cr_id, 8, thread_id, 8, comm_id, 8, call_path_id, 8, call_time, 8, return_time, 8, branch_count, 8, call_id, 8, return_id, 8, parent_call_path_id, 4, flags, 8, parent_id, 8, insn_cnt, 8, cyc_cnt)
        call_file.write(value)
+
+def ptwrite(id, raw_buf):
+       data = struct.unpack_from("<IQ", raw_buf)
+       flags = data[0]
+       payload = data[1]
+       exact_ip = flags & 1
+       value = struct.pack("!hiqiqiB", 3, 8, id, 8, payload, 1, exact_ip)
+       ptwrite_file.write(value)
+
+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
+       value = struct.pack("!hiqiiiiii", 4, 8, id, 4, cbr, 4, MHz, 4, percent)
+       cbr_file.write(value)
+
+def mwait(id, raw_buf):
+       data = struct.unpack_from("<IQ", raw_buf)
+       payload = data[1]
+       hints = payload & 0xff
+       extensions = (payload >> 32) & 0x3
+       value = struct.pack("!hiqiiii", 3, 8, id, 4, hints, 4, extensions)
+       mwait_file.write(value)
+
+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
+       value = struct.pack("!hiqiiiiiB", 4, 8, id, 4, cstate, 4, subcstate, 1, hw)
+       pwre_file.write(value)
+
+def exstop(id, raw_buf):
+       data = struct.unpack_from("<I", raw_buf)
+       flags = data[0]
+       exact_ip = flags & 1
+       value = struct.pack("!hiqiB", 2, 8, id, 1, exact_ip)
+       exstop_file.write(value)
+
+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
+       value = struct.pack("!hiqiiiiii", 4, 8, id, 4, deepest_cstate, 4, last_cstate, 4, wake_reason)
+       pwrx_file.write(value)
+
+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)
This page took 0.047637 seconds and 4 git commands to generate.