Changeset b117be8 in rtems-tools


Ignore:
Timestamp:
Mar 17, 2015, 2:11:57 AM (5 years ago)
Author:
Chris Johns <chrisj@…>
Branches:
4.10, 4.11, e9f48e9face6c4dea62712d73b35412c0fe10332
Children:
dfc5994
Parents:
a30ec56
git-author:
Chris Johns <chrisj@…> (03/17/15 02:11:57)
git-committer:
Chris Johns <chrisj@…> (03/17/15 02:12:15)
Message:

gdb/python: Update the support to a recent RTEMS.

Location:
tools/gdb/python
Files:
3 added
4 edited

Legend:

Unmodified
Added
Removed
  • tools/gdb/python/chains.py

    ra30ec56 rb117be8  
    3838
    3939    def __init__(self, node_val):
    40         self.node_val = node_val
     40        if node_val:
     41            if node_val.type.code == gdb.TYPE_CODE_PTR:
     42                self.reference = node_val
     43                self.node_val = node_val.dereference()
     44            else:
     45                self.node_val = node_val
     46                self.reference = node_val.address
     47        else:
     48            self.node_val = node_val
     49
     50    def __str__(self):
     51        return self.to_string()
    4152
    4253    def null(self):
     
    4758    def next(self):
    4859        if not self.null():
    49             self.node_val = self.node_val['next']
     60            return self.node_val['next']
    5061
    5162    def previous(self):
    5263        if not self.null():
    53             self.node_val = self.node_val['previous']
     64            return self.node_val['previous']
    5465
    5566    def cast(self, typename):
     
    6071
    6172    def to_string(self):
    62         return self.node_val['next'] + "Prev: "+self.node_val['previous']
     73        if self.null():
     74            return 'NULL'
     75        return 'Node:%s Next:%s Prev:%s' % (self.reference,
     76                                            self.node_val['next'],
     77                                            self.node_val['previous'])
    6378
    6479class control:
     
    6681
    6782    def __init__(self, ctrl):
    68         self.ctrl = ctrl
     83        if ctrl.type.code == gdb.TYPE_CODE_PTR:
     84            self.reference = ctrl
     85            self.ctrl = ctrl.dereference()
     86        else:
     87            self.ctrl = ctrl
     88            self.reference = ctrl.address
    6989
    7090    def first(self):
     
    7292        return t
    7393
    74     def last(self):
     94    def tail(self):
    7595        return node(self.ctrl['Tail']['Node'])
    7696
    7797    def empty(self):
    78         if self.last() == self.first().next():
     98        if self.tail().previous() == self.reference:
    7999            return True
     100        return False
  • tools/gdb/python/classic.py

    ra30ec56 rb117be8  
    3838import helper
    3939
     40import heaps
     41import mutex
    4042import objects
     43import supercore
    4144import threads
    4245import watchdog
    43 import heaps
    44 import supercore
    4546
    4647class attribute:
     
    112113    #ToDo: Move this out
    113114    def to_string(self):
    114         s = '0x%08x,' % (self.attr)
     115        s = '(0x%08x) ' % (self.attr)
    115116        if self.attrtype != 'none':
    116117            for m in self.groups[self.attrtype]:
     
    136137
    137138    def __init__(self, obj):
    138         self.reference = obj
    139         self.object = obj.dereference()
     139        if obj.type.code == gdb.TYPE_CODE_PTR:
     140            self.reference = obj
     141            self.object = obj.dereference()
     142        else:
     143            self.object = obj
     144            self.reference = obj.address
    140145        self.object_control = objects.control(self.object['Object'])
    141146        self.attr = attribute(self.object['attribute_set'], 'semaphore')
    142147
    143148    def show(self, from_tty):
    144         print '     Name:', self.object_control.name()
    145         print '     Attr:', self.attr.to_string()
    146         if self.attr.test('semaphore-type', 'bin-sema') or \
    147                 self.attr.test('semaphore-type', 'simple-bin-sema'):
    148             core_mutex = self.object['Core_control']['mutex']
    149             locked = core_mutex['lock'] == 0
    150             if locked:
    151                 s = 'locked'
    152             else:
    153                 s = 'unlocked'
    154             print '     Lock:', s
    155             print '  Nesting:', core_mutex['nest_count']
    156             print '  Blocked:', core_mutex['blocked_count']
    157             print '   Holder:',
    158             holder = core_mutex['holder']
    159             if holder and locked:
    160                 holder = threads.control(holder.dereference())
    161                 print holder.brief()
    162             elif holder == 0 and locked:
    163                 print 'locked but no holder'
    164             else:
    165                 print 'unlocked'
    166             wait_queue = threads.queue(core_mutex['Wait_queue'])
    167             tasks = wait_queue.tasks()
    168             print '    Queue: len = %d, state = %s' % (len(tasks),
    169                                                        wait_queue.state())
    170             print '    Tasks:'
    171             print '    Name (c:current, r:real), (id)'
    172             for t in range(0, len(tasks)):
    173                 print '      ', tasks[t].brief(), ' (%08x)' % (tasks[t].id())
    174         else:
    175             print 'semaphore'
     149        if self.object_control.id() != 0:
     150            print '     Name:', self.object_control.name()
     151            print '       Id: 0x%08x (@ 0x%08x)' % (self.object_control.id(),
     152                                                   self.reference)
     153            print '     Attr:', self.attr.to_string()
     154            if self.attr.test('semaphore-type', 'bin-sema') or \
     155               self.attr.test('semaphore-type', 'simple-bin-sema'):
     156                core_mutex = mutex.control(self.object['Core_control']['mutex'])
     157                print '  Nesting:', core_mutex.nest_count()
     158                print '   Holder:',
     159                holder = core_mutex.holder()
     160                if holder:
     161                    print '%s (id 0x%08x)' % (holder.brief(), holder.id())
     162                else:
     163                    print 'no holder (unlocked)'
     164                wait_queue = core_mutex.wait_queue()
     165                tasks = wait_queue.tasks()
     166                print '    Queue: len = %d, state = %s' % (len(tasks),
     167                                                           wait_queue.state())
     168                if len(tasks) > 0:
     169                    print '    Tasks:'
     170                    print '    Name (c:current, r:real), (id)'
     171                    for t in range(0, len(tasks)):
     172                        print '      ', tasks[t].brief(), ' (%08x)' % (tasks[t].id())
     173                return True
     174        return False
    176175
    177176class task:
     
    187186
    188187    def show(self, from_tty):
    189         cpu = self.task.executing()
    190         if cpu == -1:
    191             cpu = 'not executing'
    192         print '         Id:', '0x%08x' % (self.task.id())
    193         print '       Name:', self.task.name()
    194         print ' Active CPU:', cpu
    195         print '      State:', self.task.current_state()
    196         print '    Current:', self.task.current_priority()
    197         print '       Real:', self.task.real_priority()
    198         print '    Preempt:', self.task.preemptible()
    199         print '   T Budget:', self.task.cpu_time_budget()
    200         print '       Time:', self.task.cpu_time_used()
    201         print '  Resources:', self.task.resource_count()
    202         print '  Regsters:'
    203         for name in self.regs.names():
    204             val = self.regs.get(name)
    205             print '    %20s: %08x (%d)' % (name, val, val)
     188        if self.task.id() != 0:
     189            cpu = self.task.executing()
     190            if cpu == -1:
     191                cpu = 'not executing'
     192            print '         Id:', '0x%08x (@ 0x%08x)' % (self.task.id(),
     193                                                         self.task.reference)
     194            print '       Name:', self.task.name()
     195            print ' Active CPU:', cpu
     196            print '      State:', self.task.current_state()
     197            print '    Current:', self.task.current_priority()
     198            print '       Real:', self.task.real_priority()
     199            print '    Preempt:', self.task.preemptible()
     200            print '   T Budget:', self.task.cpu_time_budget()
     201            print '       Time:', self.task.cpu_time_used()
     202            print '  Resources:', self.task.resource_count()
     203            print '  Regsters:'
     204            for name in self.regs.names():
     205                val = self.regs.get(name)
     206                print '    %20s: %08x (%d)' % (name, val, val)
     207            return True
     208        return False
    206209
    207210class message_queue:
  • tools/gdb/python/rtems.py

    ra30ec56 rb117be8  
    7373
    7474    def invoke(self, arg, from_tty):
     75        vald = False
    7576        for num in arg.split():
    7677            try:
     
    7980            except:
    8081                print 'error: "%s" is not a number' % (num)
    81                 return
     82                return True
    8283            id = objects.ident(num)
    8384            if not id.valid():
    8485                print 'Invalid object id'
    85                 return
     86                return True
    8687
    8788            print 'API:%s Class:%s Node:%d Index:%d Id:%08X' % \
     
    9293            if objectname in self.objects:
    9394                object = self.objects[objectname](obj)
    94                 object.show(from_tty)
     95                valid = object.show(from_tty)
    9596        objects.information.invalidate()
     97        return valid
    9698
    9799class rtems_index(gdb.Command):
     
    114116        maximum = objects.information.maximum(self.api, self._class)
    115117        minimum_id = objects.ident(objects.information.minimum_id(self.api, self._class))
    116         maximum_id = objects.ident(objects.information.minimum_id(self.api, self._class))
     118        maximum_id = objects.ident(objects.information.maximum_id(self.api, self._class))
    117119        args = arg.split()
     120        valid = False
    118121        if len(args):
    119122            for val in args:
     
    138141                    return
    139142                instance = self.instance(obj)
    140                 instance.show(from_tty)
     143                valid = instance.show(from_tty)
    141144            objects.information.invalidate()
    142145        else:
     
    144147            print ' %s: %d [%08x -> %08x]' % (objects.information.name(self.api, self._class),
    145148                                             maximum, minimum_id.value(), maximum_id.value())
     149            valid = True
    146150            for index in range(minimum_id.index(), minimum_id.index() + maximum):
    147                 print '-' * 70
    148                 self.invoke(str(index), from_tty)
     151                if valid:
     152                    print '-' * 70
     153                valid = self.invoke(str(index), from_tty)
     154        return valid
    149155
    150156class rtems_semaphore(rtems_index):
     
    243249
    244250    def invoke(self, arg, from_tty):
    245 
    246251        if arg:
    247252            print "warning: commad takes no arguments!"
    248 
    249         obj = objects.information.object_return(self.api,self._class)
     253        obj = objects.information.object_return(self.api, self._class)
    250254        instance = supercore.time_of_day(obj)
    251255        instance.show()
  • tools/gdb/python/threads.py

    ra30ec56 rb117be8  
    11# RTEMS Tools Project (http://www.rtems.org/)
    2 # Copyright 2010-2014 Chris Johns (chrisj@rtems.org)
     2# Copyright 2010-2015 Chris Johns (chrisj@rtems.org)
    33# All rights reserved.
    44#
     
    3737import objects
    3838import percpu
     39import rbtrees
     40import time
    3941
    4042def task_chain(chain):
    4143    tasks = []
    42     node = chain.first()
     44    if not chain.empty():
     45        node = chain.first()
     46        while not node.null():
     47            t = control(node.cast('Thread_Control'))
     48            tasks.append(t)
     49            node = node(node.next())
     50    return tasks
     51
     52def task_tree(tree):
     53    tasks = []
     54    node = tree.first(rbtrees.rbt_left)
    4355    while not node.null():
    4456        tasks.append(control(node.cast('Thread_Control')))
    45         node.next()
     57        node = node.next(rbtrees.rbt_left)
    4658    return tasks
    4759
     
    129141        return s[:-1]
    130142
     143class cpu_usage():
     144
     145    def __init__(self, time_):
     146        self.time = time.time(time_)
     147
     148    def __str__(self):
     149        return self.time.tostring()
     150
     151    def get(self):
     152        return self.time.get()
     153
    131154class wait_info():
    132155
     
    165188            return float(self.regs[reg])
    166189        return int(self.regs[reg])
    167 
    168190
    169191    def format(self, reg):
     
    209231
    210232    def __init__(self, ctrl):
    211         self.reference = ctrl
    212         self.ctrl = ctrl.dereference()
     233        if ctrl.type.code == gdb.TYPE_CODE_PTR:
     234            self.reference = ctrl
     235            self.ctrl = ctrl.dereference()
     236        else:
     237            self.ctrl = ctrl
     238            self.reference = ctrl.address
    213239        self.object = objects.control(ctrl['Object'])
    214240        self._executing = percpu.thread_active(self.reference)
     
    246272
    247273    def cpu_time_used(self):
    248         return self.ctrl['cpu_time_used']
     274        return cpu_usage(self.ctrl['cpu_time_used'])
    249275
    250276    def preemptible(self):
     
    259285    def registers(self):
    260286        return registers(self.ctrl['Registers'])
     287
     288    def is_idle(self):
     289        return (self.id() & 0xff000000) == 0x90000000
    261290
    262291    def brief(self):
     
    267296    """Manage the Thread_queue_Control."""
    268297
    269     priority_headers = 4
    270 
    271298    def __init__(self, que):
    272         self.que = que
     299        if que.type.code == gdb.TYPE_CODE_PTR:
     300            self.reference = que
     301            self.que = que.dereference()
     302        else:
     303            self.que = que
     304            self.reference = que.address
    273305
    274306    def fifo(self):
     
    285317            t = task_chain(chains.control(self.que['Queues']['Fifo']))
    286318        else:
    287             t = []
    288             for ph in range(0, self.priority_headers):
    289                 t.extend(task_chain(chains.control( \
    290                     self.que['Queues']['Priority'][ph])))
     319            t =  task_tree(rbtrees.control(self.que['Queues']['Priority']))
    291320        return t
Note: See TracChangeset for help on using the changeset viewer.