147fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton#!/usr/bin/python
247fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton
347fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton#----------------------------------------------------------------------
447fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton# This module will enable GDB remote packet logging when the
547fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton# 'start_gdb_log' command is called with a filename to log to. When the
647fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton# 'stop_gdb_log' command is called, it will disable the logging and
747fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton# print out statistics about how long commands took to execute and also
847fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton# will primnt ou
947fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton# Be sure to add the python path that points to the LLDB shared library.
1047fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton#
1147fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton# To use this in the embedded python interpreter using "lldb" just
1247fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton# import it with the full path using the "command script import"
1347fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton# command. This can be done from the LLDB command line:
1447fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton#   (lldb) command script import /path/to/gdbremote.py
1547fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton# Or it can be added to your ~/.lldbinit file so this module is always
1647fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton# available.
1747fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton#----------------------------------------------------------------------
1847fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton
1947fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Claytonimport commands
2047fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Claytonimport optparse
2147fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Claytonimport os
2247fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Claytonimport re
23e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Claytonimport shlex
24e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Claytonimport string
25e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Claytonimport sys
2647fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Claytonimport tempfile
2747fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton
281b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton#----------------------------------------------------------------------
291b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton# Global variables
301b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton#----------------------------------------------------------------------
311b62f5967aa04ebde2ae163f12c739a6740596e2Greg Claytong_log_file = ''
321b62f5967aa04ebde2ae163f12c739a6740596e2Greg Claytong_byte_order = 'little'
331b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton
34e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Claytonclass TerminalColors:
35e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    '''Simple terminal colors class'''
361b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton    def __init__(self, enabled = True):
37e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        # TODO: discover terminal type from "file" and disable if
38e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        # it can't handle the color codes
39e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        self.enabled = enabled
40e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton
41e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    def reset(self):
42e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        '''Reset all terminal colors and formatting.'''
43e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        if self.enabled:
441b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton            return "\x1b[0m";
451b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton        return ''
46e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton
47e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    def bold(self, on = True):
48e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        '''Enable or disable bold depending on the "on" paramter.'''
49e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        if self.enabled:
50e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton            if on:
511b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton                return "\x1b[1m";
52e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton            else:
531b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton                return "\x1b[22m";
541b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton        return ''
551b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton
56e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    def italics(self, on = True):
57e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        '''Enable or disable italics depending on the "on" paramter.'''
58e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        if self.enabled:
59e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton            if on:
601b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton                return "\x1b[3m";
61e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton            else:
621b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton                return "\x1b[23m";
631b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton        return ''
641b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton
65e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    def underline(self, on = True):
66e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        '''Enable or disable underline depending on the "on" paramter.'''
67e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        if self.enabled:
68e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton            if on:
691b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton                return "\x1b[4m";
70e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton            else:
711b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton                return "\x1b[24m";
721b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton        return ''
731b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton
74e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    def inverse(self, on = True):
75e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        '''Enable or disable inverse depending on the "on" paramter.'''
76e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        if self.enabled:
77e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton            if on:
781b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton                return "\x1b[7m";
79e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton            else:
801b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton                return "\x1b[27m";
811b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton        return ''
821b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton
83e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    def strike(self, on = True):
84e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        '''Enable or disable strike through depending on the "on" paramter.'''
85e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        if self.enabled:
86e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton            if on:
871b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton                return "\x1b[9m";
88e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton            else:
891b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton                return "\x1b[29m";
901b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton        return ''
911b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton
92e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    def black(self, fg = True):
93e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        '''Set the foreground or background color to black.
94e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        The foreground color will be set if "fg" tests True. The background color will be set if "fg" tests False.'''
95e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        if self.enabled:
96e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton            if fg:
971b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton                return "\x1b[30m";
98e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton            else:
991b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton                return "\x1b[40m";
1001b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton        return ''
1011b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton
102e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    def red(self, fg = True):
103e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        '''Set the foreground or background color to red.
104e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        The foreground color will be set if "fg" tests True. The background color will be set if "fg" tests False.'''
105e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        if self.enabled:
106e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton            if fg:
1071b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton                return "\x1b[31m";
108e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton            else:
1091b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton                return "\x1b[41m";
1101b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton        return ''
1111b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton
112e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    def green(self, fg = True):
113e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        '''Set the foreground or background color to green.
114e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        The foreground color will be set if "fg" tests True. The background color will be set if "fg" tests False.'''
115e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        if self.enabled:
116e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton            if fg:
1171b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton                return "\x1b[32m";
118e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton            else:
1191b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton                return "\x1b[42m";
1201b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton        return ''
1211b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton
122e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    def yellow(self, fg = True):
123e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        '''Set the foreground or background color to yellow.
124e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        The foreground color will be set if "fg" tests True. The background color will be set if "fg" tests False.'''
125e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        if self.enabled:
126e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton            if fg:
1271b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton                return "\x1b[43m";
128e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton            else:
1291b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton                return "\x1b[33m";
1301b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton        return ''
1311b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton
132e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    def blue(self, fg = True):
133e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        '''Set the foreground or background color to blue.
134e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        The foreground color will be set if "fg" tests True. The background color will be set if "fg" tests False.'''
135e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        if self.enabled:
136e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton            if fg:
1371b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton                return "\x1b[34m";
138e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton            else:
1391b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton                return "\x1b[44m";
1401b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton        return ''
1411b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton
142e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    def magenta(self, fg = True):
143e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        '''Set the foreground or background color to magenta.
144e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        The foreground color will be set if "fg" tests True. The background color will be set if "fg" tests False.'''
145e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        if self.enabled:
146e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton            if fg:
1471b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton                return "\x1b[35m";
148e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton            else:
1491b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton                return "\x1b[45m";
1501b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton        return ''
1511b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton
152e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    def cyan(self, fg = True):
153e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        '''Set the foreground or background color to cyan.
154e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        The foreground color will be set if "fg" tests True. The background color will be set if "fg" tests False.'''
155e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        if self.enabled:
156e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton            if fg:
1571b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton                return "\x1b[36m";
158e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton            else:
1591b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton                return "\x1b[46m";
1601b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton        return ''
1611b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton
162e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    def white(self, fg = True):
163e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        '''Set the foreground or background color to white.
164e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        The foreground color will be set if "fg" tests True. The background color will be set if "fg" tests False.'''
165e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        if self.enabled:
166e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton            if fg:
1671b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton                return "\x1b[37m";
168e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton            else:
1691b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton                return "\x1b[47m";
1701b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton        return ''
1711b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton
172e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    def default(self, fg = True):
173e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        '''Set the foreground or background color to the default.
174e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        The foreground color will be set if "fg" tests True. The background color will be set if "fg" tests False.'''
175e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        if self.enabled:
176e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton            if fg:
1771b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton                return "\x1b[39m";
178e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton            else:
1791b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton                return "\x1b[49m";
1801b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton        return ''
181e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton
18247fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton
18347fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Claytondef start_gdb_log(debugger, command, result, dict):
18447fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton    '''Start logging GDB remote packets by enabling logging with timestamps and
18547fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton    thread safe logging. Follow a call to this function with a call to "stop_gdb_log"
18647fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton    in order to dump out the commands.'''
187e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    global g_log_file
18847fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton    command_args = shlex.split(command)
18947fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton    usage = "usage: start_gdb_log [options] [<LOGFILEPATH>]"
19047fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton    description='''The command enables GDB remote packet logging with timestamps. The packets will be logged to <LOGFILEPATH> if supplied, or a temporary file will be used. Logging stops when stop_gdb_log is called and the packet times will
19147fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton    be aggregated and displayed.'''
19247fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton    parser = optparse.OptionParser(description=description, prog='start_gdb_log',usage=usage)
19347fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton    parser.add_option('-v', '--verbose', action='store_true', dest='verbose', help='display verbose debug info', default=False)
19447fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton    try:
19547fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton        (options, args) = parser.parse_args(command_args)
19647fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton    except:
19747fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton        return
19847fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton
199e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    if g_log_file:
200e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        result.PutCString ('error: logging is already in progress with file "%s"', g_log_file)
20147fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton    else:
20247fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton        args_len = len(args)
20347fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton        if args_len == 0:
204e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton            g_log_file = tempfile.mktemp()
20547fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton        elif len(args) == 1:
206e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton            g_log_file = args[0]
20747fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton
208e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        if g_log_file:
209e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton            debugger.HandleCommand('log enable --threadsafe --timestamp --file "%s" gdb-remote packets' % g_log_file);
210e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton            result.PutCString ("GDB packet logging enable with log file '%s'\nUse the 'stop_gdb_log' command to stop logging and show packet statistics." % g_log_file)
21147fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton            return
21247fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton
21347fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton        result.PutCString ('error: invalid log file path')
21447fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton    result.PutCString (usage)
21547fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton
21647fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Claytondef stop_gdb_log(debugger, command, result, dict):
21747fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton    '''Stop logging GDB remote packets to the file that was specified in a call
21847fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton    to "start_gdb_log" and normalize the timestamps to be relative to the first
21947fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton    timestamp in the log file. Also print out statistics for how long each
22047fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton    command took to allow performance bottlenecks to be determined.'''
221e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    global g_log_file
22247fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton    # Any commands whose names might be followed by more valid C identifier
22347fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton    # characters must be listed here
22447fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton    command_args = shlex.split(command)
22547fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton    usage = "usage: stop_gdb_log [options]"
22647fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton    description='''The command stops a previously enabled GDB remote packet logging command. Packet logging must have been previously enabled with a call to start_gdb_log.'''
22747fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton    parser = optparse.OptionParser(description=description, prog='stop_gdb_log',usage=usage)
22847fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton    parser.add_option('-v', '--verbose', action='store_true', dest='verbose', help='display verbose debug info', default=False)
22947fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton    parser.add_option('-q', '--quiet', action='store_true', dest='quiet', help='display verbose debug info', default=False)
2301b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton    parser.add_option('-C', '--color', action='store_true', dest='color', help='add terminal colors', default=False)
23177ce90bc96f26ee707ae3ef3ba62099a7c3dc8fdJim Ingham    parser.add_option('-c', '--sort-by-count', action='store_true', dest='sort_count', help='display verbose debug info', default=False)
2321b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton    parser.add_option('-s', '--symbolicate', action='store_true', dest='symbolicate', help='symbolicate addresses in log using current "lldb.target"', default=False)
23347fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton    try:
23447fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton        (options, args) = parser.parse_args(command_args)
23547fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton    except:
23647fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton        return
2371b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton    options.colors = TerminalColors(options.color)
2381b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton    options.symbolicator = None
2391b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton    if options.symbolicate:
2401b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton        if lldb.target:
2411b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton            import lldb.utils.symbolication
2421b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton            options.symbolicator = lldb.utils.symbolication.Symbolicator()
2431b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton            options.symbolicator.target = lldb.target
2441b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton        else:
2451b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton            print "error: can't symbolicate without a target"
24647fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton
247e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    if not g_log_file:
24847fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton        result.PutCString ('error: logging must have been previously enabled with a call to "stop_gdb_log"')
249e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    elif os.path.exists (g_log_file):
25047fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton        if len(args) == 0:
25147fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton            debugger.HandleCommand('log disable gdb-remote packets');
252e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton            result.PutCString ("GDB packet logging disabled. Logged packets are in '%s'" % g_log_file)
253e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton            parse_gdb_log_file (g_log_file, options)
25447fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton        else:
25547fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton            result.PutCString (usage)
25647fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton    else:
257e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        print 'error: the GDB packet log file "%s" does not exist' % g_log_file
258e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton
259e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Claytondef is_hex_byte(str):
260e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    if len(str) == 2:
261e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        return str[0] in string.hexdigits and str[1] in string.hexdigits;
262e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    return False
263e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton
264e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton# global register info list
265e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Claytong_register_infos = list()
266e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Claytong_max_register_info_name_len = 0
267e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton
268e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Claytonclass RegisterInfo:
269e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    """Class that represents register information"""
270e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    def __init__(self, kvp):
271e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        self.info = dict()
272e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        for kv in kvp:
273e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton            key = kv[0]
274e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton            value = kv[1]
275e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton            self.info[key] = value
276e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    def name(self):
277e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        '''Get the name of the register.'''
278e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        if self.info and 'name' in self.info:
279e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton            return self.info['name']
280e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        return None
281e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton
282e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    def bit_size(self):
283e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        '''Get the size in bits of the register.'''
284e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        if self.info and 'bitsize' in self.info:
285e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton            return int(self.info['bitsize'])
286e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        return 0
287e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton
288e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    def byte_size(self):
289e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        '''Get the size in bytes of the register.'''
290e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        return self.bit_size() / 8
291e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton
292e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    def get_value_from_hex_string(self, hex_str):
293e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        '''Dump the register value given a native byte order encoded hex ASCII byte string.'''
294e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        encoding = self.info['encoding']
295e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        bit_size = self.bit_size()
296e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        packet = Packet(hex_str)
297e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        if encoding == 'uint':
298e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton            uval = packet.get_hex_uint(g_byte_order)
299e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton            if bit_size == 8:
300e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton                return '0x%2.2x' % (uval)
301e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton            elif bit_size == 16:
302e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton                return '0x%4.4x' % (uval)
303e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton            elif bit_size == 32:
304e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton                return '0x%8.8x' % (uval)
305e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton            elif bit_size == 64:
306e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton                return '0x%16.16x' % (uval)
307e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        bytes = list();
308e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        uval = packet.get_hex_uint8()
309e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        while uval != None:
310e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton            bytes.append(uval)
311e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton            uval = packet.get_hex_uint8()
312e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        value_str = '0x'
313e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        if g_byte_order == 'little':
314e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton            bytes.reverse()
315e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        for byte in bytes:
316e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton            value_str += '%2.2x' % byte
317e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        return '%s' % (value_str)
318e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton
319e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    def __str__(self):
320e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        '''Dump the register info key/value pairs'''
321e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        s = ''
322e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        for key in self.info.keys():
323e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton            if s:
324e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton                s += ', '
325e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton            s += "%s=%s " % (key, self.info[key])
326e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        return s
327e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton
328e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Claytonclass Packet:
329e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    """Class that represents a packet that contains string data"""
330e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    def __init__(self, packet_str):
331e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        self.str = packet_str
332e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton
333e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    def peek_char(self):
334e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        ch = 0
335e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        if self.str:
336e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton            ch = self.str[0]
337e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        return ch
338e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton
339e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    def get_char(self):
340e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        ch = 0
341e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        if self.str:
342e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton            ch = self.str[0]
343e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton            self.str = self.str[1:]
344e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        return ch
345e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton
346e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    def get_hex_uint8(self):
347e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        if self.str and len(self.str) >= 2 and self.str[0] in string.hexdigits and self.str[1] in string.hexdigits:
348e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton            uval = int(self.str[0:2], 16)
349e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton            self.str = self.str[2:]
350e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton            return uval
351e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        return None
352e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton
353e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    def get_hex_uint16(self, byte_order):
354e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        uval = 0
355e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        if byte_order == 'big':
356e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton            uval |= self.get_hex_uint8() << 8
357e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton            uval |= self.get_hex_uint8()
358e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        else:
359e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton            uval |= self.get_hex_uint8()
360e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton            uval |= self.get_hex_uint8() << 8
361e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        return uval
362e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton
363e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    def get_hex_uint32(self, byte_order):
364e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        uval = 0
365e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        if byte_order == 'big':
366e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton            uval |= self.get_hex_uint8() << 24
367e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton            uval |= self.get_hex_uint8() << 16
368e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton            uval |= self.get_hex_uint8() << 8
369e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton            uval |= self.get_hex_uint8()
370e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        else:
371e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton            uval |= self.get_hex_uint8()
372e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton            uval |= self.get_hex_uint8() << 8
373e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton            uval |= self.get_hex_uint8() << 16
374e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton            uval |= self.get_hex_uint8() << 24
375e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        return uval
376e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton
377e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    def get_hex_uint64(self, byte_order):
378e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        uval = 0
379e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        if byte_order == 'big':
380e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton            uval |= self.get_hex_uint8() << 56
381e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton            uval |= self.get_hex_uint8() << 48
382e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton            uval |= self.get_hex_uint8() << 40
383e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton            uval |= self.get_hex_uint8() << 32
384e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton            uval |= self.get_hex_uint8() << 24
385e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton            uval |= self.get_hex_uint8() << 16
386e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton            uval |= self.get_hex_uint8() << 8
387e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton            uval |= self.get_hex_uint8()
388e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        else:
389e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton            uval |= self.get_hex_uint8()
390e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton            uval |= self.get_hex_uint8() << 8
391e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton            uval |= self.get_hex_uint8() << 16
392e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton            uval |= self.get_hex_uint8() << 24
393e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton            uval |= self.get_hex_uint8() << 32
394e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton            uval |= self.get_hex_uint8() << 40
395e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton            uval |= self.get_hex_uint8() << 48
396e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton            uval |= self.get_hex_uint8() << 56
397e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        return uval
398e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton
399e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    def get_hex_chars(self, n = 0):
400e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        str_len = len(self.str)
401e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        if n == 0:
402e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton            # n was zero, so we need to determine all hex chars and
403e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton            # stop when we hit the end of the string of a non-hex character
404e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton            while n < str_len and self.str[n] in string.hexdigits:
405e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton                n = n + 1
406e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        else:
407e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton            if n > str_len:
408e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton                return None # Not enough chars
409e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton            # Verify all chars are hex if a length was specified
410e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton            for i in range(n):
411e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton                if self.str[i] not in string.hexdigits:
412e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton                    return None # Not all hex digits
413e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        if n == 0:
414e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton            return None
415e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        hex_str = self.str[0:n]
416e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        self.str = self.str[n:]
417e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        return hex_str
418e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton
419e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    def get_hex_uint(self, byte_order, n = 0):
420e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        if byte_order == 'big':
421e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton            hex_str = self.get_hex_chars(n)
422e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton            if hex_str == None:
423e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton                return None
424e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton            return int(hex_str, 16)
425e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        else:
426e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton            uval = self.get_hex_uint8()
427e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton            if uval == None:
428e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton                return None
429e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton            uval_result = 0
430e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton            shift = 0
431e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton            while uval != None:
432e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton                uval_result |= (uval << shift)
433e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton                shift += 8
434e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton                uval = self.get_hex_uint8()
435e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton            return uval_result
436e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton
437e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    def get_key_value_pairs(self):
438e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        kvp = list()
439e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        key_value_pairs = string.split(self.str, ';')
440e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        for key_value_pair in key_value_pairs:
441e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton            if len(key_value_pair):
442e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton                kvp.append(string.split(key_value_pair, ':'))
443e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        return kvp
444e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton
445e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    def split(self, ch):
446e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        return string.split(self.str, ch)
447e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton
448e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    def split_hex(self, ch, byte_order):
449e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        hex_values = list()
450e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        strings = string.split(self.str, ch)
451e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        for str in strings:
452e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton            hex_values.append(Packet(str).get_hex_uint(byte_order))
453e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        return hex_values
454e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton
455e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    def __str__(self):
456e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        return self.str
457e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton
458e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    def __len__(self):
459e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        return len(self.str)
460e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton
461e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Claytong_thread_suffix_regex = re.compile(';thread:([0-9a-fA-F]+);')
462e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Claytondef get_thread_from_thread_suffix(str):
463e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    if str:
464e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        match = g_thread_suffix_regex.match (str)
465e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        if match:
466e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton            return int(match.group(1), 16)
467e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    return None
468e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton
4691b62f5967aa04ebde2ae163f12c739a6740596e2Greg Claytondef cmd_stop_reply(options, cmd, args):
470e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    print "get_last_stop_info()"
471e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton
4721b62f5967aa04ebde2ae163f12c739a6740596e2Greg Claytondef rsp_stop_reply(options, cmd, cmd_args, rsp):
473e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    global g_byte_order
474e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    packet = Packet(rsp)
475e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    stop_type = packet.get_char()
476e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    if stop_type == 'T' or stop_type == 'S':
477e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        signo  = packet.get_hex_uint8()
478e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        print '    signal = %i' % signo
479e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        key_value_pairs = packet.get_key_value_pairs()
480e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        for key_value_pair in key_value_pairs:
481e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton            key = key_value_pair[0]
482e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton            value = key_value_pair[1]
483e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton            if is_hex_byte(key):
484e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton                reg_num = Packet(key).get_hex_uint8()
4851b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton                print '    ' + get_register_name_equal_value (options, reg_num, value)
486e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton            else:
487e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton                print '    %s = %s' % (key, value)
488e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    elif stop_type == 'W':
489e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        exit_status = packet.get_hex_uint8()
490e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        print 'exit (status=%i)' % exit_status
491e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    elif stop_type == 'O':
492e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        print 'stdout = %s' % packet.str
493e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton
494e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton
4951b62f5967aa04ebde2ae163f12c739a6740596e2Greg Claytondef cmd_unknown_packet(options, cmd, args):
496e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    if args:
497e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        print "cmd: %s, args: %s", cmd, args
498e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    else:
499e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        print "cmd: %s", cmd
500e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton
5011b62f5967aa04ebde2ae163f12c739a6740596e2Greg Claytondef cmd_query_packet(options, cmd, args):
502e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    if args:
5031b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton        print "query: %s, args: %s" % (cmd, args)
504e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    else:
5051b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton        print "query: %s" % (cmd)
50647fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton
507e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Claytondef rsp_ok_error(rsp):
508e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    print "rsp: ", rsp
509e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton
5101b62f5967aa04ebde2ae163f12c739a6740596e2Greg Claytondef rsp_ok_means_supported(options, cmd, cmd_args, rsp):
511e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    if rsp == 'OK':
512e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        print "%s%s is supported" % (cmd, cmd_args)
513e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    elif rsp == '':
514e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        print "%s%s is not supported" % (cmd, cmd_args)
515e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    else:
516e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        print "%s%s -> %s" % (cmd, cmd_args, rsp)
517e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton
5181b62f5967aa04ebde2ae163f12c739a6740596e2Greg Claytondef rsp_ok_means_success(options, cmd, cmd_args, rsp):
519e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    if rsp == 'OK':
520e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        print "success"
521e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    elif rsp == '':
522e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        print "%s%s is not supported" % (cmd, cmd_args)
523e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    else:
524e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        print "%s%s -> %s" % (cmd, cmd_args, rsp)
525e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton
5261b62f5967aa04ebde2ae163f12c739a6740596e2Greg Claytondef rsp_dump_key_value_pairs(options, cmd, cmd_args, rsp):
527e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    if rsp:
528e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        packet = Packet(rsp)
529e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        key_value_pairs = packet.get_key_value_pairs()
530e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        for key_value_pair in key_value_pairs:
531e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton            key = key_value_pair[0]
532e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton            value = key_value_pair[1]
533e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton            print "    %s = %s" % (key, value)
534e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    else:
535e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        print "not supported"
536e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton
5371b62f5967aa04ebde2ae163f12c739a6740596e2Greg Claytondef cmd_vCont(options, cmd, args):
538e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    if args == '?':
539e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        print "%s: get supported extended continue modes" % (cmd)
540e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    else:
541e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        got_other_threads = 0
542e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        s = ''
543e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        for thread_action in string.split(args[1:], ';'):
544e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton            (short_action, thread) = string.split(thread_action, ':')
545e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton            tid = int(thread, 16)
546e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton            if short_action == 'c':
547e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton                action = 'continue'
548e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton            elif short_action == 's':
549e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton                action = 'step'
550e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton            elif short_action[0] == 'C':
551e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton                action = 'continue with signal 0x%s' % (short_action[1:])
552e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton            elif short_action == 'S':
553e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton                action = 'step with signal 0x%s' % (short_action[1:])
554e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton            else:
555e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton                action = short_action
556e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton            if s:
557e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton                s += ', '
558e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton            if tid == -1:
559e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton                got_other_threads = 1
560e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton                s += 'other-threads:'
561e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton            else:
562e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton                s += 'thread 0x%4.4x: %s' % (tid, action)
563e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        if got_other_threads:
564e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton            print "extended_continue (%s)" % (s)
565e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        else:
566e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton            print "extended_continue (%s, other-threads: suspend)" % (s)
567e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton
5681b62f5967aa04ebde2ae163f12c739a6740596e2Greg Claytondef rsp_vCont(options, cmd, cmd_args, rsp):
569e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    if cmd_args == '?':
570e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        # Skip the leading 'vCont;'
571e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        rsp = rsp[6:]
572e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        modes = string.split(rsp, ';')
573e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        s = "%s: supported extended continue modes include: " % (cmd)
574e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton
575e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        for i, mode in enumerate(modes):
576e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton            if i:
577e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton                s += ', '
578e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton            if mode == 'c':
579e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton                s += 'continue'
580e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton            elif mode == 'C':
581e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton                s += 'continue with signal'
582e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton            elif mode == 's':
583e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton                s += 'step'
584e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton            elif mode == 'S':
585e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton                s += 'step with signal'
586e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton            else:
587e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton                s += 'unrecognized vCont mode: ', mode
588e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        print s
589e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    elif rsp:
590e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        if rsp[0] == 'T' or rsp[0] == 'S' or rsp[0] == 'W' or rsp[0] == 'X':
5911b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton            rsp_stop_reply (options, cmd, cmd_args, rsp)
592e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton            return
593e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        if rsp[0] == 'O':
594e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton            print "stdout: %s" % (rsp)
595e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton            return
596e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    else:
597e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        print "not supported (cmd = '%s', args = '%s', rsp = '%s')" % (cmd, cmd_args, rsp)
598e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton
5991b62f5967aa04ebde2ae163f12c739a6740596e2Greg Claytondef cmd_vAttach(options, cmd, args):
600e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    (extra_command, args) = string.split(args, ';')
601e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    if extra_command:
602e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        print "%s%s(%s)" % (cmd, extra_command, args)
603e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    else:
604e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        print "attach_pid(%s)" % args
605e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton
6061b62f5967aa04ebde2ae163f12c739a6740596e2Greg Claytondef cmd_qRegisterInfo(options, cmd, args):
607e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    print 'query_register_info(reg_num=%i)' % (int(args, 16))
608e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton
6091b62f5967aa04ebde2ae163f12c739a6740596e2Greg Claytondef rsp_qRegisterInfo(options, cmd, cmd_args, rsp):
610e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    global g_max_register_info_name_len
611e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    print 'query_register_info(reg_num=%i):' % (int(cmd_args, 16)),
612e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    if len(rsp) == 3 and rsp[0] == 'E':
613e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        g_max_register_info_name_len = 0
614e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        for reg_info in g_register_infos:
615e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton            name_len = len(reg_info.name())
616e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton            if g_max_register_info_name_len < name_len:
617e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton                g_max_register_info_name_len = name_len
618e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        print' DONE'
619e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    else:
620e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        packet = Packet(rsp)
621e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        reg_info = RegisterInfo(packet.get_key_value_pairs())
622e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        g_register_infos.append(reg_info)
623e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        print reg_info
624e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton
625e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton
6261b62f5967aa04ebde2ae163f12c739a6740596e2Greg Claytondef cmd_qThreadInfo(options, cmd, args):
627e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    if cmd == 'qfThreadInfo':
628e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        query_type = 'first'
629e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    else:
630e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        query_type = 'subsequent'
631e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    print 'get_current_thread_list(type=%s)' % (query_type)
632e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton
6331b62f5967aa04ebde2ae163f12c739a6740596e2Greg Claytondef rsp_qThreadInfo(options, cmd, cmd_args, rsp):
634e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    packet = Packet(rsp)
635e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    response_type = packet.get_char()
636e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    if response_type == 'm':
637e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        tids = packet.split_hex(';', 'big')
638e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        for i, tid in enumerate(tids):
639e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton            if i:
640e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton                print ',',
641e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton            print '0x%x' % (tid),
642e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        print
643e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    elif response_type == 'l':
644e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        print 'END'
645e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton
6461b62f5967aa04ebde2ae163f12c739a6740596e2Greg Claytondef rsp_hex_big_endian(options, cmd, cmd_args, rsp):
647e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    packet = Packet(rsp)
648e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    uval = packet.get_hex_uint('big')
649e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    print '%s: 0x%x' % (cmd, uval)
650e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton
6511b62f5967aa04ebde2ae163f12c739a6740596e2Greg Claytondef cmd_read_memory(options, cmd, args):
652e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    packet = Packet(args)
653e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    addr = packet.get_hex_uint('big')
654e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    comma = packet.get_char()
655e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    size = packet.get_hex_uint('big')
656e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    print 'read_memory (addr = 0x%x, size = %u)' % (addr, size)
657e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton
658e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Claytondef dump_hex_memory_buffer(addr, hex_byte_str):
659e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    packet = Packet(hex_byte_str)
660e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    idx = 0
661e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    ascii = ''
662e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    uval = packet.get_hex_uint8()
663e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    while uval != None:
664e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        if ((idx % 16) == 0):
665e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton            if ascii:
666e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton                print '  ', ascii
667e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton                ascii = ''
668e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton            print '0x%x:' % (addr + idx),
669e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        print '%2.2x' % (uval),
670e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        if 0x20 <= uval and uval < 0x7f:
671e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton            ascii += '%c' % uval
672e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        else:
673e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton            ascii += '.'
674e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        uval = packet.get_hex_uint8()
675e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        idx = idx + 1
676e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    if ascii:
677e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        print '  ', ascii
678e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        ascii = ''
679e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton
6801b62f5967aa04ebde2ae163f12c739a6740596e2Greg Claytondef cmd_write_memory(options, cmd, args):
681e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    packet = Packet(args)
682e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    addr = packet.get_hex_uint('big')
683e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    if packet.get_char() != ',':
684e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        print 'error: invalid write memory command (missing comma after address)'
685e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        return
686e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    size = packet.get_hex_uint('big')
687e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    if packet.get_char() != ':':
688e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        print 'error: invalid write memory command (missing colon after size)'
689e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        return
690e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    print 'write_memory (addr = 0x%x, size = %u, data:' % (addr, size)
691e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    dump_hex_memory_buffer (addr, packet.str)
692e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton
6931b62f5967aa04ebde2ae163f12c739a6740596e2Greg Claytondef cmd_alloc_memory(options, cmd, args):
694e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    packet = Packet(args)
695e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    byte_size = packet.get_hex_uint('big')
696e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    if packet.get_char() != ',':
697e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        print 'error: invalid allocate memory command (missing comma after address)'
698e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        return
699e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    print 'allocate_memory (byte-size = %u (0x%x), permissions = %s)' % (byte_size, byte_size, packet.str)
700e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton
7011b62f5967aa04ebde2ae163f12c739a6740596e2Greg Claytondef rsp_alloc_memory(options, cmd, cmd_args, rsp):
702e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    packet = Packet(rsp)
703e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    addr = packet.get_hex_uint('big')
704e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    print 'addr = 0x%x' % addr
705e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton
7061b62f5967aa04ebde2ae163f12c739a6740596e2Greg Claytondef cmd_dealloc_memory(options, cmd, args):
707e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    packet = Packet(args)
708e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    addr = packet.get_hex_uint('big')
709e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    if packet.get_char() != ',':
710e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        print 'error: invalid allocate memory command (missing comma after address)'
711e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        return
712e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    print 'deallocate_memory (addr = 0x%x, permissions = %s)' % (addr, packet.str)
713e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton
7141b62f5967aa04ebde2ae163f12c739a6740596e2Greg Claytondef rsp_memory_bytes(options, cmd, cmd_args, rsp):
715e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    addr = Packet(cmd_args).get_hex_uint('big')
716e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    dump_hex_memory_buffer (addr, rsp)
717e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton
7181b62f5967aa04ebde2ae163f12c739a6740596e2Greg Claytondef get_register_name_equal_value(options, reg_num, hex_value_str):
719e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    if reg_num < len(g_register_infos):
720e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        reg_info = g_register_infos[reg_num]
7211b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton        value_str = reg_info.get_value_from_hex_string (hex_value_str)
7221b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton        s = reg_info.name() + ' = '
7231b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton        if options.symbolicator:
7241b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton            symbolicated_addresses = options.symbolicator.symbolicate (int(value_str, 0))
7251b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton            if symbolicated_addresses:
7261b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton                s += options.colors.magenta()
7271b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton                s += '%s' % symbolicated_addresses[0]
7281b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton                s += options.colors.reset()
7291b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton                return s
7301b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton        s += value_str
7311b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton        return s
732e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    else:
733e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        reg_value = Packet(hex_value_str).get_hex_uint(g_byte_order)
734e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        return 'reg(%u) = 0x%x' % (reg_num, reg_value)
735e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton
7361b62f5967aa04ebde2ae163f12c739a6740596e2Greg Claytondef cmd_read_one_reg(options, cmd, args):
737e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    packet = Packet(args)
738e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    reg_num = packet.get_hex_uint('big')
739e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    tid = get_thread_from_thread_suffix (packet.str)
740e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    name = None
741e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    if reg_num < len(g_register_infos):
742e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        name = g_register_infos[reg_num].name ()
743e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    if packet.str:
744e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        packet.get_char() # skip ;
745e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        thread_info = packet.get_key_value_pairs()
746e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        tid = int(thread_info[0][1], 16)
747e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    s = 'read_register (reg_num=%u' % reg_num
748e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    if name:
749e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        s += ' (%s)' % (name)
750e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    if tid != None:
751e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        s += ', tid = 0x%4.4x' % (tid)
752e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    s += ')'
753e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    print s
754e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton
7551b62f5967aa04ebde2ae163f12c739a6740596e2Greg Claytondef rsp_read_one_reg(options, cmd, cmd_args, rsp):
756e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    packet = Packet(cmd_args)
757e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    reg_num = packet.get_hex_uint('big')
7581b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton    print get_register_name_equal_value (options, reg_num, rsp)
759e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton
7601b62f5967aa04ebde2ae163f12c739a6740596e2Greg Claytondef cmd_write_one_reg(options, cmd, args):
761e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    packet = Packet(args)
762e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    reg_num = packet.get_hex_uint('big')
763e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    if packet.get_char() != '=':
764e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        print 'error: invalid register write packet'
765e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    else:
766e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        name = None
767e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        hex_value_str = packet.get_hex_chars()
768e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        tid = get_thread_from_thread_suffix (packet.str)
769e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        s = 'write_register (reg_num=%u' % reg_num
770e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        if name:
771e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton            s += ' (%s)' % (name)
772e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        s += ', value = '
7731b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton        s += get_register_name_equal_value(options, reg_num, hex_value_str)
774e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        if tid != None:
775e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton            s += ', tid = 0x%4.4x' % (tid)
776e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        s += ')'
777e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        print s
778e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton
779e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Claytondef dump_all_regs(packet):
780e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    for reg_info in g_register_infos:
781e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        nibble_size = reg_info.bit_size() / 4
782e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        hex_value_str = packet.get_hex_chars(nibble_size)
783e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        if hex_value_str != None:
784e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton            value = reg_info.get_value_from_hex_string (hex_value_str)
785e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton            print '%*s = %s' % (g_max_register_info_name_len, reg_info.name(), value)
786e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        else:
787e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton            return
788e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton
789e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Claytondef cmd_read_all_regs(cmd, cmd_args):
790e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    packet = Packet(cmd_args)
791e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    packet.get_char() # toss the 'g' command character
792e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    tid = get_thread_from_thread_suffix (packet.str)
793e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    if tid != None:
794e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        print 'read_all_register(thread = 0x%4.4x)' % tid
795e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    else:
796e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        print 'read_all_register()'
797e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton
7981b62f5967aa04ebde2ae163f12c739a6740596e2Greg Claytondef rsp_read_all_regs(options, cmd, cmd_args, rsp):
799e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    packet = Packet(rsp)
800e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    dump_all_regs (packet)
801e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton
8021b62f5967aa04ebde2ae163f12c739a6740596e2Greg Claytondef cmd_write_all_regs(options, cmd, args):
803e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    packet = Packet(args)
804e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    print 'write_all_registers()'
805e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    dump_all_regs (packet)
806e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton
807e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Claytong_bp_types = [ "software_bp", "hardware_bp", "write_wp", "read_wp", "access_wp" ]
808e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton
8091b62f5967aa04ebde2ae163f12c739a6740596e2Greg Claytondef cmd_bp(options, cmd, args):
810e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    if cmd == 'Z':
811e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        s = 'set_'
812e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    else:
813e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        s = 'clear_'
814e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    packet = Packet (args)
815e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    bp_type = packet.get_hex_uint('big')
816e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    packet.get_char() # Skip ,
817e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    bp_addr = packet.get_hex_uint('big')
818e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    packet.get_char() # Skip ,
819e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    bp_size = packet.get_hex_uint('big')
820e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    s += g_bp_types[bp_type]
821e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    s += " (addr = 0x%x, size = %u)" % (bp_addr, bp_size)
822e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    print s
823e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton
8241b62f5967aa04ebde2ae163f12c739a6740596e2Greg Claytondef cmd_mem_rgn_info(options, cmd, args):
825e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    packet = Packet(args)
826e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    packet.get_char() # skip ':' character
827e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    addr = packet.get_hex_uint('big')
828e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    print 'get_memory_region_info (addr=0x%x)' % (addr)
829e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton
8301b62f5967aa04ebde2ae163f12c739a6740596e2Greg Claytondef cmd_kill(options, cmd, args):
831e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    print 'kill_process()'
832e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton
833e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Claytongdb_remote_commands = {
834e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    '\\?'                     : { 'cmd' : cmd_stop_reply    , 'rsp' : rsp_stop_reply          , 'name' : "stop reply pacpket"},
835e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    'QStartNoAckMode'         : { 'cmd' : cmd_query_packet  , 'rsp' : rsp_ok_means_supported  , 'name' : "query if no ack mode is supported"},
836e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    'QThreadSuffixSupported'  : { 'cmd' : cmd_query_packet  , 'rsp' : rsp_ok_means_supported  , 'name' : "query if thread suffix is supported" },
837e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    'QListThreadsInStopReply' : { 'cmd' : cmd_query_packet  , 'rsp' : rsp_ok_means_supported  , 'name' : "query if threads in stop reply packets are supported" },
838a809180cc9528dff68ecea61ab21695d383dea82Greg Clayton    'qVAttachOrWaitSupported' : { 'cmd' : cmd_query_packet  , 'rsp' : rsp_ok_means_supported  , 'name' : "query if threads attach with optional wait is supported" },
839e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    'qHostInfo'               : { 'cmd' : cmd_query_packet  , 'rsp' : rsp_dump_key_value_pairs, 'name' : "get host information" },
840e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    'vCont'                   : { 'cmd' : cmd_vCont         , 'rsp' : rsp_vCont               , 'name' : "extended continue command" },
841e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    'vAttach'                 : { 'cmd' : cmd_vAttach       , 'rsp' : rsp_stop_reply          , 'name' : "attach to process" },
842e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    'qRegisterInfo'           : { 'cmd' : cmd_qRegisterInfo , 'rsp' : rsp_qRegisterInfo       , 'name' : "query register info" },
843e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    'qfThreadInfo'            : { 'cmd' : cmd_qThreadInfo   , 'rsp' : rsp_qThreadInfo         , 'name' : "get current thread list" },
844e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    'qsThreadInfo'            : { 'cmd' : cmd_qThreadInfo   , 'rsp' : rsp_qThreadInfo         , 'name' : "get current thread list" },
845e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    'qShlibInfoAddr'          : { 'cmd' : cmd_query_packet  , 'rsp' : rsp_hex_big_endian      , 'name' : "get shared library info address" },
846e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    'qMemoryRegionInfo'       : { 'cmd' : cmd_mem_rgn_info  , 'rsp' : rsp_dump_key_value_pairs, 'name' : "get memory region information" },
847e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    'm'                       : { 'cmd' : cmd_read_memory   , 'rsp' : rsp_memory_bytes        , 'name' : "read memory" },
848e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    'M'                       : { 'cmd' : cmd_write_memory  , 'rsp' : rsp_ok_means_success    , 'name' : "write memory" },
849e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    '_M'                      : { 'cmd' : cmd_alloc_memory  , 'rsp' : rsp_alloc_memory        , 'name' : "allocate memory" },
850e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    '_m'                      : { 'cmd' : cmd_dealloc_memory, 'rsp' : rsp_ok_means_success    , 'name' : "deallocate memory" },
851e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    'p'                       : { 'cmd' : cmd_read_one_reg  , 'rsp' : rsp_read_one_reg        , 'name' : "read single register" },
852e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    'P'                       : { 'cmd' : cmd_write_one_reg , 'rsp' : rsp_ok_means_success    , 'name' : "write single register" },
853e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    'g'                       : { 'cmd' : cmd_read_all_regs , 'rsp' : rsp_read_all_regs       , 'name' : "read all registers" },
854e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    'G'                       : { 'cmd' : cmd_write_all_regs, 'rsp' : rsp_ok_means_success    , 'name' : "write all registers" },
855e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    'z'                       : { 'cmd' : cmd_bp            , 'rsp' : rsp_ok_means_success    , 'name' : "clear breakpoint or watchpoint" },
856e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    'Z'                       : { 'cmd' : cmd_bp            , 'rsp' : rsp_ok_means_success    , 'name' : "set breakpoint or watchpoint" },
857e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    'k'                       : { 'cmd' : cmd_kill          , 'rsp' : rsp_stop_reply          , 'name' : "kill process" },
858e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton}
85947fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Claytondef parse_gdb_log_file(file, options):
86047fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton    '''Parse a GDB log file that was generated by enabling logging with:
86147fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton    (lldb) log enable --threadsafe --timestamp --file <FILE> gdb-remote packets
86247fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton    This log file will contain timestamps and this fucntion will then normalize
86347fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton    those packets to be relative to the first value timestamp that is found and
86447fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton    show delta times between log lines and also keep track of how long it takes
86547fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton    for GDB remote commands to make a send/receive round trip. This can be
86647fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton    handy when trying to figure out why some operation in the debugger is taking
86747fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton    a long time during a preset set of debugger commands.'''
86847fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton
86947fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton    tricky_commands = [ 'qRegisterInfo' ]
87047fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton    timestamp_regex = re.compile('(\s*)([1-9][0-9]+\.[0-9]+)([^0-9].*)$')
87147fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton    packet_name_regex = re.compile('([A-Za-z_]+)[^a-z]')
872e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    packet_transmit_name_regex = re.compile('(?P<direction>send|read) packet: (?P<packet>.*)')
873e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    packet_contents_name_regex = re.compile('\$([^#]+)#[0-9a-fA-F]{2}')
874e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    packet_names_regex_str = '(' + '|'.join(gdb_remote_commands.keys()) + ')(.*)';
875e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    packet_names_regex = re.compile(packet_names_regex_str);
876e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton
87747fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton    base_time = 0.0
87847fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton    last_time = 0.0
87947fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton    packet_send_time = 0.0
88047fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton    packet_total_times = {}
88177ce90bc96f26ee707ae3ef3ba62099a7c3dc8fdJim Ingham    packet_count = {}
88247fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton    file = open(file)
88347fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton    lines = file.read().splitlines()
884e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    last_command = None
885e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    last_command_args = None
886e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    last_command_packet = None
88747fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton    for line in lines:
8881b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton        packet_name = None
889e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        m = packet_transmit_name_regex.search(line)
8901b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton        is_command = False
891e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        if m:
892e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton            direction = m.group('direction')
893e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton            is_command = direction == 'send'
894e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton            packet = m.group('packet')
8951b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton            sys.stdout.write(options.colors.green())
896e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton            if options.quiet:
897e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton                if is_command:
898e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton                    print '-->', packet
899e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton                else:
900e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton                    print '<--', packet
901e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton            else:
902e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton                print '#  ', line
9031b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton            sys.stdout.write(options.colors.reset())
904e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton
905e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton            #print 'direction = "%s", packet = "%s"' % (direction, packet)
906e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton
907e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton            if packet[0] == '+':
908e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton                print 'ACK'
909e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton            elif packet[0] == '-':
910e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton                print 'NACK'
911e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton            elif packet[0] == '$':
912e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton                m = packet_contents_name_regex.match(packet)
913e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton                if m:
914e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton                    contents = m.group(1)
915e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton                    if is_command:
916e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton                        m = packet_names_regex.match (contents)
917e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton                        if m:
918e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton                            last_command = m.group(1)
9191b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton                            packet_name = last_command
920e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton                            last_command_args = m.group(2)
921e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton                            last_command_packet = contents
9221b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton                            gdb_remote_commands[last_command]['cmd'](options, last_command, last_command_args)
923e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton                        else:
9241b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton                            packet_match = packet_name_regex.match (line[idx+14:])
9251b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton                            if packet_match:
9261b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton                                packet_name = packet_match.group(1)
9271b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton                                for tricky_cmd in tricky_commands:
9281b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton                                    if packet_name.find (tricky_cmd) == 0:
9291b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton                                        packet_name = tricky_cmd
9301b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton                            else:
9311b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton                                packet_name = contents
932e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton                            last_command = None
933e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton                            last_command_args = None
934e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton                            last_command_packet = None
935e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton                    elif last_command:
9361b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton                        gdb_remote_commands[last_command]['rsp'](options, last_command, last_command_args, contents)
937e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton                else:
938e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton                    print 'error: invalid packet: "', packet, '"'
939e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton            else:
940e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton                print '???'
941e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        else:
942e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton            print '## ', line
94347fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton        match = timestamp_regex.match (line)
94447fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton        if match:
94547fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton            curr_time = float (match.group(2))
94647fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton            delta = 0.0
94747fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton            if base_time:
94847fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton                delta = curr_time - last_time
94947fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton            else:
95047fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton                base_time = curr_time
9511b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton
9521b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton            if is_command:
95347fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton                packet_send_time = curr_time
95447fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton            elif line.find('read packet: $') >= 0 and packet_name:
95547fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton                if packet_name in packet_total_times:
95647fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton                    packet_total_times[packet_name] += delta
95777ce90bc96f26ee707ae3ef3ba62099a7c3dc8fdJim Ingham                    packet_count[packet_name] += 1
95847fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton                else:
95947fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton                    packet_total_times[packet_name] = delta
96077ce90bc96f26ee707ae3ef3ba62099a7c3dc8fdJim Ingham                    packet_count[packet_name] = 1
96147fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton                packet_name = None
96247fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton
96347fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton            if not options or not options.quiet:
96447fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton                print '%s%.6f %+.6f%s' % (match.group(1), curr_time - base_time, delta, match.group(3))
96547fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton            last_time = curr_time
966e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        # else:
967e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        #     print line
96847fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton    if packet_total_times:
96947fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton        total_packet_time = 0.0
97077ce90bc96f26ee707ae3ef3ba62099a7c3dc8fdJim Ingham        total_packet_count = 0
97147fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton        for key, vvv in packet_total_times.items():
97247fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton            # print '  key = (%s) "%s"' % (type(key), key)
97347fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton            # print 'value = (%s) %s' % (type(vvv), vvv)
97447fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton            # if type(vvv) == 'float':
97547fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton            total_packet_time += vvv
97677ce90bc96f26ee707ae3ef3ba62099a7c3dc8fdJim Ingham        for key, vvv in packet_count.items():
97777ce90bc96f26ee707ae3ef3ba62099a7c3dc8fdJim Ingham            total_packet_count += vvv
97877ce90bc96f26ee707ae3ef3ba62099a7c3dc8fdJim Ingham
97977ce90bc96f26ee707ae3ef3ba62099a7c3dc8fdJim Ingham        print '#---------------------------------------------------'
98047fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton        print '# Packet timing summary:'
98177ce90bc96f26ee707ae3ef3ba62099a7c3dc8fdJim Ingham        print '# Totals: time - %6f count %6d' % (total_packet_time, total_packet_count)
98277ce90bc96f26ee707ae3ef3ba62099a7c3dc8fdJim Ingham        print '#---------------------------------------------------'
98377ce90bc96f26ee707ae3ef3ba62099a7c3dc8fdJim Ingham        print '# Packet                   Time (sec) Percent Count '
98477ce90bc96f26ee707ae3ef3ba62099a7c3dc8fdJim Ingham        print '#------------------------- ---------- ------- ------'
98577ce90bc96f26ee707ae3ef3ba62099a7c3dc8fdJim Ingham        if options and options.sort_count:
98677ce90bc96f26ee707ae3ef3ba62099a7c3dc8fdJim Ingham            res = sorted(packet_count, key=packet_count.__getitem__, reverse=True)
98777ce90bc96f26ee707ae3ef3ba62099a7c3dc8fdJim Ingham        else:
98877ce90bc96f26ee707ae3ef3ba62099a7c3dc8fdJim Ingham            res = sorted(packet_total_times, key=packet_total_times.__getitem__, reverse=True)
98977ce90bc96f26ee707ae3ef3ba62099a7c3dc8fdJim Ingham
99047fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton        if last_time > 0.0:
99147fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton            for item in res:
99247fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton                packet_total_time = packet_total_times[item]
99347fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton                packet_percent = (packet_total_time / total_packet_time)*100.0
99447fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton                if packet_percent >= 10.0:
99577ce90bc96f26ee707ae3ef3ba62099a7c3dc8fdJim Ingham                    print "  %24s %.6f   %.2f%% %6d" % (item, packet_total_time, packet_percent, packet_count[item])
99647fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton                else:
99777ce90bc96f26ee707ae3ef3ba62099a7c3dc8fdJim Ingham                    print "  %24s %.6f   %.2f%%  %6d" % (item, packet_total_time, packet_percent, packet_count[item])
99847fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton
99947fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton
100047fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton
100147fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Claytonif __name__ == '__main__':
1002e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    usage = "usage: gdbremote [options]"
1003e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    description='''The command disassembles a GDB remote packet log.'''
1004e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    parser = optparse.OptionParser(description=description, prog='gdbremote',usage=usage)
1005e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    parser.add_option('-v', '--verbose', action='store_true', dest='verbose', help='display verbose debug info', default=False)
1006e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    parser.add_option('-q', '--quiet', action='store_true', dest='quiet', help='display verbose debug info', default=False)
1007e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    parser.add_option('-C', '--color', action='store_true', dest='color', help='add terminal colors', default=False)
1008e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    parser.add_option('-c', '--sort-by-count', action='store_true', dest='sort_count', help='display verbose debug info', default=False)
10091b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton    parser.add_option('--crashlog', type='string', dest='crashlog', help='symbolicate using a darwin crash log file', default=False)
1010e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    try:
1011e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        (options, args) = parser.parse_args(sys.argv[1:])
1012e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    except:
1013e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        print 'error: argument error'
1014e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        sys.exit(1)
1015e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton
10161b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton    options.colors = TerminalColors(options.color)
10171b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton    options.symbolicator = None
10181b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton    if options.crashlog:
10191b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton        import lldb
10201b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton        lldb.debugger = lldb.SBDebugger.Create()
10211b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton        import lldb.macosx.crashlog
10221b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton        options.symbolicator = lldb.macosx.crashlog.CrashLog(options.crashlog)
10231b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton        print '%s' % (options.symbolicator)
1024e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton
102547fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton    # This script is being run from the command line, create a debugger in case we are
102647fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton    # going to use any debugger functions in our function.
1027e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton    for file in args:
102847fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton        print '#----------------------------------------------------------------------'
102947fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton        print "# GDB remote log file: '%s'" % file
103047fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton        print '#----------------------------------------------------------------------'
1031e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton        parse_gdb_log_file (file, options)
10321b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton    if options.symbolicator:
10331b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton        print '%s' % (options.symbolicator)
10341b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton
103547fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Claytonelse:
103647fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton    import lldb
103747fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton    if lldb.debugger:
103847fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton        # This initializer is being run from LLDB in the embedded command interpreter
103947fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton        # Add any commands contained in this module to LLDB
104047fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton        lldb.debugger.HandleCommand('command script add -f gdbremote.start_gdb_log start_gdb_log')
104147fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton        lldb.debugger.HandleCommand('command script add -f gdbremote.stop_gdb_log stop_gdb_log')
104247fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton        print 'The "start_gdb_log" and "stop_gdb_log" commands are now installed and ready for use, type "start_gdb_log --help" or "stop_gdb_log --help" for more information'
1043