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

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-old/] [gdb-7.1/] [gdb/] [corefile.c] - Blame information for rev 825

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

Line No. Rev Author Line
1 227 jeremybenn
/* Core dump and executable file functions above target vector, for GDB.
2
 
3
   Copyright (C) 1986, 1987, 1989, 1991, 1992, 1993, 1994, 1996, 1997, 1998,
4
   1999, 2000, 2001, 2003, 2006, 2007, 2008, 2009, 2010
5
   Free Software Foundation, Inc.
6
 
7
   This file is part of GDB.
8
 
9
   This program is free software; you can redistribute it and/or modify
10
   it under the terms of the GNU General Public License as published by
11
   the Free Software Foundation; either version 3 of the License, or
12
   (at your option) any later version.
13
 
14
   This program is distributed in the hope that it will be useful,
15
   but WITHOUT ANY WARRANTY; without even the implied warranty of
16
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17
   GNU General Public License for more details.
18
 
19
   You should have received a copy of the GNU General Public License
20
   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
21
 
22
#include "defs.h"
23
#include "gdb_string.h"
24
#include <errno.h>
25
#include <signal.h>
26
#include <fcntl.h>
27
#include "inferior.h"
28
#include "symtab.h"
29
#include "command.h"
30
#include "gdbcmd.h"
31
#include "bfd.h"
32
#include "target.h"
33
#include "gdbcore.h"
34
#include "dis-asm.h"
35
#include "gdb_stat.h"
36
#include "completer.h"
37
#include "exceptions.h"
38
 
39
/* Local function declarations.  */
40
 
41
extern void _initialize_core (void);
42
static void call_extra_exec_file_hooks (char *filename);
43
 
44
/* You can have any number of hooks for `exec_file_command' command to
45
   call.  If there's only one hook, it is set in exec_file_display
46
   hook.  If there are two or more hooks, they are set in
47
   exec_file_extra_hooks[], and deprecated_exec_file_display_hook is
48
   set to a function that calls all of them.  This extra complexity is
49
   needed to preserve compatibility with old code that assumed that
50
   only one hook could be set, and which called
51
   deprecated_exec_file_display_hook directly.  */
52
 
53
typedef void (*hook_type) (char *);
54
 
55
hook_type deprecated_exec_file_display_hook;    /* the original hook */
56
static hook_type *exec_file_extra_hooks;        /* array of additional hooks */
57
static int exec_file_hook_count = 0;     /* size of array */
58
 
59
/* Binary file diddling handle for the core file.  */
60
 
61
bfd *core_bfd = NULL;
62
 
63
 
64
/* Backward compatability with old way of specifying core files.  */
65
 
66
void
67
core_file_command (char *filename, int from_tty)
68
{
69
  struct target_ops *t;
70
 
71
  dont_repeat ();               /* Either way, seems bogus. */
72
 
73
  t = find_core_target ();
74
  if (t == NULL)
75
    error (_("GDB can't read core files on this machine."));
76
 
77
  if (!filename)
78
    (t->to_detach) (t, filename, from_tty);
79
  else
80
    (t->to_open) (filename, from_tty);
81
}
82
 
83
 
84
/* If there are two or more functions that wish to hook into
85
   exec_file_command, this function will call all of the hook
86
   functions.  */
87
 
88
static void
89
call_extra_exec_file_hooks (char *filename)
90
{
91
  int i;
92
 
93
  for (i = 0; i < exec_file_hook_count; i++)
94
    (*exec_file_extra_hooks[i]) (filename);
95
}
96
 
97
/* Call this to specify the hook for exec_file_command to call back.
98
   This is called from the x-window display code.  */
99
 
100
void
101
specify_exec_file_hook (void (*hook) (char *))
102
{
103
  hook_type *new_array;
104
 
105
  if (deprecated_exec_file_display_hook != NULL)
106
    {
107
      /* There's already a hook installed.  Arrange to have both it
108
       * and the subsequent hooks called. */
109
      if (exec_file_hook_count == 0)
110
        {
111
          /* If this is the first extra hook, initialize the hook array.  */
112
          exec_file_extra_hooks = (hook_type *) xmalloc (sizeof (hook_type));
113
          exec_file_extra_hooks[0] = deprecated_exec_file_display_hook;
114
          deprecated_exec_file_display_hook = call_extra_exec_file_hooks;
115
          exec_file_hook_count = 1;
116
        }
117
 
118
      /* Grow the hook array by one and add the new hook to the end.
119
         Yes, it's inefficient to grow it by one each time but since
120
         this is hardly ever called it's not a big deal.  */
121
      exec_file_hook_count++;
122
      new_array =
123
        (hook_type *) xrealloc (exec_file_extra_hooks,
124
                                exec_file_hook_count * sizeof (hook_type));
125
      exec_file_extra_hooks = new_array;
126
      exec_file_extra_hooks[exec_file_hook_count - 1] = hook;
127
    }
128
  else
129
    deprecated_exec_file_display_hook = hook;
130
}
131
 
132
/* The exec file must be closed before running an inferior.
133
   If it is needed again after the inferior dies, it must
134
   be reopened.  */
135
 
136
void
137
close_exec_file (void)
138
{
139
#if 0                           /* FIXME */
140
  if (exec_bfd)
141
    bfd_tempclose (exec_bfd);
142
#endif
143
}
144
 
145
void
146
reopen_exec_file (void)
147
{
148
#if 0                           /* FIXME */
149
  if (exec_bfd)
150
    bfd_reopen (exec_bfd);
151
#else
152
  char *filename;
153
  int res;
154
  struct stat st;
155
  long mtime;
156
  struct cleanup *cleanups;
157
 
158
  /* Don't do anything if there isn't an exec file. */
159
  if (exec_bfd == NULL)
160
    return;
161
 
162
  /* If the timestamp of the exec file has changed, reopen it. */
163
  filename = xstrdup (bfd_get_filename (exec_bfd));
164
  cleanups = make_cleanup (xfree, filename);
165
  res = stat (filename, &st);
166
 
167
  if (exec_bfd_mtime && exec_bfd_mtime != st.st_mtime)
168
    exec_file_attach (filename, 0);
169
  else
170
    /* If we accessed the file since last opening it, close it now;
171
       this stops GDB from holding the executable open after it
172
       exits.  */
173
    bfd_cache_close_all ();
174
 
175
  do_cleanups (cleanups);
176
#endif
177
}
178
 
179
/* If we have both a core file and an exec file,
180
   print a warning if they don't go together.  */
181
 
182
void
183
validate_files (void)
184
{
185
  if (exec_bfd && core_bfd)
186
    {
187
      if (!core_file_matches_executable_p (core_bfd, exec_bfd))
188
        warning (_("core file may not match specified executable file."));
189
      else if (bfd_get_mtime (exec_bfd) > bfd_get_mtime (core_bfd))
190
        warning (_("exec file is newer than core file."));
191
    }
192
}
193
 
194
/* Return the name of the executable file as a string.
195
   ERR nonzero means get error if there is none specified;
196
   otherwise return 0 in that case.  */
197
 
198
char *
199
get_exec_file (int err)
200
{
201
  if (exec_bfd)
202
    return bfd_get_filename (exec_bfd);
203
  if (!err)
204
    return NULL;
205
 
206
  error (_("No executable file specified.\n\
207
Use the \"file\" or \"exec-file\" command."));
208
  return NULL;
209
}
210
 
211
 
212
/* Report a memory error by throwing a MEMORY_ERROR error.  */
213
 
214
void
215
memory_error (int status, CORE_ADDR memaddr)
216
{
217
  if (status == EIO)
218
    /* Actually, address between memaddr and memaddr + len was out of
219
       bounds.  */
220
    throw_error (MEMORY_ERROR,
221
                 _("Cannot access memory at address %s"),
222
                 paddress (target_gdbarch, memaddr));
223
  else
224
    throw_error (MEMORY_ERROR,
225
                 _("Error accessing memory address %s: %s."),
226
                 paddress (target_gdbarch, memaddr),
227
                 safe_strerror (status));
228
}
229
 
230
/* Same as target_read_memory, but report an error if can't read.  */
231
 
232
void
233
read_memory (CORE_ADDR memaddr, gdb_byte *myaddr, int len)
234
{
235
  int status;
236
  status = target_read_memory (memaddr, myaddr, len);
237
  if (status != 0)
238
    memory_error (status, memaddr);
239
}
240
 
241
/* Same as target_read_stack, but report an error if can't read.  */
242
 
243
void
244
read_stack (CORE_ADDR memaddr, gdb_byte *myaddr, int len)
245
{
246
  int status;
247
  status = target_read_stack (memaddr, myaddr, len);
248
  if (status != 0)
249
    memory_error (status, memaddr);
250
}
251
 
252
/* Argument / return result struct for use with
253
   do_captured_read_memory_integer().  MEMADDR and LEN are filled in
254
   by gdb_read_memory_integer().  RESULT is the contents that were
255
   successfully read from MEMADDR of length LEN.  */
256
 
257
struct captured_read_memory_integer_arguments
258
{
259
  CORE_ADDR memaddr;
260
  int len;
261
  enum bfd_endian byte_order;
262
  LONGEST result;
263
};
264
 
265
/* Helper function for gdb_read_memory_integer().  DATA must be a
266
   pointer to a captured_read_memory_integer_arguments struct.
267
   Return 1 if successful.  Note that the catch_errors() interface
268
   will return 0 if an error occurred while reading memory.  This
269
   choice of return code is so that we can distinguish between
270
   success and failure.  */
271
 
272
static int
273
do_captured_read_memory_integer (void *data)
274
{
275
  struct captured_read_memory_integer_arguments *args = (struct captured_read_memory_integer_arguments*) data;
276
  CORE_ADDR memaddr = args->memaddr;
277
  int len = args->len;
278
  enum bfd_endian byte_order = args->byte_order;
279
 
280
  args->result = read_memory_integer (memaddr, len, byte_order);
281
 
282
  return 1;
283
}
284
 
285
/* Read memory at MEMADDR of length LEN and put the contents in
286
   RETURN_VALUE.  Return 0 if MEMADDR couldn't be read and non-zero
287
   if successful.  */
288
 
289
int
290
safe_read_memory_integer (CORE_ADDR memaddr, int len, enum bfd_endian byte_order,
291
                          LONGEST *return_value)
292
{
293
  int status;
294
  struct captured_read_memory_integer_arguments args;
295
  args.memaddr = memaddr;
296
  args.len = len;
297
  args.byte_order = byte_order;
298
 
299
  status = catch_errors (do_captured_read_memory_integer, &args,
300
                        "", RETURN_MASK_ALL);
301
  if (status)
302
    *return_value = args.result;
303
 
304
  return status;
305
}
306
 
307
LONGEST
308
read_memory_integer (CORE_ADDR memaddr, int len, enum bfd_endian byte_order)
309
{
310
  gdb_byte buf[sizeof (LONGEST)];
311
 
312
  read_memory (memaddr, buf, len);
313
  return extract_signed_integer (buf, len, byte_order);
314
}
315
 
316
ULONGEST
317
read_memory_unsigned_integer (CORE_ADDR memaddr, int len, enum bfd_endian byte_order)
318
{
319
  gdb_byte buf[sizeof (ULONGEST)];
320
 
321
  read_memory (memaddr, buf, len);
322
  return extract_unsigned_integer (buf, len, byte_order);
323
}
324
 
325
void
326
read_memory_string (CORE_ADDR memaddr, char *buffer, int max_len)
327
{
328
  char *cp;
329
  int i;
330
  int cnt;
331
 
332
  cp = buffer;
333
  while (1)
334
    {
335
      if (cp - buffer >= max_len)
336
        {
337
          buffer[max_len - 1] = '\0';
338
          break;
339
        }
340
      cnt = max_len - (cp - buffer);
341
      if (cnt > 8)
342
        cnt = 8;
343
      read_memory (memaddr + (int) (cp - buffer), cp, cnt);
344
      for (i = 0; i < cnt && *cp; i++, cp++)
345
        ;                       /* null body */
346
 
347
      if (i < cnt && !*cp)
348
        break;
349
    }
350
}
351
 
352
CORE_ADDR
353
read_memory_typed_address (CORE_ADDR addr, struct type *type)
354
{
355
  gdb_byte *buf = alloca (TYPE_LENGTH (type));
356
  read_memory (addr, buf, TYPE_LENGTH (type));
357
  return extract_typed_address (buf, type);
358
}
359
 
360
/* Same as target_write_memory, but report an error if can't write.  */
361
void
362
write_memory (CORE_ADDR memaddr, const bfd_byte *myaddr, int len)
363
{
364
  int status;
365
  status = target_write_memory (memaddr, myaddr, len);
366
  if (status != 0)
367
    memory_error (status, memaddr);
368
}
369
 
370
/* Store VALUE at ADDR in the inferior as a LEN-byte unsigned integer.  */
371
void
372
write_memory_unsigned_integer (CORE_ADDR addr, int len, enum bfd_endian byte_order,
373
                               ULONGEST value)
374
{
375
  gdb_byte *buf = alloca (len);
376
  store_unsigned_integer (buf, len, byte_order, value);
377
  write_memory (addr, buf, len);
378
}
379
 
380
/* Store VALUE at ADDR in the inferior as a LEN-byte signed integer.  */
381
void
382
write_memory_signed_integer (CORE_ADDR addr, int len, enum bfd_endian byte_order,
383
                             LONGEST value)
384
{
385
  gdb_byte *buf = alloca (len);
386
  store_signed_integer (buf, len, byte_order, value);
387
  write_memory (addr, buf, len);
388
}
389
 
390
/* The current default bfd target.  Points to storage allocated for
391
   gnutarget_string.  */
392
char *gnutarget;
393
 
394
/* Same thing, except it is "auto" not NULL for the default case.  */
395
static char *gnutarget_string;
396
static void
397
show_gnutarget_string (struct ui_file *file, int from_tty,
398
                       struct cmd_list_element *c, const char *value)
399
{
400
  fprintf_filtered (file, _("The current BFD target is \"%s\".\n"), value);
401
}
402
 
403
static void set_gnutarget_command (char *, int, struct cmd_list_element *);
404
 
405
static void
406
set_gnutarget_command (char *ignore, int from_tty, struct cmd_list_element *c)
407
{
408
  if (strcmp (gnutarget_string, "auto") == 0)
409
    gnutarget = NULL;
410
  else
411
    gnutarget = gnutarget_string;
412
}
413
 
414
/* Set the gnutarget.  */
415
void
416
set_gnutarget (char *newtarget)
417
{
418
  if (gnutarget_string != NULL)
419
    xfree (gnutarget_string);
420
  gnutarget_string = xstrdup (newtarget);
421
  set_gnutarget_command (NULL, 0, NULL);
422
}
423
 
424
void
425
_initialize_core (void)
426
{
427
  struct cmd_list_element *c;
428
  c = add_cmd ("core-file", class_files, core_file_command, _("\
429
Use FILE as core dump for examining memory and registers.\n\
430
No arg means have no core file.  This command has been superseded by the\n\
431
`target core' and `detach' commands."), &cmdlist);
432
  set_cmd_completer (c, filename_completer);
433
 
434
 
435
  add_setshow_string_noescape_cmd ("gnutarget", class_files,
436
                                   &gnutarget_string, _("\
437
Set the current BFD target."), _("\
438
Show the current BFD target."), _("\
439
Use `set gnutarget auto' to specify automatic detection."),
440
                                   set_gnutarget_command,
441
                                   show_gnutarget_string,
442
                                   &setlist, &showlist);
443
 
444
  if (getenv ("GNUTARGET"))
445
    set_gnutarget (getenv ("GNUTARGET"));
446
  else
447
    set_gnutarget ("auto");
448
}

powered by: WebSVN 2.1.0

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