* [PATCH] paging_enabled and non-HVM guests
@ 2006-05-09 11:31 Simon Kagstrom
2006-05-09 19:53 ` Hollis Blanchard
0 siblings, 1 reply; 8+ messages in thread
From: Simon Kagstrom @ 2006-05-09 11:31 UTC (permalink / raw)
To: xen-devel list
I had a problem with the GDB-server crashing on connections in
xen_ptrace.c:map_domain_va(). paging_enabled() should only be checked
for HVM guests, and the patch adds a check for that.
Signed-off-by: Simon Kagstrom <ska@bth.se>
diff -r 4501d60d6add tools/libxc/xc_ptrace.c
--- a/tools/libxc/xc_ptrace.c Tue May 9 09:57:05 2006
+++ b/tools/libxc/xc_ptrace.c Tue May 9 13:26:14 2006
@@ -374,7 +374,7 @@
if (fetch_regs(xc_handle, cpu, NULL))
return NULL;
- if (!paging_enabled(&ctxt[cpu])) {
+ if ( (ctxt[cpu].flags & VGCF_HVM_GUEST) && !paging_enabled(&ctxt[cpu])) {
static void * v;
unsigned long page;
^ permalink raw reply [flat|nested] 8+ messages in thread* Re: [PATCH] paging_enabled and non-HVM guests 2006-05-09 11:31 [PATCH] paging_enabled and non-HVM guests Simon Kagstrom @ 2006-05-09 19:53 ` Hollis Blanchard 2006-05-09 20:14 ` Anthony Liguori 2006-05-10 6:06 ` Simon Kagstrom 0 siblings, 2 replies; 8+ messages in thread From: Hollis Blanchard @ 2006-05-09 19:53 UTC (permalink / raw) To: Simon Kagstrom; +Cc: xen-devel list On Tue, 2006-05-09 at 13:31 +0200, Simon Kagstrom wrote: > I had a problem with the GDB-server crashing on connections in > xen_ptrace.c:map_domain_va(). paging_enabled() should only be checked > for HVM guests, and the patch adds a check for that. > > Signed-off-by: Simon Kagstrom <ska@bth.se> > > diff -r 4501d60d6add tools/libxc/xc_ptrace.c > --- a/tools/libxc/xc_ptrace.c Tue May 9 09:57:05 2006 > +++ b/tools/libxc/xc_ptrace.c Tue May 9 13:26:14 2006 > @@ -374,7 +374,7 @@ > if (fetch_regs(xc_handle, cpu, NULL)) > return NULL; > > - if (!paging_enabled(&ctxt[cpu])) { > + if ( (ctxt[cpu].flags & VGCF_HVM_GUEST) && !paging_enabled(&ctxt[cpu])) { > static void * v; > unsigned long page; I looked at this a couple weeks ago, and I think the real problem is that the CR registers are never updated in Xen's vcpu structure, and so xc_vcpu_getcontext() doesn't get them either. So Xen should be fixed; we shouldn't add workarounds to userland. -- Hollis Blanchard IBM Linux Technology Center ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH] paging_enabled and non-HVM guests 2006-05-09 19:53 ` Hollis Blanchard @ 2006-05-09 20:14 ` Anthony Liguori 2006-05-09 20:26 ` Ryan Harper 2006-05-10 6:06 ` Simon Kagstrom 1 sibling, 1 reply; 8+ messages in thread From: Anthony Liguori @ 2006-05-09 20:14 UTC (permalink / raw) To: Hollis Blanchard; +Cc: Simon Kagstrom, xen-devel list, Ryan Harper Hollis Blanchard wrote: > On Tue, 2006-05-09 at 13:31 +0200, Simon Kagstrom wrote: > >> I had a problem with the GDB-server crashing on connections in >> xen_ptrace.c:map_domain_va(). paging_enabled() should only be checked >> for HVM guests, and the patch adds a check for that. >> >> Signed-off-by: Simon Kagstrom <ska@bth.se> >> >> diff -r 4501d60d6add tools/libxc/xc_ptrace.c >> --- a/tools/libxc/xc_ptrace.c Tue May 9 09:57:05 2006 >> +++ b/tools/libxc/xc_ptrace.c Tue May 9 13:26:14 2006 >> @@ -374,7 +374,7 @@ >> if (fetch_regs(xc_handle, cpu, NULL)) >> return NULL; >> >> - if (!paging_enabled(&ctxt[cpu])) { >> + if ( (ctxt[cpu].flags & VGCF_HVM_GUEST) && !paging_enabled(&ctxt[cpu])) { >> static void * v; >> unsigned long page; >> > > I looked at this a couple weeks ago, and I think the real problem is > that the CR registers are never updated in Xen's vcpu structure, and so > xc_vcpu_getcontext() doesn't get them either. So Xen should be fixed; we > shouldn't add workarounds to userland. > I think that the CR registers are never changed during the life of a PV domain. I think all that's needed is for some sane values to be set during domain creation and things start working. I believe Ryan had a patch that did this? Regards, Anthony Liguori ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH] paging_enabled and non-HVM guests 2006-05-09 20:14 ` Anthony Liguori @ 2006-05-09 20:26 ` Ryan Harper 0 siblings, 0 replies; 8+ messages in thread From: Ryan Harper @ 2006-05-09 20:26 UTC (permalink / raw) To: Anthony Liguori; +Cc: Simon Kagstrom, xen-devel list, Hollis Blanchard [-- Attachment #1: Type: text/plain, Size: 1884 bytes --] * Anthony Liguori <aliguori@us.ibm.com> [2006-05-09 15:15]: > Hollis Blanchard wrote: > >On Tue, 2006-05-09 at 13:31 +0200, Simon Kagstrom wrote: > > > >>I had a problem with the GDB-server crashing on connections in > >>xen_ptrace.c:map_domain_va(). paging_enabled() should only be checked > >>for HVM guests, and the patch adds a check for that. > >> > >>Signed-off-by: Simon Kagstrom <ska@bth.se> > >> > >>diff -r 4501d60d6add tools/libxc/xc_ptrace.c > >>--- a/tools/libxc/xc_ptrace.c Tue May 9 09:57:05 2006 > >>+++ b/tools/libxc/xc_ptrace.c Tue May 9 13:26:14 2006 > >>@@ -374,7 +374,7 @@ > >> if (fetch_regs(xc_handle, cpu, NULL)) > >> return NULL; > >> > >>- if (!paging_enabled(&ctxt[cpu])) { > >>+ if ( (ctxt[cpu].flags & VGCF_HVM_GUEST) && > >>!paging_enabled(&ctxt[cpu])) { static void * v; > >> unsigned long page; > >> > > > >I looked at this a couple weeks ago, and I think the real problem is > >that the CR registers are never updated in Xen's vcpu structure, and so > >xc_vcpu_getcontext() doesn't get them either. So Xen should be fixed; we > >shouldn't add workarounds to userland. > > > > I think that the CR registers are never changed during the life of a PV > domain. I think all that's needed is for some sane values to be set > during domain creation and things start working. I believe Ryan had a > patch that did this? Well, I only hacked up enough to get things functional. I didn't know what cr4 should look like so I skipped that check. Here are the two patches I needed to debug paravirt 64-bit domUs via gdb. I was going to look into abstracting out the index into the page_array (it is only needed on domains with shadow paging; non-shadow page tables already have mfns). -- Ryan Harper Software Engineer; Linux Technology Center IBM Corp., Austin, Tx (512) 838-9253 T/L: 678-9253 ryanh@us.ibm.com [-- Attachment #2: fix_ptrace_paravirt64.patch --] [-- Type: text/plain, Size: 1673 bytes --] diff -r c4eead8a925b tools/libxc/xc_ptrace.c --- a/tools/libxc/xc_ptrace.c Sun Apr 16 14:41:31 2006 +++ b/tools/libxc/xc_ptrace.c Thu Apr 20 22:44:35 2006 @@ -281,8 +281,10 @@ uint64_t *l4, *l3, *l2, *l1; static void *v; +#if 0 if ((ctxt[cpu].ctrlreg[4] & 0x20) == 0 ) /* legacy ia32 mode */ return map_domain_va_32(xc_handle, cpu, guest_va, perm); +#endif l4 = xc_map_foreign_range( xc_handle, current_domid, PAGE_SIZE, PROT_READ, ctxt[cpu].ctrlreg[3] >> PAGE_SHIFT); @@ -290,14 +292,14 @@ return NULL; l3p = l4[l4_table_offset(va)] >> PAGE_SHIFT; - l3p = page_array[l3p]; + //l3p = page_array[l3p]; l3 = xc_map_foreign_range(xc_handle, current_domid, PAGE_SIZE, PROT_READ, l3p); munmap(l4, PAGE_SIZE); if ( l3 == NULL ) return NULL; l2p = l3[l3_table_offset(va)] >> PAGE_SHIFT; - l2p = page_array[l2p]; + //l2p = page_array[l2p]; l2 = xc_map_foreign_range(xc_handle, current_domid, PAGE_SIZE, PROT_READ, l2p); munmap(l3, PAGE_SIZE); if ( l2 == NULL ) @@ -309,7 +311,7 @@ if (l1e & 0x80) { /* 2M pages */ p = (l1p + l1_table_offset(va)); } else { /* 4K pages */ - l1p = page_array[l1p]; + //l1p = page_array[l1p]; l1 = xc_map_foreign_range(xc_handle, current_domid, PAGE_SIZE, perm, l1p); munmap(l2, PAGE_SIZE); if ( l1 == NULL ) @@ -317,7 +319,7 @@ p = l1[l1_table_offset(va)] >> PAGE_SHIFT; } - p = page_array[p]; + //p = page_array[p]; if ( v != NULL ) munmap(v, PAGE_SIZE); v = xc_map_foreign_range(xc_handle, current_domid, PAGE_SIZE, perm, p); [-- Attachment #3: setup_sane_cr0.patch --] [-- Type: text/plain, Size: 1290 bytes --] diff -r c4eead8a925b tools/libxc/xc_linux_build.c --- a/tools/libxc/xc_linux_build.c Sun Apr 16 14:41:31 2006 +++ b/tools/libxc/xc_linux_build.c Thu Apr 20 22:45:21 2006 @@ -45,6 +45,11 @@ #ifdef __ia64__ #define probe_aout9(image,image_size,load_funcs) 1 #endif + +/* from xc_ptrace.h */ +#define X86_CR0_PE 0x00000001 /* Enable Protected Mode (RW) */ +#define X86_CR0_PG 0x80000000 /* Paging (RW) */ + struct initrd_info { enum { INITRD_none, INITRD_file, INITRD_mem } type; @@ -1174,6 +1179,8 @@ ctxt->failsafe_callback_eip = 0; ctxt->syscall_callback_eip = 0; #endif + /* set sane cr0 bits, protected and paging enabled */ + ctxt->ctrlreg[0] = X86_CR0_PE|X86_CR0_PG; #endif /* x86 */ memset( &launch_op, 0, sizeof(launch_op) ); diff -r c4eead8a925b linux-2.6-xen-sparse/drivers/xen/core/smpboot.c --- a/linux-2.6-xen-sparse/drivers/xen/core/smpboot.c Sun Apr 16 14:41:31 2006 +++ b/linux-2.6-xen-sparse/drivers/xen/core/smpboot.c Thu Apr 20 22:45:36 2006 @@ -216,6 +216,8 @@ ctxt.gs_base_kernel = (unsigned long)(cpu_pda(vcpu)); #endif + /* set sane cr0 bits, protected and paging enabled */ + ctxt.ctrlreg[0] = 0x80000001; BUG_ON(HYPERVISOR_vcpu_op(VCPUOP_initialise, vcpu, &ctxt)); } [-- Attachment #4: Type: text/plain, Size: 138 bytes --] _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH] paging_enabled and non-HVM guests 2006-05-09 19:53 ` Hollis Blanchard 2006-05-09 20:14 ` Anthony Liguori @ 2006-05-10 6:06 ` Simon Kagstrom 2006-05-10 14:51 ` Hollis Blanchard 1 sibling, 1 reply; 8+ messages in thread From: Simon Kagstrom @ 2006-05-10 6:06 UTC (permalink / raw) To: Hollis Blanchard; +Cc: xen-devel list At Tue, 09 May 2006 14:53:46 -0500, Hollis Blanchard wrote: > > On Tue, 2006-05-09 at 13:31 +0200, Simon Kagstrom wrote: > > I had a problem with the GDB-server crashing on connections in > > xen_ptrace.c:map_domain_va(). paging_enabled() should only be checked > > for HVM guests, and the patch adds a check for that. > > > > Signed-off-by: Simon Kagstrom <ska@bth.se> > > > > diff -r 4501d60d6add tools/libxc/xc_ptrace.c > > --- a/tools/libxc/xc_ptrace.c Tue May 9 09:57:05 2006 > > +++ b/tools/libxc/xc_ptrace.c Tue May 9 13:26:14 2006 > > @@ -374,7 +374,7 @@ > > if (fetch_regs(xc_handle, cpu, NULL)) > > return NULL; > > > > - if (!paging_enabled(&ctxt[cpu])) { > > + if ( (ctxt[cpu].flags & VGCF_HVM_GUEST) && !paging_enabled(&ctxt[cpu])) { > > static void * v; > > unsigned long page; > > I looked at this a couple weeks ago, and I think the real problem is > that the CR registers are never updated in Xen's vcpu structure, and so > xc_vcpu_getcontext() doesn't get them either. So Xen should be fixed; we > shouldn't add workarounds to userland. OK, I guess that sounds reasonable. Checks for HVM guests are done on a number of other places as well in libxc, however. Is the support meant to be transparent between HVM and PV guests? I won't argue for an incorrect fix, but as the code is right now it segmentation faults because the virtual address passed to page = page_array[va >> PAGE_SHIFT] << PAGE_SHIFT; (with libxc incorrectly believing paging is disabled) accesses outside of page_array. I'll keep the patch privately for now since gdbserver breaks without it. // Simon ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH] paging_enabled and non-HVM guests 2006-05-10 6:06 ` Simon Kagstrom @ 2006-05-10 14:51 ` Hollis Blanchard 2006-05-10 15:42 ` Hollis Blanchard 0 siblings, 1 reply; 8+ messages in thread From: Hollis Blanchard @ 2006-05-10 14:51 UTC (permalink / raw) To: Simon Kagstrom; +Cc: xen-devel list On Wed, 2006-05-10 at 08:06 +0200, Simon Kagstrom wrote: > > I won't argue for an incorrect fix, but as the code is right now it > segmentation faults because the virtual address passed to > > page = page_array[va >> PAGE_SHIFT] << PAGE_SHIFT; > > (with libxc incorrectly believing paging is disabled) accesses outside > of page_array. I'll keep the patch privately for now since gdbserver > breaks without it. Yes, and the reason is that page_array is supposed to be indexed with *physical* addresses. The current code thinks that paging is disabled (because CR0 is bad), assumes a virtual address is physical, and tries to index into the array with it. Pretty much every use of page_array needs to be abstracted so that it does the right thing on both HVM and normal guests (normal guests will have machine addresses in its page tables; HVM guests will have physical). It's very unfortunate that the people who worked on this code seem not to have tested or even thought about paravirtualized guests. -- Hollis Blanchard IBM Linux Technology Center ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH] paging_enabled and non-HVM guests 2006-05-10 14:51 ` Hollis Blanchard @ 2006-05-10 15:42 ` Hollis Blanchard 2006-05-10 18:35 ` Simon Kagstrom 0 siblings, 1 reply; 8+ messages in thread From: Hollis Blanchard @ 2006-05-10 15:42 UTC (permalink / raw) To: Simon Kagstrom; +Cc: xen-devel list On Wed, 2006-05-10 at 09:51 -0500, Hollis Blanchard wrote: > On Wed, 2006-05-10 at 08:06 +0200, Simon Kagstrom wrote: > > > > I won't argue for an incorrect fix, but as the code is right now it > > segmentation faults because the virtual address passed to > > > > page = page_array[va >> PAGE_SHIFT] << PAGE_SHIFT; > > > > (with libxc incorrectly believing paging is disabled) accesses outside > > of page_array. I'll keep the patch privately for now since gdbserver > > breaks without it. > > Yes, and the reason is that page_array is supposed to be indexed with > *physical* addresses. The current code thinks that paging is disabled > (because CR0 is bad), assumes a virtual address is physical, and tries > to index into the array with it. > > Pretty much every use of page_array needs to be abstracted so that it > does the right thing on both HVM and normal guests (normal guests will > have machine addresses in its page tables; HVM guests will have > physical). It's very unfortunate that the people who worked on this > code seem not to have tested or even thought about paravirtualized > guests. To elaborate on my previous mail, it's not just CR0/paging at fault. For example, this use of page_array: ... l3p = l4[l4_table_offset(va)] >> PAGE_SHIFT; l3p = page_array[l3p]; ... in map_domain_va_64() is obviously incorrect for paravirtualized domains. Also, I noticed there's another place that already tests VGCF_HVM_GUEST before paging_enabled(), which I guess is where you got the idea for your patch. Simon, would you care to submit the more complete patch? -- Hollis Blanchard IBM Linux Technology Center ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH] paging_enabled and non-HVM guests 2006-05-10 15:42 ` Hollis Blanchard @ 2006-05-10 18:35 ` Simon Kagstrom 0 siblings, 0 replies; 8+ messages in thread From: Simon Kagstrom @ 2006-05-10 18:35 UTC (permalink / raw) To: Hollis Blanchard; +Cc: xen-devel list At Wed, 10 May 2006 10:42:34 -0500, Hollis Blanchard wrote: > To elaborate on my previous mail, it's not just CR0/paging at fault. For > example, this use of page_array: > ... > l3p = l4[l4_table_offset(va)] >> PAGE_SHIFT; > l3p = page_array[l3p]; > ... > in map_domain_va_64() is obviously incorrect for paravirtualized > domains. > > Also, I noticed there's another place that already tests VGCF_HVM_GUEST > before paging_enabled(), which I guess is where you got the idea for > your patch. Actually, I found that afterwards :-). > Simon, would you care to submit the more complete patch? I'll see what I can do in the next few days! // Simon ^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2006-05-10 18:35 UTC | newest] Thread overview: 8+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2006-05-09 11:31 [PATCH] paging_enabled and non-HVM guests Simon Kagstrom 2006-05-09 19:53 ` Hollis Blanchard 2006-05-09 20:14 ` Anthony Liguori 2006-05-09 20:26 ` Ryan Harper 2006-05-10 6:06 ` Simon Kagstrom 2006-05-10 14:51 ` Hollis Blanchard 2006-05-10 15:42 ` Hollis Blanchard 2006-05-10 18:35 ` Simon Kagstrom
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.