[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