Commit 93d6aeb8 authored by Pavel Emelyanov's avatar Pavel Emelyanov Committed by Andrei Vagin

infect: Move parasite_execute_syscall() into infect.c

Signed-off-by: 's avatarPavel Emelyanov <xemul@virtuozzo.com>
Signed-off-by: 's avatarAndrei Vagin <avagin@virtuozzo.com>
parent d4b415eb
...@@ -17,6 +17,7 @@ ...@@ -17,6 +17,7 @@
#include "util.h" #include "util.h"
#include "cpu.h" #include "cpu.h"
#include "restorer.h" #include "restorer.h"
#include "infect.h"
#include "infect-priv.h" #include "infect-priv.h"
/* /*
...@@ -72,7 +73,7 @@ int syscall_seized(struct parasite_ctl *ctl, int nr, unsigned long *ret, ...@@ -72,7 +73,7 @@ int syscall_seized(struct parasite_ctl *ctl, int nr, unsigned long *ret,
regs.regs[6] = 0; regs.regs[6] = 0;
regs.regs[7] = 0; regs.regs[7] = 0;
err = __parasite_execute_syscall(ctl, &regs, code_syscall); err = compel_execute_syscall(ctl, &regs, code_syscall);
*ret = regs.regs[0]; *ret = regs.regs[0];
return err; return err;
......
...@@ -18,6 +18,7 @@ ...@@ -18,6 +18,7 @@
#include "restorer.h" #include "restorer.h"
#include "errno.h" #include "errno.h"
#include "kerndat.h" #include "kerndat.h"
#include "infect.h"
#include "infect-priv.h" #include "infect-priv.h"
/* /*
...@@ -74,7 +75,7 @@ int syscall_seized(struct parasite_ctl *ctl, int nr, unsigned long *ret, ...@@ -74,7 +75,7 @@ int syscall_seized(struct parasite_ctl *ctl, int nr, unsigned long *ret,
regs.ARM_r4 = arg5; regs.ARM_r4 = arg5;
regs.ARM_r5 = arg6; regs.ARM_r5 = arg6;
err = __parasite_execute_syscall(ctl, &regs, code_syscall); err = compel_execute_syscall(ctl, &regs, code_syscall);
*ret = regs.ARM_r0; *ret = regs.ARM_r0;
return err; return err;
......
...@@ -18,6 +18,7 @@ ...@@ -18,6 +18,7 @@
#include "util.h" #include "util.h"
#include "cpu.h" #include "cpu.h"
#include "errno.h" #include "errno.h"
#include "infect.h"
#include "infect-priv.h" #include "infect-priv.h"
#include "protobuf.h" #include "protobuf.h"
...@@ -87,7 +88,7 @@ int syscall_seized(struct parasite_ctl *ctl, int nr, unsigned long *ret, ...@@ -87,7 +88,7 @@ int syscall_seized(struct parasite_ctl *ctl, int nr, unsigned long *ret,
regs.gpr[7] = arg5; regs.gpr[7] = arg5;
regs.gpr[8] = arg6; regs.gpr[8] = arg6;
err = __parasite_execute_syscall(ctl, &regs, (char*)code_syscall); err = compel_execute_syscall(ctl, &regs, (char*)code_syscall);
*ret = regs.gpr[3]; *ret = regs.gpr[3];
return err; return err;
......
...@@ -25,6 +25,7 @@ ...@@ -25,6 +25,7 @@
#include "uapi/std/syscall-codes.h" #include "uapi/std/syscall-codes.h"
#include "kerndat.h" #include "kerndat.h"
#include "infect-priv.h" #include "infect-priv.h"
#include "infect.h"
#include "protobuf.h" #include "protobuf.h"
#include "images/core.pb-c.h" #include "images/core.pb-c.h"
...@@ -167,7 +168,7 @@ int syscall_seized(struct parasite_ctl *ctl, int nr, unsigned long *ret, ...@@ -167,7 +168,7 @@ int syscall_seized(struct parasite_ctl *ctl, int nr, unsigned long *ret,
r->r8 = arg5; r->r8 = arg5;
r->r9 = arg6; r->r9 = arg6;
err = __parasite_execute_syscall(ctl, &regs, code_syscall); err = compel_execute_syscall(ctl, &regs, code_syscall);
} else { } else {
user_regs_struct32 *r = &regs.compat; user_regs_struct32 *r = &regs.compat;
...@@ -179,7 +180,7 @@ int syscall_seized(struct parasite_ctl *ctl, int nr, unsigned long *ret, ...@@ -179,7 +180,7 @@ int syscall_seized(struct parasite_ctl *ctl, int nr, unsigned long *ret,
r->di = arg5; r->di = arg5;
r->bp = arg6; r->bp = arg6;
err = __parasite_execute_syscall(ctl, &regs, code_int_80); err = compel_execute_syscall(ctl, &regs, code_int_80);
} }
*ret = get_user_reg(&regs, ax); *ret = get_user_reg(&regs, ax);
......
#ifndef __COMPEL_INFECT_H__ #ifndef __COMPEL_INFECT_H__
#define __COMPEL_INFECT_H__ #define __COMPEL_INFECT_H__
#include "types.h"
extern int compel_stop_task(int pid); extern int compel_stop_task(int pid);
struct seize_task_status { struct seize_task_status {
...@@ -47,4 +50,7 @@ extern int compel_cure(struct parasite_ctl *ctl); ...@@ -47,4 +50,7 @@ extern int compel_cure(struct parasite_ctl *ctl);
extern void *compel_parasite_args_p(struct parasite_ctl *ctl); extern void *compel_parasite_args_p(struct parasite_ctl *ctl);
extern void *compel_parasite_args_s(struct parasite_ctl *ctl, int args_size); 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);
#endif #endif
...@@ -99,8 +99,6 @@ extern int syscall_seized(struct parasite_ctl *ctl, int nr, unsigned long *ret, ...@@ -99,8 +99,6 @@ extern int syscall_seized(struct parasite_ctl *ctl, int nr, unsigned long *ret,
unsigned long arg3, unsigned long arg4, unsigned long arg3, unsigned long arg4,
unsigned long arg5, unsigned long arg6); unsigned long arg5, unsigned long arg6);
extern int __parasite_execute_syscall(struct parasite_ctl *ctl,
user_regs_struct_t *regs, const char *code_syscall);
extern bool arch_can_dump_task(struct parasite_ctl *ctl); extern bool arch_can_dump_task(struct parasite_ctl *ctl);
extern bool seized_native(struct parasite_ctl *ctl); extern bool seized_native(struct parasite_ctl *ctl);
......
...@@ -369,6 +369,42 @@ err_sig: ...@@ -369,6 +369,42 @@ err_sig:
return -1; return -1;
} }
/* XXX will be removed soon */
extern int parasite_trap(struct parasite_ctl *ctl, pid_t pid,
user_regs_struct_t *regs,
struct thread_ctx *octx);
int compel_execute_syscall(struct parasite_ctl *ctl,
user_regs_struct_t *regs, const char *code_syscall)
{
pid_t pid = ctl->rpid;
int err;
u8 code_orig[BUILTIN_SYSCALL_SIZE];
/*
* Inject syscall instruction and remember original code,
* we will need it to restore original program content.
*/
memcpy(code_orig, code_syscall, sizeof(code_orig));
if (ptrace_swap_area(pid, (void *)ctl->ictx.syscall_ip,
(void *)code_orig, sizeof(code_orig))) {
pr_err("Can't inject syscall blob (pid: %d)\n", pid);
return -1;
}
err = parasite_run(pid, PTRACE_CONT, ctl->ictx.syscall_ip, 0, regs, &ctl->orig);
if (!err)
err = parasite_trap(ctl, pid, regs, &ctl->orig);
if (ptrace_poke_area(pid, (void *)code_orig,
(void *)ctl->ictx.syscall_ip, sizeof(code_orig))) {
pr_err("Can't restore syscall blob (pid: %d)\n", ctl->rpid);
err = -1;
}
return err;
}
static int accept_tsock(struct parasite_ctl *ctl) static int accept_tsock(struct parasite_ctl *ctl)
{ {
int sock; int sock;
......
...@@ -113,7 +113,7 @@ bool seized_native(struct parasite_ctl *ctl) ...@@ -113,7 +113,7 @@ bool seized_native(struct parasite_ctl *ctl)
} }
/* we run at @regs->ip */ /* we run at @regs->ip */
static int parasite_trap(struct parasite_ctl *ctl, pid_t pid, int parasite_trap(struct parasite_ctl *ctl, pid_t pid,
user_regs_struct_t *regs, user_regs_struct_t *regs,
struct thread_ctx *octx) struct thread_ctx *octx)
{ {
...@@ -166,37 +166,6 @@ err: ...@@ -166,37 +166,6 @@ err:
return ret; return ret;
} }
int __parasite_execute_syscall(struct parasite_ctl *ctl,
user_regs_struct_t *regs, const char *code_syscall)
{
pid_t pid = ctl->rpid;
int err;
u8 code_orig[BUILTIN_SYSCALL_SIZE];
/*
* Inject syscall instruction and remember original code,
* we will need it to restore original program content.
*/
memcpy(code_orig, code_syscall, sizeof(code_orig));
if (ptrace_swap_area(pid, (void *)ctl->ictx.syscall_ip,
(void *)code_orig, sizeof(code_orig))) {
pr_err("Can't inject syscall blob (pid: %d)\n", pid);
return -1;
}
err = parasite_run(pid, PTRACE_CONT, ctl->ictx.syscall_ip, 0, regs, &ctl->orig);
if (!err)
err = parasite_trap(ctl, pid, regs, &ctl->orig);
if (ptrace_poke_area(pid, (void *)code_orig,
(void *)ctl->ictx.syscall_ip, sizeof(code_orig))) {
pr_err("Can't restore syscall blob (pid: %d)\n", ctl->rpid);
err = -1;
}
return err;
}
static int parasite_run_in_thread(pid_t pid, unsigned int cmd, static int parasite_run_in_thread(pid_t pid, unsigned int cmd,
struct parasite_ctl *ctl, struct parasite_ctl *ctl,
struct thread_ctx *octx) struct thread_ctx *octx)
......
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