]> git.puffer.fish Git - matthieu/frr.git/commitdiff
[lib] Add support for backtrace on more platforms
authorJoakim Tjernlund <joakim.tjernlund@transmode.se>
Thu, 25 Jun 2009 15:40:06 +0000 (16:40 +0100)
committerDaniel Walton <dwalton@cumulusnetworks.com>
Thu, 26 May 2016 01:09:43 +0000 (01:09 +0000)
* lib/sigevent.c: (program_counter) extend to support more platforms. Joint
  effort with Paul Jakma.

(cherry picked from commit b166ea2dda9f04a8b75e0bf5adb7064580695f22)

configure.ac
lib/sigevent.c

index 852b63d6ae2d35ae715bfbb6e32a63c2e7895f61..5461e362bed394dab43d9f09a3765adb586dfa74 100755 (executable)
@@ -580,6 +580,18 @@ AC_CHECK_HEADERS([ucontext.h], [], [],
 QUAGGA_INCLUDES
 ])
 
+m4_define([UCONTEXT_INCLUDES],
+[#include <ucontext.h>])dnl
+
+AC_CHECK_MEMBERS([ucontext_t.uc_mcontext.uc_regs],
+  [], [], [UCONTEXT_INCLUDES])
+AC_CHECK_MEMBERS([ucontext_t.uc_mcontext.regs],
+  [AC_CHECK_MEMBERS([ucontext_t.uc_mcontext.regs.nip],
+   [], [], [UCONTEXT_INCLUDES])],
+  [], [UCONTEXT_INCLUDES])
+AC_CHECK_MEMBERS([ucontext_t.uc_mcontext.gregs],
+  [], [], [UCONTEXT_INCLUDES])
+
 m4_define([QUAGGA_INCLUDES],
 QUAGGA_INCLUDES
 [#if HAVE_SYS_UN_H
index 7d08fd97ce57a356e9d55b6629feab8f6748094b..c80a729012bc64096e21a81562e5cbf6aef0801c 100644 (file)
@@ -175,11 +175,35 @@ program_counter(void *context)
 {
 #ifdef HAVE_UCONTEXT_H
 #ifdef GNU_LINUX
-#ifdef REG_EIP
-  if (context)
-    return (void *)(((ucontext_t *)context)->uc_mcontext.gregs[REG_EIP]);
-#endif /* REG_EIP */
+  /* these are from GNU libc, rather than Linux, strictly speaking */
+# if defined(REG_EIP)
+#  define REG_INDEX REG_EIP
+# elif defined(REG_RIP)
+#  define REG_INDEX REG_RIP
+# elif defined(__powerpc__)
+#  define REG_INDEX 32
+# endif
+#elif defined(SUNOS_5) /* !GNU_LINUX */
+# define REG_INDEX REG_PC
 #endif /* GNU_LINUX */
+
+#ifdef REG_INDEX
+# ifdef HAVE_UCONTEXT_T_UC_MCONTEXT_GREGS
+#  define REGS gregs[REG_INDEX]
+# elif defined(HAVE_UCONTEXT_T_UC_MCONTEXT_UC_REGS)
+#  define REGS uc_regs->gregs[REG_INDEX]
+# endif /* HAVE_UCONTEXT_T_UC_MCONTEXT_GREGS */
+#endif /* REG_INDEX */
+
+#ifdef REGS
+  if (context)
+    return (void *)(((ucontext_t *)context)->uc_mcontext.REGS);
+#elif defined(HAVE_UCONTEXT_T_UC_MCONTEXT_REGS__NIP) 
+  /* older Linux / struct pt_regs ? */
+  if (context)
+    return (void *)(((ucontext_t *)context)->uc_mcontext.regs->nip);
+#endif /* REGS */
+
 #endif /* HAVE_UCONTEXT_H */
   return NULL;
 }