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