OpenCores
URL https://opencores.org/ocsvn/or1k/or1k/trunk

Subversion Repositories or1k

[/] [or1k/] [trunk/] [gdb-5.0/] [gdb/] [kod.c] - Blame information for rev 1775

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 104 markom
/* Kernel Object Display generic routines and callbacks
2
   Copyright 1998, 1999 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
  int bufsiz = 0;
91
 
92
  /* Check if current target has remote_query capabilities.
93
     If not, it does not have kod either.  */
94
  if (! current_target.to_query)
95
    {
96
      strcpy (result,
97
              "ERR: Kernel Object Display not supported by current target\n");
98
      return;
99
    }
100
 
101
  /* Just get the maximum buffer size.  */
102
  target_query ((int) 'K', 0, 0, &bufsiz);
103
 
104
  /* Check if *we* were called just for getting the buffer size.  */
105
  if (*maxsiz == 0)
106
    {
107
      *maxsiz = bufsiz;
108
      strcpy (result, "OK");
109
      return;
110
    }
111
 
112
  /* Check if caller can handle a buffer this large, if not, adjust.  */
113
  if (bufsiz > *maxsiz)
114
    bufsiz = *maxsiz;
115
 
116
  /* See if buffer can hold the query (usually it can, as the query is
117
     short).  */
118
  if (strlen (arg) >= bufsiz)
119
    error ("kod: query argument too long");
120
 
121
  /* Send actual request.  */
122
  if (target_query ((int) 'K', arg, result, &bufsiz))
123
    strcpy (result, "ERR: remote query failed");
124
}
125
 
126
/* Print name of kod command after selecting the appropriate kod
127
   formatting library module.  As a side effect we create a new "info"
128
   subcommand which is what the user actually uses to query the OS.  */
129
 
130
static void
131
kod_set_os (char *arg, int from_tty, struct cmd_list_element *command)
132
{
133
  char *p;
134
 
135
  if (command->type != set_cmd)
136
    return;
137
 
138
  /* If we had already had an open OS, close it.  */
139
  if (gdb_kod_close)
140
    (*gdb_kod_close) ();
141
 
142
  /* Also remove the old OS's command.  */
143
  if (old_operating_system)
144
    {
145
      delete_cmd (old_operating_system, &infolist);
146
      free (old_operating_system);
147
    }
148
  old_operating_system = xstrdup (operating_system);
149
 
150
  if (! operating_system || ! *operating_system)
151
    {
152
      /* If user set operating system to empty, we want to forget we
153
         had a module open.  Setting these variables is just nice for
154
         debugging and clarity.  */
155
      gdb_kod_open = NULL;
156
      gdb_kod_request = NULL;
157
      gdb_kod_close = NULL;
158
    }
159
  else
160
    {
161
      char *kodlib;
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
      free (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\n", operating_system);
216
}
217
 
218
void
219
_initialize_kod ()
220
{
221
  struct cmd_list_element *c;
222
 
223
  c = add_set_cmd ("os", no_class, var_string,
224
                   (char *) &operating_system,
225
                   "Set operating system",
226
                   &setlist);
227
  c->function.sfunc = kod_set_os;
228
  add_show_from_set (c, &showlist);
229
}

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.