Linux Archive

Linux Archive (http://www.linux-archive.org/)
-   Crash Utility (http://www.linux-archive.org/crash-utility/)
-   -   ppc: fix backtrace problem when NT_PRSTATUS was not saved (http://www.linux-archive.org/crash-utility/675863-ppc-fix-backtrace-problem-when-nt_prstatus-not-saved.html)

Dave Anderson 06-22-2012 03:36 PM

ppc: fix backtrace problem when NT_PRSTATUS was not saved
 
----- Original Message -----
> Hi Dave,
>
> I've reworked patch about ppc "bt" problem discussed in
> https://www.redhat.com/archives/crash-utility/2012-June/msg00029.html
>
> A patch is now getting to work only for ppc targets,
> and notes are relocatecd in first ppc's "bt", not in
> initialization-time.
>
> And I've tested both "bt" diskdump by makedumpfile and netdump by
> /proc/vmcore with patched kernel like
> void crash_save_cpu(struct pt_regs *regs, int cpu)
> if ((cpu % 2))
> return;
>
> I was worried about beeing able to catch all of non-contiguous NT_PRSTATUS
> notes, alternate with invalid odd notes in every process well,
> so I modified test case this time (that's no problem, everything OK).
>
> [After initialization: notes are not relocated yet]
> crash> help -D | grep notes
> num_prstatus_notes: 4
> notes_buf: 107a3518
> notes[0]: 107a3518
> notes[1]: 107a3638
> notes[2]: 107a3758
> notes[3]: 107a3878
>
> [Relocate in first bt(only once) and display correctly]
> crash> bt
> PID: 1000 TASK: eb0cf800 CPU: 4 COMMAND: "bash"
> bt: WARNING: cpu#1: not saved crash_notes
> bt: WARNING: cpu#3: not saved crash_notes
> bt: WARNING: cpu#5: not saved crash_notes
> bt: WARNING: cpu#7: not saved crash_notes
>
> R0: 00000001 R1: ea11be60 R2: eb0cf800 R3: 00000063
> R4: 00000000 R5: ffffffff R6: c043ba2c R7: 00000000
> R8: 00008000 R9: 00000000 R10: 00000000 R11: ea11be70
> R12: 28242444 R13: 100b8448 R14: 100b07b8 R15: 100b0894
> R16: 00000000 R17: 00000000 R18: 00000000 R19: 1006d270
> R20: 00000000 R21: 100f02e0 R22: 00000000 R23: 00000001
> R24: c08f1ac8 R25: 00029002 R26: c08f1bac R27: c08d0000
> R28: 00000000 R29: c09ada48 R30: 00000063 R31: ea11be60
> NIP: c0423378 MSR: 00021002 OR3: c09ada48 CTR: c0423344
> LR: c0423d8c XER: 00000000 CCR: 28242444 MQ: 00008000
> DAR: 00000000 DSISR: 00800000 Syscall Result: ea11be60
> NIP [00000000c0423378] sysrq_handle_crash
> LR [00000000c0423d8c] __handle_sysrq
>
> => PC: c0423378 (sysrq_handle_crash+52) FP: ea11be60
> #0 [ea11be60] sysrq_handle_crash at c0423378
> #1 [ea11be70] __handle_sysrq at c0423d8c
> #2 [ea11bea0] write_sysrq_trigger at c0423ed0
> #3 [ea11beb0] proc_reg_write at c01a79a4
> #4 [ea11bee0] vfs_write at c014ba44
> #5 [ea11bf00] sys_write at c014bcd8
> #6 [ea11bf40] ret_from_syscall at c0013834
> syscall [c00] exception frame:
> R0: 00000004 R1: bfe54e00 R2: 48027f80 R3: 00000001
> R4: 4811d000 R5: 00000002 R6: 00000000 R7: 00000001
> R8: 00000000 R9: 00000000 R10: 00000000 R11: 00000200
> R12: 28242442 R13: 100b8448 R14: 100b07b8 R15: 100b0894
> R16: 00000000 R17: 00000000 R18: 00000000 R19: 1006d270
> R20: 00000000 R21: 100f02e0 R22: 1006b4d0 R23: 00000001
> R24: 100b0000 R25: 1009b474 R26: bfe54ec8 R27: 00000002
> R28: 0fefa400 R29: 4811d000 R30: 0fef9ff4 R31: 00000002
> NIP: 0fe61494 MSR: 0002f902 OR3: 00000001 CTR: 0fe06fec
> LR: 0fe07050 XER: 00000000 CCR: 28242444 MQ: 00000000
> DAR: 4811d000 DSISR: 00800000 Syscall Result: 00000000
>
> [notes has been relocated: Counts num_prstatus_notes even if NULL]
> crash> help -D | grep notes
> num_prstatus_notes: 8
> notes_buf: 107a3518
> notes[0]: 107a3518
> notes[1]: 0
> notes[2]: 107a3638
> notes[3]: 0
> notes[4]: 107a3758
> notes[5]: 0
> notes[6]: 107a3878
> notes[7]: 0
>
> Thanks,
> Toshi

OK, doing it that way looks reasonable, and safely segregated to PPC only.

Just two more suggestions -- first, please do me a favor by running
"make warn" prior to posting a patch, and fix these:

$ make warn
TARGET: X86_64
CRASH: 6.0.8rc15
GDB: 7.3.1

cc -c -g -DX86_64 -DGDB_7_3_1 build_data.c -Wall -O2 -Wstrict-prototypes -Wmissing-prototypes -fstack-protector
cc -c -g -DX86_64 -DGDB_7_3_1 ppc.c -Wall -O2 -Wstrict-prototypes -Wmissing-prototypes -fstack-protector
cc -c -g -DX86_64 -DGDB_7_3_1 netdump.c -Wall -O2 -Wstrict-prototypes -Wmissing-prototypes -fstack-protector
netdump.c: In function 'get_netdump_regs_ppc':
netdump.c:2603: warning: pointer targets in passing argument 2 of 'relocate_nt_prstatus_percpu_ppc' differ in signedness
cc -c -g -DX86_64 -DGDB_7_3_1 diskdump.c -Wall -O2 -Wstrict-prototypes -Wmissing-prototypes -fstack-protector
diskdump.c:1061: warning: no previous prototype for ‘relocate_nt_prstatus_percpu_ppc’
diskdump.c: In function 'get_diskdump_regs_ppc':
diskdump.c:1103: warning: pointer targets in passing argument 2 of 'relocate_nt_prstatus_percpu_ppc' differ in signedness
...

Secondly, since your new relocate_nt_prstatus_percpu_ppc() and
verify_crash_note_in_kernel_ppc() functions are used for both
kdump ELF and compressed kdump formats, and since they are
PPC-specific, can you just move the two functions into ppc.c?
All that should require is to #include elf.h.

Thanks,
Dave




--
Crash-utility mailing list
Crash-utility@redhat.com
https://www.redhat.com/mailman/listinfo/crash-utility

Dave Anderson 06-25-2012 08:49 PM

ppc: fix backtrace problem when NT_PRSTATUS was not saved
 
----- Original Message -----
> (2012/06/23 0:36), Dave Anderson wrote:
> >
> >
> > ----- Original Message -----
>
> > OK, doing it that way looks reasonable, and safely segregated to
> > PPC only.
> >
> > Just two more suggestions -- first, please do me a favor by running
> > "make warn" prior to posting a patch, and fix these:
> >
> > $ make warn
> > TARGET: X86_64
> > CRASH: 6.0.8rc15
> > GDB: 7.3.1
> >
> > cc -c -g -DX86_64 -DGDB_7_3_1 build_data.c -Wall -O2
> > -Wstrict-prototypes -Wmissing-prototypes -fstack-protector
> > cc -c -g -DX86_64 -DGDB_7_3_1 ppc.c -Wall -O2
> > -Wstrict-prototypes -Wmissing-prototypes -fstack-protector
> > cc -c -g -DX86_64 -DGDB_7_3_1 netdump.c -Wall -O2
> > -Wstrict-prototypes -Wmissing-prototypes -fstack-protector
> > netdump.c: In function 'get_netdump_regs_ppc':
> > netdump.c:2603: warning: pointer targets in passing argument 2
> > of 'relocate_nt_prstatus_percpu_ppc' differ in signedness
> > cc -c -g -DX86_64 -DGDB_7_3_1 diskdump.c -Wall -O2
> > -Wstrict-prototypes -Wmissing-prototypes -fstack-protector
> > diskdump.c:1061: warning: no previous prototype for
> > ‘relocate_nt_prstatus_percpu_ppc’
> > diskdump.c: In function 'get_diskdump_regs_ppc':
> > diskdump.c:1103: warning: pointer targets in passing argument 2
> > of 'relocate_nt_prstatus_percpu_ppc' differ in signedness
> > ...
>
> Thanks for your checking out. I shuold use unit * for argument 2.
>
> > Secondly, since your new relocate_nt_prstatus_percpu_ppc() and
> > verify_crash_note_in_kernel_ppc() functions are used for both
> > kdump ELF and compressed kdump formats, and since they are
> > PPC-specific, can you just move the two functions into ppc.c?
> > All that should require is to #include elf.h.
>
> Make sense.
> I move them into ppc.c, then function calls in diskdump.c and netdump.c
> are wrapped with "if defined (PPC)" so that those lines will be invalid when
> other arch is build (x86_64 build was no problem).

To avoid the somewhat-confusing "#if defined (PPC)" in the PPC-only
get_diskdump_regs_ppc() and get_netdump_regs_ppc() functions, I made
ppc_relocate_nt_prstatus_cpu() a do-nothing #define in defs.h for
non-PPC arches like this:

#ifdef PPC
...
void ppc_relocate_nt_prstatus_percpu(void **, uint *);
...
#else
#define ppc_relocate_nt_prstatus_percpu(X,Y) do {} while (0)
#endif

And I changed the WARNING message from:

error(WARNING, "cpu#%d: not saved crash_notes
", i);

to:

error(WARNING, "cpu#%d: crash_notes not saved
", i);

to make it a bit more understandable.

Queued for crash-6.0.8.

Thanks,
Dave






--
Crash-utility mailing list
Crash-utility@redhat.com
https://www.redhat.com/mailman/listinfo/crash-utility


All times are GMT. The time now is 11:33 PM.

VBulletin, Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.
Content Relevant URLs by vBSEO ©2007, Crawlability, Inc.