From: Akio Takebe Subject: [Patch][RFC] fix xc_ptrace_core for gdbserver-xen on x86_64. Date: Fri, 25 Aug 2006 12:22:21 +0900 Message-ID: <52C6C7F5AD6922takebe_akio@jp.fujitsu.com> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="Boundary-G9PDvjv0RFFDoFbjoZ5Up" Return-path: List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xensource.com Errors-To: xen-devel-bounces@lists.xensource.com To: xen-devel@lists.xensource.com, Kip Macy List-Id: xen-devel@lists.xenproject.org --Boundary-G9PDvjv0RFFDoFbjoZ5Up Content-Type: text/plain; charset=iso-2022-jp Content-Transfer-Encoding: 7bit Content-Description: Mail message body Hi, x86_64 people I make a patch to fix xc_ptrace_core for gdbserver-xen on x86_64. But I'm not familiar with x86_64. Please review it. Signed-off-by: Akio Takebe diff -r b688d4a68a3e tools/libxc/xc_ptrace_core.c --- a/tools/libxc/xc_ptrace_core.c Tue Aug 22 14:59:16 2006 +0100 +++ b/tools/libxc/xc_ptrace_core.c Fri Aug 25 12:22:19 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,122 @@ 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 (ctxt[cpu].flags & VGCF_HVM_GUEST) + pgd = p2m_array[pgd >> PAGE_SHIFT] << PAGE_SHIFT; + 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 (ctxt[cpu].flags & VGCF_HVM_GUEST) + pud = p2m_array[pud >> PAGE_SHIFT] << PAGE_SHIFT; + 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 (ctxt[cpu].flags & VGCF_HVM_GUEST) + pmd = p2m_array[pmd >> PAGE_SHIFT] << PAGE_SHIFT; + 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 +262,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; } Best Regards, Akio Takebe --Boundary-G9PDvjv0RFFDoFbjoZ5Up Content-Type: application/octet-stream; name="fix_xc_ptrace_core.patch" Content-Disposition: attachment; filename="fix_xc_ptrace_core.patch" Content-Transfer-Encoding: base64 ZGlmZiAtciBiNjg4ZDRhNjhhM2UgdG9vbHMvbGlieGMveGNfcHRyYWNlX2NvcmUuYwotLS0g YS90b29scy9saWJ4Yy94Y19wdHJhY2VfY29yZS5jCVR1ZSBBdWcgMjIgMTQ6NTk6MTYgMjAw NiArMDEwMAorKysgYi90b29scy9saWJ4Yy94Y19wdHJhY2VfY29yZS5jCUZyaSBBdWcgMjUg MTI6MjI6MTkgMjAwNiArMDkwMApAQCAtOSw5ICs5LDggQEAKIAogLyogWFhYIGFwcGxpY2F0 aW9uIHN0YXRlICovCiAKLXN0YXRpYyBsb25nICAgbnJfcGFnZXMgPSAwOworc3RhdGljIHVu c2lnbmVkIGxvbmcgICBucl9wYWdlcyA9IDA7CiBzdGF0aWMgdW5zaWduZWQgbG9uZyAgKnAy bV9hcnJheSA9IE5VTEw7Ci1zdGF0aWMgdW5zaWduZWQgbG9uZyAgKm0ycF9hcnJheSA9IE5V TEw7CiBzdGF0aWMgdW5zaWduZWQgbG9uZyAgIHBhZ2VzX29mZnNldDsKIHN0YXRpYyB1bnNp Z25lZCBsb25nICAgY3IzW01BWF9WSVJUX0NQVVNdOwogCkBAIC0yMCwxMSArMTksMTggQEAg c3RhdGljIHVuc2lnbmVkIGxvbmcKIHN0YXRpYyB1bnNpZ25lZCBsb25nCiBtYXBfbXRvcF9v ZmZzZXQodW5zaWduZWQgbG9uZyBtYSkKIHsKLSAgICByZXR1cm4gcGFnZXNfb2Zmc2V0ICsg KG0ycF9hcnJheVttYSA+PiBQQUdFX1NISUZUXSA8PCBQQUdFX1NISUZUKTsKLSAgICByZXR1 cm4gMDsKLX0KLQotCisKKyAgICB1bnNpZ25lZCBsb25nIHBhZ2VfbnVtOworICAgIGZvcihw YWdlX251bT0wOyBwYWdlX251bSA8bnJfcGFnZXM7IHBhZ2VfbnVtKyspeworICAgICAgICBp ZigobWEgPj4gUEFHRV9TSElGVCkgPT0gcDJtX2FycmF5W3BhZ2VfbnVtXSkKKwkJYnJlYWs7 CisgICAgfQorCisgICAgcmV0dXJuIHBhZ2VzX29mZnNldCArIChwYWdlX251bSA8PCBQQUdF X1NISUZUKTsKK30KKworCisjaWYgZGVmaW5lZChfX2kzODZfXykKIHZvaWQgKgogbWFwX2Rv bWFpbl92YV9jb3JlKHVuc2lnbmVkIGxvbmcgZG9tZmQsIGludCBjcHUsIHZvaWQgKiBndWVz dF92YSwKICAgICAgICAgICAgICAgICAgICAgICAgIHZjcHVfZ3Vlc3RfY29udGV4dF90ICpj dHh0KQpAQCAtOTMsNiArOTksMTIyIEBAIG1hcF9kb21haW5fdmFfY29yZSh1bnNpZ25lZCBs b25nIGRvbWZkLCAKICAgICB9CiAgICAgcmV0dXJuICh2b2lkICopKCgodW5zaWduZWQgbG9u ZylwYWdlX3ZpcnRbY3B1XSkgfCAodmEgJiBCU0RfUEFHRV9NQVNLKSk7CiB9CisKKyNlbGlm IGRlZmluZWQoX194ODZfNjRfXykKK3ZvaWQgKgorbWFwX2RvbWFpbl92YV9jb3JlKHVuc2ln bmVkIGxvbmcgZG9tZmQsIGludCBjcHUsIHZvaWQgKiBndWVzdF92YSwKKyAgICAgICAgICAg ICAgICAgICAgICAgIHZjcHVfZ3Vlc3RfY29udGV4dF90ICpjdHh0KQoreworICAgIHVuc2ln bmVkIGxvbmcgcGdkLCBwdWQsIHBtZCwgcGFnZTsKKyAgICB1bnNpZ25lZCBsb25nIHZhID0g KHVuc2lnbmVkIGxvbmcpZ3Vlc3RfdmE7CisgICAgdm9pZCAqdjsKKworICAgIHN0YXRpYyB1 bnNpZ25lZCBsb25nICBjcjNfcGh5c1tNQVhfVklSVF9DUFVTXTsKKyAgICBzdGF0aWMgdW5z aWduZWQgbG9uZyAqY3IzX3ZpcnRbTUFYX1ZJUlRfQ1BVU107CisgICAgc3RhdGljIHVuc2ln bmVkIGxvbmcgIHBnZF9waHlzW01BWF9WSVJUX0NQVVNdOworICAgIHN0YXRpYyB1bnNpZ25l ZCBsb25nICpwZ2RfdmlydFtNQVhfVklSVF9DUFVTXTsKKyAgICBzdGF0aWMgdW5zaWduZWQg bG9uZyAgcHVkX3BoeXNbTUFYX1ZJUlRfQ1BVU107CisgICAgc3RhdGljIHVuc2lnbmVkIGxv bmcgKnB1ZF92aXJ0W01BWF9WSVJUX0NQVVNdOworICAgIHN0YXRpYyB1bnNpZ25lZCBsb25n ICBwbWRfcGh5c1tNQVhfVklSVF9DUFVTXTsKKyAgICBzdGF0aWMgdW5zaWduZWQgbG9uZyAq cG1kX3ZpcnRbTUFYX1ZJUlRfQ1BVU107CisgICAgc3RhdGljIHVuc2lnbmVkIGxvbmcgIHBh Z2VfcGh5c1tNQVhfVklSVF9DUFVTXTsKKyAgICBzdGF0aWMgdW5zaWduZWQgbG9uZyAqcGFn ZV92aXJ0W01BWF9WSVJUX0NQVVNdOworCisgICAgaWYgKGNyM1tjcHVdICE9IGNyM19waHlz W2NwdV0pCisgICAgeworICAgICAgICBjcjNfcGh5c1tjcHVdID0gY3IzW2NwdV07CisgICAg ICAgIGlmIChjcjNfdmlydFtjcHVdKQorICAgICAgICAgICAgbXVubWFwKGNyM192aXJ0W2Nw dV0sIFBBR0VfU0laRSk7CisgICAgICAgIHYgPSBtbWFwKAorICAgICAgICAgICAgTlVMTCwg UEFHRV9TSVpFLCBQUk9UX1JFQUQsIE1BUF9QUklWQVRFLCBkb21mZCwKKyAgICAgICAgICAg IG1hcF9tdG9wX29mZnNldCh4ZW5fY3IzX3RvX3BmbihjcjNfcGh5c1tjcHVdKSkpOworICAg ICAgICBpZiAodiA9PSBNQVBfRkFJTEVEKQorICAgICAgICB7CisgICAgICAgICAgICBwZXJy b3IoIm1tYXAgZmFpbGVkIik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAg fQorICAgICAgICBjcjNfdmlydFtjcHVdID0gdjsKKyAgICB9CisKKyAgICAvKiA0IGxldmVs ICovCisgICAgaWYgKChwZ2QgPSBjcjNfdmlydFtjcHVdW2w0X3RhYmxlX29mZnNldCh2YSld KSA9PSAwKSAvKiBsb2dpY2FsIGFkZHJlc3MgKi8KKyAgICAgICAgcmV0dXJuIE5VTEw7Cisg ICAgaWYgKGN0eHRbY3B1XS5mbGFncyAmIFZHQ0ZfSFZNX0dVRVNUKQorICAgICAgICBwZ2Qg PSBwMm1fYXJyYXlbcGdkID4+IFBBR0VfU0hJRlRdIDw8IFBBR0VfU0hJRlQ7CisgICAgaWYg KHBnZCAhPSBwZ2RfcGh5c1tjcHVdKQorICAgIHsKKyAgICAgICAgcGdkX3BoeXNbY3B1XSA9 IHBnZDsKKyAgICAgICAgaWYgKHBnZF92aXJ0W2NwdV0pCisgICAgICAgICAgICBtdW5tYXAo cGdkX3ZpcnRbY3B1XSwgUEFHRV9TSVpFKTsKKyAgICAgICAgdiA9IG1tYXAoCisgICAgICAg ICAgICBOVUxMLCBQQUdFX1NJWkUsIFBST1RfUkVBRCwgTUFQX1BSSVZBVEUsIGRvbWZkLAor ICAgICAgICAgICAgbWFwX210b3Bfb2Zmc2V0KHBnZF9waHlzW2NwdV0pKTsKKyAgICAgICAg aWYgKHYgPT0gTUFQX0ZBSUxFRCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAg ICBwZ2RfdmlydFtjcHVdID0gdjsKKyAgICB9CisKKyAgICAvKiAzIGxldmVsICovCisgICAg aWYgKChwdWQgPSBwZ2RfdmlydFtjcHVdW2wzX3RhYmxlX29mZnNldCh2YSldKSA9PSAwKSAv KiBsb2dpY2FsIGFkZHJlc3MgKi8KKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKGN0 eHRbY3B1XS5mbGFncyAmIFZHQ0ZfSFZNX0dVRVNUKQorICAgICAgICBwdWQgPSBwMm1fYXJy YXlbcHVkID4+IFBBR0VfU0hJRlRdIDw8IFBBR0VfU0hJRlQ7CisgICAgaWYgKHB1ZCAhPSBw dWRfcGh5c1tjcHVdKQorICAgIHsKKyAgICAgICAgcHVkX3BoeXNbY3B1XSA9IHB1ZDsKKyAg ICAgICAgaWYgKHB1ZF92aXJ0W2NwdV0pCisgICAgICAgICAgICBtdW5tYXAocHVkX3ZpcnRb Y3B1XSwgUEFHRV9TSVpFKTsKKyAgICAgICAgdiA9IG1tYXAoCisgICAgICAgICAgICBOVUxM LCBQQUdFX1NJWkUsIFBST1RfUkVBRCwgTUFQX1BSSVZBVEUsIGRvbWZkLAorICAgICAgICAg ICAgbWFwX210b3Bfb2Zmc2V0KHB1ZF9waHlzW2NwdV0pKTsKKyAgICAgICAgaWYgKHYgPT0g TUFQX0ZBSUxFRCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBwdWRfdmly dFtjcHVdID0gdjsKKyAgICB9CisKKworICAgIC8qIDIgbGV2ZWwgKi8KKyAgICBpZiAoKHBt ZCA9IHB1ZF92aXJ0W2NwdV1bbDJfdGFibGVfb2Zmc2V0KHZhKV0pID09IDApIC8qIGxvZ2lj YWwgYWRkcmVzcyAqLworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoY3R4dFtjcHVd LmZsYWdzICYgVkdDRl9IVk1fR1VFU1QpCisgICAgICAgIHBtZCA9IHAybV9hcnJheVtwbWQg Pj4gUEFHRV9TSElGVF0gPDwgUEFHRV9TSElGVDsKKyAgICBpZiAocG1kICE9IHBtZF9waHlz W2NwdV0pCisgICAgeworICAgICAgICBwbWRfcGh5c1tjcHVdID0gcG1kOworICAgICAgICBp ZiAocG1kX3ZpcnRbY3B1XSkKKyAgICAgICAgICAgIG11bm1hcChwbWRfdmlydFtjcHVdLCBQ QUdFX1NJWkUpOworICAgICAgICB2ID0gbW1hcCgKKyAgICAgICAgICAgIE5VTEwsIFBBR0Vf U0laRSwgUFJPVF9SRUFELCBNQVBfUFJJVkFURSwgZG9tZmQsCisgICAgICAgICAgICBtYXBf bXRvcF9vZmZzZXQocG1kX3BoeXNbY3B1XSkpOworICAgICAgICBpZiAodiA9PSBNQVBfRkFJ TEVEKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIHBtZF92aXJ0W2NwdV0g PSB2OworICAgIH0KKworCisgICAgaWYgKChwYWdlID0gcG1kX3ZpcnRbY3B1XVtsMV90YWJs ZV9vZmZzZXQodmEpXSkgPT0gMCkgLyogbG9naWNhbCBhZGRyZXNzICovCisgICAgICAgIHJl dHVybiBOVUxMOworICAgIGlmIChjdHh0W2NwdV0uZmxhZ3MgJiBWR0NGX0hWTV9HVUVTVCkK KyAgICAgICAgcGFnZSA9IHAybV9hcnJheVtwYWdlID4+IFBBR0VfU0hJRlRdIDw8IFBBR0Vf U0hJRlQ7CisgICAgaWYgKHBhZ2UgIT0gcGFnZV9waHlzW2NwdV0pCisgICAgeworICAgICAg ICBwYWdlX3BoeXNbY3B1XSA9IHBhZ2U7CisgICAgICAgIGlmIChwYWdlX3ZpcnRbY3B1XSkK KyAgICAgICAgICAgIG11bm1hcChwYWdlX3ZpcnRbY3B1XSwgUEFHRV9TSVpFKTsKKyAgICAg ICAgdiA9IG1tYXAoCisgICAgICAgICAgICBOVUxMLCBQQUdFX1NJWkUsIFBST1RfUkVBRCwg TUFQX1BSSVZBVEUsIGRvbWZkLAorICAgICAgICAgICAgbWFwX210b3Bfb2Zmc2V0KHBhZ2Vf cGh5c1tjcHVdKSk7CisgICAgICAgIGlmICh2ID09IE1BUF9GQUlMRUQpCisgICAgICAgIHsK KyAgICAgICAgICAgIElQUklOVEYoImNyMyAlbHggcG1kICVseCBwYWdlICVseCBwdGkgJWx4 XG4iLCBjcjNbY3B1XSwgcG1kLCBwYWdlLCBsMV90YWJsZV9vZmZzZXQodmEpKTsKKyAgICAg ICAgICAgIHBhZ2VfcGh5c1tjcHVdID0gMDsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOwor ICAgICAgICB9CisgICAgICAgIHBhZ2VfdmlydFtjcHVdID0gdjsKKyAgICB9CisgICAgcmV0 dXJuICh2b2lkICopKCgodW5zaWduZWQgbG9uZylwYWdlX3ZpcnRbY3B1XSkgfCAodmEgJiBC U0RfUEFHRV9NQVNLKSk7Cit9CisjZW5kaWYKIAogaW50CiB4Y193YWl0ZG9tYWluX2NvcmUo CkBAIC0xNDAsMTUgKzI2Miw2IEBAIHhjX3dhaXRkb21haW5fY29yZSgKICAgICAgICAgICAg IHNpemVvZih1bnNpZ25lZCBsb25nKSpucl9wYWdlcykKICAgICAgICAgICAgIHJldHVybiAt MTsKIAotICAgICAgICBpZiAoKG0ycF9hcnJheSA9IG1hbGxvYygoMTw8MjApICogc2l6ZW9m KHVuc2lnbmVkIGxvbmcpKSkgPT0gTlVMTCkKLSAgICAgICAgewotICAgICAgICAgICAgSVBS SU5URigiQ291bGQgbm90IGFsbG9jYXRlIG0ycCBhcnJheVxuIik7Ci0gICAgICAgICAgICBy ZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICAgICAgYnplcm8obTJwX2FycmF5LCBzaXplb2Yo dW5zaWduZWQgbG9uZykqIDEgPDwgMjApOwotCi0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBu cl9wYWdlczsgaSsrKQotICAgICAgICAgICAgbTJwX2FycmF5W3AybV9hcnJheVtpXV0gPSBp OwogICAgIH0KICAgICByZXR1cm4gMDsKIH0K --Boundary-G9PDvjv0RFFDoFbjoZ5Up 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 --Boundary-G9PDvjv0RFFDoFbjoZ5Up--