[Crash-utility] question about phys_base

Dave Anderson anderson at redhat.com
Wed Feb 15 16:17:12 UTC 2012



----- 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?

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:

       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