[Crash-utility] question about phys_base

Dave Anderson anderson at redhat.com
Thu Feb 16 15:31:01 UTC 2012



----- Original Message -----
> At 02/16/2012 12:17 AM, Dave Anderson Wrote:
> > 
> > 
> > ----- Original Message -----
> >> Hi, Dave
> >>
> >> I am implementing a new dump command in the qemu. The vmcore's
> >> format is elf(like kdump). And I try to provide phys_base in
> >> the PT_LOAD. But if the os uses the first vcpu do kdump, the
> >> value of phys_base is wrong.
> >>
> >> I find a function x86_64_virt_phys_base() in crash's code.
> >> Is it OK to call this function first? If the function
> >> successes, we do not calculate phys_base according to PT_LOAD.
> > 
> > I'm presuming that the qemu-generated ELF file is essentially
> > a "clone" of a kdump ELF file, and therefore the initialization
> > sequence would be:
> > 
> >  main()
> >   machdep_init(PRE_GDB)
> >    x86_64_init(PRE_GDB)
> >     x86_64_calc_phys_base()
> > 
> > where it should fall into this part:
> > 
> >         if ((vd = get_kdump_vmcore_data())) {
> >                 for (i = 0; i < vd->num_pt_load_segments; i++) {
> >                         phdr = vd->load64 + i;
> >                         if ((phdr->p_vaddr >= __START_KERNEL_map)
> >                         &&
> >                             !(IS_VMALLOC_ADDR(phdr->p_vaddr))) {
> > 
> >                                 machdep->machspec->phys_base =
> >                                 phdr->p_paddr -
> >                                     (phdr->p_vaddr &
> >                                     ~(__START_KERNEL_map));
> > 
> >                                 if (CRASHDEBUG(1)) {
> >                                         fprintf(fp, "p_vaddr: %lx
> >                                         p_paddr: %lx -> ",
> >                                                 phdr->p_vaddr,
> >                                                 phdr->p_paddr);
> >                                         fprintf(fp, "phys_base:
> >                                         %lx\n\n",
> >                                                 machdep->machspec->phys_base);
> >                                 }
> >                                 break;
> >                         }
> >                 }
> > 
> >                 return;
> >         }
> > 
> > Question: will the qemu-generated ELF header contain a PT_LOAD segment that
> > describes the mapped __START_KERNEL_map region?
> > 
> > If the __START_KERNEL_map PT_LOAD segment does *not* exist, then the code above
> > would fall through to the "return", and I suppose that you could call
> > x86_64_virt_phys_base() there instead.
> > 
> > If there *is* a __START_KERNEL_map PT_LOAD segment, are you saying that
> > the calculation above would incorrectly calculate phys_base?
> 
> Because it is hard to calculate phys_base in qemu side. I try to do it like
> the function get_kernel_base() in qemu.c. But if the os uses the vcpu to do
> kdump, the phys_base is for the second kernel, not the first kernel.  Another
> problem is that it is for linux, and we donot which the guest is.
> 
> > 
> > Ideally, there would be some other "differentiator" between qemu-generated
> > and kdump-generated ELF headers -- while still being a KDUMP clone in all
> > other respects.  (Maybe an ELF NOTE?)  And then preferably, that differentiator
> > could be used to separate the code, i.e., something like:
> 
> The qemu-generated ELF headers may be the same as kdump-generated ELF headers.

OK, so then I don't understand what you mean by "may be the same"?  

You didn't answer my original question, but if I understand you correctly,
it would be impossible for the qemu host to create a PT_LOAD segment that
describes an x86_64 guest's __START_KERNEL_map region, because the host 
doesn't know that what kind of kernel the guest is running.

So that means that qemu-generated ELF header *cannot* be the same
as a kdump-generated ELF header.  And for that matter, the same would be
true for x86, although the crash code doesn't use the p_vaddr field from
the ELF header like the x86_64 does.  

Dave

> 
> Thanks
> Wen Congyang
> > 
> >        if (qemu_generated_ELF_kdump() {
> >                x86_64_virt_phys_base();
> >                return;
> >        }
> > 
> >        if ((vd = get_kdump_vmcore_data())) {
> >                 for (i = 0; i < vd->num_pt_load_segments; i++) {
> >                         phdr = vd->load64 + i;
> >                         if ((phdr->p_vaddr >= __START_KERNEL_map)
> >                         &&
> >        ...
> >     
> > Would that be possible?
> > 
> > Dave
> > 
> > 
> 
> 




More information about the Crash-utility mailing list