From b502d7fd6b14ab8c006d650398264c8196d44787 Mon Sep 17 00:00:00 2001 From: Dmitry Safonov Date: Tue, 7 Mar 2017 15:55:29 +0300 Subject: 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 Signed-off-by: Andrei Vagin --- compel/arch/aarch64/src/lib/infect.c | 6 +++--- compel/arch/arm/src/lib/infect.c | 16 ++++++++-------- compel/arch/ppc64/src/lib/infect.c | 6 +++--- compel/arch/x86/src/lib/infect.c | 16 ++++++++-------- compel/include/infect-priv.h | 2 +- compel/src/lib/infect.c | 4 ++-- 6 files changed, 25 insertions(+), 25 deletions(-) (limited to 'compel') diff --git a/compel/arch/aarch64/src/lib/infect.c b/compel/arch/aarch64/src/lib/infect.c index 4f5534b75..41600e091 100644 --- a/compel/arch/aarch64/src/lib/infect.c +++ b/compel/arch/aarch64/src/lib/infect.c @@ -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; } diff --git a/compel/arch/arm/src/lib/infect.c b/compel/arch/arm/src/lib/infect.c index ad085ff98..a78108dff 100644 --- a/compel/arch/arm/src/lib/infect.c +++ b/compel/arch/arm/src/lib/infect.c @@ -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; } diff --git a/compel/arch/ppc64/src/lib/infect.c b/compel/arch/ppc64/src/lib/infect.c index 11154d658..f3f1aacec 100644 --- a/compel/arch/ppc64/src/lib/infect.c +++ b/compel/arch/ppc64/src/lib/infect.c @@ -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, diff --git a/compel/arch/x86/src/lib/infect.c b/compel/arch/x86/src/lib/infect.c index f1b216650..84ff21b15 100644 --- a/compel/arch/x86/src/lib/infect.c +++ b/compel/arch/x86/src/lib/infect.c @@ -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; } diff --git a/compel/include/infect-priv.h b/compel/include/infect-priv.h index cf0ce3a92..0f80895a7 100644 --- a/compel/include/infect-priv.h +++ b/compel/include/infect-priv.h @@ -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); diff --git a/compel/src/lib/infect.c b/compel/src/lib/infect.c index 78c9655ef..c02425036 100644 --- a/compel/src/lib/infect.c +++ b/compel/src/lib/infect.c @@ -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) -- cgit v1.2.3