[Crash-utility] [PATCH v4 02/12] crash_get_nr_cpus: get nr_cpus from the dumps

Alexey Makhalov amakhalov at vmware.com
Sat Mar 20 04:07:26 UTC 2021


Most of the dumps have information about real number of CPUS.
Use that to instantiate GDB's target inferior threads.

Signed-off-by: Alexey Makhalov <amakhalov at vmware.com>
---
 diskdump.c      | 13 +++++++++++--
 gdb_interface.c |  9 +++++++++
 netdump.c       | 11 ++++++++---
 sadump.c        |  2 +-
 4 files changed, 29 insertions(+), 6 deletions(-)

diff --git a/diskdump.c b/diskdump.c
index 4f14596..9340343 100644
--- a/diskdump.c
+++ b/diskdump.c
@@ -2516,13 +2516,22 @@ diskdump_kaslr_check()
 	return FALSE;
 }
 
-#ifdef X86_64
 int
 diskdump_get_nr_cpus(void)
 {
-	return dd->num_qemu_notes;
+	if (dd->num_prstatus_notes)
+		return dd->num_prstatus_notes;
+	else if (dd->num_qemu_notes)
+		return dd->num_qemu_notes;
+	else if (dd->num_vmcoredd_notes)
+		return dd->num_vmcoredd_notes;
+	else if (dd->header->nr_cpus)
+		return dd->header->nr_cpus;
+
+	return 1;
 }
 
+#ifdef X86_64
 QEMUCPUState *
 diskdump_get_qemucpustate(int cpu)
 {
diff --git a/gdb_interface.c b/gdb_interface.c
index 5a41992..194082f 100644
--- a/gdb_interface.c
+++ b/gdb_interface.c
@@ -1070,6 +1070,15 @@ int crash_get_nr_cpus(void);
 
 int crash_get_nr_cpus(void)
 {
+	if (SADUMP_DUMPFILE())
+		return sadump_get_nr_cpus();
+	else if (DISKDUMP_DUMPFILE())
+		return diskdump_get_nr_cpus();
+	else if (KDUMP_DUMPFILE())
+		return kdump_get_nr_cpus();
+	else if (VMSS_DUMPFILE())
+		return vmware_vmss_get_nr_cpus();
+
 	/* Just CPU #0 */
 	return 1;
 }
diff --git a/netdump.c b/netdump.c
index f2b3363..5374feb 100644
--- a/netdump.c
+++ b/netdump.c
@@ -5204,11 +5204,17 @@ kdump_kaslr_check(void)
 		return FALSE;
 }
 
-#ifdef X86_64
 int
 kdump_get_nr_cpus(void)
 {
-	return nd->num_qemu_notes;
+	if (nd->num_prstatus_notes)
+		return nd->num_prstatus_notes;
+	else if (nd->num_qemu_notes)
+		return nd->num_qemu_notes;
+	else if (nd->num_vmcoredd_notes)
+		return nd->num_vmcoredd_notes;
+
+	return 1;
 }
 
 QEMUCPUState *
@@ -5230,7 +5236,6 @@ kdump_get_qemucpustate(int cpu)
 
 	return (QEMUCPUState *)nd->nt_qemu_percpu[cpu];
 }
-#endif
 
 static void *
 get_kdump_device_dump_offset(void)
diff --git a/sadump.c b/sadump.c
index d75c66b..cb43fdb 100644
--- a/sadump.c
+++ b/sadump.c
@@ -1670,7 +1670,6 @@ get_sadump_data(void)
 	return sd;
 }
 
-#ifdef X86_64
 int
 sadump_get_nr_cpus(void)
 {
@@ -1678,6 +1677,7 @@ sadump_get_nr_cpus(void)
 	return sd->dump_header->nr_cpus;
 }
 
+#ifdef X86_64
 int
 sadump_get_cr3_cr4_idtr(int cpu, ulong *cr3, ulong *cr4, ulong *idtr)
 {
-- 
2.11.0




More information about the Crash-utility mailing list