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 <[email protected]>
---
 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

--
Crash-utility mailing list
[email protected]
https://listman.redhat.com/mailman/listinfo/crash-utility

Reply via email to