----- "Joe Porter" <joe.porter@xxxxxxxx> wrote: > Hello crash, > > The user_regs_struct was redefined in > linux-2.6.24-git8/include/asm-x86/user_32.h. > > This results in the following error when opening 32 bit kdump > crashfiles: > ------------------------------------------------------------------------- > please wait... (determining panic task) > crash: invalid structure member offset: user_regs_struct_ebp > FILE: netdump.c LINE: 687 FUNCTION: get_netdump_panic_task() > > [/sbin/crash] error trace: 80e09f4 => 8154159 => 814fc3f => 813ec75 > > 813ec75: OFFSET_verify+126 > 814fc3f: get_netdump_panic_task+1196 > 8154159: get_kdump_panic_task+11 > 80e09f4: get_dumpfile_panic_task+153 > -------------------------------------------------------------------- > > I've inserted a patch to crash-4.0-7.4/x86.c that fixes this for all > linux-2.6.24-git8 > and later kernels (2.6.25 -> 2.6.28-rc5). I've also inserted the > kernel change that > caused the breakage. > > The fix is bad because it breaks all kernels <= linux-2.6.24-git7. > > A better fix would be backward and forward compatible with all > kernels, but since there > was a lot of hardwired code revolving around the old 32 bit > user_regs_struct I thought I > would just submit this patch to expose the problem and maybe look for > a better fix in the > next crash update. Right -- it wouldn't be a "better fix", but rather the "only fix" that's going to be acceptable. Does the new kernel that has the name changes end up using the initial attempts to set the size, esp and ebp offsets? Or does it always end up using the "if (!VALID_STRUCT())" section? It's only going to use one or the other, depending upon whether the user_regs_struct gets exported-to/included-in the debuginfo data. Dave > > thx, joe > > --- crash-4.0-7.4.orig/x86.c 2008-10-14 09:35:40.000000000 -0400 > +++ crash-4.0-7.4/x86.c 2008-11-17 13:37:40.000000000 -0500 > @@ -1774,29 +1774,39 @@ > machdep->flags |= OMIT_FRAME_PTR; > STRUCT_SIZE_INIT(user_regs_struct, "user_regs_struct"); > MEMBER_OFFSET_INIT(user_regs_struct_ebp, > - "user_regs_struct", "ebp"); > + "user_regs_struct", "bp"); > MEMBER_OFFSET_INIT(user_regs_struct_esp, > - "user_regs_struct", "esp"); > + "user_regs_struct", "sp"); > if (!VALID_STRUCT(user_regs_struct)) { > /* Use this hardwired version -- sometimes the > * debuginfo doesn't pick this up even though > * it exists in the kernel; it shouldn't change. > */ > struct x86_user_regs_struct { > - long ebx, ecx, edx, esi, edi, ebp, eax; > - unsigned short ds, __ds, es, __es; > - unsigned short fs, __fs, gs, __gs; > - long orig_eax, eip; > - unsigned short cs, __cs; > - long eflags, esp; > - unsigned short ss, __ss; > + unsigned long bx; > + unsigned long cx; > + unsigned long dx; > + unsigned long si; > + unsigned long di; > + unsigned long bp; > + unsigned long ax; > + unsigned long ds; > + unsigned long es; > + unsigned long fs; > + unsigned long gs; > + unsigned long orig_ax; > + unsigned long ip; > + unsigned long cs; > + unsigned long flags; > + unsigned long sp; > + unsigned long ss; > }; > ASSIGN_SIZE(user_regs_struct) = > sizeof(struct x86_user_regs_struct); > ASSIGN_OFFSET(user_regs_struct_ebp) = > - offsetof(struct x86_user_regs_struct, ebp); > + offsetof(struct x86_user_regs_struct, bp); > ASSIGN_OFFSET(user_regs_struct_esp) = > - offsetof(struct x86_user_regs_struct, esp); > + offsetof(struct x86_user_regs_struct, sp); > } > MEMBER_OFFSET_INIT(thread_struct_cr3, "thread_struct", "cr3"); > STRUCT_SIZE_INIT(cpuinfo_x86, "cpuinfo_x86"); > > -------------------------------------------------------------------------------- > > --- linux-2.6.24-git7/include/asm-x86/user_32.h 2008-01-24 > 17:58:37.000000000 -0500 > +++ linux-2.6.24-git8/include/asm-x86/user_32.h 2008-11-11 > 18:56:13.000000000 -0500 > @@ -75,13 +75,23 @@ > * doesn't use the extra segment registers) > */ > struct user_regs_struct { > - long ebx, ecx, edx, esi, edi, ebp, eax; > - unsigned short ds, __ds, es, __es; > - unsigned short fs, __fs, gs, __gs; > - long orig_eax, eip; > - unsigned short cs, __cs; > - long eflags, esp; > - unsigned short ss, __ss; > + unsigned long bx; > + unsigned long cx; > + unsigned long dx; > + unsigned long si; > + unsigned long di; > + unsigned long bp; > + unsigned long ax; > + unsigned long ds; > + unsigned long es; > + unsigned long fs; > + unsigned long gs; > + unsigned long orig_ax; > + unsigned long ip; > + unsigned long cs; > + unsigned long flags; > + unsigned long sp; > + unsigned long ss; > }; > > /* When the kernel dumps core, it starts by dumping the user struct > - > > -- > Crash-utility mailing list > Crash-utility@xxxxxxxxxx > https://www.redhat.com/mailman/listinfo/crash-utility -- Crash-utility mailing list Crash-utility@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/crash-utility