diff options
-rw-r--r-- | gdb/ChangeLog | 18 | ||||
-rw-r--r-- | gdb/config/m68k/tm-m68k.h | 33 | ||||
-rw-r--r-- | gdb/m68k-tdep.c | 99 |
3 files changed, 122 insertions, 28 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index cc07fd9ac7b..f9f0cb74317 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -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 diff --git a/gdb/config/m68k/tm-m68k.h b/gdb/config/m68k/tm-m68k.h index fd8656406f7..0c97c50a0cf 100644 --- a/gdb/config/m68k/tm-m68k.h +++ b/gdb/config/m68k/tm-m68k.h @@ -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. */ +#if !GDB_MULTI_ARCH -#define D0_REGNUM 0 -#define A0_REGNUM 8 #define A1_REGNUM 9 -#if !GDB_MULTI_ARCH #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). */ diff --git a/gdb/m68k-tdep.c b/gdb/m68k-tdep.c index d1ab13fb6e1..a39fa948182 100644 --- a/gdb/m68k-tdep.c +++ b/gdb/m68k-tdep.c @@ -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 *) ®isters[REGISTER_BYTE (FPC_REGNUM)]; + fpregsetp->f_pcr = *(int *) ®isters[REGISTER_BYTE (E_FPC_REGNUM)]; } - if ((regno == -1) || (regno == FPS_REGNUM)) + if ((regno == -1) || (regno == E_FPS_REGNUM)) { - fpregsetp->f_psr = *(int *) ®isters[REGISTER_BYTE (FPS_REGNUM)]; + fpregsetp->f_psr = *(int *) ®isters[REGISTER_BYTE (E_FPS_REGNUM)]; } - if ((regno == -1) || (regno == FPI_REGNUM)) + if ((regno == -1) || (regno == E_FPI_REGNUM)) { - fpregsetp->f_fpiaddr = *(int *) ®isters[REGISTER_BYTE (FPI_REGNUM)]; + fpregsetp->f_fpiaddr = *(int *) ®isters[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); |