mirror of
https://github.com/checkpoint-restore/criu
synced 2025-09-03 15:55:53 +00:00
cr: Introduce stubs for tls dump/restore
Leave them empty for x86, will be used on ARM. Signed-off-by: Pavel Emelyanov <xemul@parallels.com>
This commit is contained in:
committed by
Pavel Emelyanov
parent
3f12d688ae
commit
e1e2346880
@@ -5,4 +5,7 @@ extern int get_task_regs(pid_t pid, CoreEntry *core, const struct parasite_ctl *
|
||||
extern int arch_alloc_thread_info(CoreEntry *core);
|
||||
extern void core_entry_free(CoreEntry *core);
|
||||
|
||||
|
||||
#define core_put_tls(core, tls)
|
||||
|
||||
#endif
|
||||
|
9
arch/x86/include/asm/parasite.h
Normal file
9
arch/x86/include/asm/parasite.h
Normal file
@@ -0,0 +1,9 @@
|
||||
#ifndef __ASM_PARASITE_H__
|
||||
#define __ASM_PARASITE_H__
|
||||
|
||||
static inline u32 arch_get_tls()
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endif
|
@@ -15,4 +15,6 @@
|
||||
"g"(task_args) \
|
||||
: "rsp", "rdi", "rsi", "rbx", "rax", "memory")
|
||||
|
||||
#define core_get_tls(pcore, ptls)
|
||||
|
||||
#endif
|
||||
|
@@ -134,4 +134,6 @@ int restore_gpregs(struct rt_sigframe *f, UserX86RegsEntry *r);
|
||||
|
||||
int restore_fpu(struct rt_sigframe *sigframe, struct thread_restore_args *args);
|
||||
|
||||
static inline void restore_tls(u32 tls) { }
|
||||
|
||||
#endif
|
||||
|
@@ -790,6 +790,8 @@ static int dump_task_core_all(pid_t pid, const struct proc_pid_stat *stat,
|
||||
if (ret)
|
||||
goto err_free;
|
||||
|
||||
core_put_tls(core, misc->tls);
|
||||
|
||||
ret = pb_write_one(fd_core, core, PB_CORE);
|
||||
if (ret < 0)
|
||||
goto err_free;
|
||||
@@ -1156,6 +1158,7 @@ static int dump_task_thread(struct parasite_ctl *parasite_ctl, struct pid *tid)
|
||||
int ret = -1, fd_core;
|
||||
unsigned int *taddr;
|
||||
pid_t pid = tid->real;
|
||||
u32 tls;
|
||||
|
||||
pr_info("\n");
|
||||
pr_info("Dumping core for thread (pid: %d)\n", pid);
|
||||
@@ -1174,12 +1177,15 @@ static int dump_task_thread(struct parasite_ctl *parasite_ctl, struct pid *tid)
|
||||
goto err_free;
|
||||
|
||||
ret = parasite_dump_thread_seized(parasite_ctl, pid, &taddr,
|
||||
&tid->virt, &core->thread_core->blk_sigset);
|
||||
&tid->virt, &core->thread_core->blk_sigset,
|
||||
&tls);
|
||||
|
||||
if (ret) {
|
||||
pr_err("Can't dump thread for pid %d\n", pid);
|
||||
goto err_free;
|
||||
}
|
||||
core->thread_core->has_blk_sigset = true;
|
||||
core_put_tls(core, tls);
|
||||
|
||||
pr_info("%d: virt_pid=%d tid_address=%p sig_blocked=0x%lx\n", pid,
|
||||
tid->virt, taddr, core->thread_core->blk_sigset);
|
||||
|
@@ -1897,6 +1897,7 @@ static int sigreturn_restore(pid_t pid, CoreEntry *core)
|
||||
thread_args[i].ta = task_args;
|
||||
thread_args[i].gpregs = *tcore->thread_info->gpregs;
|
||||
thread_args[i].clear_tid_addr = tcore->thread_info->clear_tid_addr;
|
||||
core_get_tls(tcore, &thread_args[i].tls);
|
||||
|
||||
if (tcore->thread_core) {
|
||||
thread_args[i].has_futex = true;
|
||||
|
@@ -38,7 +38,7 @@ extern int parasite_dump_pages_seized(struct parasite_ctl *ctl,
|
||||
struct parasite_dump_thread;
|
||||
extern int parasite_dump_thread_seized(struct parasite_ctl *ctl, pid_t pid,
|
||||
unsigned int **tid_add, pid_t *tid,
|
||||
void *blocked);
|
||||
void *blocked, u32 *tls);
|
||||
|
||||
struct parasite_drain_fd;
|
||||
struct fd_opts;
|
||||
|
@@ -83,6 +83,7 @@ struct parasite_dump_misc {
|
||||
u32 pid;
|
||||
u32 sid;
|
||||
u32 pgid;
|
||||
u32 tls;
|
||||
};
|
||||
|
||||
#define PARASITE_MAX_GROUPS (PAGE_SIZE / sizeof(unsigned int))
|
||||
@@ -97,6 +98,7 @@ struct parasite_dump_thread {
|
||||
unsigned int *tid_addr;
|
||||
pid_t tid;
|
||||
k_rtsigset_t blocked;
|
||||
u32 tls;
|
||||
};
|
||||
|
||||
#define PARASITE_MAX_FDS (PAGE_SIZE / sizeof(int))
|
||||
|
@@ -90,6 +90,8 @@ struct thread_restore_args {
|
||||
struct xsave_struct xsave;
|
||||
unsigned char __pad[sizeof(struct xsave_struct) + FP_XSTATE_MAGIC2_SIZE];
|
||||
};
|
||||
|
||||
u32 tls;
|
||||
} __aligned(sizeof(long));
|
||||
|
||||
struct task_restore_core_args {
|
||||
|
@@ -1,4 +1,5 @@
|
||||
#include <unistd.h>
|
||||
#include <inttypes.h>
|
||||
|
||||
#include <sys/stat.h>
|
||||
#include <sys/wait.h>
|
||||
@@ -365,7 +366,8 @@ err:
|
||||
|
||||
int parasite_dump_thread_seized(struct parasite_ctl *ctl, pid_t pid,
|
||||
unsigned int **tid_addr, pid_t *tid,
|
||||
void *blocked)
|
||||
void *blocked,
|
||||
u32 *tls)
|
||||
{
|
||||
struct parasite_dump_thread *args;
|
||||
int ret;
|
||||
@@ -377,6 +379,7 @@ int parasite_dump_thread_seized(struct parasite_ctl *ctl, pid_t pid,
|
||||
memcpy(blocked, &args->blocked, sizeof(args->blocked));
|
||||
*tid_addr = args->tid_addr;
|
||||
*tid = args->tid;
|
||||
*tls = args->tls;
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
@@ -12,6 +12,8 @@
|
||||
|
||||
#include <string.h>
|
||||
|
||||
#include "asm/parasite.h"
|
||||
|
||||
#ifndef CONFIG_X86_64
|
||||
#error non-x86-64 mode not yet implemented
|
||||
#endif
|
||||
@@ -287,6 +289,7 @@ static int dump_misc(struct parasite_dump_misc *args)
|
||||
args->pid = sys_getpid();
|
||||
args->sid = sys_getsid();
|
||||
args->pgid = sys_getpgid(0);
|
||||
args->tls = arch_get_tls();
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -372,6 +375,7 @@ static int dump_thread(struct parasite_dump_thread *args)
|
||||
|
||||
args->blocked = s->sig_blocked;
|
||||
args->tid = tid;
|
||||
args->tls = arch_get_tls();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@@ -162,7 +162,12 @@ static int restore_thread_common(struct rt_sigframe *sigframe,
|
||||
if (restore_fpu(sigframe, args))
|
||||
return -1;
|
||||
|
||||
return restore_gpregs(sigframe, &args->gpregs);
|
||||
if (restore_gpregs(sigframe, &args->gpregs))
|
||||
return -1;
|
||||
|
||||
restore_tls(args->tls);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
|
Reference in New Issue
Block a user