Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

perf scripting python: exported-sql-viewer.py: Factor out libxed.py

Factor out libxed.py so it can be reused.

Signed-off-by: Adrian Hunter <adrian.hunter@intel.com>
Cc: Andi Kleen <ak@linux.intel.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Link: https://lore.kernel.org/r/20210530192308.7382-13-adrian.hunter@intel.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>

authored by

Adrian Hunter and committed by
Arnaldo Carvalho de Melo
2b87386c 1a329b1c

+108 -88
+1 -88
tools/perf/scripts/python/exported-sql-viewer.py
··· 113 113 import random 114 114 import copy 115 115 import math 116 + from libxed import LibXED 116 117 117 118 pyside_version_1 = True 118 119 if not "--pyside-version-1" in sys.argv: ··· 4747 4746 def About(self): 4748 4747 dialog = AboutDialog(self.glb, self) 4749 4748 dialog.exec_() 4750 - 4751 - # XED Disassembler 4752 - 4753 - class xed_state_t(Structure): 4754 - 4755 - _fields_ = [ 4756 - ("mode", c_int), 4757 - ("width", c_int) 4758 - ] 4759 - 4760 - class XEDInstruction(): 4761 - 4762 - def __init__(self, libxed): 4763 - # Current xed_decoded_inst_t structure is 192 bytes. Use 512 to allow for future expansion 4764 - xedd_t = c_byte * 512 4765 - self.xedd = xedd_t() 4766 - self.xedp = addressof(self.xedd) 4767 - libxed.xed_decoded_inst_zero(self.xedp) 4768 - self.state = xed_state_t() 4769 - self.statep = addressof(self.state) 4770 - # Buffer for disassembled instruction text 4771 - self.buffer = create_string_buffer(256) 4772 - self.bufferp = addressof(self.buffer) 4773 - 4774 - class LibXED(): 4775 - 4776 - def __init__(self): 4777 - try: 4778 - self.libxed = CDLL("libxed.so") 4779 - except: 4780 - self.libxed = None 4781 - if not self.libxed: 4782 - self.libxed = CDLL("/usr/local/lib/libxed.so") 4783 - 4784 - self.xed_tables_init = self.libxed.xed_tables_init 4785 - self.xed_tables_init.restype = None 4786 - self.xed_tables_init.argtypes = [] 4787 - 4788 - self.xed_decoded_inst_zero = self.libxed.xed_decoded_inst_zero 4789 - self.xed_decoded_inst_zero.restype = None 4790 - self.xed_decoded_inst_zero.argtypes = [ c_void_p ] 4791 - 4792 - self.xed_operand_values_set_mode = self.libxed.xed_operand_values_set_mode 4793 - self.xed_operand_values_set_mode.restype = None 4794 - self.xed_operand_values_set_mode.argtypes = [ c_void_p, c_void_p ] 4795 - 4796 - self.xed_decoded_inst_zero_keep_mode = self.libxed.xed_decoded_inst_zero_keep_mode 4797 - self.xed_decoded_inst_zero_keep_mode.restype = None 4798 - self.xed_decoded_inst_zero_keep_mode.argtypes = [ c_void_p ] 4799 - 4800 - self.xed_decode = self.libxed.xed_decode 4801 - self.xed_decode.restype = c_int 4802 - self.xed_decode.argtypes = [ c_void_p, c_void_p, c_uint ] 4803 - 4804 - self.xed_format_context = self.libxed.xed_format_context 4805 - self.xed_format_context.restype = c_uint 4806 - self.xed_format_context.argtypes = [ c_int, c_void_p, c_void_p, c_int, c_ulonglong, c_void_p, c_void_p ] 4807 - 4808 - self.xed_tables_init() 4809 - 4810 - def Instruction(self): 4811 - return XEDInstruction(self) 4812 - 4813 - def SetMode(self, inst, mode): 4814 - if mode: 4815 - inst.state.mode = 4 # 32-bit 4816 - inst.state.width = 4 # 4 bytes 4817 - else: 4818 - inst.state.mode = 1 # 64-bit 4819 - inst.state.width = 8 # 8 bytes 4820 - self.xed_operand_values_set_mode(inst.xedp, inst.statep) 4821 - 4822 - def DisassembleOne(self, inst, bytes_ptr, bytes_cnt, ip): 4823 - self.xed_decoded_inst_zero_keep_mode(inst.xedp) 4824 - err = self.xed_decode(inst.xedp, bytes_ptr, bytes_cnt) 4825 - if err: 4826 - return 0, "" 4827 - # Use AT&T mode (2), alternative is Intel (3) 4828 - ok = self.xed_format_context(2, inst.xedp, inst.bufferp, sizeof(inst.buffer), ip, 0, 0) 4829 - if not ok: 4830 - return 0, "" 4831 - if sys.version_info[0] == 2: 4832 - result = inst.buffer.value 4833 - else: 4834 - result = inst.buffer.value.decode() 4835 - # Return instruction length and the disassembled instruction text 4836 - # For now, assume the length is in byte 166 4837 - return inst.xedd[166], result 4838 4749 4839 4750 def TryOpen(file_name): 4840 4751 try:
+107
tools/perf/scripts/python/libxed.py
··· 1 + #!/usr/bin/env python 2 + # SPDX-License-Identifier: GPL-2.0 3 + # libxed.py: Python wrapper for libxed.so 4 + # Copyright (c) 2014-2021, Intel Corporation. 5 + 6 + # To use Intel XED, libxed.so must be present. To build and install 7 + # libxed.so: 8 + # git clone https://github.com/intelxed/mbuild.git mbuild 9 + # git clone https://github.com/intelxed/xed 10 + # cd xed 11 + # ./mfile.py --share 12 + # sudo ./mfile.py --prefix=/usr/local install 13 + # sudo ldconfig 14 + # 15 + 16 + import sys 17 + 18 + from ctypes import CDLL, Structure, create_string_buffer, addressof, sizeof, \ 19 + c_void_p, c_bool, c_byte, c_char, c_int, c_uint, c_longlong, c_ulonglong 20 + 21 + # XED Disassembler 22 + 23 + class xed_state_t(Structure): 24 + 25 + _fields_ = [ 26 + ("mode", c_int), 27 + ("width", c_int) 28 + ] 29 + 30 + class XEDInstruction(): 31 + 32 + def __init__(self, libxed): 33 + # Current xed_decoded_inst_t structure is 192 bytes. Use 512 to allow for future expansion 34 + xedd_t = c_byte * 512 35 + self.xedd = xedd_t() 36 + self.xedp = addressof(self.xedd) 37 + libxed.xed_decoded_inst_zero(self.xedp) 38 + self.state = xed_state_t() 39 + self.statep = addressof(self.state) 40 + # Buffer for disassembled instruction text 41 + self.buffer = create_string_buffer(256) 42 + self.bufferp = addressof(self.buffer) 43 + 44 + class LibXED(): 45 + 46 + def __init__(self): 47 + try: 48 + self.libxed = CDLL("libxed.so") 49 + except: 50 + self.libxed = None 51 + if not self.libxed: 52 + self.libxed = CDLL("/usr/local/lib/libxed.so") 53 + 54 + self.xed_tables_init = self.libxed.xed_tables_init 55 + self.xed_tables_init.restype = None 56 + self.xed_tables_init.argtypes = [] 57 + 58 + self.xed_decoded_inst_zero = self.libxed.xed_decoded_inst_zero 59 + self.xed_decoded_inst_zero.restype = None 60 + self.xed_decoded_inst_zero.argtypes = [ c_void_p ] 61 + 62 + self.xed_operand_values_set_mode = self.libxed.xed_operand_values_set_mode 63 + self.xed_operand_values_set_mode.restype = None 64 + self.xed_operand_values_set_mode.argtypes = [ c_void_p, c_void_p ] 65 + 66 + self.xed_decoded_inst_zero_keep_mode = self.libxed.xed_decoded_inst_zero_keep_mode 67 + self.xed_decoded_inst_zero_keep_mode.restype = None 68 + self.xed_decoded_inst_zero_keep_mode.argtypes = [ c_void_p ] 69 + 70 + self.xed_decode = self.libxed.xed_decode 71 + self.xed_decode.restype = c_int 72 + self.xed_decode.argtypes = [ c_void_p, c_void_p, c_uint ] 73 + 74 + self.xed_format_context = self.libxed.xed_format_context 75 + self.xed_format_context.restype = c_uint 76 + self.xed_format_context.argtypes = [ c_int, c_void_p, c_void_p, c_int, c_ulonglong, c_void_p, c_void_p ] 77 + 78 + self.xed_tables_init() 79 + 80 + def Instruction(self): 81 + return XEDInstruction(self) 82 + 83 + def SetMode(self, inst, mode): 84 + if mode: 85 + inst.state.mode = 4 # 32-bit 86 + inst.state.width = 4 # 4 bytes 87 + else: 88 + inst.state.mode = 1 # 64-bit 89 + inst.state.width = 8 # 8 bytes 90 + self.xed_operand_values_set_mode(inst.xedp, inst.statep) 91 + 92 + def DisassembleOne(self, inst, bytes_ptr, bytes_cnt, ip): 93 + self.xed_decoded_inst_zero_keep_mode(inst.xedp) 94 + err = self.xed_decode(inst.xedp, bytes_ptr, bytes_cnt) 95 + if err: 96 + return 0, "" 97 + # Use AT&T mode (2), alternative is Intel (3) 98 + ok = self.xed_format_context(2, inst.xedp, inst.bufferp, sizeof(inst.buffer), ip, 0, 0) 99 + if not ok: 100 + return 0, "" 101 + if sys.version_info[0] == 2: 102 + result = inst.buffer.value 103 + else: 104 + result = inst.buffer.value.decode() 105 + # Return instruction length and the disassembled instruction text 106 + # For now, assume the length is in byte 166 107 + return inst.xedd[166], result