source: rtems/c/src/libmisc/monitor/mon-object.c @ 48bfd992

4.104.114.84.95
Last change on this file since 48bfd992 was 97e2729d, checked in by Joel Sherrill <joel.sherrill@…>, on 11/23/98 at 17:38:09

Added --disable-multiprocessing flag and modified a lot of files to make
it work.

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