From b4b8763f1ce92f70603f29f3fa120ff78ec15554 Mon Sep 17 00:00:00 2001 From: Zhou Wenjian Date: Wed, 10 Dec 2014 09:38:39 +0800 Subject: [PATCH 4/5] Make qemu64 note human readable --- netdump.c | 73 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 73 insertions(+), 0 deletions(-) diff --git a/netdump.c b/netdump.c index e035d95..ac15125 100644 --- a/netdump.c +++ b/netdump.c @@ -2701,12 +2701,85 @@ display_prstatus_elf32(void *note_ptr, char *buf) } void +display_qemu_elf(QEMUCPUState *ptr, char *buf, int flags) +{ + int i, size, t=0; + QEMUCPUSegment *seg; + char *seg_names[] = {"CS", "DS", "ES", "FS", "GS", "SS", "LDT", "TR", + "GDT", "IDT"}; + + ptr = (QEMUCPUState *)roundup((ulong)ptr, 4); + seg = &(ptr->cs); + + size = sprintf(buf, + "\t\tversion: 0x%08lx\tsize: 0x%08lx\n" + "\t\tRAX: 0x%016llx\tRBX: 0x%016llx\n" + "\t\tRCX: 0x%016llx\tRDX: 0x%016llx\n" + "\t\tRSI: 0x%016llx\tRDI: 0x%016llx\n" + "\t\tRSP: 0x%016llx\tRBP: 0x%016llx\n", + ptr->version, ptr->size, + ptr->rax, ptr->rbx, ptr->rcx, + ptr->rdx, ptr->rsi, ptr->rdi, + ptr->rsp, ptr->rbp + ); + buf += size; + t+=size; + if (flags == KDUMP_ELF64) { + size = sprintf(buf, + "\t\tR8 : 0x%016llx\tR9 : 0x%016llx\n" + "\t\tR10: 0x%016llx\tR11: 0x%016llx\n" + "\t\tR12: 0x%016llx\tR13: 0x%016llx\n" + "\t\tR14: 0x%016llx\tR15: 0x%016llx\n", + ptr->r8, ptr->r9, ptr->r10, + ptr->r11, ptr->r12, ptr->r13, + ptr->r14, ptr->r15 + ); + buf += size; + } + + for(i = 0; i < sizeof(seg_names)/sizeof(seg_names[0]); i++) { + size = sprintf(buf, + "\t\t%s:\n" + "\t\tselector: 0x%08lx\tlimit: 0x%08lx\tflags: 0x%08lx\n" + "\t\tpad : 0x%08lx\tbase : 0x%016llx\n", + seg_names[i], + seg->selector, seg->limit, seg->flags, + seg->pad, seg->base + ); + buf += size; + seg++; + } + + sprintf(buf, + "\t\tcr[0]: %016llx\tcr[1]: %016llx\tcr[2]: %016llx\n" + "\t\tcr[3]: %016llx\tcr[4]: %016llx\n", + ptr->cr[0], ptr->cr[1], ptr->cr[2], + ptr->cr[3], ptr->cr[4] + ); +} + +void +display_qemu_elf64(void *note_ptr, char *buf) +{ + Elf64_Nhdr *note; + QEMUCPUState *ptr; + + note = (Elf64_Nhdr *)note_ptr; + ptr = (QEMUCPUState *)( + (char *)note + sizeof(Elf64_Nhdr) + note->n_namesz); + + display_qemu_elf(ptr, buf, KDUMP_ELF64); +} + +void display_note(void *note_ptr, char *buf, int descsz) { if (descsz == (2 * sizeof(struct x86_64_prstatus))) display_prstatus_elf64(note_ptr, buf); else if (descsz == sizeof(struct x86_prstatus)) display_prstatus_elf32(note_ptr, buf); + else if (descsz == (2 * sizeof(QEMUCPUState))) + display_qemu_elf64(note_ptr, buf); } void -- 1.7.1