source: rtems/c/src/lib/libmisc/monitor/mon-object.c @ 1587af6

4.104.114.84.95
Last change on this file since 1587af6 was 5beb562, checked in by Joel Sherrill <joel.sherrill@…>, on 09/21/97 at 16:58:57

Cleaned up as part of adding the Monitor test.

  • Property mode set to 100644
File size: 10.9 KB
Line 
1/*
2 * RTEMS Monitor "object" support.
3 *
4 * Used to traverse object lists and print them out.
5 * An object can be an RTEMS object (chain based stuff) or
6 * a "misc" object such as a device driver.
7 *
8 * Each object has its own file in this directory (eg: extension.c)
9 * That file provides routines to convert a "native" structure
10 * to its canonical form, print a canonical structure, etc.
11 *
12 * TODO:
13 *     should allow for non-numeric id's???
14 *
15 *  $Id$
16 */
17
18#define __RTEMS_VIOLATE_KERNEL_VISIBILITY__
19#include <rtems.h>
20#include <rtems/monitor.h>
21
22#include <stdio.h>
23#include <stdlib.h>             /* strtoul() */
24#include <string.h>             /* memcpy() */
25
26#define NUMELEMS(arr)   (sizeof(arr) / sizeof(arr[0]))
27
28/*
29 * add:
30 *     next
31 */
32
33rtems_monitor_object_info_t rtems_monitor_object_info[] =
34{
35    { RTEMS_MONITOR_OBJECT_CONFIG,
36      (void *) 0,
37      sizeof(rtems_monitor_config_t),
38      (rtems_monitor_object_next_fn)        rtems_monitor_config_next,
39      (rtems_monitor_object_canonical_fn)   rtems_monitor_config_canonical,
40      (rtems_monitor_object_dump_header_fn) rtems_monitor_config_dump_header,
41      (rtems_monitor_object_dump_fn)        rtems_monitor_config_dump,
42    },
43    { RTEMS_MONITOR_OBJECT_MPCI,
44      (void *) 0,
45      sizeof(rtems_monitor_mpci_t),
46      (rtems_monitor_object_next_fn)        rtems_monitor_mpci_next,
47      (rtems_monitor_object_canonical_fn)   rtems_monitor_mpci_canonical,
48      (rtems_monitor_object_dump_header_fn) rtems_monitor_mpci_dump_header,
49      (rtems_monitor_object_dump_fn)        rtems_monitor_mpci_dump,
50    },
51    { RTEMS_MONITOR_OBJECT_INIT_TASK,
52      (void *) 0,
53      sizeof(rtems_monitor_init_task_t),
54      (rtems_monitor_object_next_fn)        rtems_monitor_init_task_next,
55      (rtems_monitor_object_canonical_fn)   rtems_monitor_init_task_canonical,
56      (rtems_monitor_object_dump_header_fn) rtems_monitor_init_task_dump_header,
57      (rtems_monitor_object_dump_fn)        rtems_monitor_init_task_dump,
58    },
59    { RTEMS_MONITOR_OBJECT_TASK,
60      (void *) &_RTEMS_tasks_Information,
61      sizeof(rtems_monitor_task_t),
62      (rtems_monitor_object_next_fn)        rtems_monitor_manager_next,
63      (rtems_monitor_object_canonical_fn)   rtems_monitor_task_canonical,
64      (rtems_monitor_object_dump_header_fn) rtems_monitor_task_dump_header,
65      (rtems_monitor_object_dump_fn)        rtems_monitor_task_dump,
66    },
67    { RTEMS_MONITOR_OBJECT_QUEUE,
68      (void *) &_Message_queue_Information,
69      sizeof(rtems_monitor_queue_t),
70      (rtems_monitor_object_next_fn)        rtems_monitor_manager_next,
71      (rtems_monitor_object_canonical_fn)   rtems_monitor_queue_canonical,
72      (rtems_monitor_object_dump_header_fn) rtems_monitor_queue_dump_header,
73      (rtems_monitor_object_dump_fn)        rtems_monitor_queue_dump,
74    },
75    { RTEMS_MONITOR_OBJECT_EXTENSION,
76      (void *) &_Extension_Information,
77      sizeof(rtems_monitor_extension_t),
78      (rtems_monitor_object_next_fn)        rtems_monitor_manager_next,
79      (rtems_monitor_object_canonical_fn)   rtems_monitor_extension_canonical,
80      (rtems_monitor_object_dump_header_fn) rtems_monitor_extension_dump_header,
81      (rtems_monitor_object_dump_fn)        rtems_monitor_extension_dump,
82    },
83    { RTEMS_MONITOR_OBJECT_DRIVER,
84      (void *) 0,
85      sizeof(rtems_monitor_driver_t),
86      (rtems_monitor_object_next_fn)        rtems_monitor_driver_next,
87      (rtems_monitor_object_canonical_fn)   rtems_monitor_driver_canonical,
88      (rtems_monitor_object_dump_header_fn) rtems_monitor_driver_dump_header,
89      (rtems_monitor_object_dump_fn)        rtems_monitor_driver_dump,
90    },
91    { RTEMS_MONITOR_OBJECT_DNAME,
92      /* XXX now that the driver name table is allocated from the */
93      /* XXX Workspace, this does not work */
94      (void *) 0,
95      /* (void *) _IO_Driver_name_table, */
96      sizeof(rtems_monitor_dname_t),
97      (rtems_monitor_object_next_fn)        rtems_monitor_dname_next,
98      (rtems_monitor_object_canonical_fn)   rtems_monitor_dname_canonical,
99      (rtems_monitor_object_dump_header_fn) rtems_monitor_dname_dump_header,
100      (rtems_monitor_object_dump_fn)        rtems_monitor_dname_dump,
101    },
102};
103
104/*
105 * Allow id's to be specified without the node number or
106 * type for convenience.
107 */
108
109rtems_id
110rtems_monitor_id_fixup(
111    rtems_id            id,
112    unsigned32          default_node,
113    rtems_monitor_object_type_t type
114)
115{
116    unsigned32  node;
117   
118    node = rtems_get_node(id);
119    if (node == 0)
120    {
121        if (rtems_get_class(id) != OBJECTS_NO_CLASS)
122            type = rtems_get_class(id);
123
124        id = _Objects_Build_id(type, default_node, rtems_get_index(id));
125    }
126    return id;
127}
128
129
130rtems_monitor_object_info_t *
131rtems_monitor_object_lookup(
132    rtems_monitor_object_type_t type
133)
134{
135    rtems_monitor_object_info_t *p;
136    for (p = &rtems_monitor_object_info[0];
137         p < &rtems_monitor_object_info[NUMELEMS(rtems_monitor_object_info)];
138         p++)
139    {
140        if (p->type == type)
141            return p;
142    }
143    return 0;
144}
145
146rtems_id
147rtems_monitor_object_canonical_next_remote(
148    rtems_monitor_object_type_t type,
149    rtems_id            id,
150    void               *canonical
151)
152{
153    rtems_id                        next_id;
154    rtems_status_code               status;
155    rtems_monitor_server_request_t  request;
156    rtems_monitor_server_response_t response;
157
158    /*
159     * Send request
160     */
161   
162    request.command = RTEMS_MONITOR_SERVER_CANONICAL;
163    request.argument0 = (unsigned32) type;
164    request.argument1 = (unsigned32) id;
165
166    status = rtems_monitor_server_request(rtems_get_node(id), &request, &response);
167    if (status != RTEMS_SUCCESSFUL)
168        goto failed;
169
170    /*
171     * process response
172     */
173   
174    next_id = (rtems_id) response.result0;
175    if (next_id != RTEMS_OBJECT_ID_FINAL)
176        (void) memcpy(canonical, &response.payload, response.result1);
177
178    return next_id;
179
180failed:
181    return RTEMS_OBJECT_ID_FINAL;
182
183}
184
185
186rtems_id
187rtems_monitor_object_canonical_next(
188    rtems_monitor_object_info_t *info,
189    rtems_id                     id,
190    void                        *canonical
191)
192{
193    rtems_id                     next_id;
194    void                        *raw_item;
195
196    if ( ! _Objects_Is_local_id(id))
197        next_id = rtems_monitor_object_canonical_next_remote(info->type,
198                                                             id,
199                                                             canonical);
200    else
201    {
202        next_id = id;
203       
204        raw_item = (void *) info->next(info->object_information,
205                                       canonical,
206                                       &next_id);
207
208        if (raw_item)
209        {
210            info->canonical(canonical, raw_item);
211            _Thread_Enable_dispatch();
212        }   
213    }   
214    return next_id;
215}
216
217
218/*
219 * this is routine server invokes locally to get the type
220 */
221
222rtems_id
223rtems_monitor_object_canonical_get(
224    rtems_monitor_object_type_t  type,
225    rtems_id             id,
226    void                *canonical,
227    unsigned32          *size_p
228)
229{
230    rtems_monitor_object_info_t *info;
231    rtems_id                     next_id;
232
233    *size_p = 0;
234
235    info = rtems_monitor_object_lookup(type);
236
237    if (info == 0)
238        return RTEMS_OBJECT_ID_FINAL;
239
240    next_id = rtems_monitor_object_canonical_next(info, id, canonical);
241    *size_p = info->size;
242
243    return next_id;
244}
245
246
247void
248rtems_monitor_object_dump_1(
249    rtems_monitor_object_info_t *info,
250    rtems_id                     id,
251    boolean                      verbose
252)
253{
254    rtems_id next_id;
255    rtems_monitor_union_t canonical;
256
257    if ((next_id = rtems_monitor_object_canonical_next(
258                                     info,
259                                     id,
260                                     &canonical)) != RTEMS_OBJECT_ID_FINAL)
261    {
262        /*
263         * If the one we actually got is the one we wanted, then
264         * print it out.
265         * For ones that have an id field, this works fine,
266         * for all others, always dump it out.
267         *
268         * HACK: the way we determine whether there is an id is a hack.
269         *
270         * by the way: the reason we try to not have an id, is that some
271         *   of the canonical structures are almost too big for shared
272         *   memory driver (eg: mpci)
273         */
274       
275        if ((info->next != rtems_monitor_manager_next) ||
276            (id == canonical.generic.id))
277            info->dump(&canonical, verbose);
278    }
279}
280
281void
282rtems_monitor_object_dump_all(
283    rtems_monitor_object_info_t *info,
284    boolean                      verbose
285)
286{
287    rtems_id next_id;
288    rtems_monitor_union_t canonical;
289
290    next_id = RTEMS_OBJECT_ID_INITIAL(info->type, rtems_monitor_default_node);
291
292    while ((next_id = rtems_monitor_object_canonical_next(
293                                         info,
294                                         next_id,
295                                         &canonical)) != RTEMS_OBJECT_ID_FINAL)
296    {
297        info->dump(&canonical, verbose);
298    }
299}
300
301void
302rtems_monitor_object_cmd(
303    int        argc,
304    char     **argv,
305    unsigned32 command_arg,
306    boolean    verbose
307)
308{
309    int arg;
310    rtems_monitor_object_info_t *info = 0;
311    rtems_monitor_object_type_t  type = (rtems_monitor_object_type_t) command_arg;
312   
313    /* what is the default type? */
314    type = (rtems_monitor_object_type_t) command_arg;
315
316    if (argc == 1)
317    {
318        if (type == RTEMS_MONITOR_OBJECT_INVALID)
319        {
320            printf("A type must be specified to \"dump all\"\n");
321            goto done;
322        }
323       
324        info = rtems_monitor_object_lookup(type);
325        if (info == 0)
326            goto not_found;
327
328        if (info->dump_header)
329            info->dump_header(verbose);
330        rtems_monitor_object_dump_all(info, verbose);
331    }
332    else
333    {
334        unsigned32          default_node = rtems_monitor_default_node;
335        rtems_monitor_object_type_t last_type = RTEMS_MONITOR_OBJECT_INVALID;
336        rtems_id            id;
337
338        for (arg=1; argv[arg]; arg++)
339        {
340            id = (rtems_id) strtoul(argv[arg], 0, 16);
341            id = rtems_monitor_id_fixup(id, default_node, type);
342            type = (rtems_monitor_object_type_t) rtems_get_class(id);
343
344            /*
345             * Allow the item type to change in the middle
346             * of the command.  If the type changes, then
347             * just dump out a new header and keep on going.
348             */
349            if (type != last_type)
350            {
351                info = rtems_monitor_object_lookup(type);
352                if (info == 0)
353                    goto not_found;
354           
355                if (info->dump_header)
356                    info->dump_header(verbose);
357            }
358
359            if (info == 0)
360            {
361not_found:      printf("Invalid or unsupported type %d\n", type);
362                goto done;
363            }
364
365            rtems_monitor_object_dump_1(info, id, verbose);
366
367            default_node = rtems_get_node(id);
368           
369            last_type = type;
370        }
371    }
372done:
373    return;
374}
Note: See TracBrowser for help on using the repository browser.