* am29k-tdep.c (TAGWORD_ZERO_MASK): New #define.
authorJohn Gilmore <gnu@cygnus>
Sat, 6 Mar 1993 02:02:39 +0000 (02:02 +0000)
committerJohn Gilmore <gnu@cygnus>
Sat, 6 Mar 1993 02:02:39 +0000 (02:02 +0000)
(examine_tag):  Use it.
(read_register_stack):  Only look in the local registers for a
memory address if it's between rfb and rsp; go to memory otherwise.

gdb/ChangeLog
gdb/am29k-tdep.c

index 9493d7e814655a562aa3f5bb0668cac430762892..2972dc794f4522090ca5a6bb80b0e77c192de1cb 100644 (file)
@@ -1,7 +1,10 @@
 Fri Mar  5 17:39:45 1993  John Gilmore  (gnu@cacophony.cygnus.com)
 
-       * am29k-tdep.c (initialize_29k):  Fix call_scratch_address doc.
-       Remove reginv command.
+       * am29k-tdep.c (TAGWORD_ZERO_MASK):  New #define.
+       (examine_tag):  Use it.
+       (read_register_stack):  Only look in the local registers for a
+       memory address if it's between rfb and rsp; go to memory otherwise.
+       (initialize_29k):  Fix call_scratch_address doc.  Remove reginv_com.
        (reginv_com):  Remove ancient kludge command.
 
 Fri Mar  5 17:16:26 1993  K. Richard Pixley  (rich@rtl.cygnus.com)
index 7df9ef57caca7254c9e9fc106b86544d4b56d3ac..e0090262f0b9e0934cc2b19d6e3e867f30365655 100644 (file)
@@ -22,11 +22,16 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
 #include "gdbcore.h"
 #include "frame.h"
 #include "value.h"
-/*#include <sys/param.h> */
 #include "symtab.h"
 #include "inferior.h"
 #include "gdbcmd.h"
 
+/* If all these bits in an instruction word are zero, it is a "tag word"
+   which precedes a function entry point and gives stack traceback info.
+   This used to be defined as 0xff000000, but that treated 0x00000deb as
+   a tag word, while it is really used as a breakpoint.  */
+#define        TAGWORD_ZERO_MASK       0xff00f800
+
 extern CORE_ADDR text_start;   /* FIXME, kludge... */
 
 /* The user-settable top of the register stack in virtual memory.  We
@@ -329,7 +334,7 @@ examine_tag(p, is_trans, argcount, msize, mfp_used)
   unsigned int tag1, tag2;
 
   tag1 = read_memory_integer (p, 4);
-  if ((tag1 & 0xff000000) != 0)                /* Not a tag word */
+  if ((tag1 & TAGWORD_ZERO_MASK) != 0) /* Not a tag word */
     return 0;
   if (tag1 & (1<<23))                  /* A two word tag */
     {
@@ -400,7 +405,7 @@ init_frame_info (innermost_frame, fci)
         do not trace back beyond the start of the text segment
         (just as a sanity check to avoid going into never-never land).  */
       while (p >= text_start
-            && ((insn = read_memory_integer (p, 4)) & 0xff000000) != 0)
+            && ((insn = read_memory_integer (p, 4)) & TAGWORD_ZERO_MASK) != 0)
        p -= 4;
       
       if (p < text_start)
@@ -524,11 +529,15 @@ read_register_stack (memaddr, myaddr, actual_mem_addr, lval)
       if (actual_mem_addr != NULL)
        *actual_mem_addr = REGISTER_BYTE (regnum);
     }
-  else if (memaddr < rfb)
+  /* If it's in the part of the register stack that's in real registers,
+     get the value from the registers.  If it's anywhere else in memory
+     (e.g. in another thread's saved stack), skip this part and get
+     it from real live memory.  */
+  else if (memaddr < rfb && memaddr >= rsp)
     {
       /* It's in a register.  */
       int regnum = (memaddr - rsp) / 4 + LR0_REGNUM;
-      if (regnum < LR0_REGNUM || regnum > LR0_REGNUM + 127)
+      if (regnum > LR0_REGNUM + 127)
        error ("Attempt to read register stack out of range.");
       if (myaddr != NULL)
        read_register_gen (regnum, myaddr);
@@ -733,7 +742,7 @@ pop_frame ()
         {
          /* Note: word is in host byte order.  */
           word = read_memory_integer (rfb + i, 4);
-          write_register (LR0_REGNUM + ((rfb - gr1) % 0x80) + i / 4, word);                                          
+          write_register (LR0_REGNUM + ((rfb - gr1) % 0x80) + i / 4, word);
         }                                                                    
     }
   flush_cached_frames ();                                                    
@@ -797,6 +806,7 @@ push_dummy_frame ()
   write_register (lrnum, read_register (NPC_REGNUM));
 }
 
+
 void
 _initialize_29k()
 {