From d55b7f1102c40d8ee18211c03c1eb74d3f81ba15 Mon Sep 17 00:00:00 2001 From: Zhou Wenjian Date: Wed, 10 Dec 2014 10:34:46 +0800 Subject: [PATCH 1/5] Make elf64 note human readable --- netdump.c | 97 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 97 insertions(+), 0 deletions(-) diff --git a/netdump.c b/netdump.c index 903faa0..c3bd0e3 100644 --- a/netdump.c +++ b/netdump.c @@ -45,6 +45,7 @@ static int proc_kcore_init_64(FILE *fp); static char *get_regs_from_note(char *, ulong *, ulong *); static void kdump_get_osrelease(void); static char *vmcoreinfo_read_string(const char *); +void display_note_elf64(void *note_ptr, char *buf); #define ELFSTORE 1 @@ -2279,6 +2280,12 @@ dump_Elf64_Nhdr(Elf64_Off offset, int store) iptr = (int *)uptr; netdump_print(" %08lx\n", *iptr); } else { + if (nd->ofp) { + char *l_buf = (char *)malloc(2 * BUFSIZE); + display_note_elf64(note,l_buf); + fprintf(fp, "%s", l_buf); + free(l_buf); + } for (i = lf = 0; i < note->n_descsz/sizeof(ulonglong); i++) { if (((i%2)==0)) { netdump_print("%s ", @@ -2543,6 +2550,96 @@ struct x86_64_user_regs_struct { unsigned long ds,es,fs,gs; }; +struct x86_64_prstatus { + int si_signo; + int si_code; + int si_errno; + short cursig; + unsigned long sigpend; + unsigned long sighold; + int pid; + int ppid; + int pgrp; + int sid; + struct timeval utime; + struct timeval stime; + struct timeval cutime; + struct timeval cstime; + struct x86_64_user_regs_struct regs; + int fpvalid; +}; + +static void +display_prstatus_elf64(void *note_ptr, char *buf) +{ + struct x86_64_prstatus *pr; + Elf64_Nhdr *note; + + note = (Elf64_Nhdr *)note_ptr; + pr = (struct x86_64_prstatus *)( + (char *)note + sizeof(Elf64_Nhdr) + note->n_namesz); + pr = (struct x86_64_prstatus *)roundup((ulong)pr, 4); + sprintf(buf, + "\t\tsi.signo: %d, si.code: %d, si.errno: %d, cursig:%d\n" + "\t\tsigpend: %lu\n" + "\t\tsighold: %lu\n" + "\t\tpid: %d, ppid: %d, pgrp: %d, sid:%d\n" + "\t\tutime: %01lld.%06d, stime: %01lld.%06d, cutime: %01lld.%06d, " + "cstime: %01lld.%06d\n" + "\t\tORIG_RAX: %lu, fpvalid: %d\n" + "\t\tR15 : 0x%016lx\tR14 : 0x%016lx\n" + "\t\tR13 : 0x%016lx\tR12 : 0x%016lx\n" + "\t\tRBP : 0x%016lx\tRBX : 0x%016lx\n" + "\t\tR11 : 0x%016lx\tR10 : 0x%016lx\n" + "\t\tR9 : 0x%016lx\tR8 : 0x%016lx\n" + "\t\tRAX : 0x%016lx\tRCX : 0x%016lx\n" + "\t\tRDX : 0x%016lx\tRSI : 0x%016lx\n" + "\t\tRDI : 0x%016lx\tRIP : 0x%016lx\n" + "\t\tRFLAGS : 0x%016lx\tRSP : 0x%016lx\n" + "\t\tFS_BASE: 0x%016lx\tGS_BASE : 0x%016lx\n" + "\t\tCS: 0x%04lx SS: 0x%04lx DS: 0x%04lx ES: 0x%04lx " + "FS: 0x%04lx GS: 0x%04lx\n", + pr->si_signo, pr->si_code, pr->si_errno, pr->cursig, + pr->sigpend, pr->sighold, + pr->pid, pr->ppid, pr->pgrp, pr->sid, + (long long)pr->utime.tv_sec, (int)pr->utime.tv_usec, + (long long)pr->stime.tv_sec, (int)pr->stime.tv_usec, + (long long)pr->cutime.tv_sec, (int)pr->cutime.tv_usec, + (long long)pr->cstime.tv_sec, (int)pr->cstime.tv_usec, + pr->regs.orig_rax, pr->fpvalid, + pr->regs.r15, pr->regs.r14, + pr->regs.r13, pr->regs.r12, + pr->regs.rbp, pr->regs.rbx, + pr->regs.r11, pr->regs.r10, + pr->regs.r9, pr->regs.r8, + pr->regs.rax, pr->regs.rcx, + pr->regs.rdx, pr->regs.rsi, + pr->regs.rdi, pr->regs.rip, + pr->regs.eflags, pr->regs.rsp, + pr->regs.fs_base, pr->regs.gs_base, + pr->regs.cs, pr->regs.ss, + pr->regs.ds, pr->regs.es, + pr->regs.fs, pr->regs.gs + ); +} + +static void +display_note(void *note_ptr, char *buf, int descsz) +{ + if (descsz == (2 * sizeof(struct x86_64_prstatus))) + display_prstatus_elf64(note_ptr, buf); +} + +void +display_note_elf64(void *note_ptr, char *buf) +{ + Elf64_Nhdr *note; + + note = (Elf64_Nhdr *)note_ptr; + + display_note(note_ptr, buf, 2 * (note->n_descsz)); +} + void get_netdump_regs_x86_64(struct bt_info *bt, ulong *ripp, ulong *rspp) { -- 1.7.1