Commit 4b7a3183 authored by Cyrill Gorcunov's avatar Cyrill Gorcunov

dump: Prepare for new core_entry layout

core_entry layout is arch dependant.
Signed-off-by: 's avatarCyrill Gorcunov <gorcunov@gmail.com>
parent 68cc4007
......@@ -562,71 +562,71 @@ static int dump_task_core_seized(pid_t pid, struct cr_fdset *cr_fdset)
pr_info("Dumping GP/FPU registers ... ");
assign_reg(core->gpregs, regs, r15);
assign_reg(core->gpregs, regs, r14);
assign_reg(core->gpregs, regs, r13);
assign_reg(core->gpregs, regs, r12);
assign_reg(core->gpregs, regs, bp);
assign_reg(core->gpregs, regs, bx);
assign_reg(core->gpregs, regs, r11);
assign_reg(core->gpregs, regs, r10);
assign_reg(core->gpregs, regs, r9);
assign_reg(core->gpregs, regs, r8);
assign_reg(core->gpregs, regs, ax);
assign_reg(core->gpregs, regs, cx);
assign_reg(core->gpregs, regs, dx);
assign_reg(core->gpregs, regs, si);
assign_reg(core->gpregs, regs, di);
assign_reg(core->gpregs, regs, orig_ax);
assign_reg(core->gpregs, regs, ip);
assign_reg(core->gpregs, regs, cs);
assign_reg(core->gpregs, regs, flags);
assign_reg(core->gpregs, regs, sp);
assign_reg(core->gpregs, regs, ss);
assign_reg(core->gpregs, regs, fs_base);
assign_reg(core->gpregs, regs, gs_base);
assign_reg(core->gpregs, regs, ds);
assign_reg(core->gpregs, regs, es);
assign_reg(core->gpregs, regs, fs);
assign_reg(core->gpregs, regs, gs);
assign_reg(core->fpregs, fpregs, cwd);
assign_reg(core->fpregs, fpregs, swd);
assign_reg(core->fpregs, fpregs, twd);
assign_reg(core->fpregs, fpregs, fop);
assign_reg(core->fpregs, fpregs, rip);
assign_reg(core->fpregs, fpregs, rdp);
assign_reg(core->fpregs, fpregs, mxcsr);
assign_reg(core->fpregs, fpregs, mxcsr_mask);
assign_array(core->fpregs, fpregs, st_space);
assign_array(core->fpregs, fpregs, xmm_space);
assign_array(core->fpregs, fpregs, padding);
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);
pr_info("OK\n");
pr_info("Obtainting TLS ... ");
ret = dump_task_tls(pid, core->tls_array, ARRAY_SIZE(core->tls_array));
ret = dump_task_tls(pid, core->u.arch.tls_array, ARRAY_SIZE(core->u.arch.tls_array));
if (ret)
goto err_free;
pr_info("OK\n");
pr_info("Obtainting personality ... ");
ret = get_task_personality(pid, &core->personality);
ret = get_task_personality(pid, &core->task_personality);
if (ret)
goto err_free;
pr_info("OK\n");
pr_info("Obtainting task stat ... ");
ret = get_task_stat(pid, core->comm, &core->flags);
ret = get_task_stat(pid, core->task_comm, &core->task_flags);
if (ret)
goto err_free;
pr_info("OK\n");
pr_info("Dumping header ... ");
core->hdr.version = HEADER_VERSION;
core->hdr.arch = HEADER_ARCH_X86_64;
core->hdr.flags = 0;
core->header.version = HEADER_VERSION;
core->header.arch = HEADER_ARCH_X86_64;
core->header.flags = 0;
write_ptr_safe(fd_core, core, err_free);
......
......@@ -77,7 +77,7 @@ static void show_core_regs(struct cr_fdset *cr_fdset)
pr_info("\n\t---[GP registers set]---\n");
lseek(fd_core, GET_FILE_OFF(struct core_entry, gpregs), SEEK_SET);
lseek(fd_core, GET_FILE_OFF(struct core_entry, u.arch.gpregs), SEEK_SET);
read_ptr_safe(fd_core, &regs, err);
......@@ -91,7 +91,7 @@ static void show_core_regs(struct cr_fdset *cr_fdset)
pr_info("\n\t---[TLS area]---\n");
lseek(fd_core, GET_FILE_OFF(struct core_entry, tls_array), SEEK_SET);
lseek(fd_core, GET_FILE_OFF(struct core_entry, u.arch.tls_array), SEEK_SET);
for (i = 0; i < GDT_ENTRY_TLS_ENTRIES; i++) {
read_ptr_safe(fd_core, &tls, err);
......@@ -112,10 +112,10 @@ static void show_core_rest(struct cr_fdset *cr_fdset)
if (fd_core < 0)
goto err;
lseek(fd_core, GET_FILE_OFF(struct core_entry, personality), SEEK_SET);
lseek(fd_core, GET_FILE_OFF(struct core_entry, task_personality), SEEK_SET);
read_ptr_safe(fd_core, &personality, err);
lseek(fd_core, GET_FILE_OFF(struct core_entry, comm), SEEK_SET);
lseek(fd_core, GET_FILE_OFF(struct core_entry, task_comm), SEEK_SET);
read_safe(fd_core, comm, TASK_COMM_LEN, err);
pr_info("Personality: %x\n", personality);
......
......@@ -121,7 +121,7 @@ int convert_to_elf(char *elf_path, int fd_core)
*/
lseek(fd_elf, 0, SEEK_SET);
elf_ehdr.e_phnum = e_phnum + 2;
elf_ehdr.e_entry = core.gpregs.ip;
elf_ehdr.e_entry = core.u.arch.gpregs.ip;
write_ptr_safe(fd_elf, &elf_ehdr, err_close);
/* Offset in file (after all headers) */
......
......@@ -161,14 +161,21 @@ struct user_fpregs_entry {
#define TASK_PF_USED_MATH 0x00002000
struct core_entry {
struct image_header hdr;
struct ckpt_arch_entry {
struct user_regs_entry gpregs;
struct user_fpregs_entry fpregs;
struct desc_struct tls_array[GDT_ENTRY_TLS_ENTRIES];
u32 personality;
u8 comm[TASK_COMM_LEN];
u32 flags;
};
struct core_entry {
struct image_header header;
union {
struct ckpt_arch_entry arch; /* per-arch specific */
u8 __pad[2048]; /* should be enough for all */
} u;
u32 task_personality;
u8 task_comm[TASK_COMM_LEN];
u32 task_flags;
} __packed;
#endif /* CONFIG_X86_64 */
......
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