You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

181 lines
4.1 KiB

36 years ago
/* Low level MIPS interface to ptrace, for GDB when running under Unix.
Copyright (C) 1988, 1989, 1991 Free Software Foundation, Inc.
Contributed by Alessandro Forin(af@cs.cmu.edu) at CMU
and by Per Bothner(bothner@cs.wisc.edu) at U.Wisconsin.
This file is part of GDB.
This program is free software; you can redistribute it and/or modify
36 years ago
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
36 years ago
This program is distributed in the hope that it will be useful,
36 years ago
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
36 years ago
#include <stdio.h>
#ifdef sgi
#include <sys/inst.h>
#else
36 years ago
#include <mips/inst.h>
#endif
36 years ago
#include "defs.h"
#include "frame.h"
#include "inferior.h"
#include "symtab.h"
#include "value.h"
#ifdef USG
#include <sys/types.h>
#endif
#include <sys/param.h>
#include <sys/dir.h>
#include <signal.h>
#include <sys/ioctl.h>
/* #include <fcntl.h> Can we live without this? */
#include "gdbcore.h"
#include <sys/user.h> /* After a.out.h */
#include <sys/file.h>
#include <sys/stat.h>
/* For now we stub this out; sgi format is super-hairy (and completely
different in the new release) */
#ifdef sgi
void
fetch_core_registers ()
{
return;
}
void
fetch_inferior_registers ()
{
return;
}
store_inferior_registers (regno)
int regno;
{
return;
}
#else
* infrun.c: Fixed typo in comment. * utils.c: All the v*fprintf emulation is now in libiberty, so we can get rid of some junk. * xm-sun3os4.h, xm-sun4os4.h, xconfig/decstation, xconfig/i386sco, xconfig/sun3os4, xconfig/sun4os4: Don`t need HAVE_STRSTR any more. * m68k-pinsn.c (print_insn_arg): Support BB/BW/BL type operands, as used by branch instructions. * gmalloc.c: Fix prototype of memcpy. * elfread.c: Comment out register_addr, since it conflicts with the one in coredep.c. * buildsym.h: Remove extern declarations of two functions that are really static in buildsym.c. * tm-mips.h: Add symbolic names for more registers. * mips-xdep.c (store_inferior_registers): Use new register names. * xm-mips.h: Simplify REGISTER_U_ADDR, since it is now only used for core files, not ptrace. Therefore, the KERNEL_U_ADDR hack is no longer needed. The mapping to ptrace number is now in in mips-xdep.c. * mips-xdep.c: Define REGISTER_PTRACE_ADDR (using the mapping from the old REGISTER_U_ADDR), and use it in {fetch,store}_inferior_registers. * mipsread.c: Rename #include ecoff.h to new name coff-mips.h. * mips-tdep.c (mips_push_dummy_frame, mips_pop_frame): Save/restore FP regs correctly (?). * dbxread.c: Remove duplicate define_symbol and type_synonym_name (these had been previously moved to buildsym.c). Hence, define_symbol becomes extern instead of static. * buildsym.c (read_struct_type): Comment out bogus handling of C++ operator methods. Minor hacking of reading of class contexts. Make define_symbol non-static, so dbxread.c can call it.
35 years ago
/* Map gdb internal register number to ptrace address. */
#define REGISTER_PTRACE_ADDR(regno) \
(regno < 32 ? regno \
: regno == PC_REGNUM ? 96 \
: regno == CAUSE_REGNUM ? 97 \
: regno == HI_REGNUM ? 98 \
: regno == LO_REGNUM ? 99 \
: regno == FCRCS_REGNUM ? 100 \
: regno == FCRIR_REGNUM ? 101 \
: regno >= FP0_REGNUM ? regno - (FP0_REGNUM-32)\
: 0)
36 years ago
/* Get all registers from the inferior */
void
fetch_inferior_registers ()
{
register int regno;
register unsigned int regaddr;
char buf[MAX_REGISTER_RAW_SIZE];
register int i;
registers_fetched ();
for (regno = 1; regno < NUM_REGS; regno++)
{
* infrun.c: Fixed typo in comment. * utils.c: All the v*fprintf emulation is now in libiberty, so we can get rid of some junk. * xm-sun3os4.h, xm-sun4os4.h, xconfig/decstation, xconfig/i386sco, xconfig/sun3os4, xconfig/sun4os4: Don`t need HAVE_STRSTR any more. * m68k-pinsn.c (print_insn_arg): Support BB/BW/BL type operands, as used by branch instructions. * gmalloc.c: Fix prototype of memcpy. * elfread.c: Comment out register_addr, since it conflicts with the one in coredep.c. * buildsym.h: Remove extern declarations of two functions that are really static in buildsym.c. * tm-mips.h: Add symbolic names for more registers. * mips-xdep.c (store_inferior_registers): Use new register names. * xm-mips.h: Simplify REGISTER_U_ADDR, since it is now only used for core files, not ptrace. Therefore, the KERNEL_U_ADDR hack is no longer needed. The mapping to ptrace number is now in in mips-xdep.c. * mips-xdep.c: Define REGISTER_PTRACE_ADDR (using the mapping from the old REGISTER_U_ADDR), and use it in {fetch,store}_inferior_registers. * mipsread.c: Rename #include ecoff.h to new name coff-mips.h. * mips-tdep.c (mips_push_dummy_frame, mips_pop_frame): Save/restore FP regs correctly (?). * dbxread.c: Remove duplicate define_symbol and type_synonym_name (these had been previously moved to buildsym.c). Hence, define_symbol becomes extern instead of static. * buildsym.c (read_struct_type): Comment out bogus handling of C++ operator methods. Minor hacking of reading of class contexts. Make define_symbol non-static, so dbxread.c can call it.
35 years ago
regaddr = REGISTER_PTRACE_ADDR (regno);
36 years ago
for (i = 0; i < REGISTER_RAW_SIZE (regno); i += sizeof (int))
{
*(int *) &buf[i] = ptrace (3, inferior_pid, regaddr, 0);
regaddr += sizeof (int);
}
supply_register (regno, buf);
}
}
/* Store our register values back into the inferior.
If REGNO is -1, do this for all registers.
Otherwise, REGNO specifies which register (so we can save time). */
void
36 years ago
store_inferior_registers (regno)
int regno;
{
36 years ago
register unsigned int regaddr;
char buf[80];
if (regno == 0)
return;
if (regno > 0)
{
* infrun.c: Fixed typo in comment. * utils.c: All the v*fprintf emulation is now in libiberty, so we can get rid of some junk. * xm-sun3os4.h, xm-sun4os4.h, xconfig/decstation, xconfig/i386sco, xconfig/sun3os4, xconfig/sun4os4: Don`t need HAVE_STRSTR any more. * m68k-pinsn.c (print_insn_arg): Support BB/BW/BL type operands, as used by branch instructions. * gmalloc.c: Fix prototype of memcpy. * elfread.c: Comment out register_addr, since it conflicts with the one in coredep.c. * buildsym.h: Remove extern declarations of two functions that are really static in buildsym.c. * tm-mips.h: Add symbolic names for more registers. * mips-xdep.c (store_inferior_registers): Use new register names. * xm-mips.h: Simplify REGISTER_U_ADDR, since it is now only used for core files, not ptrace. Therefore, the KERNEL_U_ADDR hack is no longer needed. The mapping to ptrace number is now in in mips-xdep.c. * mips-xdep.c: Define REGISTER_PTRACE_ADDR (using the mapping from the old REGISTER_U_ADDR), and use it in {fetch,store}_inferior_registers. * mipsread.c: Rename #include ecoff.h to new name coff-mips.h. * mips-tdep.c (mips_push_dummy_frame, mips_pop_frame): Save/restore FP regs correctly (?). * dbxread.c: Remove duplicate define_symbol and type_synonym_name (these had been previously moved to buildsym.c). Hence, define_symbol becomes extern instead of static. * buildsym.c (read_struct_type): Comment out bogus handling of C++ operator methods. Minor hacking of reading of class contexts. Make define_symbol non-static, so dbxread.c can call it.
35 years ago
regaddr = REGISTER_PTRACE_ADDR (regno);
36 years ago
errno = 0;
ptrace (6, inferior_pid, regaddr, read_register (regno));
if (errno != 0)
{
sprintf (buf, "writing register number %d", regno);
perror_with_name (buf);
}
}
else
{
* infrun.c: Fixed typo in comment. * utils.c: All the v*fprintf emulation is now in libiberty, so we can get rid of some junk. * xm-sun3os4.h, xm-sun4os4.h, xconfig/decstation, xconfig/i386sco, xconfig/sun3os4, xconfig/sun4os4: Don`t need HAVE_STRSTR any more. * m68k-pinsn.c (print_insn_arg): Support BB/BW/BL type operands, as used by branch instructions. * gmalloc.c: Fix prototype of memcpy. * elfread.c: Comment out register_addr, since it conflicts with the one in coredep.c. * buildsym.h: Remove extern declarations of two functions that are really static in buildsym.c. * tm-mips.h: Add symbolic names for more registers. * mips-xdep.c (store_inferior_registers): Use new register names. * xm-mips.h: Simplify REGISTER_U_ADDR, since it is now only used for core files, not ptrace. Therefore, the KERNEL_U_ADDR hack is no longer needed. The mapping to ptrace number is now in in mips-xdep.c. * mips-xdep.c: Define REGISTER_PTRACE_ADDR (using the mapping from the old REGISTER_U_ADDR), and use it in {fetch,store}_inferior_registers. * mipsread.c: Rename #include ecoff.h to new name coff-mips.h. * mips-tdep.c (mips_push_dummy_frame, mips_pop_frame): Save/restore FP regs correctly (?). * dbxread.c: Remove duplicate define_symbol and type_synonym_name (these had been previously moved to buildsym.c). Hence, define_symbol becomes extern instead of static. * buildsym.c (read_struct_type): Comment out bogus handling of C++ operator methods. Minor hacking of reading of class contexts. Make define_symbol non-static, so dbxread.c can call it.
35 years ago
for (regno = 0; regno < NUM_REGS; regno++)
36 years ago
{
* infrun.c: Fixed typo in comment. * utils.c: All the v*fprintf emulation is now in libiberty, so we can get rid of some junk. * xm-sun3os4.h, xm-sun4os4.h, xconfig/decstation, xconfig/i386sco, xconfig/sun3os4, xconfig/sun4os4: Don`t need HAVE_STRSTR any more. * m68k-pinsn.c (print_insn_arg): Support BB/BW/BL type operands, as used by branch instructions. * gmalloc.c: Fix prototype of memcpy. * elfread.c: Comment out register_addr, since it conflicts with the one in coredep.c. * buildsym.h: Remove extern declarations of two functions that are really static in buildsym.c. * tm-mips.h: Add symbolic names for more registers. * mips-xdep.c (store_inferior_registers): Use new register names. * xm-mips.h: Simplify REGISTER_U_ADDR, since it is now only used for core files, not ptrace. Therefore, the KERNEL_U_ADDR hack is no longer needed. The mapping to ptrace number is now in in mips-xdep.c. * mips-xdep.c: Define REGISTER_PTRACE_ADDR (using the mapping from the old REGISTER_U_ADDR), and use it in {fetch,store}_inferior_registers. * mipsread.c: Rename #include ecoff.h to new name coff-mips.h. * mips-tdep.c (mips_push_dummy_frame, mips_pop_frame): Save/restore FP regs correctly (?). * dbxread.c: Remove duplicate define_symbol and type_synonym_name (these had been previously moved to buildsym.c). Hence, define_symbol becomes extern instead of static. * buildsym.c (read_struct_type): Comment out bogus handling of C++ operator methods. Minor hacking of reading of class contexts. Make define_symbol non-static, so dbxread.c can call it.
35 years ago
if (regno == ZERO_REGNUM || regno == PS_REGNUM
|| regno == BADVADDR_REGNUM || regno == CAUSE_REGNUM
|| regno == FCRIR_REGNUM || regno == FP_REGNUM)
36 years ago
continue;
regaddr = register_addr (regno, 1);
errno = 0;
ptrace (6, inferior_pid, regaddr, read_register (regno));
if (errno != 0)
{
sprintf (buf, "writing all regs, number %d", regno);
perror_with_name (buf);
}
}
}
}
#endif /* sgi */
#if 0
36 years ago
void
fetch_core_registers ()
{
register int regno;
int val;
for (regno = 1; regno < NUM_REGS; regno++) {
char buf[MAX_REGISTER_RAW_SIZE];
val = bfd_seek (core_bfd, register_addr (regno, 0));
if (val < 0 || (val = bfd_read (core_bfd, buf, sizeof buf)) < 0) {
char buffer[50];
strcpy (buffer, "Reading register ");
strcat (buffer, reg_names[regno]);
perror_with_name (buffer);
}
supply_register (regno, buf);
}
}
#endif /* 0 */