summaryrefslogblamecommitdiffstats
path: root/tools/gdb/python/rtems.py
blob: 6c987cf7b35db27906604b034444817dc2ada329 (plain) (tree)
1
2
3
4
5
6
7
8
9
10
11
12











                                               
             
               
                

              













                                                       






                                                                         


                       

                                                                              
                                                          

                                                               











                                                           

                      


                                                                          

                                                              
                                          
                                                      

                                        
 

                               

                   
               
 







                                                                                        







                                                         






                                                                              
 
                                         


                                        












                                                                

                                    


                       

                                                           
 

                                
 
 
                                       

                                  


                             

                                                                    
 

                                         
 















































                                                                



















                                                                       




















                                                                              
             

                                                              



                                








                                                        







                                                           
#
# RTEMS Pretty Printers
# Copyright 2010 Chris Johns (chrisj@rtems.org)
#
# $Id$
#

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 rtems_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):
        for val in arg.split():
            try:
                index = int(val)
            except ValueError:
                print "error: %s is not an index" % (val)
                return
            try:
                obj = objects.information.object_return( self.api,
                                                         self._class,
                                                         index ).dereference()
            except IndexError:
                print "error: index %s is invalid" % (index)
                return

            instance = self.instance(obj)
            instance.show(from_tty)
        objects.information.invalidate()


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')