This is the mail archive of the gdb-patches@sources.redhat.com mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH] FR-V: Improve handling of SPR registers


The patch below depends on some work that Dave Brolley has done on the
simulator.  I'll commit the change below after Dave commits his patch.

I'll eventually provide a pseudo-register for obtaining access iacc0
as a unit (instead of separate upper and lower halves).  But, before
that happens, I have some more de-deprecation to do first.

Of all the SPRs the FR-V has, the simulator had only implemented
support for fetching / setting the link register.  Dave's patch will
provide GDB with the ability to access all of them, making it very
easy to add support for other SPRs from GDB.  The patch below (in
conjunction with Dave's patch) will enable support for all of the
SPRs presently known to GDB (including iacc0).

I had considered (attempting) to provide support for all known FR-V
SPRs from GDB, but there were a number of drawbacks with doing this:
1) The g/G packet would get very large.  2) There are a lot of "holes"
in the register set do to reserved registers, unimplemented registers,
and the like.  3) I don't think it makes sense for all of the remaining
registers to be fetched/set via g/G packets.

Kevin

	* frv-tdep.c (gdb_assert.h, sim-regno.h, opcodes/frv-desc.h):
	Include.
	(iacc0h_regnum, iacc0l_regnum): Define.
	(last_spr_regnum, frv_num_regs): Update.
	(new_variant): Don't supply default names for holes in the SPRs.
	Supply names for iacc0h_regnum and iacc0l_regnum.
	(frv_register_type): Use symbolic constants first_fpr_regnum and
	last_fpr_regnum instead of hardcoded constants 64 and 127.  Use
	builtin_type_int instead of builtin_type_int32.
	(frv_register_sim_regno): New function.
	(frv_gdbarch_init): Call set_gdbarch_register_sim_regno().
	* Makefile.in (frv-tdep.o): Update dependencies.

Index: Makefile.in
===================================================================
RCS file: /cvs/src/src/gdb/Makefile.in,v
retrieving revision 1.463
diff -u -p -r1.463 Makefile.in
--- Makefile.in	24 Oct 2003 20:24:05 -0000	1.463
+++ Makefile.in	31 Oct 2003 00:14:29 -0000
@@ -588,6 +588,7 @@ demangle_h =    $(INCLUDE_DIR)/demangle.
 obstack_h =     $(INCLUDE_DIR)/obstack.h
 opcode_m68hc11_h = $(INCLUDE_DIR)/opcode/m68hc11.h
 readline_h = 	$(READLINE_SRC)/readline.h
+frv_desc_h =	$(OPCODES_SRC)/frv-desc.h
 sh_opc_h = 	$(OPCODES_SRC)/sh-opc.h
 gdb_sim_arm_h =	$(INCLUDE_DIR)/gdb/sim-arm.h
 gdb_sim_d10v_h = $(INCLUDE_DIR)/gdb/sim-d10v.h
@@ -1773,7 +1774,8 @@ frame-unwind.o: frame-unwind.c $(defs_h)
 	$(gdb_assert_h) $(dummy_frame_h)
 frv-tdep.o: frv-tdep.c $(defs_h) $(gdb_string_h) $(inferior_h) $(symfile_h) \
 	$(gdbcore_h) $(arch_utils_h) $(regcache_h) $(frame_h) \
-	$(frame_unwind_h) $(frame_base_h) $(trad_frame_h) $(dis_asm_h)
+	$(frame_unwind_h) $(frame_base_h) $(trad_frame_h) $(dis_asm_h) \
+	$(gdb_assert_h) $(sim_regno_h) $(frv_desc_h)
 f-typeprint.o: f-typeprint.c $(defs_h) $(gdb_obstack_h) $(bfd_h) $(symtab_h) \
 	$(gdbtypes_h) $(expression_h) $(value_h) $(gdbcore_h) $(target_h) \
 	$(f_lang_h) $(gdb_string_h)
Index: frv-tdep.c
===================================================================
RCS file: /cvs/src/src/gdb/frv-tdep.c,v
retrieving revision 1.57
diff -u -p -r1.57 frv-tdep.c
--- frv-tdep.c	27 Oct 2003 06:30:49 -0000	1.57
+++ frv-tdep.c	31 Oct 2003 00:14:29 -0000
@@ -30,6 +30,9 @@
 #include "frame-base.h"
 #include "trad-frame.h"
 #include "dis-asm.h"
+#include "gdb_assert.h"
+#include "sim-regno.h"
+#include "opcodes/frv-desc.h"	/* for the H_SPR_... enums */
 
 extern void _initialize_frv_tdep (void);
 
@@ -45,12 +48,9 @@ static gdbarch_frameless_function_invoca
 static gdbarch_deprecated_push_arguments_ftype frv_push_arguments;
 static gdbarch_deprecated_saved_pc_after_call_ftype frv_saved_pc_after_call;
 
-/* Register numbers.  You can change these as needed, but don't forget
-   to update the simulator accordingly.  */
+/* Register numbers.  The order in which these appear define the
+   remote protocol, so take care in changing them.  */
 enum {
-  /* The total number of registers we know exist.  */
-  frv_num_regs = 147,
-
   /* Register numbers 0 -- 63 are always reserved for general-purpose
      registers.  The chip at hand may have less.  */
   first_gpr_regnum = 0,
@@ -64,10 +64,12 @@ enum {
   first_fpr_regnum = 64,
   last_fpr_regnum = 127,
 
-  /* Register numbers 128 on up are always reserved for special-purpose
-     registers.  */
-  first_spr_regnum = 128,
+  /* The PC register.  */
   pc_regnum = 128,
+
+  /* Register numbers 129 on up are always reserved for special-purpose
+     registers.  */
+  first_spr_regnum = 129,
   psr_regnum = 129,
   ccr_regnum = 130,
   cccr_regnum = 131,
@@ -79,7 +81,12 @@ enum {
   dbar3_regnum = 140,
   lr_regnum = 145,
   lcr_regnum = 146,
-  last_spr_regnum = 146
+  iacc0h_regnum = 147,
+  iacc0l_regnum = 148,
+  last_spr_regnum = 148,
+
+  /* The total number of registers we know exist.  */
+  frv_num_regs = last_spr_regnum + 1
 };
 
 static LONGEST frv_call_dummy_words[] =
@@ -159,13 +166,8 @@ new_variant (void)
   for (r = 0; r < frv_num_regs; r++)
     var->register_names[r] = "";
 
-  /* Do, however, supply default names for the special-purpose
+  /* Do, however, supply default names for the known special-purpose
      registers.  */
-  for (r = first_spr_regnum; r <= last_spr_regnum; ++r)
-    {
-      sprintf (buf, "x%d", r);
-      var->register_names[r] = xstrdup (buf);
-    }
 
   var->register_names[pc_regnum] = "pc";
   var->register_names[lr_regnum] = "lr";
@@ -183,6 +185,10 @@ new_variant (void)
   var->register_names[dbar2_regnum] = "dbar2";
   var->register_names[dbar3_regnum] = "dbar3";
 
+  /* iacc0 (Only found on MB93405.)  */
+  var->register_names[iacc0h_regnum] = "iacc0h";
+  var->register_names[iacc0l_regnum] = "iacc0l";
+
   return var;
 }
 
@@ -236,13 +242,14 @@ frv_register_name (int reg)
   return CURRENT_VARIANT->register_names[reg];
 }
 
+
 static struct type *
 frv_register_type (struct gdbarch *gdbarch, int reg)
 {
-  if (reg >= 64 && reg <= 127)
+  if (reg >= first_fpr_regnum && reg <= last_fpr_regnum)
     return builtin_type_float;
   else
-    return builtin_type_int;
+    return builtin_type_int32;
 }
 
 static int
@@ -251,6 +258,60 @@ frv_register_byte (int reg)
   return (reg * 4);
 }
 
+static int
+frv_register_sim_regno (int reg)
+{
+  static const int spr_map[] =
+    {
+      H_SPR_PSR,		/* psr_regnum */
+      H_SPR_CCR,		/* ccr_regnum */
+      H_SPR_CCCR,		/* cccr_regnum */
+      -1,			/* 132 */
+      -1,			/* 133 */
+      -1,			/* 134 */
+      H_SPR_TBR,		/* tbr_regnum */
+      H_SPR_BRR,		/* brr_regnum */
+      H_SPR_DBAR0,		/* dbar0_regnum */
+      H_SPR_DBAR1,		/* dbar1_regnum */
+      H_SPR_DBAR2,		/* dbar2_regnum */
+      H_SPR_DBAR3,		/* dbar3_regnum */
+      -1,			/* 141 */
+      -1,			/* 142 */
+      -1,			/* 143 */
+      -1,			/* 144 */
+      H_SPR_LR,			/* lr_regnum */
+      H_SPR_LCR,		/* lcr_regnum */
+      H_SPR_IACC0H,		/* iacc0h_regnum */
+      H_SPR_IACC0L		/* iacc0l_regnum */
+    };
+
+  gdb_assert (reg >= 0 && reg < NUM_REGS);
+
+  if (reg < first_spr_regnum)
+    return reg;
+  else if (reg >= first_spr_regnum
+           && reg < first_spr_regnum + sizeof (spr_map) / sizeof (spr_map[0]))
+    {
+      int spr_reg = spr_map[reg - first_spr_regnum];
+
+      if (spr_reg < 0)
+	return SIM_REGNO_DOES_NOT_EXIST;
+      else
+	{
+	  /* More precisely, the following line of code should be
+
+	       return SPR_REGNUM_MIN + spr_reg;
+
+	     where SPR_REGNUM_MIN is obtained from sim/frv/frv-sim.h.
+	     However, first_spr_regnum is intended to match this value,
+	     so that's what we use.  */
+	  return first_spr_regnum + spr_reg;
+	}
+    }
+
+  internal_error (__FILE__, __LINE__, "Bad register number %d", reg);
+}
+
 static const unsigned char *
 frv_breakpoint_from_pc (CORE_ADDR *pcptr, int *lenp)
 {
@@ -1138,6 +1199,7 @@ frv_gdbarch_init (struct gdbarch_info in
   set_gdbarch_register_name (gdbarch, frv_register_name);
   set_gdbarch_deprecated_register_byte (gdbarch, frv_register_byte);
   set_gdbarch_register_type (gdbarch, frv_register_type);
+  set_gdbarch_register_sim_regno (gdbarch, frv_register_sim_regno);
 
   set_gdbarch_skip_prologue (gdbarch, frv_skip_prologue);
   set_gdbarch_breakpoint_from_pc (gdbarch, frv_breakpoint_from_pc);


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]