source: rtems-tools/tools/gdb/python/classic.py @ 09086b4

4.104.11
Last change on this file since 09086b4 was 09086b4, checked in by Dhananjay Balan <mb.dhananjay@…>, on Jul 27, 2013 at 8:41:19 AM

Support classic/partitions
Added support for partition object.

  • Property mode set to 100644
File size: 7.3 KB
Line 
1#
2# RTEMS Classic API Support
3# Copyright 2010 Chris Johns (chrisj@rtems.org)
4#
5# $Id$
6#
7
8import gdb
9import itertools
10import re
11
12import objects
13import threads
14import watchdog
15import supercore
16
17class attribute:
18    """The Classic API attribute."""
19
20    groups = {
21        'none' : [],
22        'all' : ['scope',
23                 'priority',
24                 'fpu',
25                 'semaphore-type',
26                 'semaphore-pri',
27                 'semaphore-pri-ceiling',
28                 'barrier',
29                 'task'],
30        'task' : ['scope',
31                  'priority',
32                  'fpu',
33                  'task'],
34        'semaphore' : ['scope',
35                       'priority',
36                       'semaphore-type',
37                       'semaphore-pri',
38                       'semaphore-pri-ceiling'],
39        'barrier' : ['scope',
40                     'priority',
41                     'barrier'],
42        'message_queue' : ['priority',
43                           'scope'],
44        'partition' : ['scope']
45        }
46
47    masks = {
48        'scope' : 0x00000002,
49        'priority' : 0x00000004,
50        'fpu' : 0x00000001,
51        'semaphore-type' : 0x00000030,
52        'semaphore-pri' : 0x00000040,
53        'semaphore-pri-ceiling' : 0x00000080,
54        'barrier' : 0x00000010,
55        'task' : 0x00008000
56        }
57
58    fields = {
59        'scope' : [(0x00000000, 'local'),
60                   (0x00000002, 'global')],
61        'priority' : [(0x00000000, 'fifo'),
62                      (0x00000004, 'pri')],
63        'fpu' : [(0x00000000, 'no-fpu'),
64                 (0x00000001, 'fpu')],
65        'semaphore-type' : [(0x00000000, 'count-sema'),
66                            (0x00000010, 'bin-sema'),
67                            (0x00000020, 'simple-bin-sema')],
68        'semaphore-pri' : [(0x00000000, 'no-inherit-pri'),
69                           (0x00000040, 'inherit-pri')],
70        'semaphore-pri-ceiling' : [(0x00000000, 'no-pri-ceiling'),
71                                   (0x00000080, 'pri-ceiling')],
72        'barrier' : [(0x00000010, 'barrier-auto-release'),
73                     (0x00000000, 'barrier-manual-release')],
74        'task' : [(0x00000000, 'app-task'),
75                  (0x00008000, 'sys-task')]
76        }
77
78    def __init__(self, attr, attrtype = 'none'):
79        if attrtype not in self.groups:
80            raise 'invalid attribute type'
81        self.attrtype = attrtype
82        self.attr = attr
83
84    #ToDo: Move this out
85    def to_string(self):
86        s = '0x%08x,' % (self.attr)
87        if self.attrtype != 'none':
88            for m in self.groups[self.attrtype]:
89                v = self.attr & self.masks[m]
90                for f in self.fields[m]:
91                    if f[0] == v:
92                        s += f[1] + ','
93                        break
94        return s[:-1]
95
96    def test(self, mask, value):
97        if self.attrtype != 'none' and \
98                mask in self.groups[self.attrtype]:
99            v = self.masks[mask] & self.attr
100            for f in self.fields[mask]:
101                if v == f[0] and value == f[1]:
102                    return True
103        return False
104
105
106class semaphore:
107    "Print a classic semaphore."
108
109    def __init__(self, id):
110        self.id = id;
111        self.object = objects.information.object(self.id).dereference()
112        self.object_control = objects.control(self.object['Object'])
113        self.attr = attribute(self.object['attribute_set'], 'semaphore')
114
115    def show(self, from_tty):
116        print '     Name:', self.object_control.name()
117        print '     Attr:', self.attr.to_string()
118        if self.attr.test('semaphore-type', 'bin-sema') or \
119                self.attr.test('semaphore-type', 'simple-bin-sema'):
120            core_mutex = self.object['Core_control']['mutex']
121            locked = core_mutex['lock'] == 0
122            if locked:
123                s = 'locked'
124            else:
125                s = 'unlocked'
126            print '     Lock:', s
127            print '  Nesting:', core_mutex['nest_count']
128            print '  Blocked:', core_mutex['blocked_count']
129            print '   Holder:',
130            holder = core_mutex['holder']
131            if holder and locked:
132                holder = threads.control(holder.dereference())
133                print holder.brief()
134            elif holder == 0 and locked:
135                print 'locked but no holder'
136            else:
137                print 'unlocked'
138            wait_queue = threads.queue(core_mutex['Wait_queue'])
139            tasks = wait_queue.tasks()
140            print '    Queue: len = %d, state = %s' % (len(tasks),
141                                                       wait_queue.state())
142            for t in range(0, len(tasks)):
143                print '      ', tasks[t].brief(), ' (%08x)' % (tasks[t].id())
144        else:
145            print 'semaphore'
146
147class task:
148    "Print a classic tasks."
149
150    def __init__(self, id):
151        self.id = id;
152        self.task = \
153            threads.control(objects.information.object(self.id).dereference())
154
155    def show(self, from_tty):
156        print '     Name:', self.task.name()
157        print '    State:', self.task.current_state()
158        print '  Current:', self.task.current_priority()
159        print '     Real:', self.task.real_priority()
160        print ' Suspends:', self.task.suspends()
161        print ' Post Ext:', self.task.post_task_switch_ext()
162        print '  Preempt:', self.task.preemptible()
163        print ' T Budget:', self.task.cpu_time_budget()
164        wait_info = self.task.wait_info()
165
166class message_queue:
167    "Print classic messege queue"
168
169    def __init__(self,id):
170        self.id = id
171        self.object = objects.information.object(self.id).dereference()
172        self.object_control = objects.control(self.object['Object'])
173        self.attr = attribute(self.object['attribute_set'], \
174            'message_queue')
175        self.wait_queue = threads.queue( \
176            self.object['message_queue']['Wait_queue'])
177
178        self.core_control = supercore.CORE_message_queue(self.object['message_queue'])
179
180    def show(self, from_tty):
181        print '     Name:', self.object_control.name()
182        print '     Attr:', self.attr.to_string()
183
184        self.core_control.show()
185
186class timer:
187    '''Print a classic timer'''
188
189    def __init__(self, id):
190        self.id = id
191        self.object = objects.information.object(self.id).dereference()
192        self.object_control = objects.control(self.object['Object'])
193        self.watchdog = watchdog.control(self.object['Ticker'])
194
195    def show(self, from_tty):
196        print '     Name:', self.object_control.name()
197        self.watchdog.show()
198
199class partition:
200    ''' Print a rtems partition '''
201
202    def __init__(self, id):
203        self.id = id
204        self.object = objects.information.object(self.id).dereference()
205        self.object_control = objects.control(self.object['Object'])
206        self.attr = attribute(self.object['attribute_set'], 'partition')
207        self.starting_addr = self.object['starting_address']
208        self.length = self.object['length']
209        self.buffer_size = self.object['buffer_size']
210        self.used_blocks = self.object['number_of_used_blocks']
211
212    def show(self, from_tty):
213        # ToDo: the printing still somewhat crude.
214        print '     Name:', self.object_control.name()
215        print '     Attr:', self.attr.to_string()
216        print '   Length:', self.length
217        print 'Buffer Size:', self.buffer_size
218        print 'Used Blocks:', self.used_blocks
219
Note: See TracBrowser for help on using the repository browser.