[CRIU] [PATCH] Wire up AArch64 TLS dump and restore

Christopher Covington cov at codeaurora.org
Fri Feb 14 15:18:21 PST 2014


I wonder why ptrace isn't being used by existing architecture
ports for TLS registers, but since the hooks already exist for
non-ptrace style, implement that for now.

Signed-off-by: Christopher Covington <cov at codeaurora.org>
---
 arch/aarch64/include/asm/dump.h     | 5 ++++-
 arch/aarch64/include/asm/parasite.h | 6 +++++-
 arch/aarch64/include/asm/restore.h  | 5 ++++-
 arch/aarch64/include/asm/restorer.h | 4 +++-
 protobuf/core-aarch64.proto         | 5 +++--
 5 files changed, 19 insertions(+), 6 deletions(-)

diff --git a/arch/aarch64/include/asm/dump.h b/arch/aarch64/include/asm/dump.h
index 396c97e..2665166 100644
--- a/arch/aarch64/include/asm/dump.h
+++ b/arch/aarch64/include/asm/dump.h
@@ -6,6 +6,9 @@ extern int arch_alloc_thread_info(CoreEntry *core);
 extern void arch_free_thread_info(CoreEntry *core);
 
 
-static inline void core_put_tls(CoreEntry *core, u32 tls) { }
+static inline void core_put_tls(CoreEntry *core, u32 tls)
+{
+	core->ti_aarch64->tls = tls;
+}
 
 #endif
diff --git a/arch/aarch64/include/asm/parasite.h b/arch/aarch64/include/asm/parasite.h
index 19959b7..8f3644d 100644
--- a/arch/aarch64/include/asm/parasite.h
+++ b/arch/aarch64/include/asm/parasite.h
@@ -1,6 +1,10 @@
 #ifndef __ASM_PARASITE_H__
 #define __ASM_PARASITE_H__
 
-static inline u32 arch_get_tls(void) { return 0; }
+static inline u32 arch_get_tls(void) {
+	u32 ret;
+	asm("mrs %0, tpidr_el0" : "=r" (ret));
+	return ret;
+}
 
 #endif
diff --git a/arch/aarch64/include/asm/restore.h b/arch/aarch64/include/asm/restore.h
index 8aae682..7724843 100644
--- a/arch/aarch64/include/asm/restore.h
+++ b/arch/aarch64/include/asm/restore.h
@@ -20,7 +20,10 @@
 			  "r"(task_args)			\
 			: "sp", "x0", "x1", "memory")
 
-static inline void core_get_tls(CoreEntry *pcore, uint32_t *ptls) { }
+static inline void core_get_tls(CoreEntry *pcore, uint32_t *ptls)
+{
+	*ptls = pcore->ti_aarch64->tls;
+}
 
 
 int restore_fpu(struct rt_sigframe *sigframe, CoreEntry *core);
diff --git a/arch/aarch64/include/asm/restorer.h b/arch/aarch64/include/asm/restorer.h
index 5fa929e..91bc912 100644
--- a/arch/aarch64/include/asm/restorer.h
+++ b/arch/aarch64/include/asm/restorer.h
@@ -135,6 +135,8 @@ int restore_nonsigframe_gpregs(UserAarch64RegsEntry *r);
 
 static inline int sigreturn_prep_fpu_frame(struct rt_sigframe *sigframe, fpu_state_t *fpu_state) { return 0; }
 
-static inline void restore_tls(u32 tls) { }
+static inline void restore_tls(u32 tls) {
+	asm("msr tpidr_el0, %0" : : "r" (tls));
+}
 
 #endif
diff --git a/protobuf/core-aarch64.proto b/protobuf/core-aarch64.proto
index b29425e..b0fd352 100644
--- a/protobuf/core-aarch64.proto
+++ b/protobuf/core-aarch64.proto
@@ -13,6 +13,7 @@ message user_aarch64_fpsimd_context_entry {
 
 message thread_info_aarch64 {
 	required uint64			 		clear_tid_addr	= 1;
-	required user_aarch64_regs_entry		gpregs		= 2;
-	required user_aarch64_fpsimd_context_entry	fpsimd		= 3;
+	required uint32					tls		= 2;
+	required user_aarch64_regs_entry		gpregs		= 3;
+	required user_aarch64_fpsimd_context_entry	fpsimd		= 4;
 }
-- 
Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum,
hosted by the Linux Foundation.



More information about the CRIU mailing list