[PATCH] restore: Add restoration of alternative signal stack

Cyrill Gorcunov gorcunov at openvz.org
Mon Jun 17 12:34:00 EDT 2013


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 <gorcunov at openvz.org>
CC: Alexander Kartashov <alekskartashov at parallels.com>
---
 include/sigframe.h | 18 ++++++++++++++++++
 sigframe.c         | 12 ++++++++++++
 2 files changed, 30 insertions(+)

diff --git a/include/sigframe.h b/include/sigframe.h
index afc2c9d..7c3ae9f 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,19 @@ extern int construct_sigframe(struct rt_sigframe *sigframe,
 			      struct rt_sigframe *rsigframe,
 			      CoreEntry *core);
 
+#define SAS_INVALID_SP		((u64)-1)
+/*
+ * 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 68c9776..053bdf0 100644
--- a/sigframe.c
+++ b/sigframe.c
@@ -31,5 +31,17 @@ int construct_sigframe(struct rt_sigframe *sigframe,
 	if (restore_gpregs(sigframe, CORE_THREAD_ARCH_INFO(core)->gpregs))
 		return -1;
 
+	/*
+	 * On restore we have 2 ways for sas
+	 * - either call for sigaltstack explicitly in restorer.c right before
+	 *   we call for sigreturn
+	 *
+	 * - either pass stack value to sigreturn call and allow the kernel to
+	 *   restore stack for us
+	 *
+	 * Second way looks more clean and simple, and here we go.
+	 */
+	setup_sas(sigframe, core->thread_core->sas);
+
 	return 0;
 }
-- 
1.8.1.4


--gKMricLos+KVdGMg--


More information about the CRIU mailing list