Commit a722258d authored by Pavel Emelyanov's avatar Pavel Emelyanov Committed by Andrei Vagin

compel: Relax the thread mgmt API

Signed-off-by: 's avatarPavel Emelyanov <xemul@virtuozzo.com>
Signed-off-by: 's avatarAndrei Vagin <avagin@virtuozzo.com>
parent d0caedd1
......@@ -42,6 +42,8 @@ struct parasite_ctl {
};
struct parasite_thread_ctl {
int tid;
struct parasite_ctl *ctl;
struct thread_ctx th;
};
......
......@@ -64,9 +64,7 @@ extern void *compel_parasite_args_s(struct parasite_ctl *ctl, int args_size);
extern int compel_execute_syscall(struct parasite_ctl *ctl,
user_regs_struct_t *regs, const char *code_syscall);
extern int compel_run_in_thread(pid_t pid, unsigned int cmd,
struct parasite_ctl *ctl,
struct parasite_thread_ctl *tctl);
extern int compel_run_in_thread(struct parasite_thread_ctl *tctl, unsigned int cmd);
/*
* The PTRACE_SYSCALL will trap task twice -- on
......@@ -139,7 +137,7 @@ struct parasite_blob_desc {
extern struct parasite_blob_desc *compel_parasite_blob_desc(struct parasite_ctl *);
typedef int (*save_regs_t)(void *, user_regs_struct_t *, user_fpregs_struct_t *);
extern int compel_get_thread_regs(pid_t pid, struct parasite_thread_ctl *, save_regs_t, void *);
extern int compel_get_thread_regs(struct parasite_thread_ctl *, save_regs_t, void *);
extern void compel_relocs_apply(void *mem, void *vbase, size_t size, compel_reloc_t *elf_relocs, size_t nr_relocs);
......
......@@ -856,6 +856,9 @@ struct parasite_thread_ctl *compel_prepare_thread(struct parasite_ctl *ctl, int
if (prepare_thread(pid, &tctl->th)) {
xfree(tctl);
tctl = NULL;
} else {
tctl->tid = pid;
tctl->ctl = ctl;
}
}
......@@ -1083,10 +1086,10 @@ void *compel_parasite_args_s(struct parasite_ctl *ctl, int args_size)
return compel_parasite_args_p(ctl);
}
int compel_run_in_thread(pid_t pid, unsigned int cmd,
struct parasite_ctl *ctl,
struct parasite_thread_ctl *tctl)
int compel_run_in_thread(struct parasite_thread_ctl *tctl, unsigned int cmd)
{
int pid = tctl->tid;
struct parasite_ctl *ctl = tctl->ctl;
struct thread_ctx *octx = &tctl->th;
void *stack = ctl->r_thread_stack;
user_regs_struct_t regs = octx->regs;
......@@ -1297,9 +1300,9 @@ k_rtsigset_t *compel_task_sigmask(struct parasite_ctl *ctl)
return thread_ctx_sigmask(&ctl->orig);
}
int compel_get_thread_regs(pid_t pid, struct parasite_thread_ctl *tctl, save_regs_t save, void * arg)
int compel_get_thread_regs(struct parasite_thread_ctl *tctl, save_regs_t save, void * arg)
{
return get_task_regs(pid, tctl->th.regs, save, arg);
return get_task_regs(tctl->tid, tctl->th.regs, save, arg);
}
struct infect_ctx *compel_infect_ctx(struct parasite_ctl *ctl)
......
......@@ -203,7 +203,7 @@ int parasite_dump_thread_seized(struct parasite_ctl *ctl, int id,
tc->has_blk_sigset = true;
memcpy(&tc->blk_sigset, compel_thread_sigmask(tctl), sizeof(k_rtsigset_t));
ret = compel_run_in_thread(pid, PARASITE_CMD_DUMP_THREAD, ctl, tctl);
ret = compel_run_in_thread(tctl, PARASITE_CMD_DUMP_THREAD);
if (ret) {
pr_err("Can't init thread in parasite %d\n", pid);
goto err_rth;
......@@ -215,7 +215,7 @@ int parasite_dump_thread_seized(struct parasite_ctl *ctl, int id,
goto err_rth;
}
ret = compel_get_thread_regs(pid, tctl, save_task_regs, core);
ret = compel_get_thread_regs(tctl, save_task_regs, core);
if (ret) {
pr_err("Can't obtain regs for thread %d\n", pid);
goto err_rth;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment