diff -r 9611a5c9e1a1 tools/debugger/gdb/gdbbuild --- a/tools/debugger/gdb/gdbbuild Thu Aug 31 13:12:26 2006 +0900 +++ b/tools/debugger/gdb/gdbbuild Thu Aug 31 18:54:02 2006 +0900 @@ -2,7 +2,7 @@ [ "$GDB_MIRROR" ] || GDB_MIRROR="ftp://ftp.gnu.org/gnu/gdb/" -rm -rf gdb-6.2.1 gdb-6.2.1-linux-i386-xen +rm -rf gdb-6.2.1 gdb-6.2.1-linux-xen [ -a gdb-6.2.1.tar.bz2 ] || wget -c "$GDB_MIRROR/gdb-6.2.1.tar.bz2" tar xjf gdb-6.2.1.tar.bz2 @@ -10,8 +10,8 @@ bash ./mkbuildtree ../gdb-6.2.1 bash ./mkbuildtree ../gdb-6.2.1 cd .. -mkdir gdb-6.2.1-linux-i386-xen -cd gdb-6.2.1-linux-i386-xen +mkdir gdb-6.2.1-linux-xen +cd gdb-6.2.1-linux-xen ../gdb-6.2.1/configure # Use $MAKE if set, else use gmake if present, otherwise use make diff -r 9611a5c9e1a1 tools/libxc/xc_ptrace_core.c --- a/tools/libxc/xc_ptrace_core.c Thu Aug 31 13:12:26 2006 +0900 +++ b/tools/libxc/xc_ptrace_core.c Thu Aug 31 18:54:02 2006 +0900 @@ -9,9 +9,8 @@ /* XXX application state */ -static long nr_pages = 0; +static unsigned long nr_pages = 0; static unsigned long *p2m_array = NULL; -static unsigned long *m2p_array = NULL; static unsigned long pages_offset; static unsigned long cr3[MAX_VIRT_CPUS]; @@ -20,11 +19,18 @@ static unsigned long static unsigned long map_mtop_offset(unsigned long ma) { - return pages_offset + (m2p_array[ma >> PAGE_SHIFT] << PAGE_SHIFT); - return 0; -} - - + + unsigned long page_num; + for(page_num=0; page_num > PAGE_SHIFT) == p2m_array[page_num]) + break; + } + + return pages_offset + (page_num << PAGE_SHIFT); +} + + +#if defined(__i386__) void * map_domain_va_core(unsigned long domfd, int cpu, void * guest_va, vcpu_guest_context_t *ctxt) @@ -93,6 +99,116 @@ map_domain_va_core(unsigned long domfd, } return (void *)(((unsigned long)page_virt[cpu]) | (va & BSD_PAGE_MASK)); } + +#elif defined(__x86_64__) +void * +map_domain_va_core(unsigned long domfd, int cpu, void * guest_va, + vcpu_guest_context_t *ctxt) +{ + unsigned long pgd, pud, pmd, page; + unsigned long va = (unsigned long)guest_va; + void *v; + + static unsigned long cr3_phys[MAX_VIRT_CPUS]; + static unsigned long *cr3_virt[MAX_VIRT_CPUS]; + static unsigned long pgd_phys[MAX_VIRT_CPUS]; + static unsigned long *pgd_virt[MAX_VIRT_CPUS]; + static unsigned long pud_phys[MAX_VIRT_CPUS]; + static unsigned long *pud_virt[MAX_VIRT_CPUS]; + static unsigned long pmd_phys[MAX_VIRT_CPUS]; + static unsigned long *pmd_virt[MAX_VIRT_CPUS]; + static unsigned long page_phys[MAX_VIRT_CPUS]; + static unsigned long *page_virt[MAX_VIRT_CPUS]; + + if (cr3[cpu] != cr3_phys[cpu]) + { + cr3_phys[cpu] = cr3[cpu]; + if (cr3_virt[cpu]) + munmap(cr3_virt[cpu], PAGE_SIZE); + v = mmap( + NULL, PAGE_SIZE, PROT_READ, MAP_PRIVATE, domfd, + map_mtop_offset(xen_cr3_to_pfn(cr3_phys[cpu]))); + if (v == MAP_FAILED) + { + perror("mmap failed"); + return NULL; + } + cr3_virt[cpu] = v; + } + + /* 4 level */ + if ((pgd = cr3_virt[cpu][l4_table_offset(va)]) == 0) /* logical address */ + return NULL; + if (pgd != pgd_phys[cpu]) + { + pgd_phys[cpu] = pgd; + if (pgd_virt[cpu]) + munmap(pgd_virt[cpu], PAGE_SIZE); + v = mmap( + NULL, PAGE_SIZE, PROT_READ, MAP_PRIVATE, domfd, + map_mtop_offset(pgd_phys[cpu])); + if (v == MAP_FAILED) + return NULL; + pgd_virt[cpu] = v; + } + + /* 3 level */ + if ((pud = pgd_virt[cpu][l3_table_offset(va)]) == 0) /* logical address */ + return NULL; + if (pud != pud_phys[cpu]) + { + pud_phys[cpu] = pud; + if (pud_virt[cpu]) + munmap(pud_virt[cpu], PAGE_SIZE); + v = mmap( + NULL, PAGE_SIZE, PROT_READ, MAP_PRIVATE, domfd, + map_mtop_offset(pud_phys[cpu])); + if (v == MAP_FAILED) + return NULL; + pud_virt[cpu] = v; + } + + + /* 2 level */ + if ((pmd = pud_virt[cpu][l2_table_offset(va)]) == 0) /* logical address */ + return NULL; + if (pmd != pmd_phys[cpu]) + { + pmd_phys[cpu] = pmd; + if (pmd_virt[cpu]) + munmap(pmd_virt[cpu], PAGE_SIZE); + v = mmap( + NULL, PAGE_SIZE, PROT_READ, MAP_PRIVATE, domfd, + map_mtop_offset(pmd_phys[cpu])); + if (v == MAP_FAILED) + return NULL; + pmd_virt[cpu] = v; + } + + + if ((page = pmd_virt[cpu][l1_table_offset(va)]) == 0) /* logical address */ + return NULL; + if (ctxt[cpu].flags & VGCF_HVM_GUEST) + page = p2m_array[page >> PAGE_SHIFT] << PAGE_SHIFT; + if (page != page_phys[cpu]) + { + page_phys[cpu] = page; + if (page_virt[cpu]) + munmap(page_virt[cpu], PAGE_SIZE); + v = mmap( + NULL, PAGE_SIZE, PROT_READ, MAP_PRIVATE, domfd, + map_mtop_offset(page_phys[cpu])); + if (v == MAP_FAILED) + { + IPRINTF("cr3 %lx pmd %lx page %lx pti %lx\n", cr3[cpu], pmd, page, l1_table_offset(va)); + page_phys[cpu] = 0; + return NULL; + } + page_virt[cpu] = v; + } + return (void *)(((unsigned long)page_virt[cpu]) | (va & BSD_PAGE_MASK)); +} +#endif int xc_waitdomain_core( @@ -140,15 +256,6 @@ xc_waitdomain_core( sizeof(unsigned long)*nr_pages) return -1; - if ((m2p_array = malloc((1<<20) * sizeof(unsigned long))) == NULL) - { - IPRINTF("Could not allocate m2p array\n"); - return -1; - } - bzero(m2p_array, sizeof(unsigned long)* 1 << 20); - - for (i = 0; i < nr_pages; i++) - m2p_array[p2m_array[i]] = i; } return 0; }