]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
linux-unwind.h (x86_frob_update_context): New function.
authorEric Botcazou <ebotcazou@adacore.com>
Fri, 13 Nov 2009 06:58:12 +0000 (06:58 +0000)
committerEric Botcazou <ebotcazou@gcc.gnu.org>
Fri, 13 Nov 2009 06:58:12 +0000 (06:58 +0000)
* config/i386/linux-unwind.h (x86_frob_update_context): New function.
(MD_FROB_UPDATE_CONTEXT): Define.

From-SVN: r154141

gcc/ChangeLog
gcc/config/i386/linux-unwind.h

index ca0c28e86b410b74ccc29bd87b042b1a6926fa3f..238cd22a078bb4169c158ac35f38eda7ffcd74de 100644 (file)
@@ -1,3 +1,8 @@
+2009-11-13  Eric Botcazou  <ebotcazou@adacore.com>
+
+       * config/i386/linux-unwind.h (x86_frob_update_context): New function.
+       (MD_FROB_UPDATE_CONTEXT): Define.
+
 2009-11-12  Eric Botcazou  <ebotcazou@adacore.com>
             Laurent GUERBY  <laurent@guerby.net>
 
index 89f238a6ea17840ce184585315715008e4bc050b..36ee3709261777e867d21322d1d2889e719b4c41 100644 (file)
@@ -172,6 +172,25 @@ x86_fallback_frame_state (struct _Unwind_Context *context,
   fs->signal_frame = 1;
   return _URC_NO_REASON;
 }
+
+#define MD_FROB_UPDATE_CONTEXT x86_frob_update_context
+
+/* Fix up for kernels that have vDSO, but don't have S flag in it.  */
+
+static void
+x86_frob_update_context (struct _Unwind_Context *context,
+                        _Unwind_FrameState *fs ATTRIBUTE_UNUSED)
+{
+  unsigned char *pc = context->ra;
+
+  /* movl $__NR_rt_sigreturn,%eax ; {int $0x80 | syscall}  */
+  if (*(unsigned char *)(pc+0) == 0xb8
+      && *(unsigned int *)(pc+1) == 173
+      && (*(unsigned short *)(pc+5) == 0x80cd
+         || *(unsigned short *)(pc+5) == 0x050f))
+    _Unwind_SetSignalFrame (context, 1);
+}
+
 #endif /* not glibc 2.0 */
 #endif /* ifdef __x86_64__  */
 #endif /* ifdef inhibit_libc  */