[Crash-utility] ARM: crash registers might be read from the wrong physical address

Karlsson, Jan Jan.Karlsson at sonymobile.com
Thu Jul 19 06:25:52 UTC 2012


These are the same lines in my case.

<readmem: c0d2af6c, KVADDR, "crash_notes", 4, (ROE), 85ba84c>
<read_kdump: addr: c0d2af6c paddr: 80f2af6c cnt: 4>
<readmem: f9fe0000, KVADDR, "note_buf_t", 560, (ROE), 85bac40>      <--- !!
<readmem: c0004000, KVADDR, "pgd page", 16384, (FOE), 914e8d0>

I have never seen this problem before, so the behavior you see is exactly what I have seen before. However with a fairly new kernel I did not get the correct crash_notes. The investigation lead to the patch for the problem described in my previous mail.

I have not investigated if there is any patch in newer kernels that changes this behavior and in that case where it comes from (it could be a patch by us). However as the algorithm for reading crash_notes is wrong, as it depends on a variable that is not yet initialized, I think it should be corrected anyhow. I have tested my patch with both newer and older kernels and it works as intended.

Jan

Jan Karlsson
Senior Software Engineer
MIB
 
Sony Mobile Communications
Tel: +46703062174
sonymobile.com
 



-----Original Message-----
From: crash-utility-bounces at redhat.com [mailto:crash-utility-bounces at redhat.com] On Behalf Of Dave Anderson
Sent: onsdag den 18 juli 2012 15:13
To: Discussion list for crash utility usage, maintenance and development
Cc: Fänge, Thomas
Subject: Re: [Crash-utility] ARM: crash registers might be read from the wrong physical address



----- Original Message -----
> 
> 
> 
> 
> Hi Dave
> 
> 
> 
> I found a problem in arm.c that arm_get_crash_notes() is called too 
> early. This has never been a problem until now.
> 
> arm_get_crash_notes() in arm.c
> calls readmem(, KVADDR, )
> which calls kvtop()
> which calls machdep->kvtop that is arm_kvtop which uses 
> vt->vmalloc_start
> vt->vmalloc_start is initialized in vm_init
> 
> From main_loop:
> 
> machdep_init(POST_GDB);
> vm_init();
> machdep_init(POST_VM);
> 
> arm_get_crash_notes() is currently called in the POST_GDB section of 
> machdep_init, but should be moved to the POST_VM section. I put the 
> comment and the code just before:
> 
> if (init_unwind_tables()) {
> 
> and then it works fine. Without this fix the crash registers might be 
> read from the wrong physical address.
> 
> Jan

Looking at the 2.6.38-based SMP ARM sample kernel I have, the
arm_get_crash_notes() does not make any readmem() calls of a vmalloc address, only unity-mapped calls:

$ crash -d7 vmlinux vmcore
...
<readmem: c0b04230, KVADDR, "crash_notes", 4, (ROE), 85be9e0>
<read_diskdump: addr: c0b04230 paddr: 80b04230 cnt: 4>
<readmem: c0d5194c, KVADDR, "note_buf_t", 180, (ROE), 85bede0>
<read_diskdump: addr: c0d5194c paddr: 80d5194c cnt: 180> ...

Have newer ARM kernels changed how percpu addresses are translated such that the note_ptrs[] entries become vmalloc addresses here in arm_get_crash_notes():? 

        if (symbol_exists("__per_cpu_offset")) {

                /* Add __per_cpu_offset for each cpu to form the pointer to the notes */
                for (i = 0; i<kt->cpus; i++)
                        notes_ptrs[i] = notes_ptrs[kt->cpus-1] + kt->__per_cpu_offset[i];
        }

Dave

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




More information about the Crash-utility mailing list