mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2025-04-17 22:00:41 +00:00

*** to conform to clang-format’s LLVM style. This kind of mass change has *** two obvious implications: Firstly, merging this particular commit into a downstream fork may be a huge effort. Alternatively, it may be worth merging all changes up to this commit, performing the same reformatting operation locally, and then discarding the merge for this particular commit. The commands used to accomplish this reformatting were as follows (with current working directory as the root of the repository): find . \( -iname "*.c" -or -iname "*.cpp" -or -iname "*.h" -or -iname "*.mm" \) -exec clang-format -i {} + find . -iname "*.py" -exec autopep8 --in-place --aggressive --aggressive {} + ; The version of clang-format used was 3.9.0, and autopep8 was 1.2.4. Secondly, “blame” style tools will generally point to this commit instead of a meaningful prior commit. There are alternatives available that will attempt to look through this change and find the appropriate prior commit. YMMV. llvm-svn: 280751
232 lines
9.6 KiB
Python
232 lines
9.6 KiB
Python
#!/usr/bin/python
|
|
|
|
import lldb
|
|
import struct
|
|
|
|
|
|
class OperatingSystemPlugIn(object):
|
|
"""Class that provides data for an instance of a LLDB 'OperatingSystemPython' plug-in class"""
|
|
|
|
def __init__(self, process):
|
|
'''Initialization needs a valid.SBProcess object.
|
|
|
|
This plug-in will get created after a live process is valid and has stopped for the
|
|
first time.'''
|
|
self.process = None
|
|
self.registers = None
|
|
self.threads = None
|
|
if isinstance(process, lldb.SBProcess) and process.IsValid():
|
|
self.process = process
|
|
self.threads = None # Will be an dictionary containing info for each thread
|
|
|
|
def get_target(self):
|
|
# NOTE: Don't use "lldb.target" when trying to get your target as the "lldb.target"
|
|
# tracks the current target in the LLDB command interpreter which isn't the
|
|
# correct thing to use for this plug-in.
|
|
return self.process.target
|
|
|
|
def create_thread(self, tid, context):
|
|
if tid == 0x444444444:
|
|
thread_info = {
|
|
'tid': tid,
|
|
'name': 'four',
|
|
'queue': 'queue4',
|
|
'state': 'stopped',
|
|
'stop_reason': 'none'}
|
|
self.threads.append(thread_info)
|
|
return thread_info
|
|
return None
|
|
|
|
def get_thread_info(self):
|
|
if not self.threads:
|
|
# The sample dictionary below shows the values that can be returned for a thread
|
|
# tid => thread ID (mandatory)
|
|
# name => thread name (optional key/value pair)
|
|
# queue => thread dispatch queue name (optional key/value pair)
|
|
# state => thred state (mandatory, set to 'stopped' for now)
|
|
# stop_reason => thread stop reason. (mandatory, usually set to 'none')
|
|
# Possible values include:
|
|
# 'breakpoint' if the thread is stopped at a breakpoint
|
|
# 'none' thread is just stopped because the process is stopped
|
|
# 'trace' the thread just single stepped
|
|
# The usual value for this while threads are in memory is 'none'
|
|
# register_data_addr => the address of the register data in memory (optional key/value pair)
|
|
# Specifying this key/value pair for a thread will avoid a call to get_register_data()
|
|
# and can be used when your registers are in a thread context structure that is contiguous
|
|
# in memory. Don't specify this if your register layout in memory doesn't match the layout
|
|
# described by the dictionary returned from a call to the
|
|
# get_register_info() method.
|
|
self.threads = [{'tid': 0x111111111,
|
|
'name': 'one',
|
|
'queue': 'queue1',
|
|
'state': 'stopped',
|
|
'stop_reason': 'breakpoint'},
|
|
{'tid': 0x222222222,
|
|
'name': 'two',
|
|
'queue': 'queue2',
|
|
'state': 'stopped',
|
|
'stop_reason': 'none'},
|
|
{'tid': 0x333333333,
|
|
'name': 'three',
|
|
'queue': 'queue3',
|
|
'state': 'stopped',
|
|
'stop_reason': 'trace',
|
|
'register_data_addr': 0x100000000}]
|
|
return self.threads
|
|
|
|
def get_register_info(self):
|
|
if self.registers is None:
|
|
self.registers = dict()
|
|
triple = self.process.target.triple
|
|
if triple:
|
|
arch = triple.split('-')[0]
|
|
if arch == 'x86_64':
|
|
self.registers['sets'] = ['GPR', 'FPU', 'EXC']
|
|
self.registers['registers'] = [
|
|
{'name': 'rax', 'bitsize': 64, 'offset': 0, 'encoding': 'uint', 'format': 'hex', 'set': 0, 'gcc': 0, 'dwarf': 0},
|
|
{'name': 'rbx', 'bitsize': 64, 'offset': 8, 'encoding': 'uint', 'format': 'hex', 'set': 0, 'gcc': 3, 'dwarf': 3},
|
|
{'name': 'rcx', 'bitsize': 64, 'offset': 16, 'encoding': 'uint', 'format': 'hex', 'set': 0, 'gcc': 2, 'dwarf': 2, 'generic': 'arg4', 'alt-name': 'arg4', },
|
|
{'name': 'rdx', 'bitsize': 64, 'offset': 24, 'encoding': 'uint', 'format': 'hex', 'set': 0, 'gcc': 1, 'dwarf': 1, 'generic': 'arg3', 'alt-name': 'arg3', },
|
|
{'name': 'rdi', 'bitsize': 64, 'offset': 32, 'encoding': 'uint', 'format': 'hex', 'set': 0, 'gcc': 5, 'dwarf': 5, 'generic': 'arg1', 'alt-name': 'arg1', },
|
|
{'name': 'rsi', 'bitsize': 64, 'offset': 40, 'encoding': 'uint', 'format': 'hex', 'set': 0, 'gcc': 4, 'dwarf': 4, 'generic': 'arg2', 'alt-name': 'arg2', },
|
|
{'name': 'rbp', 'bitsize': 64, 'offset': 48, 'encoding': 'uint', 'format': 'hex', 'set': 0, 'gcc': 6, 'dwarf': 6, 'generic': 'fp', 'alt-name': 'fp', },
|
|
{'name': 'rsp', 'bitsize': 64, 'offset': 56, 'encoding': 'uint', 'format': 'hex', 'set': 0, 'gcc': 7, 'dwarf': 7, 'generic': 'sp', 'alt-name': 'sp', },
|
|
{'name': 'r8', 'bitsize': 64, 'offset': 64, 'encoding': 'uint', 'format': 'hex', 'set': 0, 'gcc': 8, 'dwarf': 8, 'generic': 'arg5', 'alt-name': 'arg5', },
|
|
{'name': 'r9', 'bitsize': 64, 'offset': 72, 'encoding': 'uint', 'format': 'hex', 'set': 0, 'gcc': 9, 'dwarf': 9, 'generic': 'arg6', 'alt-name': 'arg6', },
|
|
{'name': 'r10', 'bitsize': 64, 'offset': 80, 'encoding': 'uint', 'format': 'hex', 'set': 0, 'gcc': 10, 'dwarf': 10},
|
|
{'name': 'r11', 'bitsize': 64, 'offset': 88, 'encoding': 'uint', 'format': 'hex', 'set': 0, 'gcc': 11, 'dwarf': 11},
|
|
{'name': 'r12', 'bitsize': 64, 'offset': 96, 'encoding': 'uint', 'format': 'hex', 'set': 0, 'gcc': 12, 'dwarf': 12},
|
|
{'name': 'r13', 'bitsize': 64, 'offset': 104, 'encoding': 'uint', 'format': 'hex', 'set': 0, 'gcc': 13, 'dwarf': 13},
|
|
{'name': 'r14', 'bitsize': 64, 'offset': 112, 'encoding': 'uint', 'format': 'hex', 'set': 0, 'gcc': 14, 'dwarf': 14},
|
|
{'name': 'r15', 'bitsize': 64, 'offset': 120, 'encoding': 'uint', 'format': 'hex', 'set': 0, 'gcc': 15, 'dwarf': 15},
|
|
{'name': 'rip', 'bitsize': 64, 'offset': 128, 'encoding': 'uint', 'format': 'hex', 'set': 0, 'gcc': 16, 'dwarf': 16, 'generic': 'pc', 'alt-name': 'pc'},
|
|
{'name': 'rflags', 'bitsize': 64, 'offset': 136, 'encoding': 'uint', 'format': 'hex', 'set': 0, 'generic': 'flags', 'alt-name': 'flags'},
|
|
{'name': 'cs', 'bitsize': 64, 'offset': 144, 'encoding': 'uint', 'format': 'hex', 'set': 0},
|
|
{'name': 'fs', 'bitsize': 64, 'offset': 152, 'encoding': 'uint', 'format': 'hex', 'set': 0},
|
|
{'name': 'gs', 'bitsize': 64, 'offset': 160, 'encoding': 'uint', 'format': 'hex', 'set': 0},
|
|
]
|
|
return self.registers
|
|
|
|
def get_register_data(self, tid):
|
|
if tid == 0x111111111:
|
|
return struct.pack(
|
|
'21Q',
|
|
1,
|
|
2,
|
|
3,
|
|
4,
|
|
5,
|
|
6,
|
|
7,
|
|
8,
|
|
9,
|
|
10,
|
|
11,
|
|
12,
|
|
13,
|
|
14,
|
|
15,
|
|
16,
|
|
17,
|
|
18,
|
|
19,
|
|
20,
|
|
21)
|
|
elif tid == 0x222222222:
|
|
return struct.pack(
|
|
'21Q',
|
|
11,
|
|
12,
|
|
13,
|
|
14,
|
|
15,
|
|
16,
|
|
17,
|
|
18,
|
|
19,
|
|
110,
|
|
111,
|
|
112,
|
|
113,
|
|
114,
|
|
115,
|
|
116,
|
|
117,
|
|
118,
|
|
119,
|
|
120,
|
|
121)
|
|
elif tid == 0x333333333:
|
|
return struct.pack(
|
|
'21Q',
|
|
21,
|
|
22,
|
|
23,
|
|
24,
|
|
25,
|
|
26,
|
|
27,
|
|
28,
|
|
29,
|
|
210,
|
|
211,
|
|
212,
|
|
213,
|
|
214,
|
|
215,
|
|
216,
|
|
217,
|
|
218,
|
|
219,
|
|
220,
|
|
221)
|
|
elif tid == 0x444444444:
|
|
return struct.pack(
|
|
'21Q',
|
|
31,
|
|
32,
|
|
33,
|
|
34,
|
|
35,
|
|
36,
|
|
37,
|
|
38,
|
|
39,
|
|
310,
|
|
311,
|
|
312,
|
|
313,
|
|
314,
|
|
315,
|
|
316,
|
|
317,
|
|
318,
|
|
319,
|
|
320,
|
|
321)
|
|
else:
|
|
return struct.pack(
|
|
'21Q',
|
|
41,
|
|
42,
|
|
43,
|
|
44,
|
|
45,
|
|
46,
|
|
47,
|
|
48,
|
|
49,
|
|
410,
|
|
411,
|
|
412,
|
|
413,
|
|
414,
|
|
415,
|
|
416,
|
|
417,
|
|
418,
|
|
419,
|
|
420,
|
|
421)
|
|
return None
|