[CRIU] [PATCH 02/22] x86: parasite -- Add call_daemon_thread and asm_trap helpers

Andrey Vagin avagin at openvz.org
Wed May 8 09:28:29 EDT 2013


From: Cyrill Gorcunov <gorcunov at openvz.org>

call_daemon_thread will be needed to run thread daemon
with own stack, while asm_trap is just a wrap over trapping
instruction for portability sake.

Signed-off-by: Cyrill Gorcunov <gorcunov at openvz.org>
Signed-off-by: Andrey Vagin <avagin at openvz.org>
---
 arch/x86/include/asm/parasite.h | 26 ++++++++++++++++++++++++++
 1 file changed, 26 insertions(+)

diff --git a/arch/x86/include/asm/parasite.h b/arch/x86/include/asm/parasite.h
index 41f4a97..3d55dc5 100644
--- a/arch/x86/include/asm/parasite.h
+++ b/arch/x86/include/asm/parasite.h
@@ -6,4 +6,30 @@ static inline u32 arch_get_tls()
 	return 0;
 }
 
+/*
+ * Call thread daemon with new stack, the function must
+ * return the original stack pointer passed in argument
+ * argument 3
+ */
+#define call_daemon_thread(new_sp, args, s, func)	\
+do {							\
+	asm volatile ("movq %0, %%rax		\n"	\
+		      "movq %1, %%rdi		\n"	\
+		      "movq %2, %%rsi		\n"	\
+		      "movq %%rsp, %%rdx	\n"	\
+		      "movq %%rax, %%rsp	\n"	\
+		      "call " #func "		\n"	\
+		      "movq %%rax, %%rsp	\n"	\
+		      :					\
+		      : "g"(new_sp), "g"(args), "g"(s)	\
+		      : "rax", "rdi", "rsi", "rdx",	\
+		        "rsp", "memory");		\
+} while (0)
+
+#define asm_trap()					\
+do {							\
+	asm volatile("int3" ::);			\
+	while (1) ;					\
+} while (0)
+
 #endif
-- 
1.8.2



More information about the CRIU mailing list