[CRIU] [PATCH 2/8] [v2] cr: generalize the type to store the value of the TLS register
Alexander Kartashov
alekskartashov at parallels.com
Tue Mar 18 10:00:47 PDT 2014
Supported machine architectures provide TLS stogares of different sizes:
the size of the TLS storage in x86-64 is 24 bytes, ARM --- 4 bytes
and upcoming AArch64 --- 8 bytes. This means every supported architecture
needs a specific type to store the value of the TLS register.
This patch reworks the insterface of the routines arch_get_tls()
and restore_tls() passing them the TLS storage by pointer
rather than by value to simplify the TLS stub for x86.
Signed-off-by: Alexander Kartashov <alekskartashov at parallels.com>
---
arch/arm/include/asm/dump.h | 2 +-
arch/arm/include/asm/parasite.h | 4 ++--
arch/arm/include/asm/restore.h | 2 +-
arch/arm/include/asm/restorer.h | 6 +++---
arch/arm/include/asm/types.h | 1 +
arch/x86/include/asm/parasite.h | 5 +----
arch/x86/include/asm/restorer.h | 2 +-
arch/x86/include/asm/types.h | 1 +
include/parasite.h | 2 +-
include/restorer.h | 2 +-
pie/parasite.c | 2 +-
pie/restorer.c | 2 +-
12 files changed, 15 insertions(+), 16 deletions(-)
diff --git a/arch/arm/include/asm/dump.h b/arch/arm/include/asm/dump.h
index f81b3a6..ae1588d 100644
--- a/arch/arm/include/asm/dump.h
+++ b/arch/arm/include/asm/dump.h
@@ -6,7 +6,7 @@ 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, tls_t tls)
{
core->ti_arm->tls = tls;
}
diff --git a/arch/arm/include/asm/parasite.h b/arch/arm/include/asm/parasite.h
index 4c4007f..7f62bb9 100644
--- a/arch/arm/include/asm/parasite.h
+++ b/arch/arm/include/asm/parasite.h
@@ -1,9 +1,9 @@
#ifndef __ASM_PARASITE_H__
#define __ASM_PARASITE_H__
-static inline u32 arch_get_tls(void)
+static inline void arch_get_tls(tls_t *ptls)
{
- return ((u32 (*)())0xffff0fe0)();
+ *ptls = ((tls_t (*)())0xffff0fe0)();
}
#endif
diff --git a/arch/arm/include/asm/restore.h b/arch/arm/include/asm/restore.h
index 1d6a423..a1e66a5 100644
--- a/arch/arm/include/asm/restore.h
+++ b/arch/arm/include/asm/restore.h
@@ -18,7 +18,7 @@
"r"(task_args) \
: "sp", "r0", "r1", "memory")
-static inline void core_get_tls(CoreEntry *pcore, u32 *ptls)
+static inline void core_get_tls(CoreEntry *pcore, tls_t *ptls)
{
*ptls = pcore->ti_arm->tls;
}
diff --git a/arch/arm/include/asm/restorer.h b/arch/arm/include/asm/restorer.h
index 7ffb05c..9461d12 100644
--- a/arch/arm/include/asm/restorer.h
+++ b/arch/arm/include/asm/restorer.h
@@ -136,16 +136,16 @@ int restore_nonsigframe_gpregs(UserArmRegsEntry *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(tls_t *ptls) {
asm (
"mov %%r7, #15 \n"
"lsl %%r7, #16 \n"
"mov %%r0, #5 \n"
"add %%r7, %%r0 \n" /* r7 = 0xF005 */
- "mov %%r0, %0 \n"
+ "ldr %%r0, [%0] \n"
"svc #0 \n"
:
- : "r"(tls)
+ : "r"(ptls)
: "r0", "r7"
);
}
diff --git a/arch/arm/include/asm/types.h b/arch/arm/include/asm/types.h
index 4b601d2..0b57ce8 100644
--- a/arch/arm/include/asm/types.h
+++ b/arch/arm/include/asm/types.h
@@ -110,6 +110,7 @@ typedef UserArmRegsEntry UserRegsEntry;
#define TI_SP(core) ((core)->ti_arm->gpregs->sp)
typedef u32 auxv_t;
+typedef u32 tls_t;
static inline void *decode_pointer(u64 v) { return (void*)(u32)v; }
static inline u64 encode_pointer(void *p) { return (u32)p; }
diff --git a/arch/x86/include/asm/parasite.h b/arch/x86/include/asm/parasite.h
index 41f4a97..48e48ac 100644
--- a/arch/x86/include/asm/parasite.h
+++ b/arch/x86/include/asm/parasite.h
@@ -1,9 +1,6 @@
#ifndef __ASM_PARASITE_H__
#define __ASM_PARASITE_H__
-static inline u32 arch_get_tls()
-{
- return 0;
-}
+static inline void arch_get_tls(tls_t *ptls) { (void)ptls; }
#endif
diff --git a/arch/x86/include/asm/restorer.h b/arch/x86/include/asm/restorer.h
index 4cc510c..5512155 100644
--- a/arch/x86/include/asm/restorer.h
+++ b/arch/x86/include/asm/restorer.h
@@ -143,6 +143,6 @@ int restore_nonsigframe_gpregs(UserX86RegsEntry *r);
int sigreturn_prep_fpu_frame(struct rt_sigframe *sigframe, fpu_state_t *fpu_state);
-static inline void restore_tls(u32 tls) { }
+static inline void restore_tls(tls_t *ptls) { (void)ptls; }
#endif
diff --git a/arch/x86/include/asm/types.h b/arch/x86/include/asm/types.h
index e056570..e0501c4 100644
--- a/arch/x86/include/asm/types.h
+++ b/arch/x86/include/asm/types.h
@@ -112,6 +112,7 @@ typedef struct {
#define TASK_SIZE ((1UL << 47) - PAGE_SIZE)
typedef u64 auxv_t;
+typedef char tls_t[24];
#define REG_RES(regs) ((regs).ax)
#define REG_IP(regs) ((regs).ip)
diff --git a/include/parasite.h b/include/parasite.h
index d53242e..502d575 100644
--- a/include/parasite.h
+++ b/include/parasite.h
@@ -138,7 +138,7 @@ static inline int posix_timers_dump_size(int timer_n)
struct parasite_dump_thread {
unsigned int *tid_addr;
pid_t tid;
- u32 tls;
+ tls_t tls;
stack_t sas;
};
diff --git a/include/restorer.h b/include/restorer.h
index e283b28..0041e60 100644
--- a/include/restorer.h
+++ b/include/restorer.h
@@ -85,7 +85,7 @@ struct thread_restore_args {
struct task_restore_args *ta;
- u32 tls;
+ tls_t tls;
siginfo_t *siginfo;
unsigned int siginfo_nr;
diff --git a/pie/parasite.c b/pie/parasite.c
index 564e244..1521862 100644
--- a/pie/parasite.c
+++ b/pie/parasite.c
@@ -142,7 +142,7 @@ static int dump_thread_common(struct parasite_dump_thread *ti)
{
int ret;
- ti->tls = arch_get_tls();
+ arch_get_tls(&ti->tls);
ret = sys_prctl(PR_GET_TID_ADDRESS, (unsigned long) &ti->tid_addr, 0, 0, 0);
if (ret == 0)
ret = sys_sigaltstack(NULL, &ti->sas);
diff --git a/pie/restorer.c b/pie/restorer.c
index 2bfe70d..f0a2d3e 100644
--- a/pie/restorer.c
+++ b/pie/restorer.c
@@ -256,7 +256,7 @@ static int restore_thread_common(struct rt_sigframe *sigframe,
if (restore_nonsigframe_gpregs(&args->gpregs))
return -1;
- restore_tls(args->tls);
+ restore_tls(&args->tls);
return 0;
}
--
1.7.9.5
More information about the CRIU
mailing list