>> On 2023/06/12 12:42, Viktor Prutyanov wrote: >> >>>> Prcb may be set to 0 for some CPUs if the dump was taken before they >>>> start. The dump may still contain valuable information for started CPUs >>>> so don't abandon conversion in such a case. >>>> >>>> Signed-off-by: Akihiko Odaki <akihiko.od...@daynix.com> >>>> --- >>>> contrib/elf2dmp/main.c | 5 +++++ >>>> 1 file changed, 5 insertions(+) >>>> >>>> diff --git a/contrib/elf2dmp/main.c b/contrib/elf2dmp/main.c >>>> index d77b8f98f7..91c58e4424 100644 >>>> --- a/contrib/elf2dmp/main.c >>>> +++ b/contrib/elf2dmp/main.c >>>> @@ -312,6 +312,11 @@ static int fill_context(KDDEBUGGER_DATA64 *kdbg, >>>> return 1; >>>> } >>>> >>>> + if (!Prcb) { >>>> + eprintf("Context for CPU #%d is missing\n", i); >>>> + continue; >>>> + } >>>> + >>>> if (va_space_rw(vs, Prcb + kdbg->OffsetPrcbContext, >>>> &Context, sizeof(Context), 0)) { >>>> eprintf("Failed to read CPU #%d ContextFrame location\n", i); >>>> >>>> -- >>>> 2.40.1 >>> >>> Hi Akihiko, >>> >>> How this fix can be tested? >> >> It is a bit difficult to test it as you need to interrupt the very early >> stage of boot. I applied the following change to TCG so that it stops >> immediately after the first processor configures Prcb. >> >> diff --git a/target/i386/tcg/sysemu/misc_helper.c >> b/target/i386/tcg/sysemu/misc_helper.c >> index e1528b7f80..f68eba9cac 100644 >> --- a/target/i386/tcg/sysemu/misc_helper.c >> +++ b/target/i386/tcg/sysemu/misc_helper.c >> @@ -25,6 +25,9 @@ >> #include "exec/address-spaces.h" >> #include "exec/exec-all.h" >> #include "tcg/helper-tcg.h" >> +#include "exec/gdbstub.h" >> +#include "hw/core/cpu.h" >> +#include "sysemu/runstate.h" >> >> void helper_outb(CPUX86State *env, uint32_t port, uint32_t data) >> { >> @@ -217,7 +220,10 @@ void helper_wrmsr(CPUX86State *env) >> env->segs[R_FS].base = val; >> break; >> case MSR_GSBASE: >> + printf("%s: %" PRIx64 "\n", __func__, val); >> env->segs[R_GS].base = val; >> + gdb_set_stop_cpu(current_cpu); >> + vm_stop(RUN_STATE_PAUSED); >> break; >> case MSR_KERNELGSBASE: >> env->kernelgsbase = val; >> >>> NumberProcessors field is still set to qemu_elf.state_nr, how does WinDbg >>> react to this? >> >> If Prcb for processor 1 is missing, WinDbg outputs: KiProcessorBlock[1] >> is null. >> You can still debug the started processors with no issue. >> >> Regards, >> Akihiko Odaki >> >>> Viktor > > Reviewed-by: Viktor Prutyanov <viktor.prutya...@phystech.edu>
Hi Peter, Could you please put Akihiko's patch into your branch? Thank you, Viktor Prutyanov