Re: [PATCH v2 2/3] dump: add crash_occurred flag to QEMUCPUState
Akihiko Odaki <[email protected]> Thu, 6 Aug 2026 12:17:29 +0900
| Newsgroups | gmane.comp.emulators.qemu |
|---|---|
| Message-ID | <[email protected]> |
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 <[email protected]> > --- > 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,