a0969109cf8174929bb9f7f9a1a2c0c23d087061
1 /* Kernel Object Display generic routines and callbacks
2 Copyright 1998, 1999 Free Software Foundation, Inc.
4 Written by Fernando Nasser <fnasser@cygnus.com> for Cygnus Solutions.
6 This file is part of GDB.
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2 of the License, or
11 (at your option) any later version.
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 59 Temple Place - Suite 330,
21 Boston, MA 02111-1307, USA. */
27 #include "gdb_string.h"
29 /* Prototypes for exported functions. */
30 void _initialize_kod (void);
32 /* Prototypes for local functions. */
33 static void show_kod (char *, int);
34 static void info_kod_command (char *, int);
35 static void load_kod_library (char *);
37 /* Prototypes for callbacks. These are passed into the KOD modules. */
38 static void gdb_kod_display (char *);
39 static void gdb_kod_query (char *, char *, int *);
41 /* These functions are imported from the KOD module.
43 gdb_kod_open - initiates the KOD connection to the remote. The
44 first argument is the display function the module should use to
45 communicate with the user. The second argument is the query
46 function the display should use to communicate with the target.
47 This should call error() if there is an error. Otherwise it should
48 return a malloc()d string of the form:
50 NAME VERSION - DESCRIPTION
52 Neither NAME nor VERSION should contain a hyphen.
55 gdb_kod_request - This is used when the user enters an "info
56 <module>" request. The remaining arguments are passed as the first
57 argument. The second argument is the standard `from_tty'
61 gdb_kod_close - This is called when the KOD connection to the
62 remote should be terminated. */
64 static char *(*gdb_kod_open
) (void *, void *);
65 static void (*gdb_kod_request
) (char *, int);
66 static void (*gdb_kod_close
) ();
69 /* Name of inferior's operating system. */
70 char *operating_system
;
72 /* We save a copy of the OS so that we can properly reset when
74 static char *old_operating_system
;
76 /* Functions imported from the library for all supported OSes.
77 FIXME: we really should do something better, such as dynamically
78 loading the KOD modules. */
79 extern char *ecos_kod_open (void *, void *);
80 extern void ecos_kod_request (char *, int);
81 extern void ecos_kod_close ();
82 extern char *cisco_kod_open (void *, void *);
83 extern void cisco_kod_request (char *, int);
84 extern void cisco_kod_close ();
87 /* Print a line of data generated by the module. */
90 gdb_kod_display (char *arg
)
92 printf_filtered ("%s", arg
);
95 /* Queries the target on behalf of the module. */
98 gdb_kod_query (char *arg
, char *result
, int *maxsiz
)
102 /* Check if current target has remote_query capabilities.
103 If not, it does not have kod either. */
104 if (! current_target
.to_query
)
107 "ERR: Kernel Object Display not supported by current target\n");
111 /* Just get the maximum buffer size. */
112 target_query ((int) 'K', 0, 0, &bufsiz
);
114 /* Check if *we* were called just for getting the buffer size. */
118 strcpy (result
, "OK");
122 /* Check if caller can handle a buffer this large, if not, adjust. */
123 if (bufsiz
> *maxsiz
)
126 /* See if buffer can hold the query (usually it can, as the query is
128 if (strlen (arg
) >= bufsiz
)
129 error ("kod: query argument too long");
131 /* Send actual request. */
132 if (target_query ((int) 'K', arg
, result
, &bufsiz
))
133 strcpy (result
, "ERR: remote query failed");
136 /* Print name of kod command after selecting the appropriate kod
137 formatting library module. As a side effect we create a new "info"
138 subcommand which is what the user actually uses to query the OS. */
141 kod_set_os (char *arg
, int from_tty
, struct cmd_list_element
*command
)
145 if (command
->type
!= set_cmd
)
148 /* If we had already had an open OS, close it. */
152 /* Also remove the old OS's command. */
153 if (old_operating_system
)
155 delete_cmd (old_operating_system
, &infolist
);
156 free (old_operating_system
);
158 old_operating_system
= strdup (operating_system
);
160 if (! operating_system
|| ! *operating_system
)
162 /* If user set operating system to empty, we want to forget we
163 had a module open. Setting these variables is just nice for
164 debugging and clarity. */
166 gdb_kod_request
= NULL
;
167 gdb_kod_close
= NULL
;
173 load_kod_library (operating_system
);
175 kodlib
= (*gdb_kod_open
) (gdb_kod_display
, gdb_kod_query
);
177 /* Add kod related info commands to gdb. */
178 add_info (operating_system
, info_kod_command
,
179 "Displays information about Kernel Objects.");
181 p
= strrchr (kodlib
, '-');
185 p
= "Unknown KOD library";
186 printf_filtered ("%s - %s\n", operating_system
, p
);
192 /* Print information about currently known kernel objects of the
193 specified type or a list of all known kernel object types if
194 argument is empty. */
197 info_kod_command (char *arg
, int from_tty
)
199 (*gdb_kod_request
) (arg
, from_tty
);
202 /* Print name of kod command after selecting the appropriate kod
203 formatting library module. */
206 load_kod_library (char *lib
)
209 /* FIXME: Don't have the eCos code here. */
210 if (! strcmp (lib
, "ecos"))
212 gdb_kod_open
= ecos_kod_open
;
213 gdb_kod_request
= ecos_kod_request
;
214 gdb_kod_close
= ecos_kod_close
;
218 if (! strcmp (lib
, "cisco"))
220 gdb_kod_open
= cisco_kod_open
;
221 gdb_kod_request
= cisco_kod_request
;
222 gdb_kod_close
= cisco_kod_close
;
225 error ("Unknown operating system: %s\n", operating_system
);
231 struct cmd_list_element
*c
;
233 c
= add_set_cmd ("os", no_class
, var_string
,
234 (char *) &operating_system
,
235 "Set operating system",
237 c
->function
.sfunc
= kod_set_os
;
238 add_show_from_set (c
, &showlist
);