* m68k-tdep.c (m68k_remote_breakpoint_from_pc): Add. Currently not

used in architecture vector. The default is
m68k_local_breakpoint_from_pc.
(m68k_local_breakpoint_from_pc): Add.
(enum): Add register numbers from tm-m68k.h.
(m68k_gdbarch_init): Add breakpoint_from_pc to architecture vector.
* config/m68k/tm-m68k.h (GDB_MULTI_ARCH): Set to
GDB_MULTI_ARCH_PARTIAL.
(BPT_VECTOR, REGISTER_BYTES_FP, REGISTER_BYTES_NOFP)
(NUM_FREGS, SIG_PC_FP_OFFSET, SP_ARG0, REMOTE_BPT_VECTOR): Move to
m68k-tdep.c.
(BREAKPOINT, REMOTE_BREAKPOINT): Remove.
(A1_REGNUM, FP0_REGNUM, FPC_REGNUM, FPS_REGNUM, FPI_REGNUM): Move
to enum in m68k-tdep.c
This commit is contained in:
Grace Sainsbury 2002-07-02 18:13:54 +00:00
parent 7a5a05349e
commit 103a159751
3 changed files with 123 additions and 29 deletions

View File

@ -1,3 +1,21 @@
2002-07-02 Grace Sainsbury <graces@redhat.com>
* m68k-tdep.c (m68k_remote_breakpoint_from_pc): Add. Currently not
used in architecture vector. The default is
m68k_local_breakpoint_from_pc.
(m68k_local_breakpoint_from_pc): Add.
(enum): Add register numbers from tm-m68k.h.
(m68k_gdbarch_init): Add breakpoint_from_pc to architecture
vector.
* config/m68k/tm-m68k.h (GDB_MULTI_ARCH): Set to
GDB_MULTI_ARCH_PARTIAL.
(BPT_VECTOR, REGISTER_BYTES_FP, REGISTER_BYTES_NOFP)
(NUM_FREGS, SIG_PC_FP_OFFSET, SP_ARG0, REMOTE_BPT_VECTOR): Move to
m68k-tdep.c.
(BREAKPOINT, REMOTE_BREAKPOINT): Remove.
(A1_REGNUM, FP0_REGNUM, FPC_REGNUM, FPS_REGNUM, FPI_REGNUM): Move
to enum in m68k-tdep.c
2002-07-02 Joel Brobecker <brobecker@gnat.com>
* solib-osf.c (open_map): Compute the list of shared libraries

View File

@ -21,17 +21,24 @@
#include "regcache.h"
#define GDB_MULTI_ARCH 0
#define GDB_MULTI_ARCH GDB_MULTI_ARCH_PARTIAL
/* Generic 68000 stuff, to be included by other tm-*.h files. */
struct frame_info;
/* struct frame_info; */
/* D0_REGNM and A0_REGNUM must be defined here because they are
used by the monitor. */
#define D0_REGNUM 0
#define A0_REGNUM 8
/* Sequence of bytes for breakpoint instruction.
This is a TRAP instruction. The last 4 bits (0xf below) is the
vector. Systems which don't use 0xf should define BPT_VECTOR
themselves before including this file. */
#if !GDB_MULTI_ARCH
#if !defined (BPT_VECTOR)
#define BPT_VECTOR 0xf
#endif
@ -45,17 +52,22 @@ struct frame_info;
#if !defined (REMOTE_BPT_VECTOR)
#define REMOTE_BPT_VECTOR 1
#endif
#endif
#if !GDB_MULTI_ARCH
#if !defined (REMOTE_BREAKPOINT)
#define REMOTE_BREAKPOINT {0x4e, (0x40 | REMOTE_BPT_VECTOR)}
#endif
#endif
#if !GDB_MULTI_ARCH
#define REGISTER_BYTES_FP (16*4 + 8 + 8*12 + 3*4)
#define REGISTER_BYTES_NOFP (16*4 + 8)
#define NUM_FREGS (NUM_REGS-24)
/* This was determined by experimentation on hp300 BSD 4.3. Perhaps
it corresponds to some offset in /usr/include/sys/user.h or
something like that. Using some system include file would
@ -70,7 +82,7 @@ struct frame_info;
#define SP_ARG0 (1 * 4)
#define TARGET_M68K
#endif
#if !GDB_MULTI_ARCH
#define TARGET_LONG_DOUBLE_FORMAT &floatformat_m68881_ext
@ -147,7 +159,7 @@ extern CORE_ADDR m68k_saved_pc_after_call (struct frame_info *);
#ifndef REGISTER_BYTES
#define REGISTER_BYTES (16*4 + 8 + 8*12 + 3*4)
#endif
#endif //multi-arch
#endif /* multi-arch */
/* Index within `registers' of the first byte of the space for
register N. */
@ -180,7 +192,7 @@ extern CORE_ADDR m68k_saved_pc_after_call (struct frame_info *);
/* Largest value REGISTER_VIRTUAL_SIZE can have. */
#define MAX_REGISTER_VIRTUAL_SIZE 12
#endif //multi-arch
#endif /* multi-arch */
/* Return the GDB type object for the "standard" data type of data
in register N. This should be int for D0-D7, long double for FP0-FP7,
@ -214,21 +226,18 @@ extern CORE_ADDR m68k_saved_pc_after_call (struct frame_info *);
to be actual register numbers as far as the user is concerned
but do serve to get the desired values when passed to read_register. */
#define D0_REGNUM 0
#define A0_REGNUM 8
#define A1_REGNUM 9
#if !GDB_MULTI_ARCH
#define A1_REGNUM 9
#define FP_REGNUM 14 /* Contains address of executing stack frame */
#define SP_REGNUM 15 /* Contains address of top of stack */
#define PS_REGNUM 16 /* Contains processor status */
#define PC_REGNUM 17 /* Contains program counter */
#define FP0_REGNUM 18 /* Floating point register 0 */
#endif
#define FPC_REGNUM 26 /* 68881 control register */
#define FPS_REGNUM 27 /* 68881 status register */
#define FPI_REGNUM 28 /* 68881 iaddr register */
#endif
/* Store the address of the place in which to copy the structure the
subroutine will return. This is called from call_function. */
@ -248,7 +257,7 @@ extern CORE_ADDR m68k_saved_pc_after_call (struct frame_info *);
(TYPE_LENGTH(TYPE) >= 4 ? 0 : 4 - TYPE_LENGTH(TYPE)), \
TYPE_LENGTH(TYPE))
#endif
#endif //multi-arch
#endif /* multi-arch */
/* Write into appropriate registers a function return value
of type TYPE, given in virtual format. Assumes floats are passed
@ -265,7 +274,7 @@ extern CORE_ADDR m68k_saved_pc_after_call (struct frame_info *);
as a CORE_ADDR (or an expression that can be used as one). */
#define DEPRECATED_EXTRACT_STRUCT_VALUE_ADDRESS(REGBUF) (*(CORE_ADDR *)(REGBUF))
#endif //multi-arch
#endif /* multi-arch */
/* Describe the pointer in each stack frame to the previous stack frame
(its caller). */

View File

@ -42,17 +42,83 @@
#define P_FMOVM 0xf237
#define P_TRAP 0x4e40
/* Register numbers of various important registers.
Note that some of these values are "real" register numbers,
and correspond to the general registers of the machine,
and some are "phony" register numbers which are too large
to be actual register numbers as far as the user is concerned
but do serve to get the desired values when passed to read_register. */
/* Note: Since they are used in files other than this (monitor files),
D0_REGNUM and A0_REGNUM are currently defined in tm-m68k.h. */
enum
{
E_A1_REGNUM = 9,
E_FP_REGNUM = 14, /* Contains address of executing stack frame */
E_SP_REGNUM = 15, /* Contains address of top of stack */
E_PS_REGNUM = 16, /* Contains processor status */
E_PC_REGNUM = 17, /* Contains program counter */
E_FP0_REGNUM = 18 /* Floating point register 0 */
E_FP0_REGNUM = 18, /* Floating point register 0 */
E_FPC_REGNUM = 26, /* 68881 control register */
E_FPS_REGNUM = 27, /* 68881 status register */
E_FPI_REGNUM = 28
};
#define REGISTER_BYTES_FP (16*4 + 8 + 8*12 + 3*4)
#define REGISTER_BYTES_NOFP (16*4 + 8)
#define NUM_FREGS (NUM_REGS-24)
/* Offset from SP to first arg on stack at first instruction of a function */
#define SP_ARG0 (1 * 4)
/* This was determined by experimentation on hp300 BSD 4.3. Perhaps
it corresponds to some offset in /usr/include/sys/user.h or
something like that. Using some system include file would
have the advantage of probably being more robust in the face
of OS upgrades, but the disadvantage of being wrong for
cross-debugging. */
#define SIG_PC_FP_OFFSET 530
#define TARGET_M68K
#if !defined (BPT_VECTOR)
#define BPT_VECTOR 0xf
#endif
#if !defined (REMOTE_BPT_VECTOR)
#define REMOTE_BPT_VECTOR 1
#endif
void m68k_frame_init_saved_regs (struct frame_info *frame_info);
/* gdbarch_breakpoint_from_pc is set to m68k_local_breakpoint_from_pc
so m68k_remote_breakpoint_from_pc is currently not used. */
const static unsigned char *
m68k_remote_breakpoint_from_pc (CORE_ADDR *pcptr, int *lenptr)
{
static unsigned char break_insn[] = {0x4e, (0x40 | REMOTE_BPT_VECTOR)};
*lenptr = sizeof (break_insn);
return break_insn;
}
const static unsigned char *
m68k_local_breakpoint_from_pc (CORE_ADDR *pcptr, int *lenptr)
{
static unsigned char break_insn[] = {0x4e, (0x40 | BPT_VECTOR)};
*lenptr = sizeof (break_insn);
return break_insn;
}
static int
m68k_register_bytes_ok (numbytes)
{
@ -92,7 +158,7 @@ m68k_register_virtual_size (int regnum)
static struct type *
m68k_register_virtual_type (int regnum)
{
if ((unsigned) regnum >= FPC_REGNUM)
if ((unsigned) regnum >= E_FPC_REGNUM)
return lookup_pointer_type (builtin_type_void);
else if ((unsigned) regnum >= FP0_REGNUM)
return builtin_type_long_double;
@ -138,8 +204,8 @@ m68k_stack_align (CORE_ADDR addr)
static int
m68k_register_byte (int regnum)
{
if (regnum >= FPC_REGNUM)
return (((regnum - FPC_REGNUM) * 4) + 168);
if (regnum >= E_FPC_REGNUM)
return (((regnum - E_FPC_REGNUM) * 4) + 168);
else if (regnum >= FP0_REGNUM)
return (((regnum - FP0_REGNUM) * 12) + 72);
else
@ -152,7 +218,7 @@ m68k_register_byte (int regnum)
static void
m68k_store_struct_return (CORE_ADDR addr, CORE_ADDR sp)
{
write_register (A1_REGNUM, addr);
write_register (E_A1_REGNUM, addr);
}
/* Extract from an array regbuf containing the (raw) register state
@ -795,14 +861,14 @@ supply_fpregset (fpregset_t *fpregsetp)
register int regi;
char *from;
for (regi = FP0_REGNUM; regi < FPC_REGNUM; regi++)
for (regi = FP0_REGNUM; regi < E_FPC_REGNUM; regi++)
{
from = (char *) &(fpregsetp->f_fpregs[regi - FP0_REGNUM][0]);
supply_register (regi, from);
}
supply_register (FPC_REGNUM, (char *) &(fpregsetp->f_pcr));
supply_register (FPS_REGNUM, (char *) &(fpregsetp->f_psr));
supply_register (FPI_REGNUM, (char *) &(fpregsetp->f_fpiaddr));
supply_register (E_FPC_REGNUM, (char *) &(fpregsetp->f_pcr));
supply_register (E_FPS_REGNUM, (char *) &(fpregsetp->f_psr));
supply_register (E_FPI_REGNUM, (char *) &(fpregsetp->f_fpiaddr));
}
/* Given a pointer to a floating point register set in /proc format
@ -817,7 +883,7 @@ fill_fpregset (fpregset_t *fpregsetp, int regno)
char *to;
char *from;
for (regi = FP0_REGNUM; regi < FPC_REGNUM; regi++)
for (regi = FP0_REGNUM; regi < E_FPC_REGNUM; regi++)
{
if ((regno == -1) || (regno == regi))
{
@ -826,17 +892,17 @@ fill_fpregset (fpregset_t *fpregsetp, int regno)
memcpy (to, from, REGISTER_RAW_SIZE (regi));
}
}
if ((regno == -1) || (regno == FPC_REGNUM))
if ((regno == -1) || (regno == E_FPC_REGNUM))
{
fpregsetp->f_pcr = *(int *) &registers[REGISTER_BYTE (FPC_REGNUM)];
fpregsetp->f_pcr = *(int *) &registers[REGISTER_BYTE (E_FPC_REGNUM)];
}
if ((regno == -1) || (regno == FPS_REGNUM))
if ((regno == -1) || (regno == E_FPS_REGNUM))
{
fpregsetp->f_psr = *(int *) &registers[REGISTER_BYTE (FPS_REGNUM)];
fpregsetp->f_psr = *(int *) &registers[REGISTER_BYTE (E_FPS_REGNUM)];
}
if ((regno == -1) || (regno == FPI_REGNUM))
if ((regno == -1) || (regno == E_FPI_REGNUM))
{
fpregsetp->f_fpiaddr = *(int *) &registers[REGISTER_BYTE (FPI_REGNUM)];
fpregsetp->f_fpiaddr = *(int *) &registers[REGISTER_BYTE (E_FPI_REGNUM)];
}
}
@ -936,6 +1002,7 @@ m68k_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
set_gdbarch_skip_prologue (gdbarch, m68k_skip_prologue);
set_gdbarch_saved_pc_after_call (gdbarch, m68k_saved_pc_after_call);
set_gdbarch_breakpoint_from_pc (gdbarch, m68k_local_breakpoint_from_pc);
/* Stack grows down. */
set_gdbarch_inner_than (gdbarch, core_addr_lessthan);