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] Adjust prototypes for i387_supply_fsave and i387_supply_fxsave


This patch is not very exciting.  However, for my work on unifying ELF
core file support, I'd like some uniformity in the prototypes of
functions that handle blocks of registers.  With the addition of a
`regnum' argument, these can be used to supply a single register, or
the whole bunch if REGNUM is -1.

I haven't tested this on all targets, but its largely mechanical so I

Committed,

Mark

Index: ChangeLog
from  Mark Kettenis  <kettenis@gnu.org>

	* go32-nat.c (fetch_register): Call i387_supply_fsave instead of
	i387_supply_register.
	(go32_fetch_registers): Adjust call to i387_supply_fsave.
	* i386nbsd-tdep.c (fetch_core_registers): Adjust call to
	i387_supply_fsave.
	(fetch_elfcore_registers): Adjust call to i387_supply_fsave and
	i387_supply_fxsave.
	* i386obsd-tdep.c (fetch_core_registers): Adjust call to
	i387_supply_fsave.
	* i386bsd-nat.c (supply_fpregset): Adjust call to
	i387_supply_fsave.
	(fetch_inferior_registers): Remove extraneous whitespace.  Adjust
	call to i387_supply_fxsave.  Call i387_supply_fsave instead of
	supply_fpregset.
	(store_inferior_registers): Remove extraneous whitespace.  Call
	i387_fill_fsave instead of fill_fpregset.
	* i386gnu-nat.c (fetch_fpregs): Adjust call to i387_supply_fsave.
	(supply_fpregset): Likewise.
	* i386v4-nat.c (supply_fpregset): Adjust call to
	i387_supply_fsave.
	* i386-interix-nat.c (supply_fpregset): Adjust call to
	i387_supply_fsave.
	* i386-linux-nat.c (supply_fpregset): Adjust call to
	i387_supply_fsave.
	(supply_fpxregset): Adjust call to i387_adjust_fxsave.
	* i386-nto-tdep.c (i386nto_supply_fpregset): Adjust calls to
	i387supply_fsave and i387_supply_fxsave.
	* i387-tdep.c (i387_supply_fsave): Add `regnum' argument.
	Incorporate code from `i387_supply_register.
	(i387_supply_register): Remove.
	(i387_supply_fxsave): Add `regnum' argument.
	Update comments.
	* i387-tdep.h (i387_supply_fsave, i387_supply_fsxave): Adjust
	prototype.
	(i387_supply_register): remove prototype.
	Update comments.

Index: go32-nat.c
===================================================================
RCS file: /cvs/src/src/gdb/go32-nat.c,v
retrieving revision 1.34
diff -u -p -r1.34 go32-nat.c
--- go32-nat.c 8 Nov 2002 16:52:37 -0000 1.34
+++ go32-nat.c 23 Aug 2003 08:39:48 -0000
@@ -468,7 +468,7 @@ fetch_register (int regno)
   if (regno < FP0_REGNUM)
     supply_register (regno, (char *) &a_tss + regno_mapping[regno].tss_ofs);
   else if (i386_fp_regnum_p (regno) || i386_fpc_regnum_p (regno))
-    i387_supply_register (regno, (char *) &npx);
+    i387_supply_fsave ((const char *) &npx, regno);
   else
     internal_error (__FILE__, __LINE__,
 		    "Invalid register no. %d in fetch_register.", regno);
@@ -483,7 +483,7 @@ go32_fetch_registers (int regno)
     {
       for (regno = 0; regno < FP0_REGNUM; regno++)
 	fetch_register (regno);
-      i387_supply_fsave ((char *) &npx);
+      i387_supply_fsave ((const char *) &npx, -1);
     }
 }
 
Index: i386nbsd-tdep.c
===================================================================
RCS file: /cvs/src/src/gdb/i386nbsd-tdep.c,v
retrieving revision 1.14
diff -u -p -r1.14 i386nbsd-tdep.c
--- i386nbsd-tdep.c 31 May 2003 16:08:06 -0000 1.14
+++ i386nbsd-tdep.c 23 Aug 2003 08:39:49 -0000
@@ -1,4 +1,5 @@
-/* Target-dependent code for NetBSD/i386, for GDB.
+/* Target-dependent code for NetBSD/i386.
+
    Copyright 1988, 1989, 1991, 1992, 1994, 1996, 2000, 2001, 2002, 2003
    Free Software Foundation, Inc.
 
@@ -88,7 +89,7 @@ fetch_core_registers (char *core_reg_sec
   i386nbsd_supply_reg (regs, -1);
 
   /* Floating point registers.  */
-  i387_supply_fsave (fsave);
+  i387_supply_fsave (fsave, -1);
 }
 
 static void
@@ -106,9 +107,9 @@ fetch_elfcore_registers (char *core_reg_
 
     case 2:  /* Floating point registers.  */
       if (core_reg_size != 108)
-	warning ("Wrong size FP register set in core file."); 
+	warning ("Wrong size FP register set in core file.");
       else
-	i387_supply_fsave (core_reg_sect);  
+	i387_supply_fsave (core_reg_sect, -1);
       break;
 
     case 3:  /* "Extended" floating point registers.  This is gdb-speak
@@ -116,7 +117,7 @@ fetch_elfcore_registers (char *core_reg_
       if (core_reg_size != 512)
 	warning ("Wrong size XMM register set in core file.");
       else
-	i387_supply_fxsave (core_reg_sect);
+	i387_supply_fxsave (core_reg_sect, -1);
       break;
 
     default:
Index: i386obsd-tdep.c
===================================================================
RCS file: /cvs/src/src/gdb/i386obsd-tdep.c,v
retrieving revision 1.4
diff -u -p -r1.4 i386obsd-tdep.c
--- i386obsd-tdep.c 31 May 2003 16:08:06 -0000 1.4
+++ i386obsd-tdep.c 23 Aug 2003 08:39:49 -0000
@@ -66,7 +66,7 @@ fetch_core_registers (char *core_reg_sec
   i386obsd_supply_reg (regs, -1);
 
   /* Floating point registers.  */
-  i387_supply_fsave (fsave);
+  i387_supply_fsave (fsave, -1);
 }
 
 static struct core_fns i386obsd_core_fns =
Index: i386bsd-nat.c
===================================================================
RCS file: /cvs/src/src/gdb/i386bsd-nat.c,v
retrieving revision 1.21
diff -u -p -r1.21 i386bsd-nat.c
--- i386bsd-nat.c 10 Aug 2003 18:32:09 -0000 1.21
+++ i386bsd-nat.c 23 Aug 2003 08:39:49 -0000
@@ -157,7 +157,7 @@ fill_gregset (gregset_t *gregsetp, int r
 void
 supply_fpregset (fpregset_t *fpregsetp)
 {
-  i387_supply_fsave ((char *) fpregsetp);
+  i387_supply_fsave ((const char *) fpregsetp, -1);
 }
 
 /* Fill register REGNO (if it is a floating-point register) in
@@ -176,7 +176,6 @@ fill_fpregset (fpregset_t *fpregsetp, in
 void
 fetch_inferior_registers (int regno)
 {
-
   if (regno == -1 || GETREGS_SUPPLIES (regno))
     {
       gregset_t gregs;
@@ -201,7 +200,7 @@ fetch_inferior_registers (int regno)
 		    (PTRACE_ARG3_TYPE) xmmregs, 0) == 0)
 	{
 	  have_ptrace_xmmregs = 1;
-	  i387_supply_fxsave (xmmregs);
+	  i387_supply_fxsave (xmmregs, -1);
 	}
       else
 	{
@@ -209,14 +208,14 @@ fetch_inferior_registers (int regno)
 		      (PTRACE_ARG3_TYPE) &fpregs, 0) == -1)
 	    perror_with_name ("Couldn't get floating point status");
 
-	  supply_fpregset (&fpregs);
+	  i387_supply_fsave ((const char *) &fpregs, -1);
 	}
 #else
       if (ptrace (PT_GETFPREGS, PIDGET (inferior_ptid),
 		  (PTRACE_ARG3_TYPE) &fpregs, 0) == -1)
 	perror_with_name ("Couldn't get floating point status");
 
-      supply_fpregset (&fpregs);
+      i387_supply_fsave ((const char *) &fpregs, -1);
 #endif
     }
 }
@@ -227,7 +226,6 @@ fetch_inferior_registers (int regno)
 void
 store_inferior_registers (int regno)
 {
-
   if (regno == -1 || GETREGS_SUPPLIES (regno))
     {
       gregset_t gregs;
@@ -272,7 +270,7 @@ store_inferior_registers (int regno)
 		      (PTRACE_ARG3_TYPE) &fpregs, 0) == -1)
 	    perror_with_name ("Couldn't get floating point status");
 
-          fill_fpregset (&fpregs, regno);
+          i387_fill_fsave ((char *) &fpregs, regno);
   
           if (ptrace (PT_SETFPREGS, PIDGET (inferior_ptid),
 		      (PTRACE_ARG3_TYPE) &fpregs, 0) == -1)
Index: i386gnu-nat.c
===================================================================
RCS file: /cvs/src/src/gdb/i386gnu-nat.c,v
retrieving revision 1.13
diff -u -p -r1.13 i386gnu-nat.c
--- i386gnu-nat.c 14 Nov 2002 20:37:28 -0000 1.13
+++ i386gnu-nat.c 23 Aug 2003 08:39:49 -0000
@@ -89,7 +89,7 @@ fetch_fpregs (struct proc *thread)
     }
 
   /* Supply the floating-point registers.  */
-  i387_supply_fsave (state.hw_state);
+  i387_supply_fsave (state.hw_state, -1);
 }
 
 #ifdef HAVE_SYS_PROCFS_H
@@ -106,7 +106,7 @@ supply_gregset (gdb_gregset_t *gregs)
 void
 supply_fpregset (gdb_fpregset_t *fpregs)
 {
-  i387_supply_fsave ((char *) fpregs);
+  i387_supply_fsave ((const char *) fpregs, -1);
 }
 #endif
 
Index: i386v4-nat.c
===================================================================
RCS file: /cvs/src/src/gdb/i386v4-nat.c,v
retrieving revision 1.11
diff -u -p -r1.11 i386v4-nat.c
--- i386v4-nat.c 15 Jun 2002 17:22:04 -0000 1.11
+++ i386v4-nat.c 23 Aug 2003 08:39:49 -0000
@@ -139,7 +139,7 @@ supply_fpregset (fpregset_t *fpregsetp)
   if (FP0_REGNUM == 0)
     return;
 
-  i387_supply_fsave ((char *) fpregsetp);
+  i387_supply_fsave ((const char *) fpregsetp, -1);
 }
 
 /* Fill register REGNO (if it is a floating-point register) in
Index: i386-interix-nat.c
===================================================================
RCS file: /cvs/src/src/gdb/i386-interix-nat.c,v
retrieving revision 1.1
diff -u -p -r1.1 i386-interix-nat.c
--- i386-interix-nat.c 1 Nov 2002 22:08:44 -0000 1.1
+++ i386-interix-nat.c 23 Aug 2003 08:39:50 -0000
@@ -80,7 +80,7 @@ fill_gregset (gregset_t *gregsetp, int r
 void
 supply_fpregset (fpregset_t *fpregsetp)
 {
-  i387_supply_fsave ((char *) fpregsetp);
+  i387_supply_fsave ((const char *) fpregsetp, -1);
 }
 
 /* Given a pointer to a floating point register set in (fpregset_t *)
Index: i386-linux-nat.c
===================================================================
RCS file: /cvs/src/src/gdb/i386-linux-nat.c,v
retrieving revision 1.48
diff -u -p -r1.48 i386-linux-nat.c
--- i386-linux-nat.c 17 Aug 2003 18:22:25 -0000 1.48
+++ i386-linux-nat.c 23 Aug 2003 08:39:50 -0000
@@ -320,7 +320,7 @@ static void store_regs (int tid, int reg
 void 
 supply_fpregset (elf_fpregset_t *fpregsetp)
 {
-  i387_supply_fsave ((char *) fpregsetp);
+  i387_supply_fsave ((const char *) fpregsetp, -1);
   dummy_sse_values ();
 }
 
@@ -385,7 +385,7 @@ static void store_fpregs (int tid, int r
 void
 supply_fpxregset (elf_fpxregset_t *fpxregsetp)
 {
-  i387_supply_fxsave ((char *) fpxregsetp);
+  i387_supply_fxsave ((const char *) fpxregsetp, -1);
 }
 
 /* Fill register REGNO (if it is a floating-point or SSE register) in
Index: i386-nto-tdep.c
===================================================================
RCS file: /cvs/src/src/gdb/i386-nto-tdep.c,v
retrieving revision 1.5
diff -u -p -r1.5 i386-nto-tdep.c
--- i386-nto-tdep.c 17 Jun 2003 17:49:39 -0000 1.5
+++ i386-nto-tdep.c 23 Aug 2003 08:39:50 -0000
@@ -87,9 +87,9 @@ static void
 i386nto_supply_fpregset (char *fpregs)
 {
   if (nto_cpuinfo_valid && nto_cpuinfo_flags | X86_CPU_FXSR)
-    i387_supply_fxsave (fpregs);
+    i387_supply_fxsave (fpregs, -1);
   else
-    i387_supply_fsave (fpregs);
+    i387_supply_fsave (fpregs, -1);
 }
 
 static void
Index: i387-tdep.c
===================================================================
RCS file: /cvs/src/src/gdb/i387-tdep.c,v
retrieving revision 1.34
diff -u -p -r1.34 i387-tdep.c
--- i387-tdep.c 10 Aug 2003 17:01:32 -0000 1.34
+++ i387-tdep.c 23 Aug 2003 08:39:50 -0000
@@ -361,51 +361,44 @@ static int fsave_offset[] =
 #define FSAVE_ADDR(fsave, regnum) (fsave + fsave_offset[regnum - FP0_REGNUM])
 
 
-/* Fill register REGNUM in GDB's register array with the appropriate
+/* Fill register REGNUM in GDB's register cache with the appropriate
    value from *FSAVE.  This function masks off any of the reserved
    bits in *FSAVE.  */
 
 void
-i387_supply_register (int regnum, char *fsave)
-{
-  if (fsave == NULL)
-    {
-      supply_register (regnum, NULL);
-      return;
-    }
-
-  /* Most of the FPU control registers occupy only 16 bits in
-     the fsave area.  Give those a special treatment.  */
-  if (regnum >= FPC_REGNUM
-      && regnum != FIOFF_REGNUM && regnum != FOOFF_REGNUM)
-    {
-      unsigned char val[4];
-
-      memcpy (val, FSAVE_ADDR (fsave, regnum), 2);
-      val[2] = val[3] = 0;
-      if (regnum == FOP_REGNUM)
-	val[1] &= ((1 << 3) - 1);
-      supply_register (regnum, val);
-    }
-  else
-    supply_register (regnum, FSAVE_ADDR (fsave, regnum));
-}
-
-/* Fill GDB's register array with the floating-point register values
-   in *FSAVE.  This function masks off any of the reserved
-   bits in *FSAVE.  */
-
-void
-i387_supply_fsave (char *fsave)
+i387_supply_fsave (const char *fsave, int regnum)
 {
   int i;
 
   for (i = FP0_REGNUM; i < XMM0_REGNUM; i++)
-    i387_supply_register (i, fsave);
+    if (regnum == -1 || regnum == i)
+      {
+	if (fsave == NULL)
+	  {
+	    supply_register (i, NULL);
+	    return;
+	  }
+
+	/* Most of the FPU control registers occupy only 16 bits in the
+	   fsave area.  Give those a special treatment.  */
+	if (i >= FPC_REGNUM
+	    && i != FIOFF_REGNUM && i != FOOFF_REGNUM)
+	  {
+	    unsigned char val[4];
+
+	    memcpy (val, FSAVE_ADDR (fsave, i), 2);
+	    val[2] = val[3] = 0;
+	    if (i == FOP_REGNUM)
+	      val[1] &= ((1 << 3) - 1);
+	    supply_register (i, val);
+	  }
+	else
+	  supply_register (i, FSAVE_ADDR (fsave, i));
+      }
 }
 
 /* Fill register REGNUM (if it is a floating-point register) in *FSAVE
-   with the value in GDB's register array.  If REGNUM is -1, do this
+   with the value in GDB's register cache.  If REGNUM is -1, do this
    for all registers.  This function doesn't touch any of the reserved
    bits in *FSAVE.  */
 
@@ -492,15 +485,15 @@ static int fxsave_offset[] =
   ((regnum == MXCSR_REGNUM) ? (fxsave + 24) : \
    (fxsave + fxsave_offset[regnum - FP0_REGNUM]))
 
-static int i387_tag (unsigned char *raw);
+static int i387_tag (const unsigned char *raw);
 
 
-/* Fill GDB's register array with the floating-point and SSE register
-   values in *FXSAVE.  This function masks off any of the reserved
-   bits in *FXSAVE.  */
+/* Fill register REGNUM in GDB's register cache with the appropriate
+   floating-point or SSE register value from *FXSAVE.  This function
+   masks off any of the reserved bits in *FXSAVE.  */
 
 void
-i387_supply_fxsave (char *fxsave)
+i387_supply_fxsave (const char *fxsave, int regnum)
 {
   int i, last_regnum = MXCSR_REGNUM;
 
@@ -508,62 +501,63 @@ i387_supply_fxsave (char *fxsave)
     last_regnum = FOP_REGNUM;
 
   for (i = FP0_REGNUM; i <= last_regnum; i++)
-    {
-      if (fxsave == NULL)
-	{
-	  supply_register (i, NULL);
-	  continue;
-	}
-
-      /* Most of the FPU control registers occupy only 16 bits in
-	 the fxsave area.  Give those a special treatment.  */
-      if (i >= FPC_REGNUM && i < XMM0_REGNUM
-	  && i != FIOFF_REGNUM && i != FOOFF_REGNUM)
-	{
-	  unsigned char val[4];
-
-	  memcpy (val, FXSAVE_ADDR (fxsave, i), 2);
-	  val[2] = val[3] = 0;
-	  if (i == FOP_REGNUM)
-	    val[1] &= ((1 << 3) - 1);
-	  else if (i== FTAG_REGNUM)
-	    {
-	      /* The fxsave area contains a simplified version of the
-                 tag word.  We have to look at the actual 80-bit FP
-                 data to recreate the traditional i387 tag word.  */
-
-	      unsigned long ftag = 0;
-	      int fpreg;
-	      int top;
-
-	      top = (((FXSAVE_ADDR (fxsave, FSTAT_REGNUM))[1] >> 3) & 0x7);
-
-	      for (fpreg = 7; fpreg >= 0; fpreg--)
-		{
-		  int tag;
-
-		  if (val[0] & (1 << fpreg))
-		    {
-		      int regnum = (fpreg + 8 - top) % 8 + FP0_REGNUM;
-		      tag = i387_tag (FXSAVE_ADDR (fxsave, regnum));
-		    }
-		  else
-		    tag = 3;		/* Empty */
-
-		  ftag |= tag << (2 * fpreg);
-		}
-	      val[0] = ftag & 0xff;
-	      val[1] = (ftag >> 8) & 0xff;
-	    }
-	  supply_register (i, val);
-	}
-      else
-	supply_register (i, FXSAVE_ADDR (fxsave, i));
-    }
+    if (regnum == -1 || regnum == i)
+      {
+	if (fxsave == NULL)
+	  {
+	    supply_register (i, NULL);
+	    continue;
+	  }
+
+	/* Most of the FPU control registers occupy only 16 bits in
+	   the fxsave area.  Give those a special treatment.  */
+	if (i >= FPC_REGNUM && i < XMM0_REGNUM
+	    && i != FIOFF_REGNUM && i != FOOFF_REGNUM)
+	  {
+	    unsigned char val[4];
+
+	    memcpy (val, FXSAVE_ADDR (fxsave, i), 2);
+	    val[2] = val[3] = 0;
+	    if (i == FOP_REGNUM)
+	      val[1] &= ((1 << 3) - 1);
+	    else if (i== FTAG_REGNUM)
+	      {
+		/* The fxsave area contains a simplified version of
+		   the tag word.  We have to look at the actual 80-bit
+		   FP data to recreate the traditional i387 tag word.  */
+
+		unsigned long ftag = 0;
+		int fpreg;
+		int top;
+
+		top = (((FXSAVE_ADDR (fxsave, FSTAT_REGNUM))[1] >> 3) & 0x7);
+
+		for (fpreg = 7; fpreg >= 0; fpreg--)
+		  {
+		    int tag;
+
+		    if (val[0] & (1 << fpreg))
+		      {
+			int regnum = (fpreg + 8 - top) % 8 + FP0_REGNUM;
+			tag = i387_tag (FXSAVE_ADDR (fxsave, regnum));
+		      }
+		    else
+		      tag = 3;		/* Empty */
+
+		    ftag |= tag << (2 * fpreg);
+		  }
+		val[0] = ftag & 0xff;
+		val[1] = (ftag >> 8) & 0xff;
+	      }
+	    supply_register (i, val);
+	  }
+	else
+	  supply_register (i, FXSAVE_ADDR (fxsave, i));
+      }
 }
 
 /* Fill register REGNUM (if it is a floating-point or SSE register) in
-   *FXSAVE with the value in GDB's register array.  If REGNUM is -1, do
+   *FXSAVE with the value in GDB's register cache.  If REGNUM is -1, do
    this for all registers.  This function doesn't touch any of the
    reserved bits in *FXSAVE.  */
 
@@ -624,7 +618,7 @@ i387_fill_fxsave (char *fxsave, int regn
    *RAW.  */
 
 static int
-i387_tag (unsigned char *raw)
+i387_tag (const unsigned char *raw)
 {
   int integer;
   unsigned int exponent;
Index: i387-tdep.h
===================================================================
RCS file: /cvs/src/src/gdb/i387-tdep.h,v
retrieving revision 1.5
diff -u -p -r1.5 i387-tdep.h
--- i387-tdep.h 15 Jun 2003 11:01:46 -0000 1.5
+++ i387-tdep.h 23 Aug 2003 08:39:50 -0000
@@ -45,33 +45,27 @@ extern void i387_register_to_value (stru
 extern void i387_value_to_register (struct frame_info *frame, int regnum,
 				    struct type *type, const void *from);
 
-/* Fill register REGNUM in GDB's register array with the appropriate
+/* Fill register REGNUM in GDB's register cache with the appropriate
    value from *FSAVE.  This function masks off any of the reserved
    bits in *FSAVE.  */
 
-extern void i387_supply_register (int regnum, char *fsave);
-
-/* Fill GDB's register array with the floating-point register values
-   in *FSAVE.  This function masks off any of the reserved
-   bits in *FSAVE.  */
-
-extern void i387_supply_fsave (char *fsave);
+extern void i387_supply_fsave (const char *fsave, int regnum);
 
 /* Fill register REGNUM (if it is a floating-point register) in *FSAVE
-   with the value in GDB's register array.  If REGNUM is -1, do this
+   with the value in GDB's register cache.  If REGNUM is -1, do this
    for all registers.  This function doesn't touch any of the reserved
    bits in *FSAVE.  */
 
 extern void i387_fill_fsave (char *fsave, int regnum);
 
-/* Fill GDB's register array with the floating-point and SSE register
-   values in *FXSAVE.  This function masks off any of the reserved
-   bits in *FXSAVE.  */
+/* Fill register REGNUM in GDB's register cache with the appropriate
+   floating-point or SSE register value from *FXSAVE.  This function
+   masks off any of the reserved bits in *FXSAVE.  */
 
-extern void i387_supply_fxsave (char *fxsave);
+extern void i387_supply_fxsave (const char *fxsave, int regnum);
 
 /* Fill register REGNUM (if it is a floating-point or SSE register) in
-   *FXSAVE with the value in GDB's register array.  If REGNUM is -1, do
+   *FXSAVE with the value in GDB's register cache.  If REGNUM is -1, do
    this for all registers.  This function doesn't touch any of the
    reserved bits in *FXSAVE.  */
 


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