From 08d71ea4baaf082b22f1385e3fe6a787d2873583 Mon Sep 17 00:00:00 2001 From: Qiao Nuohan Date: Tue, 23 Sep 2014 15:54:45 +0800 Subject: [PATCH v3 06/21] modify help -r to hide offline cpus' registers help -r can display registers on three types of vmcore: 1. qemu memoly-only dump 2. kdump(kdump-compressed format) 3. kdump(elf format) This patch will hide the offline cpus' registers. With offline cpus' registers hiden, the output is like below 1. qemu memory-only dump, cpu#1 and cpu#2 are offline ... idt: selector:00000000 limit:00000fff flags:00000000 pad:00000000 base:ffffffffff529000 cr[0]:000000008005003b cr[1]:0000000000000000 cr[2]:00007f6885fa3000 cr[3]:000000003b481000 cr[4]:00000000000006f0 CPU 1: [OFFLINE] CPU 2: [OFFLINE] CPU 3: rax:00000000ffffffed rbx:ffff88003daeffd8 rcx:0100000000000000 rdx:0000000000000000 rsi:0000000000000000 rdi:0000000000000046 rsp:ffff88003daefe98 rbp:ffff88003daefe98 r8:0000000000000000 r9:0000000000000000 r10:0000000000000013 r11:ffff88003db45028 r12:0000000000000003 r13:ffff88003daeffd8 r14:0000000000000000 r15:ffff88003daeffd8 rip:ffffffff81046346 rflags:00000286 ... 2. kdump(kdump-compressed format), cpu#2 is offline ... CPU 1: RIP: ffffffff8134b6c6 RSP: ffff88003df25e18 RFLAGS: 00010096 RAX: 0000000000000010 RBX: 0000000000000063 RCX: 0000000000000000 RDX: 0000000000000000 RSI: 0000000000000000 RDI: 0000000000000063 RBP: ffff88003df25e18 R8: 0000000000000000 R9: ffffffff81645da0 R10: 0000000000000001 R11: 0000000000000000 R12: 0000000000000000 R13: ffffffff81b01a40 R14: 0000000000000286 R15: 0000000000000004 CS: 0010 SS: 0018 CPU 2: [OFFLINE] CPU 3: RIP: ffffffff81015670 RSP: ffff88003f3fdca0 RFLAGS: 00000097 RAX: 0000000000000000 RBX: 000000000000001f RCX: 0000000000000000 RDX: 00000000000003d5 RSI: 000000000000001f RDI: ffffffff81fdd2a8 ... 3. kdump(elf format), cpu #1 is offline ... RBP: ffffffff818c3e98 R8: 0000000000000000 R9: 0000000000000000 R10: 0000000000000000 R11: 0000000000000000 R12: 0000000000000000 R13: ffffffff818c3fd8 R14: ffff88003ff54780 R15: ffffffff818c3fd8 CS: 0010 SS: 0018 CPU 1: [OFFLINE] CPU 2: RIP: ffffffff81046346 RSP: ffff88003daede98 RFLAGS: 00000286 RAX: 00000000ffffffed RBX: ffff88003daedfd8 RCX: 0100000000000000 RDX: 0000000000000000 RSI: 0000000000000000 RDI: 0000000000000046 RBP: ffff88003daede98 R8: 0000000000000000 R9: 0000000000000000 ... Signed-off-by: Qiao Nuohan --- diskdump.c | 6 +++++- netdump.c | 25 +++++++++++++++++++++++-- 2 files changed, 28 insertions(+), 3 deletions(-) diff --git a/diskdump.c b/diskdump.c index 7639e32..3938552 100644 --- a/diskdump.c +++ b/diskdump.c @@ -2057,7 +2057,11 @@ dump_registers_for_compressed_kdump(void) error(FATAL, "-r option not supported for this dumpfile\n"); for (c = 0; c < kt->cpus; c++) { - fprintf(fp, "%sCPU %d:\n", c ? "\n" : "", c); + if (hide_offline_cpu(c)) { + fprintf(fp, "%sCPU %d: [OFFLINE]\n", c ? "\n" : "", c); + continue; + } else + fprintf(fp, "%sCPU %d:\n", c ? "\n" : "", c); diskdump_display_regs(c, fp); } } diff --git a/netdump.c b/netdump.c index e946b45..35e4e69 100644 --- a/netdump.c +++ b/netdump.c @@ -2380,8 +2380,19 @@ display_regs_from_elf_notes(int cpu) Elf64_Nhdr *note64; size_t len; char *user_regs; + int c, skipped_count; - if (cpu >= nd->num_prstatus_notes) { + /* + * NT_PRSTATUS notes are only related to online cpus, offline cpus + * should be skipped. + */ + skipped_count = 0; + for (c = 0; c < cpu; c++) { + if (check_offline_cpu(c)) + skipped_count++; + } + + if ((cpu - skipped_count) >= nd->num_prstatus_notes) { error(INFO, "registers not collected for cpu %d\n", cpu); return; } @@ -2488,6 +2499,11 @@ dump_registers_for_elf_dumpfiles(void) } for (c = 0; c < kt->cpus; c++) { + if (check_offline_cpu(c)) { + fprintf(fp, "%sCPU %d: [OFFLINE]\n", c ? "\n" : "", c); + continue; + } + fprintf(fp, "%sCPU %d:\n", c ? "\n" : "", c); display_regs_from_elf_notes(c); } @@ -3786,7 +3802,12 @@ dump_registers_for_qemu_mem_dump(void) if (i) netdump_print("\n"); - netdump_print("CPU %d:\n", i); + + if (hide_offline_cpu(i)) { + netdump_print("CPU %d: [OFFLINE]\n", i); + continue; + } else + netdump_print("CPU %d:\n", i); if (CRASHDEBUG(1)) netdump_print(" version:%08lx size:%08lx\n", -- 1.8.5.3