[Crash-utility] ppc64 specific changes to support kdump vmcore

David Wilder dwilder at us.ibm.com
Tue Feb 14 20:34:34 UTC 2006


Dave Anderson wrote:

>Haren Myneni wrote:
>
>  
>
>>Reposting this patch as it did not made to crash mailing list. Dave,
>>Thanks for adding my different e-mail address to subscriber list.
>>
>>    
>>
>
>No problem -- I prefer to keep this list subscriber-only to avoid the spam
>you see on other lists...
>
>  
>
>>Dave,
>>
>>Attaching a patch which contains ppc64 specific changes to read kdump
>>vmcore. As we are saving pt_regs for all cpus, it reads them from vmcore
>>instead of looking for specific symbols, used for PPC64 netdump/diskdump
>>vmcore. Also, prints regs before any active backtrace. Whereas for
>>netdump vmcore, regs will be displayed anyway as part of exception frame
>>since the 'bt' command displays from the top frame.
>>Verified with "Make Warn"
>>
>>Please let me know if you have any comments.
>>
>>    
>>
>
>This patch looks good.  No comment...        ;-)
>
>  
>
>>As Badari mentioned, when the sparsemem is enabled, pg_dat->node_mem_map
>>member does not exists. mem_map for each node is scattered across
>>multiple sections and is not contiguous. Therefore, some detailed
>>changes are needed.  Until we fix this issue, can we include some hack
>>so that users can use other commands for vmcore analysis.
>>The fix will be:
>>   if (MEMBER_EXISTS("pglist_data", "node_mem_map"))
>>      readmem(pgdat+OFFSET(pglist_data_node_mem_map), KVADDR,
>>                    &node_mem_map, sizeof(ulong),
>>                    "node_mem_map", FAULT_ON_ERROR);
>>
>>[I noticed your response to Badari's posting. Since the sparsemem is
>>effected only for powerpc at this point, we thought, user can use the
>>limited functionality with the above change. (Ex: bt) until we have the
>>complete fix. At least we will be having crash tool available for kdump
>>vmore on ppc64. The sparsemem issue will be fixed soon. Ok, please
>>ignore this if you prefer to wait for the complete fix]
>>
>>    
>>
>
>I was tinkering around with this by simulating the bogus setting of
>"node_mem_map" above, and I'm surprised that you can get as much
>functionality as crash does give you.  Most people probably wouldn't even
>notice.  Anyway, I was about to change my mind, and put the EXISTS
>check in for now -- but along with a non-fatal error message that would be
>annoying enough for you guys to whip up a real fix.  I'll still do that,
>unless by "fixed soon", you mean in a day or two?
>
>Dave
>
>
>  
>
Dave-
I am working on the sparse mem support in crash, It is going to take 
longer than a few days.
Sorry I can't give you a time estimate yet. Please go with Haren patch. 
I will update you
when I get sparse memory is working working.

>
>  
>
>>Thanks
>>Haren
>>
>>  ------------------------------------------------------------------------------------------------------------------------
>>diff -Naurp crash-4.0-2.20.orig/netdump.c crash-4.0-2.20/netdump.c
>>--- crash-4.0-2.20.orig/netdump.c       2006-02-11 16:50:28.000000000 -0800
>>+++ crash-4.0-2.20/netdump.c    2006-02-11 16:50:58.000000000 -0800
>>@@ -1680,7 +1680,13 @@ get_netdump_regs_ppc64(struct bt_info *b
>>        Elf64_Nhdr *note;
>>        size_t len;
>>
>>-       if (bt->task == tt->panic_task) {
>>+       if ((bt->task == tt->panic_task) ||
>>+               (is_task_active(bt->task) && nd->num_prstatus_notes > 1)) {
>>+               /*
>>+                * Registers are saved during the dump process for the
>>+                * panic task. Whereas in kdump, regs are captured for all
>>+                * CPUs if they responded to an IPI.
>>+                */
>>                 if (nd->num_prstatus_notes > 1)
>>                         note = (Elf64_Nhdr *)
>>                                 nd->nt_prstatus_percpu[bt->tc->processor];
>>diff -Naurp crash-4.0-2.20.orig/ppc64.c crash-4.0-2.20/ppc64.c
>>--- crash-4.0-2.20.orig/ppc64.c 2006-02-11 16:50:32.000000000 -0800
>>+++ crash-4.0-2.20/ppc64.c      2006-02-13 16:10:56.000000000 -0800
>>@@ -1420,20 +1420,11 @@ ppc64_check_eframe(struct ppc64_pt_regs
>>        return NULL;
>> }
>>
>>-/*
>>- *  Print exception frame information for ppc64
>>- */
>> static void
>>-ppc64_print_eframe(char *efrm_str, struct ppc64_pt_regs *regs,
>>-               struct bt_info *bt)
>>+ppc64_print_regs(struct ppc64_pt_regs *regs)
>> {
>>        int i;
>>
>>-       if (BT_REFERENCE_CHECK(bt))
>>-               return;
>>-
>>-        fprintf(fp, " %s  [%lx] exception frame:", efrm_str, regs->trap);
>>-
>>         /* print out the gprs... */
>>         for(i=0; i<32; i++) {
>>                 if(!(i % 3))
>>@@ -1465,9 +1456,66 @@ ppc64_print_eframe(char *efrm_str, struc
>>         fprintf(fp, "DAR: %016lx\n", regs->dar);
>>         fprintf(fp, " DSISR: %016lx ", regs->dsisr);
>>         fprintf(fp, "    Syscall Result: %016lx\n", regs->result);
>>+}
>>+
>>+/*
>>+ * Print the exception frame information
>>+ */
>>+static void
>>+ppc64_print_eframe(char *efrm_str, struct ppc64_pt_regs *regs,
>>+                       struct bt_info *bt)
>>+{
>>+       if (BT_REFERENCE_CHECK(bt))
>>+               return;
>>+
>>+       fprintf(fp, " %s  [%lx] exception frame:", efrm_str, regs->trap);
>>+       ppc64_print_regs(regs);
>>        fprintf(fp, "\n");
>> }
>>
>>+/*
>>+ * get SP and IP from the saved ptregs.
>>+ */
>>+static int
>>+ppc64_kdump_stack_frame(struct bt_info *bt_in, ulong *nip, ulong *ksp)
>>+{
>>+       struct ppc64_pt_regs *pt_regs;
>>+       unsigned long unip;
>>+
>>+       pt_regs = (struct ppc64_pt_regs *)bt_in->machdep;
>>+       if (!pt_regs->gpr[1]) {
>>+               /*
>>+                * Not collected regs. May be the corresponding CPU not
>>+                * responded to an IPI.
>>+                */
>>+               fprintf(fp, "%0lx: GPR1 register value (SP) was not saved\n",
>>+                       bt_in->task);
>>+               return FALSE;
>>+       }
>>+       *ksp = pt_regs->gpr[1];
>>+       readmem(*ksp+16, KVADDR, &unip, sizeof(ulong), "Regs NIP value",
>>+               FAULT_ON_ERROR);
>>+       *nip = unip;
>>+
>>+       if (bt_in->flags &&
>>+       ((BT_TEXT_SYMBOLS|BT_TEXT_SYMBOLS_PRINT|BT_TEXT_SYMBOLS_NOPRINT)))
>>+               return TRUE;
>>+
>>+       /*
>>+        * Print the collected regs for the active task
>>+        */
>>+       ppc64_print_regs(pt_regs);
>>+
>>+       fprintf(fp, " NIP [%016lx] %s\n", pt_regs->nip,
>>+               closest_symbol(pt_regs->nip));
>>+       if (unip != pt_regs->link)
>>+               fprintf(fp, " LR  [%016lx] %s\n", pt_regs->link,
>>+                       closest_symbol(pt_regs->link));
>>+
>>+       fprintf(fp, "\n");
>>+
>>+       return TRUE;
>>+}
>>
>> /*
>>  *  Get the starting point for the active cpus in a diskdump/netdump.
>>@@ -1485,12 +1533,18 @@ ppc64_get_dumpfile_stack_frame(struct bt
>>         ulong ur_ksp = 0;
>>        int check_hardirq, check_softirq;
>>        int check_intrstack = TRUE;
>>+       struct ppc64_pt_regs *pt_regs;
>>+
>>+       /*
>>+        * For the kdump vmcore, Use SP and IP values that are saved in ptregs.
>>+        */
>>+       if (pc->flags && KDUMP)
>>+               return ppc64_kdump_stack_frame(bt_in, nip, ksp);
>>
>>         bt = &bt_local;
>>         BCOPY(bt_in, bt, sizeof(struct bt_info));
>>         ms = machdep->machspec;
>>         ur_nip = ur_ksp = 0;
>>-       struct ppc64_pt_regs *pt_regs;
>>
>>        panic_task = tt->panic_task == bt->task ? TRUE : FALSE;
>>
>>
>>  ------------------------------------------------------------------------------------------------------------------------
>>--
>>Crash-utility mailing list
>>Crash-utility at redhat.com
>>https://www.redhat.com/mailman/listinfo/crash-utility
>>    
>>
>
>--
>Crash-utility mailing list
>Crash-utility at redhat.com
>https://www.redhat.com/mailman/listinfo/crash-utility
>
>
>  
>


-- 
David Wilder
IBM Linux Change Team
dwilder at us.ibm.com
(503)578-3789




More information about the Crash-utility mailing list