* sparc-tdep.c, lynx-nat.c, config/sparc/tm-sparc.h,
authorStu Grossman <grossman@cygnus>
Sat, 22 Jan 1994 08:42:14 +0000 (08:42 +0000)
committerStu Grossman <grossman@cygnus>
Sat, 22 Jan 1994 08:42:14 +0000 (08:42 +0000)
config/sparc/tm-sparclynx.h:  Move defs of FRAME_SAVED_I0/L0 to
tm-sparc.h so they can be overridden if necessary.

gdb/ChangeLog
gdb/config/sparc/tm-sparc.h
gdb/config/sparc/tm-sparclynx.h
gdb/lynx-nat.c
gdb/sparc-tdep.c

index 705b3bffa11e662b3c6b16ef3a8075466396761a..1e615d14af65e4b502d94c00e1269fc0f335bc1c 100644 (file)
@@ -1,3 +1,9 @@
+Sat Jan 22 00:34:47 1994  Stu Grossman  (grossman at cygnus.com)
+
+       * sparc-tdep.c, lynx-nat.c, config/sparc/tm-sparc.h,
+       config/sparc/tm-sparclynx.h:  Move defs of FRAME_SAVED_I0/L0 to
+       tm-sparc.h so they can be overridden if necessary.
+
 Fri Jan 21 17:49:28 1994  Stu Grossman  (grossman at cygnus.com)
 
        * lynx-nat.c:  Add Sparc support.
index b71f7f2b5942ff274463d90c8b35b40c6eff0410..69899b868c3110c89a1a519f4112c9b704408342 100644 (file)
@@ -346,10 +346,18 @@ CORE_ADDR sparc_frame_chain ();
 #define FRAMELESS_FUNCTION_INVOCATION(FI, FRAMELESS) \
   (FRAMELESS) = frameless_look_for_prologue(FI)
 
+/* The location of I0 w.r.t SP.  This is actually dependent on how the system's
+   window overflow/underflow routines are written.  Most vendors save the L regs
+   followed by the I regs (at the higher address).  Some vendors get it wrong.
+ */
+
+#define        FRAME_SAVED_L0  0
+#define        FRAME_SAVED_I0  (8 * REGISTER_RAW_SIZE (L0_REGNUM))
+
 /* Where is the PC for a specific frame */
 
-#define FRAME_SAVED_PC(FRAME) frame_saved_pc (FRAME)
-CORE_ADDR frame_saved_pc ();
+#define FRAME_SAVED_PC(FRAME) sparc_frame_saved_pc (FRAME)
+CORE_ADDR sparc_frame_saved_pc ();
 
 /* If the argument is on the stack, it will be here.  */
 #define FRAME_ARGS_ADDRESS(fi) ((fi)->frame)
index 525eeb4e0dbe9d9ecada3cfafd72dfe969b24dfd..8a0ea7227dc39b6770564516d935f57622ad8c43 100644 (file)
@@ -25,4 +25,12 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
 /* Use generic Sparc definitions. */
 #include "sparc/tm-sparc.h"
 
+/* Lynx does this backwards from everybody else */
+
+#undef FRAME_SAVED_I0
+#undef FRAME_SAVED_L0
+
+#define FRAME_SAVED_I0 0
+#define FRAME_SAVED_L0 (8 * REGISTER_RAW_SIZE (I0_REGNUM))
+
 #endif /* TM_SPARCLYNX_H */
index 4510972cf05c183f744571e227aab856f14a9b4d..66e0d25c9c19c37d7ee4ac958242e23fcd7422a1 100644 (file)
@@ -235,14 +235,14 @@ fetch_inferior_registers (regno)
 
       sp = read_register (SP_REGNUM);
 
-      target_xfer_memory (sp, &registers[REGISTER_BYTE(I0_REGNUM)],
+      target_xfer_memory (sp + FRAME_SAVED_I0,
+                         &registers[REGISTER_BYTE(I0_REGNUM)],
                          8 * REGISTER_RAW_SIZE (I0_REGNUM), 0);
       for (i = I0_REGNUM; i <= I7_REGNUM; i++)
        register_valid[i] = 1;
 
-      sp += 8 * REGISTER_RAW_SIZE (I0_REGNUM);
-
-      target_xfer_memory (sp, &registers[REGISTER_BYTE(L0_REGNUM)],
+      target_xfer_memory (sp + FRAME_SAVED_L0,
+                         &registers[REGISTER_BYTE(L0_REGNUM)],
                          8 * REGISTER_RAW_SIZE (L0_REGNUM), 0);
       for (i = L0_REGNUM; i <= L0_REGNUM + 7; i++)
        register_valid[i] = 1;
@@ -329,10 +329,12 @@ store_inferior_registers (regno)
        {
          if (!register_valid[L0_REGNUM+5])
            abort();
-         target_xfer_memory (sp, &registers[REGISTER_BYTE (I0_REGNUM)],
+         target_xfer_memory (sp + FRAME_SAVED_I0,
+                             &registers[REGISTER_BYTE (I0_REGNUM)],
                              8 * REGISTER_RAW_SIZE (I0_REGNUM), 1);
-         sp += 8 * REGISTER_RAW_SIZE (I0_REGNUM);
-         target_xfer_memory (sp, &registers[REGISTER_BYTE (L0_REGNUM)],
+
+         target_xfer_memory (sp + FRAME_SAVED_L0,
+                             &registers[REGISTER_BYTE (L0_REGNUM)],
                              8 * REGISTER_RAW_SIZE (L0_REGNUM), 1);
        }
       else if (regno >= L0_REGNUM && regno <= I7_REGNUM)
@@ -341,9 +343,10 @@ store_inferior_registers (regno)
            abort();
          if (regno >= L0_REGNUM && regno <= L0_REGNUM + 7)
            regoffset = REGISTER_BYTE (regno) - REGISTER_BYTE (L0_REGNUM)
-             + 8 * REGISTER_RAW_SIZE (I0_REGNUM);
+             + FRAME_SAVED_L0;
          else
-           regoffset = REGISTER_BYTE (regno) - REGISTER_BYTE (I0_REGNUM);
+           regoffset = REGISTER_BYTE (regno) - REGISTER_BYTE (I0_REGNUM)
+             + FRAME_SAVED_I0;
          target_xfer_memory (sp + regoffset, &registers[REGISTER_BYTE (regno)],
                              REGISTER_RAW_SIZE (regno), 1);
        }
index dc7b1910ba92dc19bba2c90a60f3c45925cb027e..da7fd2cf1c93b3587c68526b8f074e18dd5abf16 100644 (file)
@@ -131,9 +131,6 @@ single_step (ignore)
     }
 }
 \f
-#define        FRAME_SAVED_L0  0                           /* Byte offset from SP */
-#define        FRAME_SAVED_I0  (8 * REGISTER_RAW_SIZE (0)) /* Byte offset from SP */
-
 CORE_ADDR
 sparc_frame_chain (thisframe)
      FRAME thisframe;
@@ -161,7 +158,7 @@ sparc_extract_struct_value_address (regbuf)
 /* Find the pc saved in frame FRAME.  */
 
 CORE_ADDR
-frame_saved_pc (frame)
+sparc_frame_saved_pc (frame)
      FRAME frame;
 {
   char buf[MAX_REGISTER_RAW_SIZE];