mirror of
https://github.com/checkpoint-restore/criu.git
synced 2026-01-23 02:14:37 +00:00
compel: pass regs by pointer in get_task_regs()
CID 73371 (#1 of 1): Big parameter passed by value (PASS_BY_VALUE) pass_by_value: Passing parameter regs of type user_regs_struct_t (size 224 bytes) by value. Suggesting to do this until compel is released and API is cut in stone. Signed-off-by: Dmitry Safonov <dsafonov@virtuozzo.com> Signed-off-by: Andrei Vagin <avagin@virtuozzo.com>
This commit is contained in:
parent
72557edb15
commit
b502d7fd6b
6 changed files with 25 additions and 25 deletions
|
|
@ -56,7 +56,7 @@ int sigreturn_prep_fpu_frame_plain(struct rt_sigframe *sigframe,
|
|||
return 0;
|
||||
}
|
||||
|
||||
int get_task_regs(pid_t pid, user_regs_struct_t regs, save_regs_t save, void *arg)
|
||||
int get_task_regs(pid_t pid, user_regs_struct_t *regs, save_regs_t save, void *arg)
|
||||
{
|
||||
struct iovec iov;
|
||||
user_fpregs_struct_t fpsimd;
|
||||
|
|
@ -64,7 +64,7 @@ int get_task_regs(pid_t pid, user_regs_struct_t regs, save_regs_t save, void *ar
|
|||
|
||||
pr_info("Dumping GP/FPU registers for %d\n", pid);
|
||||
|
||||
iov.iov_base = ®s;
|
||||
iov.iov_base = regs;
|
||||
iov.iov_len = sizeof(user_regs_struct_t);
|
||||
if ((ret = ptrace(PTRACE_GETREGSET, pid, NT_PRSTATUS, &iov))) {
|
||||
pr_perror("Failed to obtain CPU registers for %d", pid);
|
||||
|
|
@ -78,7 +78,7 @@ int get_task_regs(pid_t pid, user_regs_struct_t regs, save_regs_t save, void *ar
|
|||
goto err;
|
||||
}
|
||||
|
||||
ret = save(arg, ®s, &fpsimd);
|
||||
ret = save(arg, regs, &fpsimd);
|
||||
err:
|
||||
return ret;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -65,7 +65,7 @@ int sigreturn_prep_fpu_frame_plain(struct rt_sigframe *sigframe,
|
|||
}
|
||||
|
||||
#define PTRACE_GETVFPREGS 27
|
||||
int get_task_regs(pid_t pid, user_regs_struct_t regs, save_regs_t save, void *arg)
|
||||
int get_task_regs(pid_t pid, user_regs_struct_t *regs, save_regs_t save, void *arg)
|
||||
{
|
||||
user_fpregs_struct_t vfp;
|
||||
int ret = -1;
|
||||
|
|
@ -78,23 +78,23 @@ int get_task_regs(pid_t pid, user_regs_struct_t regs, save_regs_t save, void *ar
|
|||
}
|
||||
|
||||
/* Did we come from a system call? */
|
||||
if ((int)regs.ARM_ORIG_r0 >= 0) {
|
||||
if ((int)regs->ARM_ORIG_r0 >= 0) {
|
||||
/* Restart the system call */
|
||||
switch ((long)(int)regs.ARM_r0) {
|
||||
switch ((long)(int)regs->ARM_r0) {
|
||||
case -ERESTARTNOHAND:
|
||||
case -ERESTARTSYS:
|
||||
case -ERESTARTNOINTR:
|
||||
regs.ARM_r0 = regs.ARM_ORIG_r0;
|
||||
regs.ARM_pc -= 4;
|
||||
regs->ARM_r0 = regs->ARM_ORIG_r0;
|
||||
regs->ARM_pc -= 4;
|
||||
break;
|
||||
case -ERESTART_RESTARTBLOCK:
|
||||
regs.ARM_r0 = __NR_restart_syscall;
|
||||
regs.ARM_pc -= 4;
|
||||
regs->ARM_r0 = __NR_restart_syscall;
|
||||
regs->ARM_pc -= 4;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
ret = save(arg, ®s, &vfp);
|
||||
ret = save(arg, regs, &vfp);
|
||||
err:
|
||||
return ret;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -369,16 +369,16 @@ static int __get_task_regs(pid_t pid, user_regs_struct_t *regs,
|
|||
return 0;
|
||||
}
|
||||
|
||||
int get_task_regs(pid_t pid, user_regs_struct_t regs, save_regs_t save, void *arg)
|
||||
int get_task_regs(pid_t pid, user_regs_struct_t *regs, save_regs_t save, void *arg)
|
||||
{
|
||||
user_fpregs_struct_t fpregs;
|
||||
int ret;
|
||||
|
||||
ret = __get_task_regs(pid, ®s, &fpregs);
|
||||
ret = __get_task_regs(pid, regs, &fpregs);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
return save(arg, ®s, &fpregs);
|
||||
return save(arg, regs, &fpregs);
|
||||
}
|
||||
|
||||
int compel_syscall(struct parasite_ctl *ctl, int nr, long *ret,
|
||||
|
|
|
|||
|
|
@ -225,7 +225,7 @@ int sigreturn_prep_fpu_frame_plain(struct rt_sigframe *sigframe,
|
|||
((user_regs_native(pregs)) ? (int64_t)((pregs)->native.name) : \
|
||||
(int32_t)((pregs)->compat.name))
|
||||
|
||||
int get_task_regs(pid_t pid, user_regs_struct_t regs, save_regs_t save, void *arg)
|
||||
int get_task_regs(pid_t pid, user_regs_struct_t *regs, save_regs_t save, void *arg)
|
||||
{
|
||||
user_fpregs_struct_t xsave = { }, *xs = NULL;
|
||||
|
||||
|
|
@ -233,21 +233,21 @@ int get_task_regs(pid_t pid, user_regs_struct_t regs, save_regs_t save, void *ar
|
|||
int ret = -1;
|
||||
|
||||
pr_info("Dumping general registers for %d in %s mode\n", pid,
|
||||
user_regs_native(®s) ? "native" : "compat");
|
||||
user_regs_native(regs) ? "native" : "compat");
|
||||
|
||||
/* Did we come from a system call? */
|
||||
if (get_signed_user_reg(®s, orig_ax) >= 0) {
|
||||
if (get_signed_user_reg(regs, orig_ax) >= 0) {
|
||||
/* Restart the system call */
|
||||
switch (get_signed_user_reg(®s, ax)) {
|
||||
switch (get_signed_user_reg(regs, ax)) {
|
||||
case -ERESTARTNOHAND:
|
||||
case -ERESTARTSYS:
|
||||
case -ERESTARTNOINTR:
|
||||
set_user_reg(®s, ax, get_user_reg(®s, orig_ax));
|
||||
set_user_reg(®s, ip, get_user_reg(®s, ip) - 2);
|
||||
set_user_reg(regs, ax, get_user_reg(regs, orig_ax));
|
||||
set_user_reg(regs, ip, get_user_reg(regs, ip) - 2);
|
||||
break;
|
||||
case -ERESTART_RESTARTBLOCK:
|
||||
pr_warn("Will restore %d with interrupted system call\n", pid);
|
||||
set_user_reg(®s, ax, -EINTR);
|
||||
set_user_reg(regs, ax, -EINTR);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
|
@ -279,7 +279,7 @@ int get_task_regs(pid_t pid, user_regs_struct_t regs, save_regs_t save, void *ar
|
|||
|
||||
xs = &xsave;
|
||||
out:
|
||||
ret = save(arg, ®s, xs);
|
||||
ret = save(arg, regs, xs);
|
||||
err:
|
||||
return ret;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -58,7 +58,7 @@ extern void *remote_mmap(struct parasite_ctl *ctl,
|
|||
void *addr, size_t length, int prot,
|
||||
int flags, int fd, off_t offset);
|
||||
extern bool arch_can_dump_task(struct parasite_ctl *ctl);
|
||||
extern int get_task_regs(pid_t pid, user_regs_struct_t regs, save_regs_t save, void *arg);
|
||||
extern int get_task_regs(pid_t pid, user_regs_struct_t *regs, save_regs_t save, void *arg);
|
||||
extern int sigreturn_prep_regs_plain(struct rt_sigframe *sigframe,
|
||||
user_regs_struct_t *regs,
|
||||
user_fpregs_struct_t *fpregs);
|
||||
|
|
|
|||
|
|
@ -664,7 +664,7 @@ static int parasite_start_daemon(struct parasite_ctl *ctl)
|
|||
* while in daemon it is not such.
|
||||
*/
|
||||
|
||||
if (get_task_regs(pid, ctl->orig.regs, ictx->save_regs, ictx->regs_arg)) {
|
||||
if (get_task_regs(pid, &ctl->orig.regs, ictx->save_regs, ictx->regs_arg)) {
|
||||
pr_err("Can't obtain regs for thread %d\n", pid);
|
||||
return -1;
|
||||
}
|
||||
|
|
@ -1556,7 +1556,7 @@ k_rtsigset_t *compel_task_sigmask(struct parasite_ctl *ctl)
|
|||
|
||||
int compel_get_thread_regs(struct parasite_thread_ctl *tctl, save_regs_t save, void * arg)
|
||||
{
|
||||
return get_task_regs(tctl->tid, 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)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue