Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
From: Kevin Buettner <kevinb@redhat.com>
To: Dave Brolley <brolley@redhat.com>
Cc: gdb-patches@sources.redhat.com
Subject: [RFA] FR-V SIM: Check availability of GR and FR regs
Date: Fri, 07 Nov 2003 06:33:00 -0000	[thread overview]
Message-ID: <1031107063317.ZM15719@localhost.localdomain> (raw)

The patch below adds tests for checking the availability of the GR and
FR registers in frvbf_fetch_register() and frvbf_store_register().

This patch fixes a gdb segfault that I was seeing when running the
simulator against a program built with -mcpu=fr400.  The fr400 series
only has 32 GRs and 32 FRs.  This was causing a segfault during
simulator initialization that occurred as a result of the "target sim"
command.

The reason for this segfault was much the same as that for the SPR
related segfault that you committed a patch for last week - basically,
if the existence of the register is not checked for ahead of time, the
simulator attempts to generate an exception for those registers which
are unavailable.  We don't want to generate an "unavailable register"
exception (or whatever it's really called) when attempting to
fetch/store registers from GDB.

I also took the opportunity to revise frvbf_{fetch,store}_register() to
use the register constants defined in include/gdb/sim-frv.h.

Okay?

	* frv-sim.h (GR_REGNUM_MAX, FR_REGNUM_MAX, PC_REGNUM, SPR_REGNUM_MIN)
	(SPR_REGNUM_MAX): Delete.
	* frv.c (gdb/sim-frv.h): Include.
	(frvbf_fetch_register, frvbf_store_register): Use register number
	constants from gdb/sim-frv.h.  Check availability of general
	purpose and float registers.

Index: frv/frv-sim.h
===================================================================
RCS file: /cvs/src/src/sim/frv/frv-sim.h,v
retrieving revision 1.4
diff -u -p -r1.4 frv-sim.h
--- frv/frv-sim.h	31 Oct 2003 18:23:47 -0000	1.4
+++ frv/frv-sim.h	7 Nov 2003 06:08:39 -0000
@@ -29,13 +29,6 @@ with this program; if not, write to the 
 #define H_SPR_ACCG4  1476
 #define H_SPR_ACCG63 1535
 
-/* gdb register numbers.  */
-#define GR_REGNUM_MAX	63
-#define FR_REGNUM_MAX  127
-#define PC_REGNUM      128
-#define SPR_REGNUM_MIN 129
-#define SPR_REGNUM_MAX (SPR_REGNUM_MIN + 4096 - 1)
-
 /* Initialization of the frv cpu.  */
 void frv_initialize (SIM_CPU *, SIM_DESC);
 void frv_term (SIM_DESC);
Index: frv/frv.c
===================================================================
RCS file: /cvs/src/src/sim/frv/frv.c,v
retrieving revision 1.4
diff -u -p -r1.4 frv.c
--- frv/frv.c	31 Oct 2003 18:23:47 -0000	1.4
+++ frv/frv.c	7 Nov 2003 06:08:39 -0000
@@ -27,6 +27,7 @@ with this program; if not, write to the 
 #include "cgen-engine.h"
 #include "cgen-par.h"
 #include "bfd.h"
+#include "gdb/sim-frv.h"
 #include <math.h>
 
 /* Maintain a flag in order to know when to write the address of the next
@@ -38,17 +39,37 @@ int frvbf_write_next_vliw_addr_to_LR;
 int
 frvbf_fetch_register (SIM_CPU *current_cpu, int rn, unsigned char *buf, int len)
 {
-  if (rn <= GR_REGNUM_MAX)
-    SETTSI (buf, GET_H_GR (rn));
-  else if (rn <= FR_REGNUM_MAX)
-    SETTSI (buf, GET_H_FR (rn - GR_REGNUM_MAX - 1));
-  else if (rn == PC_REGNUM)
+  if (SIM_FRV_GR0_REGNUM <= rn && rn <= SIM_FRV_GR63_REGNUM)
+    {
+      int hi_available, lo_available;
+      int grn = rn - SIM_FRV_GR0_REGNUM;
+
+      frv_gr_registers_available (current_cpu, &hi_available, &lo_available);
+
+      if ((grn < 32 && !lo_available) || (grn >= 32 && !hi_available))
+	return 0;
+      else
+	SETTSI (buf, GET_H_GR (grn));
+    }
+  else if (SIM_FRV_FR0_REGNUM <= rn && rn <= SIM_FRV_FR63_REGNUM)
+    {
+      int hi_available, lo_available;
+      int frn = rn - SIM_FRV_FR0_REGNUM;
+
+      frv_fr_registers_available (current_cpu, &hi_available, &lo_available);
+
+      if ((frn < 32 && !lo_available) || (frn >= 32 && !hi_available))
+	return 0;
+      else
+	SETTSI (buf, GET_H_FR (frn));
+    }
+  else if (rn == SIM_FRV_PC_REGNUM)
     SETTSI (buf, GET_H_PC ());
-  else if (rn >= SPR_REGNUM_MIN && rn <= SPR_REGNUM_MAX)
+  else if (SIM_FRV_SPR0_REGNUM <= rn && rn <= SIM_FRV_SPR4095_REGNUM)
     {
       /* Make sure the register is implemented.  */
       FRV_REGISTER_CONTROL *control = CPU_REGISTER_CONTROL (current_cpu);
-      int spr = rn - SPR_REGNUM_MIN;
+      int spr = rn - SIM_FRV_SPR0_REGNUM;
       if (! control->spr[spr].implemented)
 	return 0;
       SETTSI (buf, GET_H_SPR (spr));
@@ -67,17 +88,37 @@ frvbf_fetch_register (SIM_CPU *current_c
 int
 frvbf_store_register (SIM_CPU *current_cpu, int rn, unsigned char *buf, int len)
 {
-  if (rn <= GR_REGNUM_MAX)
-    SET_H_GR (rn, GETTSI (buf));
-  else if (rn <= FR_REGNUM_MAX)
-    SET_H_FR (rn - GR_REGNUM_MAX - 1, GETTSI (buf));
-  else if (rn == PC_REGNUM)
+  if (SIM_FRV_GR0_REGNUM <= rn && rn <= SIM_FRV_GR63_REGNUM)
+    {
+      int hi_available, lo_available;
+      int grn = rn - SIM_FRV_GR0_REGNUM;
+
+      frv_gr_registers_available (current_cpu, &hi_available, &lo_available);
+
+      if ((grn < 32 && !lo_available) || (grn >= 32 && !hi_available))
+	return 0;
+      else
+	SET_H_GR (grn, GETTSI (buf));
+    }
+  else if (SIM_FRV_FR0_REGNUM <= rn && rn <= SIM_FRV_FR63_REGNUM)
+    {
+      int hi_available, lo_available;
+      int frn = rn - SIM_FRV_FR0_REGNUM;
+
+      frv_fr_registers_available (current_cpu, &hi_available, &lo_available);
+
+      if ((frn < 32 && !lo_available) || (frn >= 32 && !hi_available))
+	return 0;
+      else
+	SET_H_FR (frn, GETTSI (buf));
+    }
+  else if (rn == SIM_FRV_PC_REGNUM)
     SET_H_PC (GETTSI (buf));
-  else if (rn >= SPR_REGNUM_MIN && rn <= SPR_REGNUM_MAX)
+  else if (SIM_FRV_SPR0_REGNUM <= rn && rn <= SIM_FRV_SPR4095_REGNUM)
     {
       /* Make sure the register is implemented.  */
       FRV_REGISTER_CONTROL *control = CPU_REGISTER_CONTROL (current_cpu);
-      int spr = rn - SPR_REGNUM_MIN;
+      int spr = rn - SIM_FRV_SPR0_REGNUM;
       if (! control->spr[spr].implemented)
 	return 0;
       SET_H_SPR (spr, GETTSI (buf));


             reply	other threads:[~2003-11-07  6:33 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2003-11-07  6:33 Kevin Buettner [this message]
2003-11-07 17:30 ` Dave Brolley
2003-11-07 17:49   ` Kevin Buettner
2003-11-07 19:12     ` Michael Snyder
2003-11-24 16:47 ` Kevin Buettner

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1031107063317.ZM15719@localhost.localdomain \
    --to=kevinb@redhat.com \
    --cc=brolley@redhat.com \
    --cc=gdb-patches@sources.redhat.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox