[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-changelog] fix single-stepping



ChangeSet 1.1321, 2005/04/18 23:03:29+01:00, iap10@xxxxxxxxxxxxxxxxxxxxx

        fix single-stepping
        make persistent context per-cpu
        Signed-off-by: Kip Macy <kmacy@xxxxxxxxxxx>
        Signed-off-by: ian@xxxxxxxxxxxxx



 xc_ptrace.c |  185 ++++++++++++++++++++++++++++++++----------------------------
 1 files changed, 101 insertions(+), 84 deletions(-)


diff -Nru a/tools/libxc/xc_ptrace.c b/tools/libxc/xc_ptrace.c
--- a/tools/libxc/xc_ptrace.c   2005-04-18 21:06:18 -04:00
+++ b/tools/libxc/xc_ptrace.c   2005-04-18 21:06:18 -04:00
@@ -10,6 +10,7 @@
 #define PDRSHIFT        22
 #define        PSL_T           0x00000100      /* trace enable bit */
 
+#define VCPU            0               /* XXX */
 
 /*
  * long  
@@ -67,6 +68,17 @@
     long esp;    /* 60 */     
     int  xss;    /* 64 */
 };
+
+#define FETCH_REGS(cpu) \
+    if (!regs_valid[cpu]) \
+    {                \
+       int retval = xc_domain_getfullinfo(xc_handle, domid, cpu, NULL, 
&ctxt[cpu]); \
+       if (retval) \
+           goto error_out; \
+       cr3[cpu] = ctxt[cpu].pt_base; \
+       regs_valid[cpu] = 1; \
+    } \
+
 #define printval(x) printf("%s = %lx\n", #x, (long)x);
 #define SET_PT_REGS(pt, xc) \
 { \
@@ -115,74 +127,70 @@
 /* XXX application state */
 
 
-static int xc_handle;
-static int regs_valid;
-static unsigned long cr3;
-static full_execution_context_t ctxt;
+static int                      xc_handle;
+static int                      regs_valid[MAX_VIRT_CPUS];
+static unsigned long            cr3[MAX_VIRT_CPUS];
+static full_execution_context_t ctxt[MAX_VIRT_CPUS];
+
 
 /* --------------------- */
 
 static void *
-map_domain_va(unsigned long domid, void * guest_va, int perm)
+map_domain_va(unsigned long domid, int cpu, void * guest_va, int perm)
 {
     unsigned long pde, page;
     unsigned long va = (unsigned long)guest_va;
 
-    static unsigned long cr3_phys;
-    static unsigned long *cr3_virt;
-    static unsigned long pde_phys;
-    static unsigned long *pde_virt;
-    static unsigned long page_phys;
-    static unsigned long *page_virt;
+    static unsigned long  cr3_phys[MAX_VIRT_CPUS];
+    static unsigned long *cr3_virt[MAX_VIRT_CPUS];
+    static unsigned long  pde_phys[MAX_VIRT_CPUS];
+    static unsigned long *pde_virt[MAX_VIRT_CPUS];
+    static unsigned long  page_phys[MAX_VIRT_CPUS];
+    static unsigned long *page_virt[MAX_VIRT_CPUS];
     
-    static int prev_perm;
-    if (!regs_valid) 
-    {
-       int retval = xc_domain_getfullinfo(xc_handle, domid, 0, NULL, &ctxt);
-       if (retval)
-           goto error_out;
-       cr3 = ctxt.pt_base;
-       regs_valid = 1;
-    }
-    if (cr3 != cr3_phys) 
+    static int            prev_perm[MAX_VIRT_CPUS];
+
+    FETCH_REGS(cpu);
+
+    if (cr3[cpu] != cr3_phys[cpu]) 
     {
-       cr3_phys = cr3;
-       if (cr3_virt)
-           munmap(cr3_virt, PAGE_SIZE);
-       if ((cr3_virt = xc_map_foreign_range(xc_handle, domid, PAGE_SIZE,
+       cr3_phys[cpu] = cr3[cpu];
+       if (cr3_virt[cpu])
+           munmap(cr3_virt[cpu], PAGE_SIZE);
+       if ((cr3_virt[cpu] = xc_map_foreign_range(xc_handle, domid, PAGE_SIZE,
                                             PROT_READ,
-                                            cr3_phys >> PAGE_SHIFT)) == NULL)
+                                            cr3_phys[cpu] >> PAGE_SHIFT)) == 
NULL)
            goto error_out;
     } 
-    if ((pde = cr3_virt[vtopdi(va)]) == 0)
+    if ((pde = cr3_virt[cpu][vtopdi(va)]) == 0)
        goto error_out;
-    if (pde != pde_phys) 
+    if (pde != pde_phys[cpu]) 
     {
-       pde_phys = pde;
-       if (pde_virt)
-           munmap(pde_virt, PAGE_SIZE);
-       if ((pde_virt = xc_map_foreign_range(xc_handle, domid, PAGE_SIZE,
+       pde_phys[cpu] = pde;
+       if (pde_virt[cpu])
+           munmap(pde_virt[cpu], PAGE_SIZE);
+       if ((pde_virt[cpu] = xc_map_foreign_range(xc_handle, domid, PAGE_SIZE,
                                             PROT_READ,
-                                            pde_phys >> PAGE_SHIFT)) == NULL)
+                                            pde_phys[cpu] >> PAGE_SHIFT)) == 
NULL)
            goto error_out;
     }
-    if ((page = pde_virt[vtopti(va)]) == 0)
+    if ((page = pde_virt[cpu][vtopti(va)]) == 0)
        goto error_out;
-    if (page != page_phys || perm != prev_perm) 
+    if (page != page_phys[cpu] || perm != prev_perm[cpu]) 
     {
-       page_phys = page;
-       if (page_virt)
-           munmap(page_virt, PAGE_SIZE);
-       if ((page_virt = xc_map_foreign_range(xc_handle, domid, PAGE_SIZE,
-                                            perm,
-                                             page_phys >> PAGE_SHIFT)) == 
NULL) {
-           printf("cr3 %lx pde %lx page %lx pti %lx\n", cr3, pde, page, 
vtopti(va));
-           page_phys = 0;
+       page_phys[cpu] = page;
+       if (page_virt[cpu])
+           munmap(page_virt[cpu], PAGE_SIZE);
+       if ((page_virt[cpu] = xc_map_foreign_range(xc_handle, domid, PAGE_SIZE,
+                                             perm,
+                                             page_phys[cpu] >> PAGE_SHIFT)) == 
NULL) {
+           printf("cr3 %lx pde %lx page %lx pti %lx\n", cr3[cpu], pde, page, 
vtopti(va));
+           page_phys[cpu] = 0;
            goto error_out;
        }
-       prev_perm = perm;
+       prev_perm[cpu] = perm;
     }  
-    return (void *)(((unsigned long)page_virt) | (va & BSD_PAGE_MASK));
+    return (void *)(((unsigned long)page_virt[cpu]) | (va & BSD_PAGE_MASK));
 
  error_out:
     return 0;
@@ -231,14 +239,14 @@
 }
 
 long
-xc_ptrace(enum __ptrace_request request, pid_t pid, void *addr, void *data)
+xc_ptrace(enum __ptrace_request request, pid_t domid, void *addr, void *data)
 {
-    dom0_op_t op;
-    int status = 0;
-    xc_domaininfo_t info;
+    dom0_op_t       op;
+    int             status = 0;
     struct gdb_regs pt;
-    long retval = 0;
-    unsigned long *guest_va;
+    long            retval = 0;
+    unsigned long  *guest_va;
+    int             cpu = VCPU;
 
     op.interface_version = DOM0_INTERFACE_VERSION;
     
@@ -246,23 +254,23 @@
        if ((xc_handle = xc_interface_open()) < 0)
            return -1;
 #if 0
-    printf("%20s %d, %p, %p \n", ptrace_names[request], pid, addr, data);
+    printf("%20s %d, %p, %p \n", ptrace_names[request], domid, addr, data);
 #endif
     switch (request) { 
     case PTRACE_PEEKTEXT:
     case PTRACE_PEEKDATA:
-       if ((guest_va = (unsigned long *)map_domain_va(pid, addr, PROT_READ)) 
== NULL) {
+       if ((guest_va = (unsigned long *)map_domain_va(domid, cpu, addr, 
PROT_READ)) == NULL) {
            status = EFAULT;
-           goto done;
+           goto error_out;
        }
 
        retval = *guest_va;
        break;
     case PTRACE_POKETEXT:
     case PTRACE_POKEDATA:
-       if ((guest_va = (unsigned long *)map_domain_va(pid, addr, 
PROT_READ|PROT_WRITE)) == NULL) {
+       if ((guest_va = (unsigned long *)map_domain_va(domid, cpu, addr, 
PROT_READ|PROT_WRITE)) == NULL) {
            status = EFAULT;
-           goto done;
+           goto error_out;
        }
 
        *guest_va = (unsigned long)data;
@@ -270,70 +278,79 @@
     case PTRACE_GETREGS:
     case PTRACE_GETFPREGS:
     case PTRACE_GETFPXREGS:
-       /* XXX hard-coding UP */
-       retval = xc_domain_getfullinfo(xc_handle, pid, 0, &info, &ctxt);
+       FETCH_REGS(cpu);
 
-       if (retval) {
-           printf("getfullinfo failed\n");
-           goto done;
-       }
        if (request == PTRACE_GETREGS) {
-               SET_PT_REGS(pt, ctxt.cpu_ctxt); 
+               SET_PT_REGS(pt, ctxt[cpu].cpu_ctxt); 
                memcpy(data, &pt, sizeof(elf_gregset_t));
        } else if (request == PTRACE_GETFPREGS)
-           memcpy(data, &ctxt.fpu_ctxt, sizeof(ctxt.fpu_ctxt));
+           memcpy(data, &ctxt[cpu].fpu_ctxt, sizeof(ctxt[cpu].fpu_ctxt));
        else /*if (request == PTRACE_GETFPXREGS)*/
-           memcpy(data, &ctxt.fpu_ctxt, sizeof(ctxt.fpu_ctxt));
-       cr3 = ctxt.pt_base;
-       regs_valid = 1;
+           memcpy(data, &ctxt[cpu].fpu_ctxt, sizeof(ctxt[cpu].fpu_ctxt));
        break;
     case PTRACE_SETREGS:
        op.cmd = DOM0_SETDOMAININFO;
-       SET_XC_REGS(((struct gdb_regs *)data), ctxt.cpu_ctxt);
-       op.u.setdomaininfo.domain = pid;
+       SET_XC_REGS(((struct gdb_regs *)data), ctxt[VCPU].cpu_ctxt);
+       op.u.setdomaininfo.domain = domid;
        /* XXX need to understand multiple exec_domains */
-       op.u.setdomaininfo.exec_domain = 0;
-       op.u.setdomaininfo.ctxt = &ctxt;
+       op.u.setdomaininfo.exec_domain = cpu;
+       op.u.setdomaininfo.ctxt = &ctxt[cpu];
        retval = do_dom0_op(xc_handle, &op);
        if (retval)
-           goto done;
+           goto error_out;
 
        break;
     case PTRACE_ATTACH:
        op.cmd = DOM0_GETDOMAININFO;
-       op.u.getdomaininfo.domain = pid;
+       op.u.getdomaininfo.domain = domid;
        op.u.getdomaininfo.exec_domain = 0;
-       op.u.getdomaininfo.ctxt = &ctxt;
+       op.u.getdomaininfo.ctxt = NULL;
        retval = do_dom0_op(xc_handle, &op);
        if (retval) {
            perror("dom0 op failed");
-           goto done;
+           goto error_out;
        }

_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.