* [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.