source: rtems/cpukit/libmisc/monitor/monitor.h @ f3255a6

4.115
Last change on this file since f3255a6 was f3255a6, checked in by Mathew Kallada <matkallada@…>, on 12/28/12 at 17:30:27

Header File Doxygen Enhancement Task #11

  • Property mode set to 100644
File size: 18.0 KB
Line 
1/**
2 * @file rtems/monitor.h
3 *
4 * @brief The RTEMS Monitor Task
5 */
6
7
8#ifndef __MONITOR_H
9#define __MONITOR_H
10
11#include <rtems/error.h>  /* rtems_error() */
12#include <rtems/config.h>
13
14#ifdef __cplusplus
15extern "C" {
16#endif
17
18/* Forward decls from symbols.h */
19typedef struct _rtems_symbol_t rtems_symbol_t;
20typedef struct _rtems_symbol_table_t rtems_symbol_table_t;
21
22/*
23 * Monitor types are derived from rtems object classes
24 */
25
26typedef enum {
27    RTEMS_MONITOR_OBJECT_INVALID   =  OBJECTS_CLASSIC_NO_CLASS,
28    RTEMS_MONITOR_OBJECT_TASK      =  OBJECTS_RTEMS_TASKS,
29    RTEMS_MONITOR_OBJECT_EXTENSION =  OBJECTS_RTEMS_EXTENSIONS,
30    RTEMS_MONITOR_OBJECT_QUEUE     =  OBJECTS_RTEMS_MESSAGE_QUEUES,
31    RTEMS_MONITOR_OBJECT_SEMAPHORE =  OBJECTS_RTEMS_SEMAPHORES,
32    RTEMS_MONITOR_OBJECT_PARTITION =  OBJECTS_RTEMS_PARTITIONS,
33    RTEMS_MONITOR_OBJECT_REGION    =  OBJECTS_RTEMS_REGIONS,
34    RTEMS_MONITOR_OBJECT_PORT      =  OBJECTS_RTEMS_PORTS,
35
36    /* following monitor objects are not known to RTEMS, but
37     * we like to have "types" for them anyway */
38
39    RTEMS_MONITOR_OBJECT_DRIVER    =  OBJECTS_RTEMS_CLASSES_LAST+1,
40    RTEMS_MONITOR_OBJECT_DNAME,
41    RTEMS_MONITOR_OBJECT_CONFIG,
42    RTEMS_MONITOR_OBJECT_INIT_TASK,
43    RTEMS_MONITOR_OBJECT_MPCI,
44    RTEMS_MONITOR_OBJECT_SYMBOL,
45    #if defined(RTEMS_POSIX_API)
46      RTEMS_MONITOR_OBJECT_PTHREAD,
47    #endif
48} rtems_monitor_object_type_t;
49
50/*
51 * rtems_monitor_init() flags
52 */
53
54#define RTEMS_MONITOR_SUSPEND   0x0001          /* suspend monitor on startup */
55#define RTEMS_MONITOR_GLOBAL    0x0002          /* monitor should be global */
56#define RTEMS_MONITOR_NOTASK    0x0004 /* do not start monitor task */
57#define RTEMS_MONITOR_NOSYMLOAD 0x0008 /* do not load symbols       */
58#define RTEMS_MONITOR_WAITQUIT  0x0010 /* wait for monitor task to terminate */
59
60/*
61 * Public interfaces for RTEMS data structures monitor is aware of.
62 * These are only used by the monitor.
63 *
64 * NOTE:
65 *  All the canonical objects that correspond to RTEMS managed "objects"
66 *  must have an identical first portion with 'id' and 'name' fields.
67 *
68 *  Others do not have that restriction, even tho we would like them to.
69 *  This is because some of the canonical structures are almost too big
70 *  for shared memory driver (eg: mpci) and we are nickel and diming it.
71 */
72
73/*
74 * Type of a pointer that may be a symbol
75 */
76
77#define MONITOR_SYMBOL_LEN 20
78typedef struct {
79    char       name[MONITOR_SYMBOL_LEN];
80    uint32_t   value;
81    uint32_t   offset;
82} rtems_monitor_symbol_t;
83
84typedef struct {
85    rtems_id            id;
86    rtems_name          name;
87  /* end of common portion */
88} rtems_monitor_generic_t;
89
90/*
91 * Task
92 */
93typedef struct {
94    rtems_id                   id;
95    rtems_name                 name;
96  /* end of common portion */
97    Thread_Entry               entry;
98    Thread_Entry_numeric_type  argument;
99    void                      *stack;
100    uint32_t                   stack_size;
101    rtems_task_priority        priority;
102    States_Control             state;
103    rtems_event_set            events;
104    rtems_mode                 modes;
105    rtems_attribute            attributes;
106    uint32_t                   notepad[RTEMS_NUMBER_NOTEPADS];
107    rtems_id                   wait_id;
108    uint32_t                   wait_args;
109    uint32_t                   ticks;
110} rtems_monitor_task_t;
111
112/*
113 * Init task
114 */
115
116typedef struct {
117    rtems_id            id;             /* not really an id */
118    rtems_name          name;
119  /* end of common portion */
120    rtems_monitor_symbol_t entry;
121    uint32_t               argument;
122    uint32_t               stack_size;
123    rtems_task_priority    priority;
124    rtems_mode             modes;
125    rtems_attribute        attributes;
126} rtems_monitor_init_task_t;
127
128
129/*
130 * Message queue
131 */
132typedef struct {
133    rtems_id            id;
134    rtems_name          name;
135  /* end of common portion */
136    rtems_attribute     attributes;
137    uint32_t            number_of_pending_messages;
138    uint32_t            maximum_pending_messages;
139    size_t              maximum_message_size;
140} rtems_monitor_queue_t;
141
142/*
143 * Semaphore
144 */
145typedef struct {
146    rtems_id            id;
147    rtems_name          name;
148  /* end of common portion */
149    rtems_attribute     attribute;
150    rtems_task_priority priority_ceiling;
151    uint32_t            max_count;
152    uint32_t            cur_count;
153    rtems_id            holder_id;
154} rtems_monitor_sema_t;
155
156/*
157 * Extension
158 */
159typedef struct {
160    rtems_id                 id;
161    rtems_name               name;
162  /* end of common portion */
163    rtems_monitor_symbol_t  e_create;
164    rtems_monitor_symbol_t  e_start;
165    rtems_monitor_symbol_t  e_restart;
166    rtems_monitor_symbol_t  e_delete;
167    rtems_monitor_symbol_t  e_tswitch;
168    rtems_monitor_symbol_t  e_begin;
169    rtems_monitor_symbol_t  e_exitted;
170    rtems_monitor_symbol_t  e_fatal;
171} rtems_monitor_extension_t;
172
173 /*
174 * Region
175 */
176typedef struct {
177    rtems_id            id;
178    rtems_name          name;
179  /* end of common portion */
180  rtems_attribute     attribute;
181  void *              start_addr;
182  uint32_t            length;
183  uint32_t            page_size;
184  uint32_t            max_seg_size;
185  uint32_t            used_blocks;
186} rtems_monitor_region_t;
187
188/*
189 * Partition
190 */
191typedef struct {
192    rtems_id            id;
193    rtems_name          name;
194  /* end of common portion */
195  rtems_attribute     attribute;
196  void *              start_addr;
197  uint32_t            length;
198  uint32_t            buf_size;
199  uint32_t            used_blocks;
200} rtems_monitor_part_t;
201
202/*
203 * Device driver
204 */
205
206typedef struct {
207    rtems_id            id;                /* not really an id (should be tho) */
208    rtems_name          name;              /* ditto */
209  /* end of common portion */
210    rtems_monitor_symbol_t initialization; /* initialization procedure */
211    rtems_monitor_symbol_t open;           /* open request procedure */
212    rtems_monitor_symbol_t close;          /* close request procedure */
213    rtems_monitor_symbol_t read;           /* read request procedure */
214    rtems_monitor_symbol_t write;          /* write request procedure */
215    rtems_monitor_symbol_t control;        /* special functions procedure */
216} rtems_monitor_driver_t;
217
218/*
219 * System config
220 */
221
222typedef struct {
223    void               *work_space_start;
224    uint32_t            work_space_size;
225    uint32_t            maximum_tasks;
226    uint32_t            maximum_timers;
227    uint32_t            maximum_semaphores;
228    uint32_t            maximum_message_queues;
229    uint32_t            maximum_partitions;
230    uint32_t            maximum_regions;
231    uint32_t            maximum_ports;
232    uint32_t            maximum_periods;
233    uint32_t            maximum_extensions;
234    uint32_t            microseconds_per_tick;
235    uint32_t            ticks_per_timeslice;
236    uint32_t            number_of_initialization_tasks;
237} rtems_monitor_config_t;
238
239/*
240 * MPCI config
241 */
242
243#if defined(RTEMS_MULTIPROCESSING)
244typedef struct {
245    uint32_t    node;                   /* local node number */
246    uint32_t    maximum_nodes;          /* maximum # nodes in system */
247    uint32_t    maximum_global_objects; /* maximum # global objects */
248    uint32_t    maximum_proxies;        /* maximum # proxies */
249
250    uint32_t                 default_timeout;        /* in ticks */
251    size_t                   maximum_packet_size;
252    rtems_monitor_symbol_t   initialization;
253    rtems_monitor_symbol_t   get_packet;
254    rtems_monitor_symbol_t   return_packet;
255    rtems_monitor_symbol_t   send_packet;
256    rtems_monitor_symbol_t   receive_packet;
257} rtems_monitor_mpci_t;
258#endif
259
260/*
261 * The generic canonical information union
262 */
263
264typedef union {
265    rtems_monitor_generic_t    generic;
266    rtems_monitor_task_t       task;
267    rtems_monitor_queue_t      queue;
268    rtems_monitor_sema_t       sema;
269    rtems_monitor_extension_t  extension;
270    rtems_monitor_driver_t     driver;
271    rtems_monitor_config_t     config;
272    rtems_monitor_region_t     region;
273    rtems_monitor_part_t       part;
274#if defined(RTEMS_MULTIPROCESSING)
275    rtems_monitor_mpci_t       mpci;
276#endif
277    rtems_monitor_init_task_t  itask;
278} rtems_monitor_union_t;
279
280/*
281 * Support for talking to other monitors
282 */
283
284/*
285 * Names of other monitors
286 */
287
288#define RTEMS_MONITOR_NAME        (rtems_build_name('R', 'M', 'O', 'N'))
289#define RTEMS_MONITOR_SERVER_NAME (rtems_build_name('R', 'M', 'S', 'V'))
290#define RTEMS_MONITOR_QUEUE_NAME  (rtems_build_name('R', 'M', 'S', 'Q'))
291#define RTEMS_MONITOR_RESPONSE_QUEUE_NAME (rtems_build_name('R', 'M', 'R', 'Q'))
292
293#define RTEMS_MONITOR_SERVER_RESPONSE    0x0001
294#define RTEMS_MONITOR_SERVER_CANONICAL   0x0002
295
296typedef struct
297{
298    uint32_t    command;
299    rtems_id    return_id;
300    uint32_t    argument0;
301    uint32_t    argument1;
302    uint32_t    argument2;
303    uint32_t    argument3;
304    uint32_t    argument4;
305    uint32_t    argument5;
306} rtems_monitor_server_request_t;
307
308typedef struct
309{
310    uint32_t    command;
311    uint32_t    result0;
312    uint32_t    result1;
313    rtems_monitor_union_t payload;
314} rtems_monitor_server_response_t;
315
316extern rtems_id  rtems_monitor_task_id;
317
318extern uint32_t   rtems_monitor_node;          /* our node number */
319extern uint32_t   rtems_monitor_default_node;  /* current default for commands */
320
321/*
322 * Monitor command function and table entry
323 */
324
325typedef struct rtems_monitor_command_entry_s rtems_monitor_command_entry_t;
326typedef union _rtems_monitor_command_arg_t   rtems_monitor_command_arg_t;
327
328typedef void (*rtems_monitor_command_function_t)(
329  int                                argc,
330  char                             **argv,
331  const rtems_monitor_command_arg_t *command_arg,
332  bool                               verbose
333);
334
335union _rtems_monitor_command_arg_t {
336  rtems_monitor_object_type_t   monitor_object;
337  rtems_status_code             status_code;
338  rtems_symbol_table_t          **symbol_table;
339  const rtems_monitor_command_entry_t *monitor_command_entry;
340};
341
342struct rtems_monitor_command_entry_s {
343    const char *command;      /* command name */
344    const char *usage;        /* usage string for the command */
345    uint32_t arguments_required;    /* # of required args */
346    rtems_monitor_command_function_t command_function;
347                               /* Some argument for the command */
348    rtems_monitor_command_arg_t command_arg;
349    const rtems_monitor_command_entry_t *next;
350};
351
352
353typedef const void *(*rtems_monitor_object_next_fn)(void *, void *, rtems_id *);
354typedef void (*rtems_monitor_object_canonical_fn)(void *, const void *);
355typedef void (*rtems_monitor_object_dump_header_fn)(bool);
356typedef void (*rtems_monitor_object_dump_fn)(void *, bool);
357
358typedef struct {
359    rtems_monitor_object_type_t         type;
360    void                               *object_information;
361    int                                 size;   /* of canonical object */
362    rtems_monitor_object_next_fn        next;
363    rtems_monitor_object_canonical_fn   canonical;
364    rtems_monitor_object_dump_header_fn dump_header;
365    rtems_monitor_object_dump_fn        dump;
366} rtems_monitor_object_info_t;
367
368typedef bool (*rtems_monitor_per_command_routine)(const rtems_monitor_command_entry_t *, void *);
369
370/* monitor.c */
371void    rtems_monitor_pause_cmd(int, char **, const rtems_monitor_command_arg_t*, bool);
372void    rtems_monitor_fatal_cmd(int, char **, const rtems_monitor_command_arg_t*, bool);
373void    rtems_monitor_continue_cmd(int, char **, const rtems_monitor_command_arg_t*, bool);
374void    rtems_monitor_debugger_cmd(int, char **, const rtems_monitor_command_arg_t*, bool);
375void    rtems_monitor_reset_cmd(int, char **, const rtems_monitor_command_arg_t*, bool);
376void    rtems_monitor_node_cmd(int, char **, const rtems_monitor_command_arg_t*, bool);
377void    rtems_monitor_symbols_loadup(void);
378int     rtems_monitor_insert_cmd(rtems_monitor_command_entry_t *);
379void    rtems_monitor_wakeup(void);
380void rtems_monitor_command_iterate(rtems_monitor_per_command_routine routine, void *arg);
381rtems_status_code rtems_monitor_suspend(rtems_interval timeout);
382
383/* editor.c */
384void    rtems_monitor_kill(void);
385void    rtems_monitor_init(uint32_t);
386void    rtems_monitor_task(rtems_task_argument);
387
388/* server.c */
389void    rtems_monitor_server_kill(void);
390rtems_status_code rtems_monitor_server_request(uint32_t  , rtems_monitor_server_request_t *, rtems_monitor_server_response_t *);
391void    rtems_monitor_server_task(rtems_task_argument);
392void    rtems_monitor_server_init(uint32_t);
393
394/* command.c */
395int     rtems_monitor_make_argv(char *, int *, char **);
396int     rtems_monitor_command_read(char *, int *, char **);
397void    rtems_monitor_command_usage(const rtems_monitor_command_entry_t *, const char *);
398void    rtems_monitor_help_cmd(int, char **, const rtems_monitor_command_arg_t *, bool);
399const rtems_monitor_command_entry_t *rtems_monitor_command_lookup(const char *name);
400
401/* prmisc.c */
402void       rtems_monitor_separator(void);
403uint32_t   rtems_monitor_pad(uint32_t   dest_col, uint32_t   curr_col);
404int        rtems_monitor_dump_decimal(uint32_t   num);
405int        rtems_monitor_dump_hex(uint32_t   num);
406int        rtems_monitor_dump_addr(void *addr);
407int        rtems_monitor_dump_id(rtems_id id);
408int        rtems_monitor_dump_name(rtems_id id);
409int        rtems_monitor_dump_priority(rtems_task_priority priority);
410int        rtems_monitor_dump_state(States_Control state);
411int        rtems_monitor_dump_modes(rtems_mode modes);
412int        rtems_monitor_dump_attributes(rtems_attribute attributes);
413int        rtems_monitor_dump_events(rtems_event_set events);
414int        rtems_monitor_dump_notepad(uint32_t   *notepad);
415
416/* object.c */
417rtems_id   rtems_monitor_id_fixup(rtems_id, uint32_t  , rtems_monitor_object_type_t);
418const rtems_monitor_object_info_t *rtems_monitor_object_lookup(rtems_monitor_object_type_t type);
419rtems_id   rtems_monitor_object_canonical_get(rtems_monitor_object_type_t, rtems_id, void *, size_t *size_p);
420rtems_id   rtems_monitor_object_canonical_next(const rtems_monitor_object_info_t *, rtems_id, void *);
421const void *rtems_monitor_object_next(void *, void *, rtems_id, rtems_id *);
422rtems_id   rtems_monitor_object_canonical(rtems_id, const void *);
423void       rtems_monitor_object_cmd(int, char **, const rtems_monitor_command_arg_t*, bool);
424
425/* manager.c */
426const void *rtems_monitor_manager_next(void *, void *, rtems_id *);
427
428/* config.c */
429void       rtems_monitor_config_canonical(rtems_monitor_config_t *, const void *);
430const void *rtems_monitor_config_next(void *, rtems_monitor_config_t *, rtems_id *);
431void       rtems_monitor_config_dump_header(bool);
432int        rtems_monitor_config_dump(rtems_monitor_config_t *, bool verbose);
433
434/* mpci.c */
435#if defined(RTEMS_MULTIPROCESSING)
436void       rtems_monitor_mpci_canonical(rtems_monitor_mpci_t *, const void *);
437const void *rtems_monitor_mpci_next(void *, rtems_monitor_mpci_t *, rtems_id *);
438void       rtems_monitor_mpci_dump_header(bool);
439void       rtems_monitor_mpci_dump(rtems_monitor_mpci_t *, bool verbose);
440#endif
441
442/* itask.c */
443void       rtems_monitor_init_task_canonical(rtems_monitor_init_task_t *, const void *);
444const void *rtems_monitor_init_task_next(void *, rtems_monitor_init_task_t *, rtems_id *);
445void       rtems_monitor_init_task_dump_header(bool);
446void       rtems_monitor_init_task_dump(rtems_monitor_init_task_t *, bool verbose);
447
448/* extension.c */
449void       rtems_monitor_extension_canonical(rtems_monitor_extension_t *, const void *);
450void       rtems_monitor_extension_dump_header(bool verbose);
451void       rtems_monitor_extension_dump(rtems_monitor_extension_t *, bool);
452
453/* task.c */
454void    rtems_monitor_task_canonical(rtems_monitor_task_t *, const void *);
455void    rtems_monitor_task_dump_header(bool verbose);
456void    rtems_monitor_task_dump(rtems_monitor_task_t *, bool);
457
458/* sema.c */
459void    rtems_monitor_sema_canonical(rtems_monitor_sema_t *, const void *);
460void    rtems_monitor_sema_dump_header(bool verbose);
461void    rtems_monitor_sema_dump(rtems_monitor_sema_t *, bool);
462
463/* queue.c */
464void    rtems_monitor_queue_canonical(rtems_monitor_queue_t *, const void *);
465void    rtems_monitor_queue_dump_header(bool verbose);
466void    rtems_monitor_queue_dump(rtems_monitor_queue_t *, bool);
467
468/* region.c */
469void    rtems_monitor_region_canonical(rtems_monitor_region_t *, const void *);
470void    rtems_monitor_region_dump_header(bool verbose);
471void    rtems_monitor_region_dump(rtems_monitor_region_t *, bool);
472
473/* partition.c */
474void    rtems_monitor_part_canonical(rtems_monitor_part_t *, const void *);
475void    rtems_monitor_part_dump_header(bool verbose);
476void    rtems_monitor_part_dump(rtems_monitor_part_t *, bool);
477
478/* driver.c */
479const void *rtems_monitor_driver_next(void *, rtems_monitor_driver_t *, rtems_id *);
480void     rtems_monitor_driver_canonical(rtems_monitor_driver_t *, const void *);
481void     rtems_monitor_driver_dump_header(bool);
482void     rtems_monitor_driver_dump(rtems_monitor_driver_t *, bool);
483
484/* symbols.c */
485rtems_symbol_table_t *rtems_symbol_table_create(void);
486void                  rtems_symbol_table_destroy(rtems_symbol_table_t *table);
487
488rtems_symbol_t *rtems_symbol_create(rtems_symbol_table_t *, const char *, uint32_t);
489rtems_symbol_t *rtems_symbol_value_lookup(rtems_symbol_table_t *, uint32_t);
490const rtems_symbol_t *rtems_symbol_value_lookup_exact(rtems_symbol_table_t *, uint32_t);
491rtems_symbol_t *rtems_symbol_name_lookup(rtems_symbol_table_t *, const char *);
492const void *rtems_monitor_symbol_next(void *object_info, rtems_monitor_symbol_t *, rtems_id *);
493void    rtems_monitor_symbol_canonical(rtems_monitor_symbol_t *, rtems_symbol_t *);
494void    rtems_monitor_symbol_canonical_by_name(rtems_monitor_symbol_t *, const char *);
495void    rtems_monitor_symbol_canonical_by_value(rtems_monitor_symbol_t *, void *);
496uint32_t   rtems_monitor_symbol_dump(rtems_monitor_symbol_t *, bool);
497void    rtems_monitor_symbol_cmd(int, char **, const rtems_monitor_command_arg_t*, bool);
498
499#if defined(RTEMS_NETWORKING)
500void mon_ifconfig(
501  int argc,
502  char *argv[],
503  uint32_t command_arg,
504  bool verbose
505);
506void mon_route(
507  int argc,
508  char *argv[],
509  uint32_t command_arg,
510  bool verbose
511);
512#endif
513
514/* mon-object.c */
515const rtems_monitor_object_info_t *rtems_monitor_object_lookup(
516  rtems_monitor_object_type_t type
517);
518
519/* shared data */
520extern rtems_symbol_table_t *rtems_monitor_symbols;
521
522#define MONITOR_WAKEUP_EVENT   RTEMS_EVENT_0
523
524#ifdef __cplusplus
525}
526#endif
527
528#endif  /* ! __MONITOR_H */
Note: See TracBrowser for help on using the repository browser.