mirror of
https://github.com/checkpoint-restore/criu
synced 2025-09-01 14:55:39 +00:00
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: Pavel Emelyanov <xemul@parallels.com> Signed-off-by: Cyrill Gorcunov <gorcunov@openvz.org>
This commit is contained in:
committed by
Cyrill Gorcunov
parent
cf0550ce61
commit
dbf3c1a8cd
98
cr-dump.c
98
cr-dump.c
@@ -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->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->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_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->u.arch.fpregs, fpregs, st_space);
|
||||
assign_array(core->u.arch.fpregs, fpregs, xmm_space);
|
||||
assign_array(core->u.arch.fpregs, fpregs, padding);
|
||||
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 ... ");
|
||||
|
20
cr-show.c
20
cr-show.c
@@ -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, ®s, 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 {
|
||||
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,7 +234,15 @@ struct core_entry {
|
||||
u64 mm_start_stack;
|
||||
u64 mm_start_brk;
|
||||
u64 mm_brk;
|
||||
u64 task_sigset;
|
||||
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];
|
||||
};
|
||||
|
34
restorer.c
34
restorer.c
@@ -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
|
||||
|
Reference in New Issue
Block a user