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) ...@@ -510,46 +510,46 @@ static int get_task_regs(pid_t pid, struct core_entry *core)
break; break;
} }
assign_reg(core->u.arch.gpregs, regs, r15); assign_reg(core->arch.gpregs, regs, r15);
assign_reg(core->u.arch.gpregs, regs, r14); assign_reg(core->arch.gpregs, regs, r14);
assign_reg(core->u.arch.gpregs, regs, r13); assign_reg(core->arch.gpregs, regs, r13);
assign_reg(core->u.arch.gpregs, regs, r12); assign_reg(core->arch.gpregs, regs, r12);
assign_reg(core->u.arch.gpregs, regs, bp); assign_reg(core->arch.gpregs, regs, bp);
assign_reg(core->u.arch.gpregs, regs, bx); assign_reg(core->arch.gpregs, regs, bx);
assign_reg(core->u.arch.gpregs, regs, r11); assign_reg(core->arch.gpregs, regs, r11);
assign_reg(core->u.arch.gpregs, regs, r10); assign_reg(core->arch.gpregs, regs, r10);
assign_reg(core->u.arch.gpregs, regs, r9); assign_reg(core->arch.gpregs, regs, r9);
assign_reg(core->u.arch.gpregs, regs, r8); assign_reg(core->arch.gpregs, regs, r8);
assign_reg(core->u.arch.gpregs, regs, ax); assign_reg(core->arch.gpregs, regs, ax);
assign_reg(core->u.arch.gpregs, regs, cx); assign_reg(core->arch.gpregs, regs, cx);
assign_reg(core->u.arch.gpregs, regs, dx); assign_reg(core->arch.gpregs, regs, dx);
assign_reg(core->u.arch.gpregs, regs, si); assign_reg(core->arch.gpregs, regs, si);
assign_reg(core->u.arch.gpregs, regs, di); assign_reg(core->arch.gpregs, regs, di);
assign_reg(core->u.arch.gpregs, regs, orig_ax); assign_reg(core->arch.gpregs, regs, orig_ax);
assign_reg(core->u.arch.gpregs, regs, ip); assign_reg(core->arch.gpregs, regs, ip);
assign_reg(core->u.arch.gpregs, regs, cs); assign_reg(core->arch.gpregs, regs, cs);
assign_reg(core->u.arch.gpregs, regs, flags); assign_reg(core->arch.gpregs, regs, flags);
assign_reg(core->u.arch.gpregs, regs, sp); assign_reg(core->arch.gpregs, regs, sp);
assign_reg(core->u.arch.gpregs, regs, ss); assign_reg(core->arch.gpregs, regs, ss);
assign_reg(core->u.arch.gpregs, regs, fs_base); assign_reg(core->arch.gpregs, regs, fs_base);
assign_reg(core->u.arch.gpregs, regs, gs_base); assign_reg(core->arch.gpregs, regs, gs_base);
assign_reg(core->u.arch.gpregs, regs, ds); assign_reg(core->arch.gpregs, regs, ds);
assign_reg(core->u.arch.gpregs, regs, es); assign_reg(core->arch.gpregs, regs, es);
assign_reg(core->u.arch.gpregs, regs, fs); assign_reg(core->arch.gpregs, regs, fs);
assign_reg(core->u.arch.gpregs, regs, gs); assign_reg(core->arch.gpregs, regs, gs);
assign_reg(core->u.arch.fpregs, fpregs, cwd); assign_reg(core->arch.fpregs, fpregs, cwd);
assign_reg(core->u.arch.fpregs, fpregs, swd); assign_reg(core->arch.fpregs, fpregs, swd);
assign_reg(core->u.arch.fpregs, fpregs, twd); assign_reg(core->arch.fpregs, fpregs, twd);
assign_reg(core->u.arch.fpregs, fpregs, fop); assign_reg(core->arch.fpregs, fpregs, fop);
assign_reg(core->u.arch.fpregs, fpregs, rip); assign_reg(core->arch.fpregs, fpregs, rip);
assign_reg(core->u.arch.fpregs, fpregs, rdp); assign_reg(core->arch.fpregs, fpregs, rdp);
assign_reg(core->u.arch.fpregs, fpregs, mxcsr); assign_reg(core->arch.fpregs, fpregs, mxcsr);
assign_reg(core->u.arch.fpregs, fpregs, mxcsr_mask); assign_reg(core->arch.fpregs, fpregs, mxcsr_mask);
assign_array(core->u.arch.fpregs, fpregs, st_space); assign_array(core->arch.fpregs, fpregs, st_space);
assign_array(core->u.arch.fpregs, fpregs, xmm_space); assign_array(core->arch.fpregs, fpregs, xmm_space);
assign_array(core->u.arch.fpregs, fpregs, padding); assign_array(core->arch.fpregs, fpregs, padding);
ret = 0; ret = 0;
...@@ -581,21 +581,21 @@ static int dump_task_core_seized(pid_t pid, int pid_dir, struct proc_pid_stat *s ...@@ -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("OK\n");
pr_info("Obtainting personality ... "); 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) if (ret)
goto err_free; goto err_free;
pr_info("OK\n"); pr_info("OK\n");
strncpy((char *)core->task_comm, stat->comm, TASK_COMM_LEN); strncpy((char *)core->tc.comm, stat->comm, TASK_COMM_LEN);
core->task_flags = stat->flags; core->tc.flags = stat->flags;
core->mm_start_code = stat->start_code; core->tc.mm_start_code = stat->start_code;
core->mm_end_code = stat->end_code; core->tc.mm_end_code = stat->end_code;
core->mm_start_data = stat->start_data; core->tc.mm_start_data = stat->start_data;
core->mm_end_data = stat->end_data; core->tc.mm_end_data = stat->end_data;
core->mm_start_stack = stat->start_stack; core->tc.mm_start_stack = stat->start_stack;
core->mm_start_brk = stat->start_brk; 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) if (ret)
goto err_free; goto err_free;
pr_info("OK\n"); 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 ...@@ -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); brk = brk_seized(pid, 0);
if ((long)brk < 0) if ((long)brk < 0)
goto err_free; goto err_free;
core->mm_brk = brk; core->tc.mm_brk = brk;
pr_info("OK\n"); pr_info("OK\n");
pr_info("Dumping header ... "); pr_info("Dumping header ... ");
......
...@@ -292,7 +292,7 @@ static void show_core_regs(int fd_core) ...@@ -292,7 +292,7 @@ static void show_core_regs(int fd_core)
pr_info("\n\t---[GP registers set]---\n"); 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); read_ptr_safe(fd_core, &regs, err);
...@@ -317,31 +317,31 @@ static void show_core_rest(int fd_core) ...@@ -317,31 +317,31 @@ static void show_core_rest(int fd_core)
u32 personality; u32 personality;
int i; 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); 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); 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); 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); 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); 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); 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); 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); 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); read_ptr_safe(fd_core, &mm_start_brk, err);
pr_info("\n\t---[Task parameters]---\n"); pr_info("\n\t---[Task parameters]---\n");
......
...@@ -208,25 +208,25 @@ struct user_fpregs_entry { ...@@ -208,25 +208,25 @@ struct user_fpregs_entry {
#define TASK_PF_USED_MATH 0x00002000 #define TASK_PF_USED_MATH 0x00002000
#define CKPT_ARCH_SIZE (1 * 4096)
struct ckpt_arch_entry { struct ckpt_arch_entry {
union {
struct {
struct user_regs_entry gpregs; struct user_regs_entry gpregs;
struct user_fpregs_entry fpregs; 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) #define CKPT_CORE_SIZE (2 * 4096)
struct core_entry { struct task_core_entry {
union {
struct { u32 personality;
struct image_header header; u8 comm[TASK_COMM_LEN];
union { u32 flags;
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;
u64 mm_start_code; u64 mm_start_code;
u64 mm_end_code; u64 mm_end_code;
u64 mm_start_data; u64 mm_start_data;
...@@ -234,7 +234,15 @@ struct core_entry { ...@@ -234,7 +234,15 @@ struct core_entry {
u64 mm_start_stack; u64 mm_start_stack;
u64 mm_start_brk; u64 mm_start_brk;
u64 mm_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]; u8 __core_pad[CKPT_CORE_SIZE];
}; };
......
...@@ -73,8 +73,8 @@ long restore_thread(struct thread_restore_args *args) ...@@ -73,8 +73,8 @@ long restore_thread(struct thread_restore_args *args)
rt_sigframe = (void *)args->mem_zone.rt_sigframe + 8; 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 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->u.arch.gpregs.s #define CPREGT2(d,s) rt_sigframe->uc.uc_mcontext.d = core_entry->arch.gpregs.s
CPREGT1(r8); CPREGT1(r8);
CPREGT1(r9); CPREGT1(r9);
...@@ -98,7 +98,7 @@ long restore_thread(struct thread_restore_args *args) ...@@ -98,7 +98,7 @@ long restore_thread(struct thread_restore_args *args)
CPREGT1(gs); CPREGT1(gs);
CPREGT1(fs); 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); ret = sys_arch_prctl(ARCH_SET_FS, (void *)fsgs_base);
if (ret) { if (ret) {
write_num_n(__LINE__); write_num_n(__LINE__);
...@@ -106,7 +106,7 @@ long restore_thread(struct thread_restore_args *args) ...@@ -106,7 +106,7 @@ long restore_thread(struct thread_restore_args *args)
goto core_restore_end; 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); ret = sys_arch_prctl(ARCH_SET_GS, (void *)fsgs_base);
if (ret) { if (ret) {
write_num_n(__LINE__); write_num_n(__LINE__);
...@@ -352,14 +352,14 @@ long restore_task(struct task_restore_core_args *args) ...@@ -352,14 +352,14 @@ long restore_task(struct task_restore_core_args *args)
} \ } \
} while (0) } while (0)
sys_prctl_safe(PR_SET_NAME, (long)core_entry->task_comm, 0); 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->mm_start_code); 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->mm_end_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->mm_start_data); 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->mm_end_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->mm_start_stack); 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->mm_start_brk); 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->mm_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 * We need to prepare a valid sigframe here, so
...@@ -369,8 +369,8 @@ long restore_task(struct task_restore_core_args *args) ...@@ -369,8 +369,8 @@ long restore_task(struct task_restore_core_args *args)
*/ */
rt_sigframe = (void *)args->mem_zone.rt_sigframe + 8; 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 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->u.arch.gpregs.s #define CPREG2(d,s) rt_sigframe->uc.uc_mcontext.d = core_entry->arch.gpregs.s
CPREG1(r8); CPREG1(r8);
CPREG1(r9); CPREG1(r9);
...@@ -394,7 +394,7 @@ long restore_task(struct task_restore_core_args *args) ...@@ -394,7 +394,7 @@ long restore_task(struct task_restore_core_args *args)
CPREG1(gs); CPREG1(gs);
CPREG1(fs); 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); ret = sys_arch_prctl(ARCH_SET_FS, (void *)fsgs_base);
if (ret) { if (ret) {
write_num_n(__LINE__); write_num_n(__LINE__);
...@@ -402,7 +402,7 @@ long restore_task(struct task_restore_core_args *args) ...@@ -402,7 +402,7 @@ long restore_task(struct task_restore_core_args *args)
goto core_restore_end; 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); ret = sys_arch_prctl(ARCH_SET_GS, (void *)fsgs_base);
if (ret) { if (ret) {
write_num_n(__LINE__); write_num_n(__LINE__);
...@@ -413,7 +413,7 @@ long restore_task(struct task_restore_core_args *args) ...@@ -413,7 +413,7 @@ long restore_task(struct task_restore_core_args *args)
/* /*
* Blocked signals. * 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 * 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