Commit 808b8f2f authored by Cyrill Gorcunov's avatar Cyrill Gorcunov Committed by Pavel Emelyanov

protobuf: Convert mm_entry to PB format

Because the MmEntry has a "repeated" field, we
copy aux vector explicitly and reserve space for
it in task args.
Signed-off-by: 's avatarCyrill Gorcunov <gorcunov@openvz.org>
Signed-off-by: 's avatarPavel Emelyanov <xemul@parallels.com>
parent a7691bcb
......@@ -49,6 +49,7 @@
#include "protobuf.h"
#include "protobuf/fdinfo.pb-c.h"
#include "protobuf/fs.pb-c.h"
#include "protobuf/mm.pb-c.h"
#ifndef CONFIG_X86_64
# error No x86-32 support yet
......@@ -156,7 +157,7 @@ int do_dump_gen_file(struct fd_parms *p, int lfd,
return pb_write(fdset_fd(cr_fdset, CR_FD_FDINFO), &e, fdinfo_entry);
}
static int dump_task_exe_link(pid_t pid, struct mm_entry *mm)
static int dump_task_exe_link(pid_t pid, MmEntry *mm)
{
struct fd_parms params = { };
int fd, ret;
......@@ -494,7 +495,7 @@ static int dump_task_creds(pid_t pid, const struct parasite_dump_misc *misc,
#define assign_reg(dst, src, e) dst.e = (__typeof__(dst.e))src.e
#define assign_array(dst, src, e) memcpy(&dst.e, &src.e, sizeof(dst.e))
static int get_task_auxv(pid_t pid, struct mm_entry *mm)
static int get_task_auxv(pid_t pid, MmEntry *mm)
{
int fd, ret, i;
......@@ -526,7 +527,8 @@ err:
static int dump_task_mm(pid_t pid, const struct proc_pid_stat *stat,
const struct parasite_dump_misc *misc, const struct cr_fdset *fdset)
{
struct mm_entry mme;
MmEntry mme = MM_ENTRY__INIT;
int ret = -1;
mme.mm_start_code = stat->start_code;
mme.mm_end_code = stat->end_code;
......@@ -542,14 +544,22 @@ static int dump_task_mm(pid_t pid, const struct proc_pid_stat *stat,
mme.mm_brk = misc->brk;
mme.n_mm_saved_auxv = AT_VECTOR_SIZE;
mme.mm_saved_auxv = xmalloc(pb_repeated_size(&mme, mm_saved_auxv));
if (!mme.mm_saved_auxv)
goto out;
if (get_task_auxv(pid, &mme))
return -1;
goto out;
pr_info("OK\n");
if (dump_task_exe_link(pid, &mme))
return -1;
goto out;
return write_img(fdset_fd(fdset, CR_FD_MM), &mme);
ret = pb_write(fdset_fd(fdset, CR_FD_MM), &mme, mm_entry);
xfree(mme.mm_saved_auxv);
out:
return ret;
}
static int get_task_personality(pid_t pid, u32 *personality)
......
......@@ -1057,23 +1057,38 @@ static struct vma_entry *vma_list_remap(void *addr, unsigned long len, struct li
static int prepare_mm(pid_t pid, struct task_restore_core_args *args)
{
int fd, exe_fd;
int fd, exe_fd, ret = -1;
MmEntry *mm;
fd = open_image_ro(CR_FD_MM, pid);
if (fd < 0)
return -1;
if (read_img(fd, &args->mm) < 0)
if (pb_read(fd, &mm, mm_entry) < 0)
return -1;
args->mm = *mm;
args->mm.n_mm_saved_auxv = 0;
args->mm.mm_saved_auxv = NULL;
if (mm->n_mm_saved_auxv != AT_VECTOR_SIZE) {
pr_err("Image corrupted on pid %d\n", pid);
goto out;
}
memcpy(args->mm_saved_auxv, mm->mm_saved_auxv,
pb_repeated_size(mm, mm_saved_auxv));
exe_fd = open_reg_by_id(args->mm.exe_file_id);
if (exe_fd < 0)
return -1;
goto out;
args->fd_exe_link = exe_fd;
ret = 0;
out:
mm_entry__free_unpacked(mm, NULL);
close(fd);
return 0;
return ret;
}
static int sigreturn_restore(pid_t pid, struct list_head *tgt_vmas, int nr_vmas)
......
......@@ -37,6 +37,7 @@
#include "protobuf/pipe-data.pb-c.h"
#include "protobuf/sa.pb-c.h"
#include "protobuf/itimer.pb-c.h"
#include "protobuf/mm.pb-c.h"
#define DEF_PAGES_PER_LINE 6
......@@ -615,25 +616,27 @@ out:
void show_mm(int fd_mm, struct cr_options *o)
{
struct mm_entry mme;
MmEntry *mme;
pr_img_head(CR_FD_MM);
if (read_img(fd_mm, &mme) < 0)
if (pb_read(fd_mm, &mme, mm_entry) < 0)
goto out;
pr_msg("\tBrk: 0x%lx\n", mme.mm_brk);
pr_msg("\tStart code: 0x%lx\n", mme.mm_start_code);
pr_msg("\tEnd code: 0x%lx\n", mme.mm_end_code);
pr_msg("\tStart stack: 0x%lx\n", mme.mm_start_stack);
pr_msg("\tStart data: 0x%lx\n", mme.mm_start_data);
pr_msg("\tEnd data: 0x%lx\n", mme.mm_end_data);
pr_msg("\tStart brk: 0x%lx\n", mme.mm_start_brk);
pr_msg("\tArg start: 0x%lx\n", mme.mm_arg_start);
pr_msg("\tArg end: 0x%lx\n", mme.mm_arg_end);
pr_msg("\tEnv start: 0x%lx\n", mme.mm_env_start);
pr_msg("\tEnv end: 0x%lx\n", mme.mm_env_end);
pr_msg("\tExe file ID %#x\n", mme.exe_file_id);
pr_msg("\tBrk: 0x%lx\n", mme->mm_brk);
pr_msg("\tStart code: 0x%lx\n", mme->mm_start_code);
pr_msg("\tEnd code: 0x%lx\n", mme->mm_end_code);
pr_msg("\tStart stack: 0x%lx\n", mme->mm_start_stack);
pr_msg("\tStart data: 0x%lx\n", mme->mm_start_data);
pr_msg("\tEnd data: 0x%lx\n", mme->mm_end_data);
pr_msg("\tStart brk: 0x%lx\n", mme->mm_start_brk);
pr_msg("\tArg start: 0x%lx\n", mme->mm_arg_start);
pr_msg("\tArg end: 0x%lx\n", mme->mm_arg_end);
pr_msg("\tEnv start: 0x%lx\n", mme->mm_env_start);
pr_msg("\tEnv end: 0x%lx\n", mme->mm_env_end);
pr_msg("\tExe file ID %#x\n", mme->exe_file_id);
mm_entry__free_unpacked(mme, NULL);
out:
pr_img_tail(CR_FD_MM);
}
......
......@@ -335,22 +335,6 @@ struct task_core_entry {
u64 blk_sigset;
};
struct mm_entry {
u64 mm_start_code;
u64 mm_end_code;
u64 mm_start_data;
u64 mm_end_data;
u64 mm_start_stack;
u64 mm_start_brk;
u64 mm_brk;
u64 mm_arg_start;
u64 mm_arg_end;
u64 mm_env_start;
u64 mm_env_end;
u64 mm_saved_auxv[AT_VECTOR_SIZE];
u32 exe_file_id;
} __packed;
struct core_ids_entry {
u32 vm_id;
u32 files_id;
......
......@@ -11,6 +11,8 @@
#include "util.h"
#include "crtools.h"
#include "../protobuf/mm.pb-c.h"
#ifndef CONFIG_X86_64
# error Only x86-64 is supported
#endif
......@@ -84,7 +86,9 @@ struct task_restore_core_args {
struct itimerval itimers[3];
struct creds_entry creds;
struct mm_entry mm;
MmEntry mm;
u64 mm_saved_auxv[AT_VECTOR_SIZE];
} __aligned(sizeof(long));
struct pt_regs {
......
......@@ -38,6 +38,7 @@ PROTO_FILES += mnt.proto
PROTO_FILES += pipe-data.proto
PROTO_FILES += sa.proto
PROTO_FILES += itimer.proto
PROTO_FILES += mm.proto
HDRS := $(patsubst %.proto,%.pb-c.h,$(PROTO_FILES))
SRCS := $(patsubst %.proto,%.pb-c.c,$(PROTO_FILES))
......
message mm_entry {
required uint64 mm_start_code = 1;
required uint64 mm_end_code = 2;
required uint64 mm_start_data = 3;
required uint64 mm_end_data = 4;
required uint64 mm_start_stack = 5;
required uint64 mm_start_brk = 6;
required uint64 mm_brk = 7;
required uint64 mm_arg_start = 8;
required uint64 mm_arg_end = 9;
required uint64 mm_env_start = 10;
required uint64 mm_env_end = 11;
required uint32 exe_file_id = 12;
repeated uint64 mm_saved_auxv = 13;
}
......@@ -437,8 +437,8 @@ long __export_restore_task(struct task_restore_core_args *args)
ret |= sys_prctl_safe(PR_SET_MM, PR_SET_MM_ARG_END, (long)args->mm.mm_arg_end, 0);
ret |= sys_prctl_safe(PR_SET_MM, PR_SET_MM_ENV_START, (long)args->mm.mm_env_start, 0);
ret |= sys_prctl_safe(PR_SET_MM, PR_SET_MM_ENV_END, (long)args->mm.mm_env_end, 0);
ret |= sys_prctl_safe(PR_SET_MM, PR_SET_MM_AUXV, (long)args->mm.mm_saved_auxv,
sizeof(args->mm.mm_saved_auxv));
ret |= sys_prctl_safe(PR_SET_MM, PR_SET_MM_AUXV, (long)args->mm_saved_auxv,
sizeof(args->mm_saved_auxv));
if (ret)
goto core_restore_end;
......
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