[PATCH] m68k multi-arch

Grace Sainsbury graces@redhat.com
Tue Jul 2 10:04:00 GMT 2002


I did some more on the m68k multi-arch. I think I'm finished, so let
me know if you see anything that needs doing.

grace

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
-------------- next part --------------
Index: gdb/m68k-tdep.c
===================================================================
RCS file: /cvs/src/src/gdb/m68k-tdep.c,v
retrieving revision 1.21
diff -u -r1.21 m68k-tdep.c
--- gdb/m68k-tdep.c	26 Jun 2002 17:09:29 -0000	1.21
+++ gdb/m68k-tdep.c	2 Jul 2002 16:16:51 -0000
@@ -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 @@
 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 @@
 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 @@
 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 @@
   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 @@
   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 @@
 	  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 @@
 
   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);
Index: gdb/config/m68k/tm-m68k.h
===================================================================
RCS file: /cvs/src/src/gdb/config/m68k/tm-m68k.h,v
retrieving revision 1.17
diff -u -r1.17 tm-m68k.h
--- gdb/config/m68k/tm-m68k.h	26 Jun 2002 17:09:30 -0000	1.17
+++ gdb/config/m68k/tm-m68k.h	2 Jul 2002 16:16:52 -0000
@@ -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 @@
 #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 @@
 #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 @@
 #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 @@
 /* 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 @@
    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 @@
 	         (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 @@
    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).  */


More information about the Gdb-patches mailing list