summaryrefslogtreecommitdiff
path: root/tools/gdb/python/rtems.py
diff options
context:
space:
mode:
Diffstat (limited to 'tools/gdb/python/rtems.py')
-rw-r--r--tools/gdb/python/rtems.py306
1 files changed, 306 insertions, 0 deletions
diff --git a/tools/gdb/python/rtems.py b/tools/gdb/python/rtems.py
new file mode 100644
index 0000000..534cb0d
--- /dev/null
+++ b/tools/gdb/python/rtems.py
@@ -0,0 +1,306 @@
+# RTEMS Tools Project (http://www.rtems.org/)
+# Copyright 2010-2014 Chris Johns (chrisj@rtems.org)
+# All rights reserved.
+#
+# This file is part of the RTEMS Tools package in 'rtems-tools'.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are met:
+#
+# 1. Redistributions of source code must retain the above copyright notice,
+# this list of conditions and the following disclaimer.
+#
+# 2. Redistributions in binary form must reproduce the above copyright notice,
+# this list of conditions and the following disclaimer in the documentation
+# and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+# POSSIBILITY OF SUCH DAMAGE.
+#
+
+#
+# RTEMS Pretty Printers
+#
+
+import gdb
+import re
+
+import objects
+import threads
+import chains
+import watchdog
+import supercore
+import classic
+
+
+class rtems(gdb.Command):
+ """Prefix command for RTEMS."""
+
+ def __init__(self):
+ super(rtems, self).__init__('rtems',
+ gdb.COMMAND_STATUS,
+ gdb.COMPLETE_NONE,
+ True)
+
+class rtems_object(gdb.Command):
+ """Object sub-command for RTEMS"""
+
+ objects = {
+ 'classic/semaphores': lambda obj: classic.semaphore(obj),
+ 'classic/tasks': lambda obj: classic.task(obj),
+ 'classic/message_queues': lambda obj: classic.message_queue(obj),
+ 'classic/timers' : lambda obj: classic.timer(obj),
+ 'classic/partitions' : lambda obj: classic.partition(obj),
+ 'classic/regions' : lambda obj: classic.region(obj),
+ 'classic/barriers' : lambda obj: classic.barrier(obj)
+ }
+
+ def __init__(self):
+ self.__doc__ = 'Display the RTEMS object given a numeric ID' \
+ '(Or a reference to the object).'
+ super(rtems_object, self).__init__('rtems object',
+ gdb.COMMAND_DATA,
+ gdb.COMPLETE_SYMBOL)
+
+ def invoke(self, arg, from_tty):
+ for num in arg.split():
+ try:
+ val = gdb.parse_and_eval(num)
+ num = int(val)
+ except:
+ print 'error: "%s" is not a number' % (num)
+ return
+ id = objects.ident(num)
+ if not id.valid():
+ print 'Invalid object id'
+ return
+
+ print 'API:%s Class:%s Node:%d Index:%d Id:%08X' % \
+ (id.api(), id._class(), id.node(), id.index(), id.value())
+ objectname = id.api() + '/' + id._class()
+
+ obj = objects.information.object(id).dereference()
+ if objectname in self.objects:
+ object = self.objects[objectname](obj)
+ object.show(from_tty)
+ objects.information.invalidate()
+
+class rtems_index(gdb.Command):
+ '''Print object by index'''
+
+ api = 'classic'
+ _class = ''
+
+ def __init__(self,command):
+ super(rtems_index, self).__init__( command,
+ gdb.COMMAND_DATA,
+ gdb.COMPLETE_NONE)
+
+ def instance(self, obj):
+ '''Returns a n instance of corresponding object, the child should extend
+ this'''
+ return obj
+
+ def invoke(self, arg, from_tty):
+ maximum = objects.information.maximum(self.api, self._class)
+ minimum_id = objects.ident(objects.information.minimum_id(self.api, self._class))
+ maximum_id = objects.ident(objects.information.minimum_id(self.api, self._class))
+ args = arg.split()
+ if len(args):
+ for val in args:
+ try:
+ index = int(val, base = 0)
+ if index < maximum:
+ if index < minimum_id.index():
+ print "error: %s is not an index (min is %d)" % (val,
+ minimum_id.index())
+ return
+ else:
+ index = objects.ident(index).index()
+ except ValueError:
+ print "error: %s is not an index" % (val)
+ return
+ try:
+ obj = objects.information.object_return(self.api,
+ self._class,
+ index)
+ except IndexError:
+ print "error: index %s is invalid" % (index)
+ return
+ instance = self.instance(obj)
+ instance.show(from_tty)
+ objects.information.invalidate()
+ else:
+ print '-' * 70
+ print ' %s: %d [%08x -> %08x]' % (objects.information.name(self.api, self._class),
+ maximum, minimum_id.value(), maximum_id.value())
+ for index in range(minimum_id.index(), minimum_id.index() + maximum):
+ print '-' * 70
+ self.invoke(str(index), from_tty)
+
+class rtems_semaphore(rtems_index):
+ '''semaphore subcommand'''
+ _class = 'semaphores'
+
+ def __init__(self):
+ self.__doc__ = 'Display RTEMS semaphore(s) by index(es)'
+ super(rtems_semaphore, self).__init__('rtems semaphore')
+
+ def instance(self, obj):
+ return classic.semaphore(obj)
+
+class rtems_task(rtems_index):
+ '''tasks subcommand for rtems'''
+
+ _class = 'tasks'
+
+ def __init__(self):
+ self.__doc__ = 'Display RTEMS task(s) by index(es)'
+ super(rtems_task,self).__init__('rtems task')
+
+ def instance(self, obj):
+ return classic.task(obj)
+
+class rtems_message_queue(rtems_index):
+ '''Message Queue subcommand'''
+
+ _class = 'message_queues'
+
+ def __init__(self):
+ self.__doc__ = 'Display RTEMS message_queue(s) by index(es)'
+ super(rtems_message_queue,self).__init__('rtems mqueue')
+
+ def instance(self, obj):
+ return classic.message_queue(obj)
+
+class rtems_timer(rtems_index):
+ '''Index subcommand'''
+
+ _class = 'timers'
+
+ def __init__(self):
+ self.__doc__ = 'Display RTEMS timer(s) by index(es)'
+ super(rtems_timer, self).__init__('rtems timer')
+
+ def instance(self, obj):
+ return classic.timer(obj)
+
+class rtems_partition(rtems_index):
+ '''Partition subcommand'''
+
+ _class = 'partitions'
+
+ def __init__(self):
+ self.__doc__ = 'Display RTEMS partition(s) by index(es)'
+ super(rtems_partition, self).__init__('rtems partition')
+
+ def instance(self, obj):
+ return classic.partition(obj)
+
+class rtems_region(rtems_index):
+ '''Region subcomamnd'''
+
+ _class = 'regions'
+
+ def __init__(self):
+ self.__doc__ = 'Display RTEMS region(s) by index(es)'
+ super(rtems_region , self).__init__('rtems regions')
+
+ def instance(self, obj):
+ return classic.region(obj)
+
+class rtems_barrier(rtems_index):
+ '''Barrier subcommand'''
+
+ _class = 'barriers'
+
+ def __init__(self):
+ self.__doc__ = 'Display RTEMS barrier(s) by index(es)'
+ super(rtems_barrier , self).__init__('rtems barrier')
+
+ def instance(self, obj):
+ return classic.barrier(obj)
+
+class rtems_tod(gdb.Command):
+ '''Print rtems time of day'''
+
+ api = 'internal'
+ _class = 'time'
+
+ def __init__(self):
+ self.__doc__ = 'Display RTEMS time of day'
+ super(rtems_tod, self).__init__ \
+ ('rtems tod', gdb.COMMAND_STATUS,gdb.COMPLETE_NONE)
+
+ def invoke(self, arg, from_tty):
+
+ if arg:
+ print "warning: commad takes no arguments!"
+
+ obj = objects.information.object_return(self.api,self._class)
+ instance = supercore.time_of_day(obj)
+ instance.show()
+ objects.information.invalidate()
+
+class rtems_watchdog_chain(gdb.Command):
+ '''Print watchdog ticks chain'''
+
+ api = 'internal'
+ _class = ''
+
+ def __init__(self,command):
+ super(rtems_watchdog_chain, self).__init__ \
+ (command, gdb.COMMAND_DATA, gdb.COMPLETE_NONE)
+
+ def invoke(self, arg, from_tty):
+ obj = objects.information.object_return(self.api, self._class)
+
+ inst = chains.control(obj)
+
+ if inst.empty():
+ print ' error: empty chain'
+ return
+
+ nd = inst.first()
+ i = 0
+ while not nd.null():
+ wd = watchdog.control(nd.cast('Watchdog_Control'))
+ print ' #'+str(i)
+ print wd.to_string()
+ nd.next()
+ i += 1
+
+class rtems_wdt(rtems_watchdog_chain):
+
+ _class = 'wdticks'
+
+ def __init__(self):
+ self.__doc__ = 'Display watchdog ticks chain'
+ super(rtems_wdt, self).__init__('rtems wdticks')
+
+class rtems_wsec(rtems_watchdog_chain):
+
+ _class = 'wdseconds'
+
+ def __init__(self):
+ self.__doc__ = 'Display watchdog seconds chain'
+ super(rtems_wsec, self).__init__('rtems wdseconds')
+
+def create():
+ return (rtems(),
+ rtems_object(),
+ rtems_semaphore(),
+ rtems_task(),
+ rtems_message_queue(),
+ rtems_tod(),
+ rtems_wdt(),
+ rtems_wsec())