old-cross-binutils/gdb/mips-xdep.c
John Gilmore 6872cfda60 Changes to make MIPS x 29K compile.
* am29k-tdep.c:  Lint from DECstation compiler.
* mem-break.c:  Restore test of BREAKPOINT size that Fred removed.
As the man page says, "Sometimes you just can't get lint to shut
up".  That doesn't mean you should blow away the code it won't
shut up about.
* mips-xdep.c:  Revise stubbing-out of code until Rich cleans
it up over the next few weeks.  Make mips x 29k build.
* tm-29k.h (CALL_DUMMY):  Make it work on cross-endian hosts.
(FIX_CALL_DUMMY):  Comment in the patching of the breakpoint,
but leave it as a comment because the breakpoint instruction
is not easily accessible at this moment (it's static, and if
we define one here, it goes into every file compiled).
1992-08-11 09:54:24 +00:00

152 lines
3.8 KiB
C

/* Low level MIPS interface to ptrace, for GDB when running under Unix.
Copyright 1988, 1989, 1991, 1992 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
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.
This program is distributed in the hope that it will be useful,
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. */
#include "defs.h"
#include "inferior.h"
#include "gdbcore.h"
/* For now we stub this out; sgi core format is super-hairy (and completely
different in the new release).
For most mips systems, this function is defined in coredep.c. */
#if defined(sgi)
void
fetch_core_registers (core_reg_sect, core_reg_size, which, reg_addr)
char *core_reg_sect;
unsigned core_reg_size;
int which;
unsigned int reg_addr;
{
return;
}
#endif
/* Access to the inferior is only good for native systems, not cross.
I am not sure why this is stubbed out on SGI... --gnu@cygnus.com */
#if defined(sgi) || !defined(GDB_TARGET_IS_MIPS)
/* ARGSUSED */
void
fetch_inferior_registers (regno)
int regno;
{
return;
}
/* ARGSUSED */
void
store_inferior_registers (regno)
int regno;
{
return;
}
#else
/* 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)
/* Get all registers from the inferior */
void
fetch_inferior_registers (regno)
int regno;
{
register unsigned int regaddr;
char buf[MAX_REGISTER_RAW_SIZE];
register int i;
registers_fetched ();
for (regno = 1; regno < NUM_REGS; regno++)
{
regaddr = REGISTER_PTRACE_ADDR (regno);
for (i = 0; i < REGISTER_RAW_SIZE (regno); i += sizeof (int))
{
*(int *) &buf[i] = ptrace (3, inferior_pid,
(PTRACE_ARG3_TYPE) 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
store_inferior_registers (regno)
int regno;
{
register unsigned int regaddr;
char buf[80];
if (regno == 0)
return;
if (regno > 0)
{
regaddr = REGISTER_PTRACE_ADDR (regno);
errno = 0;
ptrace (6, inferior_pid, (PTRACE_ARG3_TYPE) regaddr,
read_register (regno));
if (errno != 0)
{
sprintf (buf, "writing register number %d", regno);
perror_with_name (buf);
}
}
else
{
for (regno = 0; regno < NUM_REGS; regno++)
{
if (regno == ZERO_REGNUM || regno == PS_REGNUM
|| regno == BADVADDR_REGNUM || regno == CAUSE_REGNUM
|| regno == FCRIR_REGNUM || regno == FP_REGNUM
|| (regno >= FIRST_EMBED_REGNUM && regno <= LAST_EMBED_REGNUM))
continue;
regaddr = register_addr (regno, 1);
errno = 0;
ptrace (6, inferior_pid, (PTRACE_ARG3_TYPE) regaddr,
read_register (regno));
if (errno != 0)
{
sprintf (buf, "writing all regs, number %d", regno);
perror_with_name (buf);
}
}
}
}
#endif /* sgi */