Tidy up formatting.
[deliverable/binutils-gdb.git] / gdb / m68k-tdep.c
index 87bcfeb758e2a69107f7df50cedf7340d6abe6e6..0bdb3f62fc10ea59e2bd10949edf32b1b518207d 100644 (file)
@@ -1,5 +1,6 @@
 /* Target dependent code for the Motorola 68000 series.
-   Copyright (C) 1990, 1992 Free Software Foundation, Inc.
+   Copyright (C) 1990, 1992, 1993, 1994, 1995, 1996, 1999, 2000
+   Free Software Foundation, Inc.
 
    This file is part of GDB.
 
 #include "inferior.h"
 \f
 
+#define P_LINKL_FP     0x480e
+#define P_LINKW_FP     0x4e56
+#define P_PEA_FP       0x4856
+#define P_MOVL_SP_FP   0x2c4f
+#define P_MOVL         0x207c
+#define P_JSR          0x4eb9
+#define P_BSR          0x61ff
+#define P_LEAL         0x43fb
+#define P_MOVML                0x48ef
+#define P_FMOVM                0xf237
+#define P_TRAP         0x4e40
+
 /* The only reason this is here is the tm-altos.h reference below.  It
    was moved back here from tm-m68k.h.  FIXME? */
 
@@ -35,9 +48,9 @@ altos_skip_prologue (pc)
      CORE_ADDR pc;
 {
   register int op = read_memory_integer (pc, 2);
-  if (op == 0047126)
+  if (op == P_LINKW_FP)
     pc += 4;                   /* Skip link #word */
-  else if (op == 0044016)
+  else if (op == P_LINKL_FP)
     pc += 6;                   /* Skip link #long */
   /* Not sure why branches are here.  */
   /* From tm-isi.h, tm-altos.h */
@@ -58,9 +71,9 @@ isi_skip_prologue (pc)
      CORE_ADDR pc;
 {
   register int op = read_memory_integer (pc, 2);
-  if (op == 0047126)
+  if (op == P_LINKW_FP)
     pc += 4;                   /* Skip link #word */
-  else if (op == 0044016)
+  else if (op == P_LINKL_FP)
     pc += 6;                   /* Skip link #long */
   /* Not sure why branches are here.  */
   /* From tm-isi.h, tm-altos.h */
@@ -73,6 +86,44 @@ isi_skip_prologue (pc)
   return pc;
 }
 
+int
+delta68_in_sigtramp (pc, name)
+     CORE_ADDR pc;
+     char *name;
+{
+  if (name != NULL)
+    return strcmp (name, "_sigcode") == 0;
+  else
+    return 0;
+}
+
+CORE_ADDR
+delta68_frame_args_address (frame_info)
+     struct frame_info * frame_info;
+{
+  /* we assume here that the only frameless functions are the system calls
+     or other functions who do not put anything on the stack. */
+  if (frame_info->signal_handler_caller)
+    return frame_info->frame + 12;
+  else if (frameless_look_for_prologue (frame_info))
+    {
+    /* Check for an interrupted system call */
+    if (frame_info->next && frame_info->next->signal_handler_caller)
+      return frame_info->next->frame + 16;
+    else
+      return frame_info->frame + 4;
+    }
+  else
+    return frame_info->frame;
+}
+
+CORE_ADDR
+delta68_frame_saved_pc (frame_info)
+     struct frame_info * frame_info;
+{
+  return read_memory_integer (delta68_frame_args_address (frame_info) + 4, 4);
+}
+
 /* Return number of args passed to a frame.
    Can return -1, meaning no way to tell.  */
 
@@ -246,16 +297,6 @@ m68k_pop_frame ()
 
  */
 
-#define P_LINK_L       0x480e
-#define P_LINK_W       0x4e56
-#define P_MOV_L                0x207c
-#define P_JSR          0x4eb9
-#define P_BSR          0x61ff
-#define P_LEA_L                0x43fb
-#define P_MOVM_L       0x48ef
-#define P_FMOVM                0xf237
-#define P_TRAP         0x4e40
-
 CORE_ADDR
 m68k_skip_prologue (ip)
      CORE_ADDR ip;
@@ -275,30 +316,20 @@ m68k_skip_prologue (ip)
       op = read_memory_integer (ip, 2);
       op &= 0xFFFF;
 
-      if (op == P_LINK_W)
-       {
-         ip += 4;              /* Skip link.w */
-       }
-      else if (op == 0x4856)
+      if (op == P_LINKW_FP)
+       ip += 4;                /* Skip link.w */
+      else if (op == P_PEA_FP)
        ip += 2;                /* Skip pea %fp */
-      else if (op == 0x2c4f)
+      else if (op == P_MOVL_SP_FP)
        ip += 2;                /* Skip move.l %sp, %fp */
-      else if (op == P_LINK_L)
-       {
-         ip += 6;              /* Skip link.l */
-       }
-      else if (op == P_MOVM_L)
-       {
-         ip += 6;              /* Skip movm.l */
-       }
+      else if (op == P_LINKL_FP)
+       ip += 6;                /* Skip link.l */
+      else if (op == P_MOVML)
+       ip += 6;                /* Skip movm.l */
       else if (op == P_FMOVM)
-       {
-         ip += 10;             /* Skip fmovm */
-       }
+       ip += 10;               /* Skip fmovm */
       else
-       {
-         break;                /* Found unknown code, bail out. */
-       }
+       break;          /* Found unknown code, bail out. */
     }
   return (ip);
 }
@@ -335,26 +366,31 @@ m68k_find_saved_regs (frame_info, saved_regs)
     {
       pc = get_pc_function_start ((frame_info)->pc);
 
-      if (0x4856 == read_memory_integer (pc, 2)
-         && 0x2c4f == read_memory_integer (pc + 2, 2))
+      nextinsn = read_memory_integer (pc, 2);
+      if (P_PEA_FP == nextinsn
+         && P_MOVL_SP_FP == read_memory_integer (pc + 2, 2))
        {
-         /*
-            pea %fp
+         /* pea %fp
             move.l %sp, %fp */
-
-         pc += 4;
          next_addr = frame_info->frame;
+         pc += 4;
        }
-      else if (044016 == read_memory_integer (pc, 2))
+      else if (P_LINKL_FP == nextinsn)
        /* link.l %fp */
        /* Find the address above the saved   
           regs using the amount of storage from the link instruction.  */
-       next_addr = (frame_info)->frame + read_memory_integer (pc += 2, 4), pc += 4;
-      else if (047126 == read_memory_integer (pc, 2))
+       {
+         next_addr = (frame_info)->frame + read_memory_integer (pc + 2, 4);
+         pc += 6;
+       }
+      else if (P_LINKW_FP == nextinsn)
        /* link.w %fp */
        /* Find the address above the saved   
           regs using the amount of storage from the link instruction.  */
-       next_addr = (frame_info)->frame + read_memory_integer (pc += 2, 2), pc += 2;
+       {
+         next_addr = (frame_info)->frame + read_memory_integer (pc + 2, 2);
+         pc += 4;
+       }
       else
        goto lose;
 
@@ -362,66 +398,99 @@ m68k_find_saved_regs (frame_info, saved_regs)
       if ((0177777 & read_memory_integer (pc, 2)) == 0157774)
        next_addr += read_memory_integer (pc += 2, 4), pc += 4;
     }
-  regmask = read_memory_integer (pc + 2, 2);
 
-  /* Here can come an fmovem.  Check for it.  */
-  nextinsn = 0xffff & read_memory_integer (pc, 2);
-  if (0xf227 == nextinsn
-      && (regmask & 0xff00) == 0xe000)
+  for ( ; ; )
     {
-      pc += 4;                 /* Regmask's low bit is for register fp7, the first pushed */
-      for (regnum = FP0_REGNUM + 7; regnum >= FP0_REGNUM; regnum--, regmask >>= 1)
-       if (regmask & 1)
-         saved_regs->regs[regnum] = (next_addr -= 12);
+      nextinsn = 0xffff & read_memory_integer (pc, 2);
       regmask = read_memory_integer (pc + 2, 2);
-    }
-
-  /* next should be a moveml to (sp) or -(sp) or a movl r,-(sp) */
-  if (0044327 == read_memory_integer (pc, 2))
-    {
-      pc += 4;                 /* Regmask's low bit is for register 0, the first written */
-      for (regnum = 0; regnum < 16; regnum++, regmask >>= 1)
-       if (regmask & 1)
-         saved_regs->regs[regnum] = (next_addr += 4) - 4;
-    }
-  else if (0044347 == read_memory_integer (pc, 2))
-    {
-      pc += 4;                 /* Regmask's low bit is for register 15, the first pushed */
-      for (regnum = 15; regnum >= 0; regnum--, regmask >>= 1)
-       if (regmask & 1)
-         saved_regs->regs[regnum] = (next_addr -= 4);
-    }
-  else if (0x2f00 == (0xfff0 & read_memory_integer (pc, 2)))
-    {
-      regnum = 0xf & read_memory_integer (pc, 2);
-      pc += 2;
-      saved_regs->regs[regnum] = (next_addr -= 4);
-      /* gcc, at least, may use a pair of movel instructions when saving
-         exactly 2 registers.  */
-      if (0x2f00 == (0xfff0 & read_memory_integer (pc, 2)))
+      /* fmovemx to -(sp) */
+      if (0xf227 == nextinsn && (regmask & 0xff00) == 0xe000)
        {
-         regnum = 0xf & read_memory_integer (pc, 2);
-         pc += 2;
+         /* Regmask's low bit is for register fp7, the first pushed */
+         for (regnum = FP0_REGNUM + 8; --regnum >= FP0_REGNUM; regmask >>= 1)
+           if (regmask & 1)
+             saved_regs->regs[regnum] = (next_addr -= 12);
+         pc += 4;
+       }
+      /* fmovemx to (fp + displacement) */
+      else if (0171056 == nextinsn && (regmask & 0xff00) == 0xf000)
+       {
+         register CORE_ADDR addr;
+
+         addr = (frame_info)->frame + read_memory_integer (pc + 4, 2);
+         /* Regmask's low bit is for register fp7, the first pushed */
+         for (regnum = FP0_REGNUM + 8; --regnum >= FP0_REGNUM; regmask >>= 1)
+           if (regmask & 1)
+             {
+               saved_regs->regs[regnum] = addr;
+               addr += 12;
+             }
+         pc += 6;
+       }
+      /* moveml to (sp) */
+      else if (0044327 == nextinsn)
+       {
+         /* Regmask's low bit is for register 0, the first written */
+         for (regnum = 0; regnum < 16; regnum++, regmask >>= 1)
+           if (regmask & 1)
+             {
+               saved_regs->regs[regnum] = next_addr;
+               next_addr += 4;
+             }
+         pc += 4;
+       }
+      /* moveml to (fp + displacement) */
+      else if (0044356 == nextinsn)
+       {
+         register CORE_ADDR addr;
+
+         addr = (frame_info)->frame + read_memory_integer (pc + 4, 2);
+         /* Regmask's low bit is for register 0, the first written */
+         for (regnum = 0; regnum < 16; regnum++, regmask >>= 1)
+           if (regmask & 1)
+             {
+               saved_regs->regs[regnum] = addr;
+               addr += 4;
+             }
+         pc += 6;
+       }
+      /* moveml to -(sp) */
+      else if (0044347 == nextinsn)
+       {
+         /* Regmask's low bit is for register 15, the first pushed */
+         for (regnum = 16; --regnum >= 0; regmask >>= 1)
+           if (regmask & 1)
+             saved_regs->regs[regnum] = (next_addr -= 4);
+         pc += 4;
+       }
+      /* movl r,-(sp) */
+      else if (0x2f00 == (0xfff0 & nextinsn))
+       {
+         regnum = 0xf & nextinsn;
          saved_regs->regs[regnum] = (next_addr -= 4);
+         pc += 2;
        }
+      /* fmovemx to index of sp */
+      else if (0xf236 == nextinsn && (regmask & 0xff00) == 0xf000)
+       {
+         /* Regmask's low bit is for register fp0, the first written */
+         for (regnum = FP0_REGNUM + 8; --regnum >= FP0_REGNUM; regmask >>= 1)
+           if (regmask & 1)
+             {
+               saved_regs->regs[regnum] = next_addr;
+               next_addr += 12;
+             }
+         pc += 10;
+       }
+      /* clrw -(sp); movw ccr,-(sp) */
+      else if (0x4267 == nextinsn && 0x42e7 == regmask)
+       {
+         saved_regs->regs[PS_REGNUM] = (next_addr -= 4);
+         pc += 4;
+       }
+      else
+       break;
     }
-
-  /* fmovemx to index of sp may follow.  */
-  regmask = read_memory_integer (pc + 2, 2);
-  nextinsn = 0xffff & read_memory_integer (pc, 2);
-  if (0xf236 == nextinsn
-      && (regmask & 0xff00) == 0xf000)
-    {
-      pc += 10;                        /* Regmask's low bit is for register fp0, the first written */
-      for (regnum = FP0_REGNUM + 7; regnum >= FP0_REGNUM; regnum--, regmask >>= 1)
-       if (regmask & 1)
-         saved_regs->regs[regnum] = (next_addr += 12) - 12;
-      regmask = read_memory_integer (pc + 2, 2);
-    }
-
-  /* clrw -(sp); movw ccr,-(sp) may follow.  */
-  if (0x426742e7 == read_memory_integer (pc, 4))
-    saved_regs->regs[PS_REGNUM] = (next_addr -= 4);
 lose:;
   saved_regs->regs[SP_REGNUM] = (frame_info)->frame + 8;
   saved_regs->regs[FP_REGNUM] = (frame_info)->frame;
@@ -438,6 +507,9 @@ lose:;
 
 #include <sys/procfs.h>
 
+/* Prototypes for supply_gregset etc. */
+#include "gregset.h"
+
 /*  The /proc interface divides the target machine's register set up into
    two different sets, the general register set (gregset) and the floating
    point register set (fpregset).  For each set, there is an ioctl to get
@@ -635,6 +707,7 @@ m68k_saved_pc_after_call (frame)
     return read_memory_integer (read_register (SP_REGNUM), 4);
 }
 
+
 void
 _initialize_m68k_tdep ()
 {
This page took 0.028789 seconds and 4 git commands to generate.