From 20b7dafaacde85a599ebee8bcd6558a5925b084d Mon Sep 17 00:00:00 2001 From: Cyrill Gorcunov Date: Wed, 10 Jul 2013 17:31:12 +0400 Subject: [PATCH] restore: Add restoration of alternative signal stack To restore SAS we have two ways: - call for sigaltstack explicitly in restorer.c right before we call for sigreturn - pass stack value to sigreturn call and allow the kernel to restore stack for us Since second way is a simplier one -- we stick with it. [alekskartashov@: use RT_SIGFRAME_UC] Signed-off-by: Cyrill Gorcunov CC: Alexander Kartashov Signed-off-by: Pavel Emelyanov --- include/sigframe.h | 17 +++++++++++++++++ sigframe.c | 2 ++ 2 files changed, 19 insertions(+) diff --git a/include/sigframe.h b/include/sigframe.h index afc2c9d7e..845c47d64 100644 --- a/include/sigframe.h +++ b/include/sigframe.h @@ -5,6 +5,9 @@ #ifndef __CR_SIGFRAME_H__ #define __CR_SIGFRAME_H__ +#include "asm/types.h" +#include "protobuf/core.pb-c.h" + struct rt_sigframe; #ifndef __ARCH_SI_PREAMBLE_SIZE @@ -43,4 +46,18 @@ extern int construct_sigframe(struct rt_sigframe *sigframe, struct rt_sigframe *rsigframe, CoreEntry *core); +/* + * FIXME Convert it to inline helper, which requires + * to unweave types mess we've generated for + * run-time data. + */ +#define setup_sas(sigframe, sas) \ +do { \ + if ((sas)) { \ + RT_SIGFRAME_UC((sigframe)).uc_stack.ss_sp = (void *)decode_pointer((sas)->ss_sp); \ + RT_SIGFRAME_UC((sigframe)).uc_stack.ss_flags = (int)(sas)->ss_flags; \ + RT_SIGFRAME_UC((sigframe)).uc_stack.ss_size = (size_t)(sas)->ss_size; \ + } \ +} while (0) + #endif /* __CR_SIGFRAME_H__ */ diff --git a/sigframe.c b/sigframe.c index 68c9776ab..0c7e60093 100644 --- a/sigframe.c +++ b/sigframe.c @@ -31,5 +31,7 @@ int construct_sigframe(struct rt_sigframe *sigframe, if (restore_gpregs(sigframe, CORE_THREAD_ARCH_INFO(core)->gpregs)) return -1; + setup_sas(sigframe, core->thread_core->sas); + return 0; }