Make work for paravirtualized guest # This is a BitKeeper generated diff -Nru style patch. # # ChangeSet # 2005/04/28 15:22:26-07:00 kmacy@curly.lab.netapp.com # Fix xc_ptrace # Signed-off-by: Kip Macy <kmacy@fsmware.com> # # BitKeeper/etc/logging_ok # 2005/04/28 15:22:26-07:00 kmacy@curly.lab.netapp.com +1 -0 # Logging to logging@openlogging.org accepted # # tools/libxc/xc_ptrace.c # 2005/04/28 15:22:15-07:00 kmacy@curly.lab.netapp.com +4 -2 # don''t reference page_array in the paravirtualized case # diff -Nru a/tools/libxc/xc_ptrace.c b/tools/libxc/xc_ptrace.c --- a/tools/libxc/xc_ptrace.c 2005-04-27 19:11:24 -07:00 +++ b/tools/libxc/xc_ptrace.c 2005-04-27 19:11:24 -07:00 @@ -181,7 +181,8 @@ } if ((pde = cr3_virt[cpu][vtopdi(va)]) == 0) /* logical address */ goto error_out; - pde = page_array[pde >> PAGE_SHIFT] << PAGE_SHIFT; + if (ctxt[cpu].flags & VGCF_VMX_GUEST) + pde = page_array[pde >> PAGE_SHIFT] << PAGE_SHIFT; if (pde != pde_phys[cpu]) { pde_phys[cpu] = pde; @@ -194,7 +195,8 @@ } if ((page = pde_virt[cpu][vtopti(va)]) == 0) /* logical address */ goto error_out; - page = page_array[page >> PAGE_SHIFT] << PAGE_SHIFT; + if (ctxt[cpu].flags & VGCF_VMX_GUEST) + page = page_array[page >> PAGE_SHIFT] << PAGE_SHIFT; if (page != page_phys[cpu] || perm != prev_perm[cpu]) { page_phys[cpu] = page; _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
# Make work for paravirtualized guest So it does not return an indentity map for paravirtualized guests? Sorry about that, I''ll make sure my fixes are programmed more defensive next time. Leendert _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
What you''re doing could work in principle, but the page array would have to be equal to the number of pages on the machine not the number of "physical" pages in the guest. In the paravirtualized case you are reading from the hardware page tables, so although the guest may only be using 64MB its pages may reside at the edge of 4GB. The segmentation fault I sent earlier was caused by the inevitable indexing off the edge of the array. Looking at the code in DOM0_GETMEMINFO: for ( i = 0; (i < max_pfns) && (list_ent != &d->page_list); i++ ) { pfn = list_entry(list_ent, struct pfn_info, list) - frame_table; if ( put_user(pfn, buffer) ) It only adds an entry for each page in use, which I assume means it is just the p2m mapping of page frames.> So it does not return an indentity map for paravirtualized guests? > > Sorry about that, I''ll make sure my fixes are programmed more defensive > next time.Thanks. -Kip _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
Please apply. Paravirtualized guest debugging does not work without this change. ---------- Forwarded message ---------- From: Kip Macy <kip.macy@gmail.com> Date: Apr 28, 2005 7:08 PM Subject: xc_ptrace fix To: xen-devel <xen-devel@lists.xensource.com> Make work for paravirtualized guest # This is a BitKeeper generated diff -Nru style patch. # # ChangeSet # 2005/04/28 15:22:26-07:00 kmacy@curly.lab.netapp.com # Fix xc_ptrace # Signed-off-by: Kip Macy <kmacy@fsmware.com> # # BitKeeper/etc/logging_ok # 2005/04/28 15:22:26-07:00 kmacy@curly.lab.netapp.com +1 -0 # Logging to logging@openlogging.org accepted # # tools/libxc/xc_ptrace.c # 2005/04/28 15:22:15-07:00 kmacy@curly.lab.netapp.com +4 -2 # don''t reference page_array in the paravirtualized case # diff -Nru a/tools/libxc/xc_ptrace.c b/tools/libxc/xc_ptrace.c --- a/tools/libxc/xc_ptrace.c 2005-04-27 19:11:24 -07:00 +++ b/tools/libxc/xc_ptrace.c 2005-04-27 19:11:24 -07:00 @@ -181,7 +181,8 @@ } if ((pde = cr3_virt[cpu][vtopdi(va)]) == 0) /* logical address */ goto error_out; - pde = page_array[pde >> PAGE_SHIFT] << PAGE_SHIFT; + if (ctxt[cpu].flags & VGCF_VMX_GUEST) + pde = page_array[pde >> PAGE_SHIFT] << PAGE_SHIFT; if (pde != pde_phys[cpu]) { pde_phys[cpu] = pde; @@ -194,7 +195,8 @@ } if ((page = pde_virt[cpu][vtopti(va)]) == 0) /* logical address */ goto error_out; - page = page_array[page >> PAGE_SHIFT] << PAGE_SHIFT; + if (ctxt[cpu].flags & VGCF_VMX_GUEST) + page = page_array[page >> PAGE_SHIFT] << PAGE_SHIFT; if (page != page_phys[cpu] || perm != prev_perm[cpu]) { page_phys[cpu] = page; _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel