Index: gcc/gcc/config/i386/linux-unwind.h |
diff --git a/gcc/gcc/config/i386/linux-unwind.h b/gcc/gcc/config/i386/linux-unwind.h |
index 89f238a6ea17840ce184585315715008e4bc050b..36ee3709261777e867d21322d1d2889e719b4c41 100644 |
--- a/gcc/gcc/config/i386/linux-unwind.h |
+++ b/gcc/gcc/config/i386/linux-unwind.h |
@@ -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 */ |