* coff-solib.c (coff_solib_add): Cast result of alloca().
* m68k-tdep.c (m68k_saved_pc_after_call): Get rid of GDB_TARGET_IS_SUN3. Use more general SYSCALL_TRAP macro. * config/m68k/m68klynx.mh (NATDEPFILES): Remove exec.o (it's already in TDEPFILES). * config/m68k/tm-m68k.h (SAVED_PC_AFTER_CALL): Use m68k_saved_pc_after_call. * Remove all Sun3 specific stuff. * (FIX_CALL_DUMMY): Cast arg to bfd_putb32 to unsigned char *. * config/m68k/tm-m68klynx.h: Define SYSCALL_TRAP as trap #10. Disable REMOTE_BREAKPOINT mechanism. * config/m68k/tm-sun3.h: Get rid of GDB_TARGET_IS_SUN3. * Protect from multiple includion. * Move Sun3 specific stuff from tm-m68k.h to here. * Define SYSCALL_TRAP as trap #0. * Remove def of SAVED_PC_AFTER_CALL (now in tm-m68k.h). * gdbserver/low-lynx.c: Redo all register store/fetch stuff to make it portable for 386 and 68k.
This commit is contained in:
parent
115f743028
commit
9a13e99e20
7 changed files with 177 additions and 76 deletions
|
@ -1,3 +1,24 @@
|
|||
Fri Nov 12 10:39:31 1993 Stu Grossman (grossman at cygnus.com)
|
||||
|
||||
* coff-solib.c (coff_solib_add): Cast result of alloca().
|
||||
* m68k-tdep.c (m68k_saved_pc_after_call): Get rid of
|
||||
GDB_TARGET_IS_SUN3. Use more general SYSCALL_TRAP macro.
|
||||
* config/m68k/m68klynx.mh (NATDEPFILES): Remove exec.o (it's
|
||||
already in TDEPFILES).
|
||||
* config/m68k/tm-m68k.h (SAVED_PC_AFTER_CALL): Use
|
||||
m68k_saved_pc_after_call.
|
||||
* Remove all Sun3 specific stuff.
|
||||
* (FIX_CALL_DUMMY): Cast arg to bfd_putb32 to unsigned char *.
|
||||
* config/m68k/tm-m68klynx.h: Define SYSCALL_TRAP as trap #10.
|
||||
Disable REMOTE_BREAKPOINT mechanism.
|
||||
* config/m68k/tm-sun3.h: Get rid of GDB_TARGET_IS_SUN3.
|
||||
* Protect from multiple includion.
|
||||
* Move Sun3 specific stuff from tm-m68k.h to here.
|
||||
* Define SYSCALL_TRAP as trap #0.
|
||||
* Remove def of SAVED_PC_AFTER_CALL (now in tm-m68k.h).
|
||||
* gdbserver/low-lynx.c: Redo all register store/fetch stuff to
|
||||
make it portable for 386 and 68k.
|
||||
|
||||
Fri Nov 12 09:53:26 1993 Jim Kingdon (kingdon@lioth.cygnus.com)
|
||||
|
||||
* mips-tdep.c (init_extra_frame_info): Check to see whether the
|
||||
|
|
|
@ -67,7 +67,7 @@ coff_solib_add (arg_string, from_tty, target)
|
|||
|
||||
libsize = bfd_section_size (exec_bfd, libsect);
|
||||
|
||||
lib = alloca (libsize);
|
||||
lib = (unsigned char *) alloca (libsize);
|
||||
|
||||
bfd_get_section_contents (exec_bfd, libsect, lib, 0, libsize);
|
||||
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
XM_FILE= xm-m68klynx.h
|
||||
XDEPFILES=
|
||||
NAT_FILE= nm-m68klynx.h
|
||||
NATDEPFILES= exec.o infptrace.o inftarg.o fork-child.o corelow.o m68kly-nat.o
|
||||
NATDEPFILES= fork-child.o infptrace.o inftarg.o corelow.o m68kly-nat.o
|
||||
REGEX=regex.o
|
||||
REGEX1=regex.o
|
||||
GDBSERVER_LIBS= -lbsd
|
||||
|
|
|
@ -42,8 +42,14 @@ extern CORE_ADDR m68k_skip_prologue PARAMS ((CORE_ADDR ip));
|
|||
the new frame is not set up until the new function executes
|
||||
some instructions. */
|
||||
|
||||
#ifdef __STDC__
|
||||
struct frame_info;
|
||||
#endif
|
||||
|
||||
extern CORE_ADDR m68k_saved_pc_after_call PARAMS ((struct frame_info *));
|
||||
|
||||
#define SAVED_PC_AFTER_CALL(frame) \
|
||||
read_memory_integer (read_register (SP_REGNUM), 4)
|
||||
m68k_saved_pc_after_call(frame)
|
||||
|
||||
/* Stack grows downward. */
|
||||
|
||||
|
@ -88,29 +94,22 @@ read_memory_integer (read_register (SP_REGNUM), 4)
|
|||
|
||||
#define REGISTER_TYPE long
|
||||
|
||||
#define REGISTER_BYTES_SUN3 (16*4 + 8 + 8*12 + 3*4 + 4)
|
||||
#define REGISTER_BYTES_FP (16*4 + 8 + 8*12 + 3*4)
|
||||
#define REGISTER_BYTES_NOFP (16*4 + 8)
|
||||
|
||||
#if defined (GDB_TARGET_IS_SUN3)
|
||||
/* Sun3 status includes fpflags, which shows whether the FPU has been used
|
||||
by the process, and whether the FPU was done with an instruction or
|
||||
was interrupted in the middle of a long instruction. See
|
||||
<machine/reg.h>. */
|
||||
/* a&d, pc,sr, fp, fpstat, fpflags */
|
||||
# define NUM_REGS 31
|
||||
# define REGISTER_BYTES (16*4 + 8 + 8*12 + 3*4 + 4)
|
||||
# define REGISTER_BYTES_OK(b) \
|
||||
((b) == REGISTER_BYTES_SUN3 \
|
||||
|| (b) == REGISTER_BYTES_FP \
|
||||
|| (b) == REGISTER_BYTES_NOFP)
|
||||
#else /* Not sun3. */
|
||||
# define NUM_REGS 29
|
||||
# define REGISTER_BYTES_OK(b) \
|
||||
((b) == REGISTER_BYTES_FP \
|
||||
|| (b) == REGISTER_BYTES_NOFP)
|
||||
# define REGISTER_BYTES (16*4 + 8 + 8*12 + 3*4)
|
||||
#endif /* Not sun3. */
|
||||
#ifndef NUM_REGS
|
||||
#define NUM_REGS 29
|
||||
#endif
|
||||
|
||||
#ifndef REGISTER_BYTES_OK
|
||||
#define REGISTER_BYTES_OK(b) \
|
||||
((b) == REGISTER_BYTES_FP \
|
||||
|| (b) == REGISTER_BYTES_NOFP)
|
||||
#endif
|
||||
|
||||
#ifndef REGISTER_BYTES
|
||||
#define REGISTER_BYTES (16*4 + 8 + 8*12 + 3*4)
|
||||
#endif
|
||||
|
||||
/* Index within `registers' of the first byte of the space for
|
||||
register N. */
|
||||
|
@ -360,8 +359,8 @@ extern const struct ext_format ext_format_68881;
|
|||
We use the BFD routines to store a big-endian value of known size. */
|
||||
|
||||
#define FIX_CALL_DUMMY(dummyname, pc, fun, nargs, args, type, gcc_p) \
|
||||
{ bfd_putb32 (fun, (char *) dummyname + CALL_DUMMY_START_OFFSET + 2); \
|
||||
bfd_putb32 (nargs*4, (char *) dummyname + CALL_DUMMY_START_OFFSET + 8); }
|
||||
{ bfd_putb32 (fun, (unsigned char *) dummyname + CALL_DUMMY_START_OFFSET + 2); \
|
||||
bfd_putb32 (nargs*4, (unsigned char *) dummyname + CALL_DUMMY_START_OFFSET + 8); }
|
||||
|
||||
/* Push an empty stack frame, to record the current PC, etc. */
|
||||
|
||||
|
|
|
@ -20,10 +20,19 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
|
|||
#ifndef TM_M68KLYNX_H
|
||||
#define TM_M68KLYNX_H
|
||||
|
||||
/* If PC-2 contains this instruction, then we know what we are in a system
|
||||
call stub, and the return PC is is at SP+4, instead of SP. */
|
||||
|
||||
#define SYSCALL_TRAP 0x4e4a /* trap #10 */
|
||||
#define SYSCALL_TRAP_OFFSET 2 /* PC is after trap instruction */
|
||||
|
||||
/* Use the generic 68k definitions. */
|
||||
|
||||
#include "m68k/tm-m68k.h"
|
||||
|
||||
/* Disable dumbshit alternate breakpoint mechanism needed by 68k stub. */
|
||||
#undef REMOTE_BREAKPOINT
|
||||
|
||||
/* Include COFF shared library support. */
|
||||
|
||||
#include "coff-solib.h"
|
||||
|
|
|
@ -17,10 +17,29 @@ 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. */
|
||||
|
||||
/* Let native-versus-cross support code know we are targeting sun3,
|
||||
and modify registers to include sun3 fpustate register. */
|
||||
#ifndef TM_SUN3_H
|
||||
#define TM_SUN3_H
|
||||
|
||||
#define GDB_TARGET_IS_SUN3 1
|
||||
/* Sun3 status includes fpflags, which shows whether the FPU has been used
|
||||
by the process, and whether the FPU was done with an instruction or
|
||||
was interrupted in the middle of a long instruction. See
|
||||
<machine/reg.h>. */
|
||||
/* a&d, pc,sr, fp, fpstat, fpflags */
|
||||
|
||||
#define REGISTER_BYTES (16*4 + 8 + 8*12 + 3*4 + 4)
|
||||
|
||||
#define NUM_REGS 31
|
||||
|
||||
#define REGISTER_BYTES_OK(b) \
|
||||
((b) == REGISTER_BYTES \
|
||||
|| (b) == REGISTER_BYTES_FP \
|
||||
|| (b) == REGISTER_BYTES_NOFP)
|
||||
|
||||
/* If PC contains this instruction, then we know what we are in a system
|
||||
call stub, and the return PC is is at SP+4, instead of SP. */
|
||||
|
||||
#define SYSCALL_TRAP 0x4e40 /* trap #0 */
|
||||
#define SYSCALL_TRAP_OFFSET 0 /* PC points at trap instruction */
|
||||
|
||||
#include "m68k/tm-m68k.h"
|
||||
|
||||
|
@ -53,16 +72,8 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
|
|||
|
||||
#define GET_LONGJMP_TARGET(ADDR) get_longjmp_target(ADDR)
|
||||
|
||||
#undef SAVED_PC_AFTER_CALL
|
||||
|
||||
#ifdef __STDC__
|
||||
struct frame_info;
|
||||
#endif
|
||||
|
||||
extern CORE_ADDR m68k_saved_pc_after_call PARAMS ((struct frame_info *));
|
||||
|
||||
#define SAVED_PC_AFTER_CALL(frame) \
|
||||
m68k_saved_pc_after_call(frame)
|
||||
/* If sun3 pcc says that a parameter is a short, it's a short. */
|
||||
#define BELIEVE_PCC_PROMOTION_TYPE
|
||||
|
||||
/* Sun /bin/cc gets this right as of SunOS 4.1.x. We need to define
|
||||
BELIEVE_PCC_PROMOTION to get this right now that the code which
|
||||
|
@ -92,3 +103,5 @@ extern CORE_ADDR m68k_saved_pc_after_call PARAMS ((struct frame_info *));
|
|||
#undef SIG_PC_FP_OFFSET
|
||||
#define SIG_PC_FP_OFFSET 324
|
||||
#define SIG_SP_FP_OFFSET 332
|
||||
|
||||
#endif /* TM_SUN3_H */
|
||||
|
|
|
@ -152,53 +152,100 @@ myresume (step, signal)
|
|||
#undef offsetof
|
||||
#define offsetof(TYPE, MEMBER) ((unsigned long) &((TYPE *)0)->MEMBER)
|
||||
|
||||
static struct econtext *
|
||||
lynx_registers_addr()
|
||||
{
|
||||
st_t *stblock;
|
||||
int ecpoff = offsetof(st_t, ecp);
|
||||
CORE_ADDR ecp;
|
||||
|
||||
errno = 0;
|
||||
stblock = (st_t *) ptrace (PTRACE_THREADUSER, inferior_pid,
|
||||
(PTRACE_ARG3_TYPE)0, 0);
|
||||
if (errno)
|
||||
perror_with_name ("PTRACE_THREADUSER");
|
||||
|
||||
ecp = (CORE_ADDR) ptrace (PTRACE_PEEKTHREAD, inferior_pid,
|
||||
(PTRACE_ARG3_TYPE)ecpoff, 0);
|
||||
ecp -= (CORE_ADDR)stblock;
|
||||
if (errno)
|
||||
perror_with_name ("lynx_registers_addr(PTRACE_PEEKTHREAD)");
|
||||
|
||||
return (struct econtext *)ecp;
|
||||
}
|
||||
|
||||
static struct econtext *ecp;
|
||||
|
||||
/* Mapping between GDB register #s and offsets into econtext. Must be
|
||||
consistent with REGISTER_NAMES macro in tm-i386v.h. */
|
||||
consistent with REGISTER_NAMES macro in various tmXXX.h files. */
|
||||
|
||||
#define X(ENTRY)(offsetof(struct econtext, ENTRY) / 4)
|
||||
static int regmap[] = {
|
||||
#define X(ENTRY)(offsetof(struct econtext, ENTRY))
|
||||
|
||||
#ifdef I386
|
||||
/* Mappings from tm-i386v.h */
|
||||
|
||||
static int regmap[] =
|
||||
{
|
||||
X(eax),
|
||||
X(ecx),
|
||||
X(edx),
|
||||
X(ebx),
|
||||
X(esp),
|
||||
X(ebp),
|
||||
X(esp), /* sp */
|
||||
X(ebp), /* fp */
|
||||
X(esi),
|
||||
X(edi),
|
||||
X(eip),
|
||||
X(eip), /* pc */
|
||||
X(flags), /* ps */
|
||||
X(cs),
|
||||
X(ss),
|
||||
X(ds),
|
||||
X(es),
|
||||
X(ecode), /* Lynx doesn't give us either fs or gs, so */
|
||||
X(fault) /* we just substitute these two in the hopes
|
||||
X(fault), /* we just substitute these two in the hopes
|
||||
that they are useful. */
|
||||
};
|
||||
};
|
||||
#endif
|
||||
|
||||
#ifdef M68K
|
||||
/* Mappings from tm-m68k.h */
|
||||
|
||||
static int regmap[] =
|
||||
{
|
||||
X(regs[0]), /* d0 */
|
||||
X(regs[1]), /* d1 */
|
||||
X(regs[2]), /* d2 */
|
||||
X(regs[3]), /* d3 */
|
||||
X(regs[4]), /* d4 */
|
||||
X(regs[5]), /* d5 */
|
||||
X(regs[6]), /* d6 */
|
||||
X(regs[7]), /* d7 */
|
||||
X(regs[8]), /* a0 */
|
||||
X(regs[9]), /* a1 */
|
||||
X(regs[10]), /* a2 */
|
||||
X(regs[11]), /* a3 */
|
||||
X(regs[12]), /* a4 */
|
||||
X(regs[13]), /* a5 */
|
||||
X(regs[14]), /* fp */
|
||||
0, /* sp */
|
||||
X(status), /* ps */
|
||||
X(pc),
|
||||
|
||||
X(fregs[0*3]), /* fp0 */
|
||||
X(fregs[1*3]), /* fp1 */
|
||||
X(fregs[2*3]), /* fp2 */
|
||||
X(fregs[3*3]), /* fp3 */
|
||||
X(fregs[4*3]), /* fp4 */
|
||||
X(fregs[5*3]), /* fp5 */
|
||||
X(fregs[6*3]), /* fp6 */
|
||||
X(fregs[7*3]), /* fp7 */
|
||||
|
||||
X(fcregs[0]), /* fpcontrol */
|
||||
X(fcregs[1]), /* fpstatus */
|
||||
X(fcregs[2]), /* fpiaddr */
|
||||
X(ssw), /* fpcode */
|
||||
X(fault), /* fpflags */
|
||||
};
|
||||
#endif
|
||||
|
||||
/* Return the offset relative to the start of the per-thread data to the
|
||||
saved context block. */
|
||||
|
||||
static unsigned long
|
||||
lynx_registers_addr()
|
||||
{
|
||||
CORE_ADDR stblock;
|
||||
int ecpoff = offsetof(st_t, ecp);
|
||||
CORE_ADDR ecp;
|
||||
|
||||
errno = 0;
|
||||
stblock = (CORE_ADDR) ptrace (PTRACE_THREADUSER, inferior_pid,
|
||||
(PTRACE_ARG3_TYPE)0, 0);
|
||||
if (errno)
|
||||
perror_with_name ("PTRACE_THREADUSER");
|
||||
|
||||
ecp = (CORE_ADDR) ptrace (PTRACE_PEEKTHREAD, inferior_pid,
|
||||
(PTRACE_ARG3_TYPE)ecpoff, 0);
|
||||
if (errno)
|
||||
perror_with_name ("lynx_registers_addr(PTRACE_PEEKTHREAD)");
|
||||
|
||||
return ecp - stblock;
|
||||
}
|
||||
|
||||
/* Fetch one or more registers from the inferior. REGNO == -1 to get
|
||||
them all. We actually fetch more than requested, when convenient,
|
||||
|
@ -210,15 +257,21 @@ fetch_inferior_registers (ignored)
|
|||
{
|
||||
int regno;
|
||||
unsigned long reg;
|
||||
struct econtext *ecp;
|
||||
unsigned long ecp;
|
||||
|
||||
ecp = lynx_registers_addr();
|
||||
|
||||
for (regno = 0; regno < NUM_REGS; regno++)
|
||||
{
|
||||
int ptrace_fun = PTRACE_PEEKTHREAD;
|
||||
|
||||
#ifdef PTRACE_PEEKUSP
|
||||
ptrace_fun = regno == SP_REGNUM ? PTRACE_PEEKUSP : PTRACE_PEEKTHREAD;
|
||||
#endif
|
||||
|
||||
errno = 0;
|
||||
reg = ptrace (PTRACE_PEEKTHREAD, inferior_pid,
|
||||
(PTRACE_ARG3_TYPE) (&ecp->fault + regmap[regno]), 0);
|
||||
reg = ptrace (ptrace_fun, inferior_pid,
|
||||
(PTRACE_ARG3_TYPE) (ecp + regmap[regno]), 0);
|
||||
if (errno)
|
||||
perror_with_name ("fetch_inferior_registers(PTRACE_PEEKTHREAD)");
|
||||
|
||||
|
@ -236,17 +289,23 @@ store_inferior_registers (ignored)
|
|||
{
|
||||
int regno;
|
||||
unsigned long reg;
|
||||
struct econtext *ecp;
|
||||
unsigned long ecp;
|
||||
|
||||
ecp = lynx_registers_addr();
|
||||
|
||||
for (regno = 0; regno < NUM_REGS; regno++)
|
||||
{
|
||||
int ptrace_fun = PTRACE_POKEUSER;
|
||||
|
||||
#ifdef PTRACE_POKEUSP
|
||||
ptrace_fun = regno == SP_REGNUM ? PTRACE_POKEUSP : PTRACE_POKEUSER;
|
||||
#endif
|
||||
|
||||
reg = *(unsigned long *)®isters[REGISTER_BYTE (regno)];
|
||||
|
||||
errno = 0;
|
||||
ptrace (PTRACE_POKEUSER, inferior_pid,
|
||||
(PTRACE_ARG3_TYPE) (&ecp->fault + regmap[regno]), reg);
|
||||
ptrace (ptrace_fun, inferior_pid,
|
||||
(PTRACE_ARG3_TYPE) (ecp + regmap[regno]), reg);
|
||||
if (errno)
|
||||
perror_with_name ("PTRACE_POKEUSER");
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue