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

crtools: Reformat core_entry

Keep task arch-independent fields in one struct (will be extended) in the
beginning of the image and make pads be located separately.
Signed-off-by: 's avatarPavel Emelyanov <xemul@parallels.com>
Signed-off-by: 's avatarCyrill Gorcunov <gorcunov@openvz.org>
parent cf0550ce
......@@ -510,46 +510,46 @@ static int get_task_regs(pid_t pid, struct core_entry *core)
break;
}
assign_reg(core->u.arch.gpregs, regs, r15);
assign_reg(core->u.arch.gpregs, regs, r14);
assign_reg(core->u.arch.gpregs, regs, r13);
assign_reg(core->u.arch.gpregs, regs, r12);
assign_reg(core->u.arch.gpregs, regs, bp);
assign_reg(core->u.arch.gpregs, regs, bx);
assign_reg(core->u.arch.gpregs, regs, r11);
assign_reg(core->u.arch.gpregs, regs, r10);
assign_reg(core->u.arch.gpregs, regs, r9);
assign_reg(core->u.arch.gpregs, regs, r8);
assign_reg(core->u.arch.gpregs, regs, ax);
assign_reg(core->u.arch.gpregs, regs, cx);
assign_reg(core->u.arch.gpregs, regs, dx);
assign_reg(core->u.arch.gpregs, regs, si);
assign_reg(core->u.arch.gpregs, regs, di);
assign_reg(core->u.arch.gpregs, regs, orig_ax);
assign_reg(core->u.arch.gpregs, regs, ip);
assign_reg(core->u.arch.gpregs, regs, cs);
assign_reg(core->u.arch.gpregs, regs, flags);
assign_reg(core->u.arch.gpregs, regs, sp);
assign_reg(core->u.arch.gpregs, regs, ss);
assign_reg(core->u.arch.gpregs, regs, fs_base);
assign_reg(core->u.arch.gpregs, regs, gs_base);
assign_reg(core->u.arch.gpregs, regs, ds);
assign_reg(core->u.arch.gpregs, regs, es);
assign_reg(core->u.arch.gpregs, regs, fs);
assign_reg(core->u.arch.gpregs, regs, gs);
assign_reg(core->u.arch.fpregs, fpregs, cwd);
assign_reg(core->u.arch.fpregs, fpregs, swd);
assign_reg(core->u.arch.fpregs, fpregs, twd);
assign_reg(core->u.arch.fpregs, fpregs, fop);
assign_reg(core->u.arch.fpregs, fpregs, rip);
assign_reg(core->u.arch.fpregs, fpregs, rdp);
assign_reg(core->u.arch.fpregs, fpregs, mxcsr);
assign_reg(core->u.arch.fpregs, fpregs, mxcsr_mask);
assign_array(core->u.arch.fpregs, fpregs, st_space);
assign_array(core->u.arch.fpregs, fpregs, xmm_space);
assign_array(core->u.arch.fpregs, fpregs, padding);
assign_reg(core->arch.gpregs, regs, r15);
assign_reg(core->arch.gpregs, regs, r14);
assign_reg(core->arch.gpregs, regs, r13);
assign_reg(core->arch.gpregs, regs, r12);
assign_reg(core->arch.gpregs, regs, bp);
assign_reg(core->arch.gpregs, regs, bx);
assign_reg(core->arch.gpregs, regs, r11);
assign_reg(core->arch.gpregs, regs, r10);
assign_reg(core->arch.gpregs, regs, r9);
assign_reg(core->arch.gpregs, regs, r8);
assign_reg(core->arch.gpregs, regs, ax);
assign_reg(core->arch.gpregs, regs, cx);
assign_reg(core->arch.gpregs, regs, dx);
assign_reg(core->arch.gpregs, regs, si);
assign_reg(core->arch.gpregs, regs, di);
assign_reg(core->arch.gpregs, regs, orig_ax);
assign_reg(core->arch.gpregs, regs, ip);
assign_reg(core->arch.gpregs, regs, cs);
assign_reg(core->arch.gpregs, regs, flags);
assign_reg(core->arch.gpregs, regs, sp);
assign_reg(core->arch.gpregs, regs, ss);
assign_reg(core->arch.gpregs, regs, fs_base);
assign_reg(core->arch.gpregs, regs, gs_base);
assign_reg(core->arch.gpregs, regs, ds);
assign_reg(core->arch.gpregs, regs, es);
assign_reg(core->arch.gpregs, regs, fs);
assign_reg(core->arch.gpregs, regs, gs);
assign_reg(core->arch.fpregs, fpregs, cwd);
assign_reg(core->arch.fpregs, fpregs, swd);
assign_reg(core->arch.fpregs, fpregs, twd);
assign_reg(core->arch.fpregs, fpregs, fop);
assign_reg(core->arch.fpregs, fpregs, rip);
assign_reg(core->arch.fpregs, fpregs, rdp);
assign_reg(core->arch.fpregs, fpregs, mxcsr);
assign_reg(core->arch.fpregs, fpregs, mxcsr_mask);
assign_array(core->arch.fpregs, fpregs, st_space);
assign_array(core->arch.fpregs, fpregs, xmm_space);
assign_array(core->arch.fpregs, fpregs, padding);
ret = 0;
......@@ -581,21 +581,21 @@ static int dump_task_core_seized(pid_t pid, int pid_dir, struct proc_pid_stat *s
pr_info("OK\n");
pr_info("Obtainting personality ... ");
ret = get_task_personality(pid, pid_dir, &core->task_personality);
ret = get_task_personality(pid, pid_dir, &core->tc.personality);
if (ret)
goto err_free;
pr_info("OK\n");
strncpy((char *)core->task_comm, stat->comm, TASK_COMM_LEN);
core->task_flags = stat->flags;
core->mm_start_code = stat->start_code;
core->mm_end_code = stat->end_code;
core->mm_start_data = stat->start_data;
core->mm_end_data = stat->end_data;
core->mm_start_stack = stat->start_stack;
core->mm_start_brk = stat->start_brk;
strncpy((char *)core->tc.comm, stat->comm, TASK_COMM_LEN);
core->tc.flags = stat->flags;
core->tc.mm_start_code = stat->start_code;
core->tc.mm_end_code = stat->end_code;
core->tc.mm_start_data = stat->start_data;
core->tc.mm_end_data = stat->end_data;
core->tc.mm_start_stack = stat->start_stack;
core->tc.mm_start_brk = stat->start_brk;
ret = get_task_sigmask(pid, pid_dir, &core->task_sigset);
ret = get_task_sigmask(pid, pid_dir, &core->tc.blk_sigset);
if (ret)
goto err_free;
pr_info("OK\n");
......@@ -604,7 +604,7 @@ static int dump_task_core_seized(pid_t pid, int pid_dir, struct proc_pid_stat *s
brk = brk_seized(pid, 0);
if ((long)brk < 0)
goto err_free;
core->mm_brk = brk;
core->tc.mm_brk = brk;
pr_info("OK\n");
pr_info("Dumping header ... ");
......
......@@ -292,7 +292,7 @@ static void show_core_regs(int fd_core)
pr_info("\n\t---[GP registers set]---\n");
lseek(fd_core, GET_FILE_OFF(struct core_entry, u.arch.gpregs), SEEK_SET);
lseek(fd_core, GET_FILE_OFF(struct core_entry, arch.gpregs), SEEK_SET);
read_ptr_safe(fd_core, &regs, err);
......@@ -317,31 +317,31 @@ static void show_core_rest(int fd_core)
u32 personality;
int i;
lseek(fd_core, GET_FILE_OFF(struct core_entry, task_personality), SEEK_SET);
lseek(fd_core, GET_FILE_OFF(struct core_entry, tc.personality), SEEK_SET);
read_ptr_safe(fd_core, &personality, err);
lseek(fd_core, GET_FILE_OFF(struct core_entry, task_comm), SEEK_SET);
lseek(fd_core, GET_FILE_OFF(struct core_entry, tc.comm), SEEK_SET);
read_safe(fd_core, comm, TASK_COMM_LEN, err);
lseek(fd_core, GET_FILE_OFF(struct core_entry, mm_brk), SEEK_SET);
lseek(fd_core, GET_FILE_OFF(struct core_entry, tc.mm_brk), SEEK_SET);
read_ptr_safe(fd_core, &mm_brk, err);
lseek(fd_core, GET_FILE_OFF(struct core_entry, mm_start_code), SEEK_SET);
lseek(fd_core, GET_FILE_OFF(struct core_entry, tc.mm_start_code), SEEK_SET);
read_ptr_safe(fd_core, &mm_start_code, err);
lseek(fd_core, GET_FILE_OFF(struct core_entry, mm_end_code), SEEK_SET);
lseek(fd_core, GET_FILE_OFF(struct core_entry, tc.mm_end_code), SEEK_SET);
read_ptr_safe(fd_core, &mm_end_code, err);
lseek(fd_core, GET_FILE_OFF(struct core_entry, mm_start_stack), SEEK_SET);
lseek(fd_core, GET_FILE_OFF(struct core_entry, tc.mm_start_stack), SEEK_SET);
read_ptr_safe(fd_core, &mm_start_stack, err);
lseek(fd_core, GET_FILE_OFF(struct core_entry, mm_start_data), SEEK_SET);
lseek(fd_core, GET_FILE_OFF(struct core_entry, tc.mm_start_data), SEEK_SET);
read_ptr_safe(fd_core, &mm_start_data, err);
lseek(fd_core, GET_FILE_OFF(struct core_entry, mm_end_data), SEEK_SET);
lseek(fd_core, GET_FILE_OFF(struct core_entry, tc.mm_end_data), SEEK_SET);
read_ptr_safe(fd_core, &mm_end_data, err);
lseek(fd_core, GET_FILE_OFF(struct core_entry, mm_start_brk), SEEK_SET);
lseek(fd_core, GET_FILE_OFF(struct core_entry, tc.mm_start_brk), SEEK_SET);
read_ptr_safe(fd_core, &mm_start_brk, err);
pr_info("\n\t---[Task parameters]---\n");
......
......@@ -208,25 +208,25 @@ struct user_fpregs_entry {
#define TASK_PF_USED_MATH 0x00002000
#define CKPT_ARCH_SIZE (1 * 4096)
struct ckpt_arch_entry {
struct user_regs_entry gpregs;
struct user_fpregs_entry fpregs;
union {
struct {
struct user_regs_entry gpregs;
struct user_fpregs_entry fpregs;
};
u8 __arch_pad[CKPT_ARCH_SIZE]; /* should be enough for all */
};
};
#define CKPT_ARCH_SIZE (1 * 4096)
#define CKPT_CORE_SIZE (2 * 4096)
struct core_entry {
union {
struct {
struct image_header header;
union {
struct ckpt_arch_entry arch; /* per-arch specific */
u8 __arch_pad[CKPT_ARCH_SIZE]; /* should be enough for all */
} u;
u32 task_personality;
u8 task_comm[TASK_COMM_LEN];
u32 task_flags;
struct task_core_entry {
u32 personality;
u8 comm[TASK_COMM_LEN];
u32 flags;
u64 mm_start_code;
u64 mm_end_code;
u64 mm_start_data;
......@@ -234,10 +234,18 @@ struct core_entry {
u64 mm_start_stack;
u64 mm_start_brk;
u64 mm_brk;
u64 task_sigset;
};
u8 __core_pad[CKPT_CORE_SIZE];
};
u64 blk_sigset;
};
struct core_entry {
union {
struct {
struct image_header header;
struct task_core_entry tc;
struct ckpt_arch_entry arch;
};
u8 __core_pad[CKPT_CORE_SIZE];
};
} __packed;
#endif /* CONFIG_X86_64 */
......
......@@ -73,8 +73,8 @@ long restore_thread(struct thread_restore_args *args)
rt_sigframe = (void *)args->mem_zone.rt_sigframe + 8;
#define CPREGT1(d) rt_sigframe->uc.uc_mcontext.d = core_entry->u.arch.gpregs.d
#define CPREGT2(d,s) rt_sigframe->uc.uc_mcontext.d = core_entry->u.arch.gpregs.s
#define CPREGT1(d) rt_sigframe->uc.uc_mcontext.d = core_entry->arch.gpregs.d
#define CPREGT2(d,s) rt_sigframe->uc.uc_mcontext.d = core_entry->arch.gpregs.s
CPREGT1(r8);
CPREGT1(r9);
......@@ -98,7 +98,7 @@ long restore_thread(struct thread_restore_args *args)
CPREGT1(gs);
CPREGT1(fs);
fsgs_base = core_entry->u.arch.gpregs.fs_base;
fsgs_base = core_entry->arch.gpregs.fs_base;
ret = sys_arch_prctl(ARCH_SET_FS, (void *)fsgs_base);
if (ret) {
write_num_n(__LINE__);
......@@ -106,7 +106,7 @@ long restore_thread(struct thread_restore_args *args)
goto core_restore_end;
}
fsgs_base = core_entry->u.arch.gpregs.gs_base;
fsgs_base = core_entry->arch.gpregs.gs_base;
ret = sys_arch_prctl(ARCH_SET_GS, (void *)fsgs_base);
if (ret) {
write_num_n(__LINE__);
......@@ -352,14 +352,14 @@ long restore_task(struct task_restore_core_args *args)
} \
} while (0)
sys_prctl_safe(PR_SET_NAME, (long)core_entry->task_comm, 0);
sys_prctl_safe(PR_SET_MM, PR_SET_MM_START_CODE, (long)core_entry->mm_start_code);
sys_prctl_safe(PR_SET_MM, PR_SET_MM_END_CODE, (long)core_entry->mm_end_code);
sys_prctl_safe(PR_SET_MM, PR_SET_MM_START_DATA, (long)core_entry->mm_start_data);
sys_prctl_safe(PR_SET_MM, PR_SET_MM_END_DATA, (long)core_entry->mm_end_data);
sys_prctl_safe(PR_SET_MM, PR_SET_MM_START_STACK,(long)core_entry->mm_start_stack);
sys_prctl_safe(PR_SET_MM, PR_SET_MM_START_BRK, (long)core_entry->mm_start_brk);
sys_prctl_safe(PR_SET_MM, PR_SET_MM_BRK, (long)core_entry->mm_brk);
sys_prctl_safe(PR_SET_NAME, (long)core_entry->tc.comm, 0);
sys_prctl_safe(PR_SET_MM, PR_SET_MM_START_CODE, (long)core_entry->tc.mm_start_code);
sys_prctl_safe(PR_SET_MM, PR_SET_MM_END_CODE, (long)core_entry->tc.mm_end_code);
sys_prctl_safe(PR_SET_MM, PR_SET_MM_START_DATA, (long)core_entry->tc.mm_start_data);
sys_prctl_safe(PR_SET_MM, PR_SET_MM_END_DATA, (long)core_entry->tc.mm_end_data);
sys_prctl_safe(PR_SET_MM, PR_SET_MM_START_STACK,(long)core_entry->tc.mm_start_stack);
sys_prctl_safe(PR_SET_MM, PR_SET_MM_START_BRK, (long)core_entry->tc.mm_start_brk);
sys_prctl_safe(PR_SET_MM, PR_SET_MM_BRK, (long)core_entry->tc.mm_brk);
/*
* We need to prepare a valid sigframe here, so
......@@ -369,8 +369,8 @@ long restore_task(struct task_restore_core_args *args)
*/
rt_sigframe = (void *)args->mem_zone.rt_sigframe + 8;
#define CPREG1(d) rt_sigframe->uc.uc_mcontext.d = core_entry->u.arch.gpregs.d
#define CPREG2(d,s) rt_sigframe->uc.uc_mcontext.d = core_entry->u.arch.gpregs.s
#define CPREG1(d) rt_sigframe->uc.uc_mcontext.d = core_entry->arch.gpregs.d
#define CPREG2(d,s) rt_sigframe->uc.uc_mcontext.d = core_entry->arch.gpregs.s
CPREG1(r8);
CPREG1(r9);
......@@ -394,7 +394,7 @@ long restore_task(struct task_restore_core_args *args)
CPREG1(gs);
CPREG1(fs);
fsgs_base = core_entry->u.arch.gpregs.fs_base;
fsgs_base = core_entry->arch.gpregs.fs_base;
ret = sys_arch_prctl(ARCH_SET_FS, (void *)fsgs_base);
if (ret) {
write_num_n(__LINE__);
......@@ -402,7 +402,7 @@ long restore_task(struct task_restore_core_args *args)
goto core_restore_end;
}
fsgs_base = core_entry->u.arch.gpregs.gs_base;
fsgs_base = core_entry->arch.gpregs.gs_base;
ret = sys_arch_prctl(ARCH_SET_GS, (void *)fsgs_base);
if (ret) {
write_num_n(__LINE__);
......@@ -413,7 +413,7 @@ long restore_task(struct task_restore_core_args *args)
/*
* Blocked signals.
*/
rt_sigframe->uc.uc_sigmask.sig[0] = core_entry->task_sigset;
rt_sigframe->uc.uc_sigmask.sig[0] = core_entry->tc.blk_sigset;
/*
* Threads restoration. This requires some more comments. This
......
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