Commit cdbd2563 authored by Pavel Emelyanov's avatar Pavel Emelyanov Committed by Cyrill Gorcunov

parasite: Symplify syscall_seized

There's no need in 3 instances of regs in arguments. One is more than enough.
Plus, this one can be made static.
Signed-off-by: 's avatarPavel Emelyanov <xemul@parallels.com>
Signed-off-by: 's avatarCyrill Gorcunov <gorcunov@openvz.org>
parent 4437a1cf
...@@ -29,11 +29,6 @@ extern void *mmap_seized(pid_t pid, user_regs_struct_t *regs, ...@@ -29,11 +29,6 @@ extern void *mmap_seized(pid_t pid, user_regs_struct_t *regs,
extern int munmap_seized(pid_t pid, user_regs_struct_t *regs, extern int munmap_seized(pid_t pid, user_regs_struct_t *regs,
void *addr, size_t length); void *addr, size_t length);
extern int syscall_seized(pid_t pid,
user_regs_struct_t *where,
user_regs_struct_t *params,
user_regs_struct_t *result);
extern int parasite_dump_pages_seized(struct parasite_ctl *ctl, struct list_head *vma_area_list, extern int parasite_dump_pages_seized(struct parasite_ctl *ctl, struct list_head *vma_area_list,
struct cr_fdset *cr_fdset); struct cr_fdset *cr_fdset);
extern int parasite_dump_sigacts_seized(struct parasite_ctl *ctl, struct cr_fdset *cr_fdset); extern int parasite_dump_sigacts_seized(struct parasite_ctl *ctl, struct cr_fdset *cr_fdset);
......
...@@ -47,55 +47,7 @@ int can_run_syscall(unsigned long ip, unsigned long start, unsigned long end) ...@@ -47,55 +47,7 @@ int can_run_syscall(unsigned long ip, unsigned long start, unsigned long end)
return ip >= start && ip < (end - code_syscall_size); return ip >= start && ip < (end - code_syscall_size);
} }
void *mmap_seized(pid_t pid, user_regs_struct_t *regs, static int syscall_seized(pid_t pid, user_regs_struct_t *params)
void *addr, size_t length, int prot,
int flags, int fd, off_t offset)
{
user_regs_struct_t params = *regs;
void *mmaped = NULL;
int ret;
params.ax = (unsigned long)__NR_mmap; /* mmap */
params.di = (unsigned long)addr; /* @addr */
params.si = (unsigned long)length; /* @length */
params.dx = (unsigned long)prot; /* @prot */
params.r10 = (unsigned long)flags; /* @flags */
params.r8 = (unsigned long)fd; /* @fd */
params.r9 = (unsigned long)offset; /* @offset */
ret = syscall_seized(pid, regs, &params, &params);
if (ret)
goto err;
mmaped = (void *)params.ax;
/* error code from the kernel space */
if ((long)mmaped < 0)
mmaped = NULL;
err:
return mmaped;
}
int munmap_seized(pid_t pid, user_regs_struct_t *regs,
void *addr, size_t length)
{
user_regs_struct_t params = *regs;
int ret;
params.ax = (unsigned long)__NR_munmap; /* mmap */
params.di = (unsigned long)addr; /* @addr */
params.si = (unsigned long)length; /* @length */
ret = syscall_seized(pid, regs, &params, &params);
if (!ret)
ret = (int)params.ax;
return ret;
}
int syscall_seized(pid_t pid,
user_regs_struct_t *where,
user_regs_struct_t *params,
user_regs_struct_t *result)
{ {
user_regs_struct_t regs_orig, regs; user_regs_struct_t regs_orig, regs;
unsigned long start_ip; unsigned long start_ip;
...@@ -107,7 +59,7 @@ int syscall_seized(pid_t pid, ...@@ -107,7 +59,7 @@ int syscall_seized(pid_t pid,
BUILD_BUG_ON(sizeof(code_syscall) != BUILTIN_SYSCALL_SIZE); BUILD_BUG_ON(sizeof(code_syscall) != BUILTIN_SYSCALL_SIZE);
BUILD_BUG_ON(!is_log2(sizeof(code_syscall))); BUILD_BUG_ON(!is_log2(sizeof(code_syscall)));
start_ip = (unsigned long)where->ip; start_ip = (unsigned long)params->ip;
jerr(ptrace_peek_area(pid, (void *)saved, (void *)start_ip, code_syscall_size), err); jerr(ptrace_peek_area(pid, (void *)saved, (void *)start_ip, code_syscall_size), err);
jerr(ptrace_poke_area(pid, (void *)code_syscall, (void *)start_ip, code_syscall_size), err); jerr(ptrace_poke_area(pid, (void *)code_syscall, (void *)start_ip, code_syscall_size), err);
...@@ -176,10 +128,9 @@ retry_signal: ...@@ -176,10 +128,9 @@ retry_signal:
jerr((siginfo.si_code >> 8 != PTRACE_EVENT_STOP), err_restore_full); jerr((siginfo.si_code >> 8 != PTRACE_EVENT_STOP), err_restore_full);
jerr(ptrace(PTRACE_GETREGS, pid, NULL, &regs), err_restore_full); jerr(ptrace(PTRACE_GETREGS, pid, NULL, params), err_restore_full);
ret = 0; ret = 0;
*result = regs;
err_restore_full: err_restore_full:
if (ptrace(PTRACE_SETREGS, pid, NULL, &regs_orig)) { if (ptrace(PTRACE_SETREGS, pid, NULL, &regs_orig)) {
...@@ -196,6 +147,51 @@ err: ...@@ -196,6 +147,51 @@ err:
return ret; return ret;
} }
void *mmap_seized(pid_t pid, user_regs_struct_t *regs,
void *addr, size_t length, int prot,
int flags, int fd, off_t offset)
{
user_regs_struct_t params = *regs;
void *mmaped = NULL;
int ret;
params.ax = (unsigned long)__NR_mmap; /* mmap */
params.di = (unsigned long)addr; /* @addr */
params.si = (unsigned long)length; /* @length */
params.dx = (unsigned long)prot; /* @prot */
params.r10 = (unsigned long)flags; /* @flags */
params.r8 = (unsigned long)fd; /* @fd */
params.r9 = (unsigned long)offset; /* @offset */
ret = syscall_seized(pid, &params);
if (ret)
goto err;
mmaped = (void *)params.ax;
/* error code from the kernel space */
if ((long)mmaped < 0)
mmaped = NULL;
err:
return mmaped;
}
int munmap_seized(pid_t pid, user_regs_struct_t *regs,
void *addr, size_t length)
{
user_regs_struct_t params = *regs;
int ret;
params.ax = (unsigned long)__NR_munmap; /* mmap */
params.di = (unsigned long)addr; /* @addr */
params.si = (unsigned long)length; /* @length */
ret = syscall_seized(pid, &params);
if (!ret)
ret = (int)params.ax;
return ret;
}
static struct vma_area *get_vma_by_ip(struct list_head *vma_area_list, unsigned long ip) static struct vma_area *get_vma_by_ip(struct list_head *vma_area_list, unsigned long ip)
{ {
struct vma_area *vma_area; struct vma_area *vma_area;
......
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