From mboxrd@z Thu Jan 1 00:00:00 1970 From: Ryan Harper Subject: Re: [PATCH] paging_enabled and non-HVM guests Date: Tue, 9 May 2006 15:26:57 -0500 Message-ID: <20060509202657.GK28945@us.ibm.com> References: <87wtcv5t9e.wl%simon.kagstrom@bth.se> <1147204426.19485.67.camel@basalt.austin.ibm.com> <4460F832.4060808@us.ibm.com> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="yEPQxsgoJgBvi8ip" Return-path: Content-Disposition: inline In-Reply-To: <4460F832.4060808@us.ibm.com> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xensource.com Errors-To: xen-devel-bounces@lists.xensource.com To: Anthony Liguori Cc: Simon Kagstrom , xen-devel list , Hollis Blanchard List-Id: xen-devel@lists.xenproject.org --yEPQxsgoJgBvi8ip Content-Type: text/plain; charset=us-ascii Content-Disposition: inline * Anthony Liguori [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 > >> > >>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 --yEPQxsgoJgBvi8ip Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename="fix_ptrace_paravirt64.patch" 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); --yEPQxsgoJgBvi8ip Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename="setup_sane_cr0.patch" 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)); } --yEPQxsgoJgBvi8ip Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: inline _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel --yEPQxsgoJgBvi8ip--