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

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-stable/] [gdb-7.2/] [gdb/] [corefile.c] - Blame information for rev 857

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

Line No. Rev Author Line
1 330 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
  struct cleanup *cleanups;
156
 
157
  /* Don't do anything if there isn't an exec file. */
158
  if (exec_bfd == NULL)
159
    return;
160
 
161
  /* If the timestamp of the exec file has changed, reopen it. */
162
  filename = xstrdup (bfd_get_filename (exec_bfd));
163
  cleanups = make_cleanup (xfree, filename);
164
  res = stat (filename, &st);
165
 
166
  if (exec_bfd_mtime && exec_bfd_mtime != st.st_mtime)
167
    exec_file_attach (filename, 0);
168
  else
169
    /* If we accessed the file since last opening it, close it now;
170
       this stops GDB from holding the executable open after it
171
       exits.  */
172
    bfd_cache_close_all ();
173
 
174
  do_cleanups (cleanups);
175
#endif
176
}
177
 
178
/* If we have both a core file and an exec file,
179
   print a warning if they don't go together.  */
180
 
181
void
182
validate_files (void)
183
{
184
  if (exec_bfd && core_bfd)
185
    {
186
      if (!core_file_matches_executable_p (core_bfd, exec_bfd))
187
        warning (_("core file may not match specified executable file."));
188
      else if (bfd_get_mtime (exec_bfd) > bfd_get_mtime (core_bfd))
189
        warning (_("exec file is newer than core file."));
190
    }
191
}
192
 
193
/* Return the name of the executable file as a string.
194
   ERR nonzero means get error if there is none specified;
195
   otherwise return 0 in that case.  */
196
 
197
char *
198
get_exec_file (int err)
199
{
200
  if (exec_bfd)
201
    return bfd_get_filename (exec_bfd);
202
  if (!err)
203
    return NULL;
204
 
205
  error (_("No executable file specified.\n\
206
Use the \"file\" or \"exec-file\" command."));
207
  return NULL;
208
}
209
 
210
 
211
/* Report a memory error by throwing a MEMORY_ERROR error.  */
212
 
213
void
214
memory_error (int status, CORE_ADDR memaddr)
215
{
216
  if (status == EIO)
217
    /* Actually, address between memaddr and memaddr + len was out of
218
       bounds.  */
219
    throw_error (MEMORY_ERROR,
220
                 _("Cannot access memory at address %s"),
221
                 paddress (target_gdbarch, memaddr));
222
  else
223
    throw_error (MEMORY_ERROR,
224
                 _("Error accessing memory address %s: %s."),
225
                 paddress (target_gdbarch, memaddr),
226
                 safe_strerror (status));
227
}
228
 
229
/* Same as target_read_memory, but report an error if can't read.  */
230
 
231
void
232
read_memory (CORE_ADDR memaddr, gdb_byte *myaddr, int len)
233
{
234
  int status;
235
 
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
 
248
  status = target_read_stack (memaddr, myaddr, len);
249
  if (status != 0)
250
    memory_error (status, memaddr);
251
}
252
 
253
/* Argument / return result struct for use with
254
   do_captured_read_memory_integer().  MEMADDR and LEN are filled in
255
   by gdb_read_memory_integer().  RESULT is the contents that were
256
   successfully read from MEMADDR of length LEN.  */
257
 
258
struct captured_read_memory_integer_arguments
259
{
260
  CORE_ADDR memaddr;
261
  int len;
262
  enum bfd_endian byte_order;
263
  LONGEST result;
264
};
265
 
266
/* Helper function for gdb_read_memory_integer().  DATA must be a
267
   pointer to a captured_read_memory_integer_arguments struct.
268
   Return 1 if successful.  Note that the catch_errors() interface
269
   will return 0 if an error occurred while reading memory.  This
270
   choice of return code is so that we can distinguish between
271
   success and failure.  */
272
 
273
static int
274
do_captured_read_memory_integer (void *data)
275
{
276
  struct captured_read_memory_integer_arguments *args = (struct captured_read_memory_integer_arguments*) data;
277
  CORE_ADDR memaddr = args->memaddr;
278
  int len = args->len;
279
  enum bfd_endian byte_order = args->byte_order;
280
 
281
  args->result = read_memory_integer (memaddr, len, byte_order);
282
 
283
  return 1;
284
}
285
 
286
/* Read memory at MEMADDR of length LEN and put the contents in
287
   RETURN_VALUE.  Return 0 if MEMADDR couldn't be read and non-zero
288
   if successful.  */
289
 
290
int
291
safe_read_memory_integer (CORE_ADDR memaddr, int len,
292
                          enum bfd_endian byte_order,
293
                          LONGEST *return_value)
294
{
295
  int status;
296
  struct captured_read_memory_integer_arguments args;
297
 
298
  args.memaddr = memaddr;
299
  args.len = len;
300
  args.byte_order = byte_order;
301
 
302
  status = catch_errors (do_captured_read_memory_integer, &args,
303
                        "", RETURN_MASK_ALL);
304
  if (status)
305
    *return_value = args.result;
306
 
307
  return status;
308
}
309
 
310
LONGEST
311
read_memory_integer (CORE_ADDR memaddr, int len, enum bfd_endian byte_order)
312
{
313
  gdb_byte buf[sizeof (LONGEST)];
314
 
315
  read_memory (memaddr, buf, len);
316
  return extract_signed_integer (buf, len, byte_order);
317
}
318
 
319
ULONGEST
320
read_memory_unsigned_integer (CORE_ADDR memaddr, int len, enum bfd_endian byte_order)
321
{
322
  gdb_byte buf[sizeof (ULONGEST)];
323
 
324
  read_memory (memaddr, buf, len);
325
  return extract_unsigned_integer (buf, len, byte_order);
326
}
327
 
328
void
329
read_memory_string (CORE_ADDR memaddr, char *buffer, int max_len)
330
{
331
  char *cp;
332
  int i;
333
  int cnt;
334
 
335
  cp = buffer;
336
  while (1)
337
    {
338
      if (cp - buffer >= max_len)
339
        {
340
          buffer[max_len - 1] = '\0';
341
          break;
342
        }
343
      cnt = max_len - (cp - buffer);
344
      if (cnt > 8)
345
        cnt = 8;
346
      read_memory (memaddr + (int) (cp - buffer), cp, cnt);
347
      for (i = 0; i < cnt && *cp; i++, cp++)
348
        ;                       /* null body */
349
 
350
      if (i < cnt && !*cp)
351
        break;
352
    }
353
}
354
 
355
CORE_ADDR
356
read_memory_typed_address (CORE_ADDR addr, struct type *type)
357
{
358
  gdb_byte *buf = alloca (TYPE_LENGTH (type));
359
 
360
  read_memory (addr, buf, TYPE_LENGTH (type));
361
  return extract_typed_address (buf, type);
362
}
363
 
364
/* Same as target_write_memory, but report an error if can't write.  */
365
void
366
write_memory (CORE_ADDR memaddr, const bfd_byte *myaddr, int len)
367
{
368
  int status;
369
 
370
  status = target_write_memory (memaddr, myaddr, len);
371
  if (status != 0)
372
    memory_error (status, memaddr);
373
}
374
 
375
/* Store VALUE at ADDR in the inferior as a LEN-byte unsigned integer.  */
376
void
377
write_memory_unsigned_integer (CORE_ADDR addr, int len,
378
                               enum bfd_endian byte_order,
379
                               ULONGEST value)
380
{
381
  gdb_byte *buf = alloca (len);
382
 
383
  store_unsigned_integer (buf, len, byte_order, value);
384
  write_memory (addr, buf, len);
385
}
386
 
387
/* Store VALUE at ADDR in the inferior as a LEN-byte signed integer.  */
388
void
389
write_memory_signed_integer (CORE_ADDR addr, int len,
390
                             enum bfd_endian byte_order,
391
                             LONGEST value)
392
{
393
  gdb_byte *buf = alloca (len);
394
 
395
  store_signed_integer (buf, len, byte_order, value);
396
  write_memory (addr, buf, len);
397
}
398
 
399
/* The current default bfd target.  Points to storage allocated for
400
   gnutarget_string.  */
401
char *gnutarget;
402
 
403
/* Same thing, except it is "auto" not NULL for the default case.  */
404
static char *gnutarget_string;
405
static void
406
show_gnutarget_string (struct ui_file *file, int from_tty,
407
                       struct cmd_list_element *c, const char *value)
408
{
409
  fprintf_filtered (file, _("The current BFD target is \"%s\".\n"), value);
410
}
411
 
412
static void set_gnutarget_command (char *, int, struct cmd_list_element *);
413
 
414
static void
415
set_gnutarget_command (char *ignore, int from_tty, struct cmd_list_element *c)
416
{
417
  if (strcmp (gnutarget_string, "auto") == 0)
418
    gnutarget = NULL;
419
  else
420
    gnutarget = gnutarget_string;
421
}
422
 
423
/* Set the gnutarget.  */
424
void
425
set_gnutarget (char *newtarget)
426
{
427
  if (gnutarget_string != NULL)
428
    xfree (gnutarget_string);
429
  gnutarget_string = xstrdup (newtarget);
430
  set_gnutarget_command (NULL, 0, NULL);
431
}
432
 
433
void
434
_initialize_core (void)
435
{
436
  struct cmd_list_element *c;
437
 
438
  c = add_cmd ("core-file", class_files, core_file_command, _("\
439
Use FILE as core dump for examining memory and registers.\n\
440
No arg means have no core file.  This command has been superseded by the\n\
441
`target core' and `detach' commands."), &cmdlist);
442
  set_cmd_completer (c, filename_completer);
443
 
444
 
445
  add_setshow_string_noescape_cmd ("gnutarget", class_files,
446
                                   &gnutarget_string, _("\
447
Set the current BFD target."), _("\
448
Show the current BFD target."), _("\
449
Use `set gnutarget auto' to specify automatic detection."),
450
                                   set_gnutarget_command,
451
                                   show_gnutarget_string,
452
                                   &setlist, &showlist);
453
 
454
  if (getenv ("GNUTARGET"))
455
    set_gnutarget (getenv ("GNUTARGET"));
456
  else
457
    set_gnutarget ("auto");
458
}

powered by: WebSVN 2.1.0

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