Hi Ryan,
You are right. It is needed for fully virtualized (HVM) Guests. And I
incorrectly thought that you are running HVM domain. I did not try
64-bit para-virtualized domain debug with the gdbserver. And your debug
findings of make sense to me. I think the map_domain_va functions and CR
registers need to more code to support the para-virtualized domains.
Thanks & Regards,
Nitin
------------------------------------------------------------------------
-----------
Open Source Technology Center, Intel Corp
>-----Original Message-----
>From: Ryan Harper [mailto:ryanh@xxxxxxxxxx]
>Sent: Thursday, April 20, 2006 3:24 PM
>To: Kamble, Nitin A
>Cc: xen-devel@xxxxxxxxxxxxxxxxxxx
>Subject: Re: [Xen-devel] gdbserver-xen x86_64 paravirt guest debugging
>
>* Kamble, Nitin A <nitin.a.kamble@xxxxxxxxx> [2006-04-19 17:17]:
>> Hi Ryan,
>> I am writing a paper for debugging Linux kernel using the Xen and
the
>> gdbserver. So with that you will get more details.
>>
>> For the quick solution for your problem, you need to run "set
>> architecture i386:x86-64:intel" command in the gdb before attaching.
>
>This didn't help at all, but thank you for the suggestion.
>
>I'm not sure if anyone has tried to get debugging of paravirtual x86_64
>guests to work. I encountered several issues along the way to getting
a
>successful 'bt' from gdb on a live x86_64 domU. Note, this is not a
hvm
>domain I am debugging.
>
>The first issue was the paging_enabled check on
>tools/libxc/xc_ptrace.c:384
>
>if (!paging_enabled(&ctxt[cpu])) {
> static void * v;
> unsigned long page;
>
> if ( v != NULL )
> munmap(v, PAGE_SIZE);
>
> page = page_array[va >> PAGE_SHIFT] << PAGE_SHIFT;
>
>Specifically, the va >> PAGE_SHIFT was too large for the page_array of
>pfn-to-mfns. Examining cr0 (ctxt->ctrlreg[0]) in gdb showed that cr0
>was 0x00000008. Any reason why cr0 wouldn't at least have paging and
>protected mode bits set for paravirtual guests?
>
>I hacked up xc_linux_build.c and
>linux-2.6-xen-sparse/drivers/xen/core/smpboot.c to set paging and
>protected bits in cr0 and I made it further. Next stop was at
>xc_ptrace.c:284
>
>#ifdef __x86_64__
>static void *
>map_domain_va_64(
> int xc_handle,
> int cpu,
> void *guest_va,
> int perm)
>{
> unsigned long l3p, l2p, l1p, l1e, p, va = (unsigned long)guest_va;
> uint64_t *l4, *l3, *l2, *l1;
> static void *v;
>
> if ((ctxt[cpu].ctrlreg[4] & 0x20) == 0 ) /* legacy ia32 mode */
> return map_domain_va_32(xc_handle, cpu, guest_va, perm);
>
>cr4's value was 0, which forced me down the map_domain_va_32, which was
>not the right path since I'm on a 64-bit guest. Commenting that
>check out, I then blew up processing the page table pointers,
>xc_ptrace.c:292
>
> l4 = xc_map_foreign_range( xc_handle, current_domid, PAGE_SIZE,
> PROT_READ, ctxt[cpu].ctrlreg[3] >> PAGE_SHIFT);
> if ( l4 == NULL )
> return NULL;
>
> l3p = l4[l4_table_offset(va)] >> PAGE_SHIFT;
> l3p = page_array[l3p]; // lineno 292
>
>
>In a paravirt domain, the entries in the l4 page table are going to be
>mfns, not gpfns, in which case, we don't need to try to convert the
>entries in the l4 table into mfns via the page_array pfn list. The
same
>holds true for the rest of the tables.
>
>I removed all page_array index lines and I was finally able to get a
>backtrace of the guest.
>
>(gdb) bt
>#0 0xffffffff801348d5 in do_timer (regs=0xffff88002ea4bf58) at
>kernel/timer.c:775
>#1 0xffffffff8010f31b in timer_interrupt (irq=782548824,
> dev_id=0x989680, regs=0xffff88002ea4bf58)
> at arch/x86_64/kernel/../../i386/kernel/time-xen.c:672
>#2 0xffffffff8014e5b9 in handle_IRQ_event (irq=256,
> regs=0xffff88002ea4bf58, action=0xffff880001dfe600)
> at kernel/irq/handle.c:88
>#3 0xffffffff8014e6b2 in __do_IRQ (irq=256, regs=0xffff88002ea4bf58)
at
> kernel/irq/handle.c:173
>#4 0xffffffff8010d6ae in do_IRQ (regs=0xffff88002ea4bf58) at
> arch/x86_64/kernel/irq-xen.c:105
>#5 0xffffffff80249c50 in evtchn_do_upcall (regs=0xffff88002ea4bf58) at
> drivers/xen/core/evtchn.c:215
>#6 0xffffffff8010b87e in do_hypervisor_callback ()
>#7 0xffff88002ea4bf58 in ?? ()
>#8 0x0000000000000000 in ?? ()
>
>
>My guess is that those conversions are needed if the guest is in shadow
>paging mode. If so, then we need to add a shadow and non-shadow mode
to
>the map_domain_va_64() call so we can debug non-hvm 64-bit guests via
>gdb.
>
>--
>Ryan Harper
>Software Engineer; Linux Technology Center
>IBM Corp., Austin, Tx
>(512) 838-9253 T/L: 678-9253
>ryanh@xxxxxxxxxx
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel
|