WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-devel

Re: [Xen-devel] [makedumpfile] extract vmcoreinfo from /proc/vmcore for

To: Itsuro ODA <oda@xxxxxxxxxxxxx>
Subject: Re: [Xen-devel] [makedumpfile] extract vmcoreinfo from /proc/vmcore for Xen
From: "Ken'ichi Ohmichi" <oomichi@xxxxxxxxxxxxxxxxx>
Date: Fri, 28 Sep 2007 19:04:45 +0900
Cc: xen-devel@xxxxxxxxxxxxxxxxxxx, kexec@xxxxxxxxxxxxxxxxxxx
Delivery-date: Fri, 28 Sep 2007 03:07:34 -0700
Envelope-to: www-data@xxxxxxxxxxxxxxxxxx
In-reply-to: <20070928090647.6EA9.ODA@xxxxxxxxxxxxx>
List-help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-id: Xen developer discussion <xen-devel.lists.xensource.com>
List-post: <mailto:xen-devel@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
References: <20070928090647.6EA9.ODA@xxxxxxxxxxxxx>
Sender: xen-devel-bounces@xxxxxxxxxxxxxxxxxxx
User-agent: Thunderbird 2.0.0.6 (Windows/20070728)
Hi,

Itsuro ODA wrote:
> > I'd like to support the "extract vmcoreinfo from /proc/vmcore"
> > function for the Xen extraction too.
> >
> > I think a way of supporting this as follows:
> > 
> > * The hypervisor makes its vmcoreinfo at the initialize.
> > * add a new hypervisor call to get the hypervisor's vmcoreinfo.
> >   The hypercall would be a subcommand of the kexec hypercall.
> > * dom-0 exposes the hypervisor's vmcoreinfo via 
> >   /sys/hypervisor/vmcoreinfo
> > * kexec-tool looks /sys/hypervisor/vmcoreinfo and makes an elf-note
> >   according it

That sounds good.

BTW, the testing tree of kexec-tools has not contain the patch for
vmcoreinfo yet. I think the tree is mainline now, and I hope the
patch is merged into the tree  ;-) 


Thanks
Ken'ichi Ohmichi 

Signed-off-by: Dan Aloni <da-x@xxxxxxxxxxxxx>
Signed-off-by: Ken'ichi Ohmichi <oomichi@xxxxxxxxxxxxxxxxx>

---
diff -rpuN a/kexec/crashdump-elf.c b/kexec/crashdump-elf.c
--- a/kexec/crashdump-elf.c     2007-03-30 13:34:36.000000000 +0900
+++ b/kexec/crashdump-elf.c     2007-09-07 22:58:18.000000000 +0900
@@ -36,6 +36,8 @@ int FUNC(struct kexec_info *info,
        char *bufp;
        long int nr_cpus = 0;
        uint64_t notes_addr, notes_len;
+       uint64_t vmcoreinfo_addr, vmcoreinfo_len;
+       int has_vmcoreinfo = 0;
        int (*get_note_info)(int cpu, uint64_t *addr, uint64_t *len);
 
        if (xen_present())
@@ -47,7 +49,11 @@ int FUNC(struct kexec_info *info,
                return -1;
        }
 
-       sz = sizeof(EHDR) + nr_cpus * sizeof(PHDR) + ranges * sizeof(PHDR);
+       if (get_kernel_vmcoreinfo(&vmcoreinfo_addr, &vmcoreinfo_len) == 0) {
+               has_vmcoreinfo = 1;
+       }
+
+       sz = sizeof(EHDR) + (nr_cpus + has_vmcoreinfo) * sizeof(PHDR) + ranges 
* sizeof(PHDR);
 
        /*
         * Certain architectures such as x86_64 and ia64 require a separate
@@ -148,6 +154,21 @@ int FUNC(struct kexec_info *info,
                dfprintf_phdr(stdout, "Elf header", phdr);
        }
 
+       if (has_vmcoreinfo) {
+               phdr = (PHDR *) bufp;
+               bufp += sizeof(PHDR);
+               phdr->p_type    = PT_NOTE;
+               phdr->p_flags   = 0;
+               phdr->p_offset  = phdr->p_paddr = vmcoreinfo_addr;
+               phdr->p_vaddr   = 0;
+               phdr->p_filesz  = phdr->p_memsz = vmcoreinfo_len;
+               /* Do we need any alignment of segments? */
+               phdr->p_align   = 0;
+
+               (elf->e_phnum)++;
+               dfprintf_phdr(stdout, "vmcoreinfo header", phdr);
+       }
+
        /* Setup an PT_LOAD type program header for the region where
         * Kernel is mapped if info->kern_size is non-zero.
         */
diff -rpuN a/kexec/crashdump.c b/kexec/crashdump.c
--- a/kexec/crashdump.c 2007-03-30 13:34:36.000000000 +0900
+++ b/kexec/crashdump.c 2007-09-07 23:03:55.000000000 +0900
@@ -108,3 +108,32 @@ int get_crash_notes_per_cpu(int cpu, uin
 
        return 0;
 }
+
+/* Returns the physical address of start of crash notes buffer for a kernel. */
+int get_kernel_vmcoreinfo(uint64_t *addr, uint64_t *len)
+{
+       char kdump_info[PATH_MAX];
+       char line[MAX_LINE];
+       int count;
+       FILE *fp;
+       unsigned long long temp, temp2;
+
+       *addr = 0;
+       *len = 0;
+
+       sprintf(kdump_info, "/sys/kernel/vmcoreinfo");
+       fp = fopen(kdump_info, "r");
+       if (!fp)
+               return 0;
+
+       if (!fgets(line, sizeof(line), fp))
+               die("Cannot parse %s: %s\n", kdump_info, strerror(errno));
+       count = sscanf(line, "%Lx %Lx", &temp, &temp2);
+       if (count != 2)
+               die("Cannot parse %s: %s\n", kdump_info, strerror(errno));
+
+       *addr = (uint64_t) temp;
+       *len = (uint64_t) temp2;
+
+       return 0;
+}
diff -rpuN a/kexec/crashdump.h b/kexec/crashdump.h
--- a/kexec/crashdump.h 2007-03-30 13:34:36.000000000 +0900
+++ b/kexec/crashdump.h 2007-09-07 22:58:18.000000000 +0900
@@ -2,6 +2,7 @@
 #define CRASHDUMP_H
 
 extern int get_crash_notes_per_cpu(int cpu, uint64_t *addr, uint64_t *len);
+extern int get_kernel_vmcoreinfo(uint64_t *addr, uint64_t *len);
 
 /* Need to find a better way to determine per cpu notes section size. */
 #define MAX_NOTE_BYTES         1024
_


_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel

<Prev in Thread] Current Thread [Next in Thread>