Pointed out by Anton Blanchard <anton@samba.org>.
authorDaniel Jacobowitz <drow@false.org>
Tue, 4 Feb 2003 18:21:29 +0000 (18:21 +0000)
committerDaniel Jacobowitz <drow@false.org>
Tue, 4 Feb 2003 18:21:29 +0000 (18:21 +0000)
* ppc-linux-tdep.c (insn_is_sigreturn): New function.
(ppc_linux_at_sigtramp_return_path): Use it.

gdb/ChangeLog
gdb/ppc-linux-tdep.c

index 892cf79e3357610dd863e3a396e8677bb983a3b4..289ad10a9b401c7734211d5a88595daa29069add 100644 (file)
@@ -1,3 +1,9 @@
+2003-02-04  Daniel Jacobowitz  <drow@mvista.com>
+
+       Pointed out by Anton Blanchard <anton@samba.org>.
+       * ppc-linux-tdep.c (insn_is_sigreturn): New function.
+       (ppc_linux_at_sigtramp_return_path): Use it.
+
 2003-02-04  Daniel Jacobowitz  <drow@mvista.com>
 
        * defs.h (streq): Add prototype.
index c118cf4af3c002c86ae84b99ae9a3312b761d248..3677d9fb314e9d9dd5a3faeed5e8549852dcf6d5 100644 (file)
 #include "solib-svr4.h"
 #include "ppc-tdep.h"
 
-/* The following two instructions are used in the signal trampoline
-   code on GNU/Linux PPC.  */
-#define INSTR_LI_R0_0x7777     0x38007777
-#define INSTR_SC               0x44000002
+/* The following instructions are used in the signal trampoline code
+   on GNU/Linux PPC. The kernel used to use magic syscalls 0x6666 and
+   0x7777 but now uses the sigreturn syscalls.  We check for both.  */
+#define INSTR_LI_R0_0x6666             0x38006666
+#define INSTR_LI_R0_0x7777             0x38007777
+#define INSTR_LI_R0_NR_sigreturn       0x38000077
+#define INSTR_LI_R0_NR_rt_sigreturn    0x380000AC
+
+#define INSTR_SC                       0x44000002
 
 /* Since the *-tdep.c files are platform independent (i.e, they may be
    used to build cross platform debuggers), we can't include system
@@ -183,6 +188,21 @@ ppc_linux_in_sigtramp (CORE_ADDR pc, char *func_name)
   return (pc == handler || pc == handler + 4);
 }
 
+static inline int
+insn_is_sigreturn (unsigned long pcinsn)
+{
+  switch(pcinsn)
+    {
+    case INSTR_LI_R0_0x6666:
+    case INSTR_LI_R0_0x7777:
+    case INSTR_LI_R0_NR_sigreturn:
+    case INSTR_LI_R0_NR_rt_sigreturn:
+      return 1;
+    default:
+      return 0;
+    }
+}
+
 /*
  * The signal handler trampoline is on the stack and consists of exactly
  * two instructions.  The easiest and most accurate way of determining
@@ -202,11 +222,11 @@ ppc_linux_at_sigtramp_return_path (CORE_ADDR pc)
   pcinsn = extract_unsigned_integer (buf + 4, 4);
 
   return (
-          (pcinsn == INSTR_LI_R0_0x7777
+          (insn_is_sigreturn (pcinsn)
            && extract_unsigned_integer (buf + 8, 4) == INSTR_SC)
           ||
           (pcinsn == INSTR_SC
-           && extract_unsigned_integer (buf, 4) == INSTR_LI_R0_0x7777));
+           && insn_is_sigreturn (extract_unsigned_integer (buf, 4))));
 }
 
 CORE_ADDR