[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen-3.0-testing] [DEBUG] Reenable debugging of paravirtualized and
# HG changeset patch # User kaf24@xxxxxxxxxxxxxxxxxxxx # Node ID 17fbffb737d90727b068ecd4f77b727114ed9d95 # Parent cb1e561583ac112b7b62bbd4d5232bc590053de3 [DEBUG] Reenable debugging of paravirtualized and HVM domains for the xen-3.0-testing.hg tree. The patches are backported from xen-unstable.hg, http://xenbits.xensource.com/xen-unstable.hg?cs=3D93379554837c http://xenbits.xensource.com/xen-unstable.hg?cs=3Ded696467fe64 The first patch exports the cr0 value to the guest in Xen and the second abstracts away the differences between HVM and paravirtualized guests with regard to physical/machine addresses in xc_ptrace.c. Signed-off-by: Simon Kagstrom <simon.kagstrom@xxxxxx> --- tools/libxc/xc_ptrace.c | 220 ++++++++++++++++++++++++----------------------- tools/libxc/xg_private.h | 12 ++ xen/arch/x86/domain.c | 5 + 3 files changed, 130 insertions(+), 107 deletions(-) diff -r cb1e561583ac -r 17fbffb737d9 tools/libxc/xc_ptrace.c --- a/tools/libxc/xc_ptrace.c Thu Jun 22 14:20:01 2006 +0100 +++ b/tools/libxc/xc_ptrace.c Thu Jun 22 21:41:19 2006 +0100 @@ -157,6 +157,27 @@ static long nr_pages static long nr_pages = 0; static unsigned long *page_array = NULL; + +/* + * Translates physical addresses to machine addresses for HVM + * guests. For paravirtual domains the function will just return the + * given address. + * + * This function should be used when reading page directories/page + * tables. + * + */ +static unsigned long +to_ma(int cpu, + unsigned long in_addr) +{ + unsigned long maddr = in_addr; + + if ( (ctxt[cpu].flags & VGCF_HVM_GUEST) && paging_enabled(&ctxt[cpu]) ) + maddr = page_array[maddr >> PAGE_SHIFT] << PAGE_SHIFT; + return maddr; +} + static void * map_domain_va_32( int xc_handle, @@ -164,66 +185,37 @@ map_domain_va_32( void *guest_va, int perm) { - unsigned long pde, page; - unsigned long va = (unsigned long)guest_va; - - static unsigned long cr3_phys[MAX_VIRT_CPUS]; - static uint32_t *cr3_virt[MAX_VIRT_CPUS]; - static unsigned long pde_phys[MAX_VIRT_CPUS]; - static uint32_t *pde_virt[MAX_VIRT_CPUS]; - static unsigned long page_phys[MAX_VIRT_CPUS]; - static uint32_t *page_virt[MAX_VIRT_CPUS]; - static int prev_perm[MAX_VIRT_CPUS]; - - if (ctxt[cpu].ctrlreg[3] == 0) - return NULL; - if ( ctxt[cpu].ctrlreg[3] != cr3_phys[cpu] ) - { - cr3_phys[cpu] = ctxt[cpu].ctrlreg[3]; - if ( cr3_virt[cpu] ) - munmap(cr3_virt[cpu], PAGE_SIZE); - cr3_virt[cpu] = xc_map_foreign_range( - xc_handle, current_domid, PAGE_SIZE, PROT_READ, - cr3_phys[cpu] >> PAGE_SHIFT); - if ( cr3_virt[cpu] == NULL ) - return NULL; - } - if ( (pde = cr3_virt[cpu][vtopdi(va)]) == 0 ) - return NULL; - if ( (ctxt[cpu].flags & VGCF_HVM_GUEST) && paging_enabled(&ctxt[cpu]) ) - pde = page_array[pde >> PAGE_SHIFT] << PAGE_SHIFT; - if ( pde != pde_phys[cpu] ) - { - pde_phys[cpu] = pde; - if ( pde_virt[cpu] ) - munmap(pde_virt[cpu], PAGE_SIZE); - pde_virt[cpu] = xc_map_foreign_range( - xc_handle, current_domid, PAGE_SIZE, PROT_READ, - pde_phys[cpu] >> PAGE_SHIFT); - if ( pde_virt[cpu] == NULL ) - return NULL; - } - if ( (page = pde_virt[cpu][vtopti(va)]) == 0 ) - return NULL; - if (ctxt[cpu].flags & VGCF_HVM_GUEST) - page = page_array[page >> PAGE_SHIFT] << PAGE_SHIFT; - if ( (page != page_phys[cpu]) || (perm != prev_perm[cpu]) ) - { - page_phys[cpu] = page; - if ( page_virt[cpu] ) - munmap(page_virt[cpu], PAGE_SIZE); - page_virt[cpu] = xc_map_foreign_range( - xc_handle, current_domid, PAGE_SIZE, perm, - page_phys[cpu] >> PAGE_SHIFT); - if ( page_virt[cpu] == NULL ) - { - page_phys[cpu] = 0; - return NULL; - } - prev_perm[cpu] = perm; - } - - return (void *)(((unsigned long)page_virt[cpu]) | (va & BSD_PAGE_MASK)); + unsigned long l2e, l1e, l1p, p, va = (unsigned long)guest_va; + uint32_t *l2, *l1; + static void *v[MAX_VIRT_CPUS]; + + l2 = xc_map_foreign_range( + xc_handle, current_domid, PAGE_SIZE, PROT_READ, + xen_cr3_to_pfn(ctxt[cpu].ctrlreg[3])); + if ( l2 == NULL ) + return NULL; + + l2e = l2[l2_table_offset_i386(va)]; + munmap(l2, PAGE_SIZE); + if ( !(l2e & _PAGE_PRESENT) ) + return NULL; + l1p = to_ma(cpu, l2e); + l1 = xc_map_foreign_range(xc_handle, current_domid, PAGE_SIZE, PROT_READ, l1p >> PAGE_SHIFT); + if ( l1 == NULL ) + return NULL; + + l1e = l1[l1_table_offset_i386(va)]; + munmap(l1, PAGE_SIZE); + if ( !(l1e & _PAGE_PRESENT) ) + return NULL; + p = to_ma(cpu, l1e); + if ( v[cpu] != NULL ) + munmap(v[cpu], PAGE_SIZE); + v[cpu] = xc_map_foreign_range(xc_handle, current_domid, PAGE_SIZE, perm, p >> PAGE_SHIFT); + if ( v[cpu] == NULL ) + return NULL; + + return (void *)((unsigned long)v[cpu] | (va & (PAGE_SIZE - 1))); } @@ -234,39 +226,46 @@ map_domain_va_pae( void *guest_va, int perm) { - unsigned long l2p, l1p, p, va = (unsigned long)guest_va; + unsigned long l3e, l2e, l1e, l2p, l1p, p, va = (unsigned long)guest_va; uint64_t *l3, *l2, *l1; - static void *v; + static void *v[MAX_VIRT_CPUS]; l3 = xc_map_foreign_range( - xc_handle, current_domid, PAGE_SIZE, PROT_READ, ctxt[cpu].ctrlreg[3] >> PAGE_SHIFT); + xc_handle, current_domid, PAGE_SIZE, PROT_READ, + xen_cr3_to_pfn(ctxt[cpu].ctrlreg[3])); if ( l3 == NULL ) return NULL; - l2p = l3[l3_table_offset_pae(va)] >> PAGE_SHIFT; - l2p = page_array[l2p]; - l2 = xc_map_foreign_range(xc_handle, current_domid, PAGE_SIZE, PROT_READ, l2p); + l3e = l3[l3_table_offset_pae(va)]; munmap(l3, PAGE_SIZE); + if ( !(l3e & _PAGE_PRESENT) ) + return NULL; + l2p = to_ma(cpu, l3e); + l2 = xc_map_foreign_range(xc_handle, current_domid, PAGE_SIZE, PROT_READ, l2p >> PAGE_SHIFT); if ( l2 == NULL ) return NULL; - l1p = l2[l2_table_offset_pae(va)] >> PAGE_SHIFT; - l1p = page_array[l1p]; - l1 = xc_map_foreign_range(xc_handle, current_domid, PAGE_SIZE, perm, l1p); + l2e = l2[l2_table_offset_pae(va)]; munmap(l2, PAGE_SIZE); + if ( !(l2e & _PAGE_PRESENT) ) + return NULL; + l1p = to_ma(cpu, l2e); + l1 = xc_map_foreign_range(xc_handle, current_domid, PAGE_SIZE, perm, l1p >> PAGE_SHIFT); if ( l1 == NULL ) return NULL; - p = l1[l1_table_offset_pae(va)] >> PAGE_SHIFT; - p = page_array[p]; - if ( v != NULL ) - munmap(v, PAGE_SIZE); - v = xc_map_foreign_range(xc_handle, current_domid, PAGE_SIZE, perm, p); + l1e = l1[l1_table_offset_pae(va)]; munmap(l1, PAGE_SIZE); - if ( v == NULL ) - return NULL; - - return (void *)((unsigned long)v | (va & (PAGE_SIZE - 1))); + if ( !(l1e & _PAGE_PRESENT) ) + return NULL; + p = to_ma(cpu, l1e); + if ( v[cpu] != NULL ) + munmap(v[cpu], PAGE_SIZE); + v[cpu] = xc_map_foreign_range(xc_handle, current_domid, PAGE_SIZE, perm, p >> PAGE_SHIFT); + if ( v[cpu] == NULL ) + return NULL; + + return (void *)((unsigned long)v[cpu] | (va & (PAGE_SIZE - 1))); } #ifdef __x86_64__ @@ -277,56 +276,65 @@ map_domain_va_64( void *guest_va, int perm) { - unsigned long l3p, l2p, l1p, l1e, p, va = (unsigned long)guest_va; + unsigned long l4e, l3e, l2e, l1e, l3p, l2p, l1p, p, va = (unsigned long)guest_va; uint64_t *l4, *l3, *l2, *l1; - static void *v; + static void *v[MAX_VIRT_CPUS]; + if ((ctxt[cpu].ctrlreg[4] & 0x20) == 0 ) /* legacy ia32 mode */ return map_domain_va_32(xc_handle, cpu, guest_va, perm); - l4 = xc_map_foreign_range( xc_handle, current_domid, PAGE_SIZE, - PROT_READ, ctxt[cpu].ctrlreg[3] >> PAGE_SHIFT); + l4 = xc_map_foreign_range( + xc_handle, current_domid, PAGE_SIZE, PROT_READ, + xen_cr3_to_pfn(ctxt[cpu].ctrlreg[3])); if ( l4 == NULL ) return NULL; - l3p = l4[l4_table_offset(va)] >> PAGE_SHIFT; - l3p = page_array[l3p]; - l3 = xc_map_foreign_range(xc_handle, current_domid, PAGE_SIZE, PROT_READ, l3p); + l4e = l4[l4_table_offset(va)]; munmap(l4, PAGE_SIZE); + if ( !(l4e & _PAGE_PRESENT) ) + return NULL; + l3p = to_ma(cpu, l4e); + l3 = xc_map_foreign_range(xc_handle, current_domid, PAGE_SIZE, PROT_READ, l3p >> PAGE_SHIFT); if ( l3 == NULL ) return NULL; - l2p = l3[l3_table_offset(va)] >> PAGE_SHIFT; - l2p = page_array[l2p]; - l2 = xc_map_foreign_range(xc_handle, current_domid, PAGE_SIZE, PROT_READ, l2p); + l3e = l3[l3_table_offset(va)]; munmap(l3, PAGE_SIZE); + if ( !(l3e & _PAGE_PRESENT) ) + return NULL; + l2p = to_ma(cpu, l3e); + l2 = xc_map_foreign_range(xc_handle, current_domid, PAGE_SIZE, PROT_READ, l2p >> PAGE_SHIFT); if ( l2 == NULL ) return NULL; l1 = NULL; - l1e = l2[l2_table_offset(va)]; - l1p = l1e >> PAGE_SHIFT; - if (l1e & 0x80) { /* 2M pages */ - p = (l1p + l1_table_offset(va)); + l2e = l2[l2_table_offset(va)]; + munmap(l2, PAGE_SIZE); + if ( !(l2e & _PAGE_PRESENT) ) + return NULL; + l1p = to_ma(cpu, l2e); + if (l2e & 0x80) { /* 2M pages */ + p = to_ma(cpu, (l1p + l1_table_offset(va)) << PAGE_SHIFT); } else { /* 4K pages */ - l1p = page_array[l1p]; - l1 = xc_map_foreign_range(xc_handle, current_domid, PAGE_SIZE, perm, l1p); - munmap(l2, PAGE_SIZE); + l1 = xc_map_foreign_range(xc_handle, current_domid, PAGE_SIZE, perm, l1p >> PAGE_SHIFT); if ( l1 == NULL ) return NULL; - p = l1[l1_table_offset(va)] >> PAGE_SHIFT; - } - p = page_array[p]; - if ( v != NULL ) - munmap(v, PAGE_SIZE); - v = xc_map_foreign_range(xc_handle, current_domid, PAGE_SIZE, perm, p); + l1e = l1[l1_table_offset(va)]; + if ( !(l1e & _PAGE_PRESENT) ) + return NULL; + p = to_ma(cpu, l1e); + } + if ( v[cpu] != NULL ) + munmap(v[cpu], PAGE_SIZE); + v[cpu] = xc_map_foreign_range(xc_handle, current_domid, PAGE_SIZE, perm, p >> PAGE_SHIFT); if (l1) munmap(l1, PAGE_SIZE); - if ( v == NULL ) - return NULL; - - return (void *)((unsigned long)v | (va & (PAGE_SIZE - 1))); + if ( v[cpu] == NULL ) + return NULL; + + return (void *)((unsigned long)v[cpu] | (va & (PAGE_SIZE - 1))); } #endif @@ -381,7 +389,7 @@ map_domain_va( if ( v != NULL ) munmap(v, PAGE_SIZE); - page = page_array[va >> PAGE_SHIFT] << PAGE_SHIFT; + page = to_ma(cpu, page_array[va >> PAGE_SHIFT]); v = xc_map_foreign_range( xc_handle, current_domid, PAGE_SIZE, perm, page >> PAGE_SHIFT); diff -r cb1e561583ac -r 17fbffb737d9 tools/libxc/xg_private.h --- a/tools/libxc/xg_private.h Thu Jun 22 14:20:01 2006 +0100 +++ b/tools/libxc/xg_private.h Thu Jun 22 21:41:19 2006 +0100 @@ -48,6 +48,8 @@ unsigned long csum_page (void * page); #define L2_PAGETABLE_SHIFT_PAE 21 #define L3_PAGETABLE_SHIFT_PAE 30 +#define L2_PAGETABLE_SHIFT_I386 22 + #if defined(__i386__) #define L1_PAGETABLE_SHIFT 12 #define L2_PAGETABLE_SHIFT 22 @@ -62,7 +64,10 @@ unsigned long csum_page (void * page); #define L2_PAGETABLE_ENTRIES_PAE 512 #define L3_PAGETABLE_ENTRIES_PAE 4 -#if defined(__i386__) +#define L1_PAGETABLE_ENTRIES_I386 1024 +#define L2_PAGETABLE_ENTRIES_I386 1024 + +#if defined(__i386__) #define L1_PAGETABLE_ENTRIES 1024 #define L2_PAGETABLE_ENTRIES 1024 #elif defined(__x86_64__) @@ -95,6 +100,11 @@ typedef unsigned long l4_pgentry_t; #define l3_table_offset_pae(_a) \ (((_a) >> L3_PAGETABLE_SHIFT_PAE) & (L3_PAGETABLE_ENTRIES_PAE - 1)) +#define l1_table_offset_i386(_a) \ + (((_a) >> L1_PAGETABLE_SHIFT) & (L1_PAGETABLE_ENTRIES_I386 - 1)) +#define l2_table_offset_i386(_a) \ + (((_a) >> L2_PAGETABLE_SHIFT_I386) & (L2_PAGETABLE_ENTRIES_I386 - 1)) + #if defined(__i386__) #define l1_table_offset(_a) \ (((_a) >> L1_PAGETABLE_SHIFT) & (L1_PAGETABLE_ENTRIES - 1)) diff -r cb1e561583ac -r 17fbffb737d9 xen/arch/x86/domain.c --- a/xen/arch/x86/domain.c Thu Jun 22 14:20:01 2006 +0100 +++ b/xen/arch/x86/domain.c Thu Jun 22 21:41:19 2006 +0100 @@ -379,6 +379,11 @@ int arch_set_info_guest( v->arch.flags |= TF_kernel_mode; memcpy(&v->arch.guest_context, c, sizeof(*c)); + + /* Only CR0.TS is modifiable by guest or admin. */ + v->arch.guest_context.ctrlreg[0] &= X86_CR0_TS; + v->arch.guest_context.ctrlreg[0] |= read_cr0() & ~X86_CR0_TS; + init_int80_direct_trap(v); if ( !(c->flags & VGCF_HVM_GUEST) ) _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |