2005-02-24 Andrew Cagney <cagney@gnu.org>
[deliverable/binutils-gdb.git] / gdb / kod.c
1 /* Kernel Object Display generic routines and callbacks
2 Copyright 1998, 1999, 2000 Free Software Foundation, Inc.
3
4 Written by Fernando Nasser <fnasser@cygnus.com> for Cygnus Solutions.
5
6 This file is part of GDB.
7
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.
12
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.
17
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. */
22
23 #include "defs.h"
24 #include "command.h"
25 #include "gdbcmd.h"
26 #include "target.h"
27 #include "gdb_string.h"
28 #include "kod.h"
29
30 /* Prototypes for exported functions. */
31 void _initialize_kod (void);
32
33 /* Prototypes for local functions. */
34 static void info_kod_command (char *, int);
35 static void load_kod_library (char *);
36
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 *);
40
41 /* These functions are imported from the KOD module.
42
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:
49
50 NAME VERSION - DESCRIPTION
51
52 Neither NAME nor VERSION should contain a hyphen.
53
54
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'
58 argument.
59
60
61 gdb_kod_close - This is called when the KOD connection to the
62 remote should be terminated. */
63
64 static char *(*gdb_kod_open) (kod_display_callback_ftype *display,
65 kod_query_callback_ftype *query);
66 static void (*gdb_kod_request) (char *, int);
67 static void (*gdb_kod_close) ();
68
69
70 /* Name of inferior's operating system. */
71 char *operating_system;
72
73 /* We save a copy of the OS so that we can properly reset when
74 switching OS's. */
75 static char *old_operating_system;
76
77 /* Print a line of data generated by the module. */
78
79 static void
80 gdb_kod_display (char *arg)
81 {
82 printf_filtered ("%s", arg);
83 }
84
85 /* Queries the target on behalf of the module. */
86
87 static void
88 gdb_kod_query (char *arg, char *result, int *maxsiz)
89 {
90 LONGEST bufsiz = 0;
91
92 /* Check if current target has remote_query capabilities. If not,
93 it does not have kod either. */
94 bufsiz = target_read_partial (&current_target, TARGET_OBJECT_KOD,
95 NULL, NULL, 0, 0);
96 if (bufsiz < 0)
97 {
98 strcpy (result,
99 "ERR: Kernel Object Display not supported by current target\n");
100 return;
101 }
102
103 /* Just get the maximum buffer size. */
104
105 /* Check if *we* were called just for getting the buffer size. */
106 if (*maxsiz == 0)
107 {
108 *maxsiz = bufsiz;
109 strcpy (result, "OK");
110 return;
111 }
112
113 /* Check if caller can handle a buffer this large, if not, adjust. */
114 if (bufsiz > *maxsiz)
115 bufsiz = *maxsiz;
116
117 /* See if buffer can hold the query (usually it can, as the query is
118 short). */
119 if (strlen (arg) >= bufsiz)
120 error (_("kod: query argument too long"));
121
122 /* Send actual request. */
123 if (target_read_partial (&current_target, TARGET_OBJECT_KOD,
124 arg, result, 0, bufsiz) < 0)
125 strcpy (result, "ERR: remote query failed");
126 }
127
128 /* Print name of kod command after selecting the appropriate kod
129 formatting library module. As a side effect we create a new "info"
130 subcommand which is what the user actually uses to query the OS. */
131
132 static void
133 kod_set_os (char *arg, int from_tty, struct cmd_list_element *command)
134 {
135 char *p;
136
137 /* If we had already had an open OS, close it. */
138 if (gdb_kod_close)
139 (*gdb_kod_close) ();
140
141 /* Also remove the old OS's command. */
142 if (old_operating_system)
143 {
144 delete_cmd (old_operating_system, &infolist);
145 xfree (old_operating_system);
146 }
147
148 if (! operating_system || ! *operating_system)
149 {
150 /* If user set operating system to empty, we want to forget we
151 had a module open. Setting these variables is just nice for
152 debugging and clarity. */
153 gdb_kod_open = NULL;
154 gdb_kod_request = NULL;
155 gdb_kod_close = NULL;
156 }
157 else
158 {
159 char *kodlib;
160
161 old_operating_system = xstrdup (operating_system);
162
163 load_kod_library (operating_system);
164
165 kodlib = (*gdb_kod_open) (gdb_kod_display, gdb_kod_query);
166
167 /* Add kod related info commands to gdb. */
168 add_info (operating_system, info_kod_command,
169 _("Displays information about Kernel Objects."));
170
171 p = strrchr (kodlib, '-');
172 if (p != NULL)
173 p++;
174 else
175 p = "Unknown KOD library";
176 printf_filtered ("%s - %s\n", operating_system, p);
177
178 xfree (kodlib);
179 }
180 }
181
182 /* Print information about currently known kernel objects of the
183 specified type or a list of all known kernel object types if
184 argument is empty. */
185
186 static void
187 info_kod_command (char *arg, int from_tty)
188 {
189 (*gdb_kod_request) (arg, from_tty);
190 }
191
192 /* Print name of kod command after selecting the appropriate kod
193 formatting library module. */
194
195 static void
196 load_kod_library (char *lib)
197 {
198 #if 0
199 /* FIXME: Don't have the eCos code here. */
200 if (! strcmp (lib, "ecos"))
201 {
202 gdb_kod_open = ecos_kod_open;
203 gdb_kod_request = ecos_kod_request;
204 gdb_kod_close = ecos_kod_close;
205 }
206 else
207 #endif /* 0 */
208 if (! strcmp (lib, "cisco"))
209 {
210 gdb_kod_open = cisco_kod_open;
211 gdb_kod_request = cisco_kod_request;
212 gdb_kod_close = cisco_kod_close;
213 }
214 else
215 error (_("Unknown operating system: %s."), operating_system);
216 }
217
218 void
219 _initialize_kod (void)
220 {
221 struct cmd_list_element *c;
222
223 add_setshow_string_cmd ("os", no_class, &operating_system, _("\
224 Set operating system"), _("\
225 Show operating system"), NULL,
226 kod_set_os,
227 NULL, /* FIXME: i18n: */
228 &setlist, &showlist);
229 }
This page took 0.033954 seconds and 4 git commands to generate.