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 data of offline cpu hiden, the output is like below
1. qemu memory-only dump, cpu#1 and cpu#2 are offline
<cut>
...
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
...
<cut>
2. kdump(kdump-compressed format), cpu#2 is offline
<cut>
...
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
...
<cut>
3. kdump(elf format), cpu #1 is offline
<cut>
...
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
...
<cut>
Signed-off-by: Qiao Nuohan <qiaonuohan(a)cn.fujitsu.com>
---
diskdump.c | 6 +++++-
netdump.c | 25 +++++++++++++++++++++++--
2 files changed, 28 insertions(+), 3 deletions(-)
diff --git a/diskdump.c b/diskdump.c
index 7639e32..08216ab 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..9cce479 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