Add is_crash_occurred_cpu field to QEMUCPUState so that
dump-guest-memory can record which CPU triggered the guest
panic.
The new field is appended after kernel_gs_base, so existing
tools that check the 'size' field can safely ignore it when
reading older dumps.
Changes since v1:
- Revert QEMUCPUSTATE_VERSION bump (not needed, tools check size)
- Move crash_occurred check outside #ifdef TARGET_X86_64 to fix
-Werror=unused-variable on i386 builds (reported by Akihiko Odaki)
- Use linux.alibaba.com identity
Signed-off-by: Zhengrong Li <zhengrong_li@linux.alibaba.com>
---
contrib/elf2dmp/qemu_elf.h | 2 ++
target/i386/arch_dump.c | 6 ++++++
2 files changed, 8 insertions(+)
diff --git a/contrib/elf2dmp/qemu_elf.h b/contrib/elf2dmp/qemu_elf.h
index adc50238b4..3b28332e67 100644
--- a/contrib/elf2dmp/qemu_elf.h
+++ b/contrib/elf2dmp/qemu_elf.h
@@ -27,6 +27,8 @@ typedef struct QEMUCPUState {
QEMUCPUSegment ldt, tr, gdt, idt;
uint64_t cr[5];
uint64_t kernel_gs_base;
+ uint8_t is_crash_occurred_cpu;
+ uint8_t pad[7];
} QEMUCPUState;
int is_system(QEMUCPUState *s);
diff --git a/target/i386/arch_dump.c b/target/i386/arch_dump.c
index 16e47c4747..8ce2c7e9bb 100644
--- a/target/i386/arch_dump.c
+++ b/target/i386/arch_dump.c
@@ -264,6 +264,8 @@ struct QEMUCPUState {
* by checking 'size' field.
*/
uint64_t kernel_gs_base;
+ uint8_t is_crash_occurred_cpu;
+ uint8_t pad[7];
};
typedef struct QEMUCPUState QEMUCPUState;
@@ -279,6 +281,7 @@ static void copy_segment(QEMUCPUSegment *d, SegmentCache *s)
static void qemu_get_cpustate(QEMUCPUState *s, CPUX86State *env)
{
+ CPUState *cs = env_cpu(env);
memset(s, 0, sizeof(QEMUCPUState));
s->version = QEMUCPUSTATE_VERSION;
@@ -325,6 +328,9 @@ static void qemu_get_cpustate(QEMUCPUState *s, CPUX86State *env)
#ifdef TARGET_X86_64
s->kernel_gs_base = env->kernelgsbase;
#endif
+ if (cs->crash_occurred) {
+ s->is_crash_occurred_cpu = 1;
+ }
}
static inline int cpu_write_qemu_note(WriteCoreDumpFunction f,
--
2.43.0
On 2026/08/05 18:05, Zhengrong Li wrote:
> Add is_crash_occurred_cpu field to QEMUCPUState so that
> dump-guest-memory can record which CPU triggered the guest
> panic.
>
> The new field is appended after kernel_gs_base, so existing
> tools that check the 'size' field can safely ignore it when
> reading older dumps.
>
> Changes since v1:
> - Revert QEMUCPUSTATE_VERSION bump (not needed, tools check size)
> - Move crash_occurred check outside #ifdef TARGET_X86_64 to fix
> -Werror=unused-variable on i386 builds (reported by Akihiko Odaki)
> - Use linux.alibaba.com identity
>
> Signed-off-by: Zhengrong Li <zhengrong_li@linux.alibaba.com>
> ---
> contrib/elf2dmp/qemu_elf.h | 2 ++
> target/i386/arch_dump.c | 6 ++++++
> 2 files changed, 8 insertions(+)
>
> diff --git a/contrib/elf2dmp/qemu_elf.h b/contrib/elf2dmp/qemu_elf.h
> index adc50238b4..3b28332e67 100644
> --- a/contrib/elf2dmp/qemu_elf.h
> +++ b/contrib/elf2dmp/qemu_elf.h
> @@ -27,6 +27,8 @@ typedef struct QEMUCPUState {
> QEMUCPUSegment ldt, tr, gdt, idt;
> uint64_t cr[5];
> uint64_t kernel_gs_base;
> + uint8_t is_crash_occurred_cpu;
> + uint8_t pad[7];
Growing QEMUCPUState from 440 to 448 bytes confuses init_states() in
contrib/elf2dmp/qemu_elf.c and makes valid version-1 notes appear to
lack kernel_gs_base, despite that field occupying bytes 432–439.
Patch 3 fixes homogeneous old dumps, but that field-specific size
detection belongs in this patch for bisectability and to support its
compatibility claim. Please see docs/devel/submitting-a-patch.rst for
the bisect requirement.
Regards,
Akihiko Odaki
> } QEMUCPUState;
>
> int is_system(QEMUCPUState *s);
> diff --git a/target/i386/arch_dump.c b/target/i386/arch_dump.c
> index 16e47c4747..8ce2c7e9bb 100644
> --- a/target/i386/arch_dump.c
> +++ b/target/i386/arch_dump.c
> @@ -264,6 +264,8 @@ struct QEMUCPUState {
> * by checking 'size' field.
> */
> uint64_t kernel_gs_base;
> + uint8_t is_crash_occurred_cpu;
> + uint8_t pad[7];
> };
>
> typedef struct QEMUCPUState QEMUCPUState;
> @@ -279,6 +281,7 @@ static void copy_segment(QEMUCPUSegment *d, SegmentCache *s)
>
> static void qemu_get_cpustate(QEMUCPUState *s, CPUX86State *env)
> {
> + CPUState *cs = env_cpu(env);
> memset(s, 0, sizeof(QEMUCPUState));
>
> s->version = QEMUCPUSTATE_VERSION;
> @@ -325,6 +328,9 @@ static void qemu_get_cpustate(QEMUCPUState *s, CPUX86State *env)
> #ifdef TARGET_X86_64
> s->kernel_gs_base = env->kernelgsbase;
> #endif
> + if (cs->crash_occurred) {
> + s->is_crash_occurred_cpu = 1;
> + }
> }
>
> static inline int cpu_write_qemu_note(WriteCoreDumpFunction f,
© 2016 - 2026 Red Hat, Inc.