Commit b502d7fd authored by Dmitry Safonov's avatar Dmitry Safonov Committed by Andrei Vagin

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: 's avatarDmitry Safonov <dsafonov@virtuozzo.com>
Signed-off-by: 's avatarAndrei Vagin <avagin@virtuozzo.com>
parent 72557edb
...@@ -56,7 +56,7 @@ int sigreturn_prep_fpu_frame_plain(struct rt_sigframe *sigframe, ...@@ -56,7 +56,7 @@ int sigreturn_prep_fpu_frame_plain(struct rt_sigframe *sigframe,
return 0; 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; struct iovec iov;
user_fpregs_struct_t fpsimd; 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 ...@@ -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); pr_info("Dumping GP/FPU registers for %d\n", pid);
iov.iov_base = &regs; iov.iov_base = regs;
iov.iov_len = sizeof(user_regs_struct_t); iov.iov_len = sizeof(user_regs_struct_t);
if ((ret = ptrace(PTRACE_GETREGSET, pid, NT_PRSTATUS, &iov))) { if ((ret = ptrace(PTRACE_GETREGSET, pid, NT_PRSTATUS, &iov))) {
pr_perror("Failed to obtain CPU registers for %d", pid); 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 ...@@ -78,7 +78,7 @@ int get_task_regs(pid_t pid, user_regs_struct_t regs, save_regs_t save, void *ar
goto err; goto err;
} }
ret = save(arg, &regs, &fpsimd); ret = save(arg, regs, &fpsimd);
err: err:
return ret; return ret;
} }
......
...@@ -65,7 +65,7 @@ int sigreturn_prep_fpu_frame_plain(struct rt_sigframe *sigframe, ...@@ -65,7 +65,7 @@ int sigreturn_prep_fpu_frame_plain(struct rt_sigframe *sigframe,
} }
#define PTRACE_GETVFPREGS 27 #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; user_fpregs_struct_t vfp;
int ret = -1; 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 ...@@ -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? */ /* 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 */ /* Restart the system call */
switch ((long)(int)regs.ARM_r0) { switch ((long)(int)regs->ARM_r0) {
case -ERESTARTNOHAND: case -ERESTARTNOHAND:
case -ERESTARTSYS: case -ERESTARTSYS:
case -ERESTARTNOINTR: case -ERESTARTNOINTR:
regs.ARM_r0 = regs.ARM_ORIG_r0; regs->ARM_r0 = regs->ARM_ORIG_r0;
regs.ARM_pc -= 4; regs->ARM_pc -= 4;
break; break;
case -ERESTART_RESTARTBLOCK: case -ERESTART_RESTARTBLOCK:
regs.ARM_r0 = __NR_restart_syscall; regs->ARM_r0 = __NR_restart_syscall;
regs.ARM_pc -= 4; regs->ARM_pc -= 4;
break; break;
} }
} }
ret = save(arg, &regs, &vfp); ret = save(arg, regs, &vfp);
err: err:
return ret; return ret;
} }
......
...@@ -369,16 +369,16 @@ static int __get_task_regs(pid_t pid, user_regs_struct_t *regs, ...@@ -369,16 +369,16 @@ static int __get_task_regs(pid_t pid, user_regs_struct_t *regs,
return 0; 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; user_fpregs_struct_t fpregs;
int ret; int ret;
ret = __get_task_regs(pid, &regs, &fpregs); ret = __get_task_regs(pid, regs, &fpregs);
if (ret) if (ret)
return ret; return ret;
return save(arg, &regs, &fpregs); return save(arg, regs, &fpregs);
} }
int compel_syscall(struct parasite_ctl *ctl, int nr, long *ret, 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, ...@@ -225,7 +225,7 @@ int sigreturn_prep_fpu_frame_plain(struct rt_sigframe *sigframe,
((user_regs_native(pregs)) ? (int64_t)((pregs)->native.name) : \ ((user_regs_native(pregs)) ? (int64_t)((pregs)->native.name) : \
(int32_t)((pregs)->compat.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; 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 ...@@ -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; int ret = -1;
pr_info("Dumping general registers for %d in %s mode\n", pid, pr_info("Dumping general registers for %d in %s mode\n", pid,
user_regs_native(&regs) ? "native" : "compat"); user_regs_native(regs) ? "native" : "compat");
/* Did we come from a system call? */ /* Did we come from a system call? */
if (get_signed_user_reg(&regs, orig_ax) >= 0) { if (get_signed_user_reg(regs, orig_ax) >= 0) {
/* Restart the system call */ /* Restart the system call */
switch (get_signed_user_reg(&regs, ax)) { switch (get_signed_user_reg(regs, ax)) {
case -ERESTARTNOHAND: case -ERESTARTNOHAND:
case -ERESTARTSYS: case -ERESTARTSYS:
case -ERESTARTNOINTR: case -ERESTARTNOINTR:
set_user_reg(&regs, ax, get_user_reg(&regs, orig_ax)); set_user_reg(regs, ax, get_user_reg(regs, orig_ax));
set_user_reg(&regs, ip, get_user_reg(&regs, ip) - 2); set_user_reg(regs, ip, get_user_reg(regs, ip) - 2);
break; break;
case -ERESTART_RESTARTBLOCK: case -ERESTART_RESTARTBLOCK:
pr_warn("Will restore %d with interrupted system call\n", pid); pr_warn("Will restore %d with interrupted system call\n", pid);
set_user_reg(&regs, ax, -EINTR); set_user_reg(regs, ax, -EINTR);
break; break;
} }
} }
...@@ -279,7 +279,7 @@ int get_task_regs(pid_t pid, user_regs_struct_t regs, save_regs_t save, void *ar ...@@ -279,7 +279,7 @@ int get_task_regs(pid_t pid, user_regs_struct_t regs, save_regs_t save, void *ar
xs = &xsave; xs = &xsave;
out: out:
ret = save(arg, &regs, xs); ret = save(arg, regs, xs);
err: err:
return ret; return ret;
} }
......
...@@ -58,7 +58,7 @@ extern void *remote_mmap(struct parasite_ctl *ctl, ...@@ -58,7 +58,7 @@ extern void *remote_mmap(struct parasite_ctl *ctl,
void *addr, size_t length, int prot, void *addr, size_t length, int prot,
int flags, int fd, off_t offset); int flags, int fd, off_t offset);
extern bool arch_can_dump_task(struct parasite_ctl *ctl); 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, extern int sigreturn_prep_regs_plain(struct rt_sigframe *sigframe,
user_regs_struct_t *regs, user_regs_struct_t *regs,
user_fpregs_struct_t *fpregs); user_fpregs_struct_t *fpregs);
......
...@@ -664,7 +664,7 @@ static int parasite_start_daemon(struct parasite_ctl *ctl) ...@@ -664,7 +664,7 @@ static int parasite_start_daemon(struct parasite_ctl *ctl)
* while in daemon it is not such. * 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); pr_err("Can't obtain regs for thread %d\n", pid);
return -1; return -1;
} }
...@@ -1556,7 +1556,7 @@ k_rtsigset_t *compel_task_sigmask(struct parasite_ctl *ctl) ...@@ -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) 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) struct infect_ctx *compel_infect_ctx(struct parasite_ctl *ctl)
......
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