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

[Xen-changelog] Consolidate xc_ptrace and xc_ptrace_core



# HG changeset patch
# User kaf24@xxxxxxxxxxxxxxxxxxxx
# Node ID 8ed131452f277aca9cdd2f0d01c77ea8a8b49bfb
# Parent  26eff2448966a9e25f6776fe56a88a0acddc35c2
Consolidate xc_ptrace and xc_ptrace_core

* xc_ptrace
  - Merge xc_ptrace_core into xc_ptrace
  - ATTACH now reads the data argument. If non-zero then
    a corefile is being debuged. Otherwise a thread has
    been attached to. This allows xc_waitdomain_core() or
    xc_waitdomain() to be called as appropriate in
    subsequent xc_ptrace() calls.
* xc_waitdomain
  - Rename xc_waitdomain (xc_ptrace.c version) __xc_waitdomain
  - Rename xc_waitdomain (xc_ptrace_core.c version) xc_waitdomain_core
  - Create xc_waitdomain (in xc_ptrace.c), a wrapper for __xc_waitdomain
    and xc_waitdomain_core.
  Consolidation seemed difficult but ctxt needs to be
  passed into xc_waitdomain_core or made global.
  Alternatively, xc_waitdomain_core could be moved into xc_ptrace.c,
  but this seems messy.
* map_domain_va
  - Rename map_domain_va (xc_ptrace_core.c version) map_domain_va_core
  - Have it accept ctxt, like xc_waitdomain_core
* myptrace and myxcwait (linux-xen-low.c)
  Removed, call the now generic xc_ptrace() and xc_waitdomain() instead

When calling xc_ptrace ATTACH, if a corefile is in use, a fd will
be passed, otherwise a pid. The fd part is important, as this
is saved internally in xc_ptrace_core.c, and passed to xc_waitdomain_core()
as neccessary. Pereviously xc_waitdomain_core() received a pid and
thus could not open the corefile.

Signed-Off-By: Horms <horms@xxxxxxxxxxxx>

diff -r 26eff2448966 -r 8ed131452f27 
tools/debugger/gdb/gdb-6.2.1-xen-sparse/gdb/gdbserver/linux-xen-low.c
--- a/tools/debugger/gdb/gdb-6.2.1-xen-sparse/gdb/gdbserver/linux-xen-low.c     
Mon Mar  6 11:05:44 2006
+++ b/tools/debugger/gdb/gdb-6.2.1-xen-sparse/gdb/gdbserver/linux-xen-low.c     
Mon Mar  6 11:06:55 2006
@@ -41,8 +41,6 @@
 
 #define TRACE_ENTER /* printf("enter %s\n", __FUNCTION__) */
 
-long (*myptrace)(int xc_handle, enum __ptrace_request, uint32_t, long, long);
-int (*myxcwait)(int xc_handle, int domain, int *status, int options) ;
 static int xc_handle;
 
 static inline int
@@ -170,7 +168,7 @@
     add_thread (0, new_process);
     new_process->stop_expected = 0;
 
-    if (myptrace (xc_handle, PTRACE_ATTACH, domid, 0, 0) != 0) {
+    if (xc_ptrace (xc_handle, PTRACE_ATTACH, domid, 0, isfile) != 0) {
        fprintf (stderr, "Cannot attach to domain %d: %s (%d)\n", domid,
                 strerror (errno), errno);
        fflush (stderr);
@@ -188,7 +186,7 @@
 {
   struct thread_info *thread = (struct thread_info *) entry;
   struct process_info *process = get_thread_process (thread);
-  myptrace (xc_handle, PTRACE_KILL, pid_of (process), 0, 0);
+  xc_ptrace (xc_handle, PTRACE_KILL, pid_of (process), 0, 0);
 }
 
 
@@ -202,7 +200,7 @@
 linux_detach_one_process (struct inferior_list_entry *entry)
 {
 
-  myptrace (xc_handle, PTRACE_DETACH, current_domid, 0, 0);
+  xc_ptrace (xc_handle, PTRACE_DETACH, current_domid, 0, 0);
 }
 
 
@@ -228,7 +226,7 @@
 linux_wait (char *status)
 {
   int w;
-  if (myxcwait(xc_handle, current_domid, &w, 0))
+  if (xc_waitdomain(xc_handle, current_domid, &w, 0))
       return -1;
   
   linux_set_inferior();
@@ -250,7 +248,7 @@
   for_each_inferior(&all_threads, regcache_invalidate_one);
   if (debug_threads)
     fprintf(stderr, "step: %d\n", step);
-  myptrace (xc_handle, step ? PTRACE_SINGLESTEP : PTRACE_CONT, 
+  xc_ptrace (xc_handle, step ? PTRACE_SINGLESTEP : PTRACE_CONT, 
            resume_info->thread, 0, 0);
 
 }
@@ -275,7 +273,7 @@
        }
 
       buf = malloc (regset->size);
-      res = myptrace (xc_handle, regset->get_request, 
+      res = xc_ptrace (xc_handle, regset->get_request, 
                      curvcpuid(),
                      0, (PTRACE_XFER_TYPE)buf);
       if (res < 0)
@@ -329,7 +327,7 @@
 
       buf = malloc (regset->size);
       regset->fill_function (buf);
-      res = myptrace (xc_handle, regset->set_request, curvcpuid(), 0, 
(PTRACE_XFER_TYPE)buf);
+      res = xc_ptrace (xc_handle, regset->set_request, curvcpuid(), 0, 
(PTRACE_XFER_TYPE)buf);
       if (res < 0)
        {
          if (errno == EIO)
@@ -407,7 +405,7 @@
   for (i = 0; i < count; i++, addr += sizeof (PTRACE_XFER_TYPE))
     {
       errno = 0;
-      buffer[i] = myptrace (xc_handle, PTRACE_PEEKTEXT, curvcpuid(), 
(PTRACE_ARG3_TYPE) addr, 0);
+      buffer[i] = xc_ptrace (xc_handle, PTRACE_PEEKTEXT, curvcpuid(), 
(PTRACE_ARG3_TYPE) addr, 0);
       if (errno)
        return errno;
     }
@@ -440,13 +438,13 @@
 
   /* Fill start and end extra bytes of buffer with existing memory data.  */
 
-  buffer[0] = myptrace (xc_handle, PTRACE_PEEKTEXT, curvcpuid(),
+  buffer[0] = xc_ptrace (xc_handle, PTRACE_PEEKTEXT, curvcpuid(),
                      (PTRACE_ARG3_TYPE) addr, 0);
 
   if (count > 1)
     {
       buffer[count - 1]
-       = myptrace (xc_handle, PTRACE_PEEKTEXT, curvcpuid(),
+       = xc_ptrace (xc_handle, PTRACE_PEEKTEXT, curvcpuid(),
                  (PTRACE_ARG3_TYPE) (addr + (count - 1)
                                      * sizeof (PTRACE_XFER_TYPE)),
                  0);
@@ -460,7 +458,7 @@
   for (i = 0; i < count; i++, addr += sizeof (PTRACE_XFER_TYPE))
     {
       errno = 0;
-      myptrace (xc_handle, PTRACE_POKETEXT, curvcpuid(), 
+      xc_ptrace (xc_handle, PTRACE_POKETEXT, curvcpuid(), 
                (PTRACE_ARG3_TYPE) addr, buffer[i]);
       if (errno)
        return errno;
@@ -561,13 +559,6 @@
                       the_low_target.breakpoint_len);
   init_registers ();
   linux_init_signals ();
-  if (isfile) {
-      myptrace = xc_ptrace_core;
-      myxcwait = xc_waitdomain_core;
-  } else {
-      myptrace = xc_ptrace;
-      myxcwait = xc_waitdomain;
-  }
   using_threads = thread_db_init ();
 
 }
diff -r 26eff2448966 -r 8ed131452f27 tools/libxc/xc_ptrace.c
--- a/tools/libxc/xc_ptrace.c   Mon Mar  6 11:05:44 2006
+++ b/tools/libxc/xc_ptrace.c   Mon Mar  6 11:06:55 2006
@@ -8,39 +8,12 @@
 #include "xc_private.h"
 #include "xg_private.h"
 #include "xc_ptrace.h"
-
-const char const * ptrace_names[] = {
-    "PTRACE_TRACEME",
-    "PTRACE_PEEKTEXT",
-    "PTRACE_PEEKDATA",
-    "PTRACE_PEEKUSER",
-    "PTRACE_POKETEXT",
-    "PTRACE_POKEDATA",
-    "PTRACE_POKEUSER",
-    "PTRACE_CONT",
-    "PTRACE_KILL",
-    "PTRACE_SINGLESTEP",
-    "PTRACE_INVALID",
-    "PTRACE_INVALID",
-    "PTRACE_GETREGS",
-    "PTRACE_SETREGS",
-    "PTRACE_GETFPREGS",
-    "PTRACE_SETFPREGS",
-    "PTRACE_ATTACH",
-    "PTRACE_DETACH",
-    "PTRACE_GETFPXREGS",
-    "PTRACE_SETFPXREGS",
-    "PTRACE_INVALID",
-    "PTRACE_INVALID",
-    "PTRACE_INVALID",
-    "PTRACE_INVALID",
-    "PTRACE_SYSCALL",
-};
 
 /* XXX application state */
 static long                     nr_pages = 0;
 static unsigned long           *page_array = NULL;
 static int                      current_domid = -1;
+static int                      current_isfile;
 
 static cpumap_t                 online_cpumap;
 static cpumap_t                 regs_valid;
@@ -298,8 +271,8 @@
     return (void *)(((unsigned long)page_virt[cpu]) | (va & BSD_PAGE_MASK));
 }
 
-int 
-xc_waitdomain(
+static int 
+__xc_waitdomain(
     int xc_handle,
     int domain,
     int *status,
@@ -368,8 +341,12 @@
     { 
     case PTRACE_PEEKTEXT:
     case PTRACE_PEEKDATA:
-        guest_va = (unsigned long *)map_domain_va(
-            xc_handle, cpu, addr, PROT_READ);
+        if (current_isfile)
+            guest_va = (unsigned long *)map_domain_va_core(current_domid, 
+                                cpu, addr, ctxt);
+        else
+            guest_va = (unsigned long *)map_domain_va(xc_handle, 
+                                cpu, addr, PROT_READ);
         if ( guest_va == NULL )
             goto out_error;
         retval = *guest_va;
@@ -378,15 +355,19 @@
     case PTRACE_POKETEXT:
     case PTRACE_POKEDATA:
         /* XXX assume that all CPUs have the same address space */
-        guest_va = (unsigned long *)map_domain_va(
-                            xc_handle, cpu, addr, PROT_READ|PROT_WRITE);
+        if (current_isfile)
+            guest_va = (unsigned long *)map_domain_va_core(current_domid, 
+                                cpu, addr, ctxt);
+        else
+            guest_va = (unsigned long *)map_domain_va(xc_handle, 
+                                cpu, addr, PROT_READ|PROT_WRITE);
         if ( guest_va == NULL ) 
             goto out_error;
         *guest_va = (unsigned long)data;
         break;
 
     case PTRACE_GETREGS:
-        if (fetch_regs(xc_handle, cpu, NULL))
+        if (!current_isfile && fetch_regs(xc_handle, cpu, NULL)) 
             goto out_error;
         SET_PT_REGS(pt, ctxt[cpu].user_regs); 
         memcpy(data, &pt, sizeof(struct gdb_regs));
@@ -394,12 +375,14 @@
 
     case PTRACE_GETFPREGS:
     case PTRACE_GETFPXREGS:
-        if (fetch_regs(xc_handle, cpu, NULL)) 
-            goto out_error;
+        if (!current_isfile && fetch_regs(xc_handle, cpu, NULL)) 
+                goto out_error;
         memcpy(data, &ctxt[cpu].fpu_ctxt, sizeof(ctxt[cpu].fpu_ctxt));
         break;
 
     case PTRACE_SETREGS:
+        if (!current_isfile)
+                goto out_unspported; /* XXX not yet supported */
         SET_XC_REGS(((struct gdb_regs *)data), ctxt[cpu].user_regs);
         if ((retval = xc_vcpu_setcontext(xc_handle, current_domid, cpu, 
                                 &ctxt[cpu])))
@@ -407,6 +390,8 @@
         break;
 
     case PTRACE_SINGLESTEP:
+        if (!current_isfile)
+              goto out_unspported; /* XXX not yet supported */
         /*  XXX we can still have problems if the user switches threads
          *  during single-stepping - but that just seems retarded
          */
@@ -418,6 +403,8 @@
 
     case PTRACE_CONT:
     case PTRACE_DETACH:
+        if (!current_isfile)
+            goto out_unspported; /* XXX not yet supported */
         if ( request != PTRACE_SINGLESTEP )
         {
             FOREACH_CPU(cpumap, index) {
@@ -450,6 +437,9 @@
 
     case PTRACE_ATTACH:
         current_domid = domid_tid;
+        current_isfile = (int)edata;
+        if (current_isfile)
+            break;
         op.cmd = DOM0_GETDOMAININFO;
         op.u.getdomaininfo.domain = current_domid;
         retval = do_dom0_op(xc_handle, &op);
@@ -477,12 +467,7 @@
     case PTRACE_POKEUSER:
     case PTRACE_SYSCALL:
     case PTRACE_KILL:
-#ifdef DEBUG
-        printf("unsupported xc_ptrace request %s\n", ptrace_names[request]);
-#endif
-        /* XXX not yet supported */
-        errno = ENOSYS;
-        return -1;
+        goto out_unspported; /* XXX not yet supported */
 
     case PTRACE_TRACEME:
         printf("PTRACE_TRACEME is an invalid request under Xen\n");
@@ -496,6 +481,26 @@
  out_error:
     errno = EINVAL;
     return retval;
+
+ out_unspported:
+#ifdef DEBUG
+    printf("unsupported xc_ptrace request %s\n", ptrace_names[request]);
+#endif
+    errno = ENOSYS;
+    return -1;
+
+}
+
+int 
+xc_waitdomain(
+    int xc_handle,
+    int domain,
+    int *status,
+    int options)
+{
+    if (current_isfile)
+        return xc_waitdomain_core(xc_handle, domain, status, options, ctxt);
+    return __xc_waitdomain(xc_handle, domain, status, options);
 }
 
 /*
diff -r 26eff2448966 -r 8ed131452f27 tools/libxc/xc_ptrace_core.c
--- a/tools/libxc/xc_ptrace_core.c      Mon Mar  6 11:05:44 2006
+++ b/tools/libxc/xc_ptrace_core.c      Mon Mar  6 11:06:55 2006
@@ -6,8 +6,6 @@
 #include "xc_ptrace.h"
 #include <time.h>
 
-#define VCPU            0               /* XXX */
-
 /* XXX application state */
 
 static long   nr_pages = 0;
@@ -15,7 +13,6 @@
 static unsigned long  *m2p_array = NULL;
 static unsigned long            pages_offset;
 static unsigned long            cr3[MAX_VIRT_CPUS];
-static vcpu_guest_context_t     ctxt[MAX_VIRT_CPUS];
 
 /* --------------------- */
 
@@ -23,11 +20,13 @@
 map_mtop_offset(unsigned long ma)
 {
     return pages_offset + (m2p_array[ma >> PAGE_SHIFT] << PAGE_SHIFT);
+    return 0;
 }
 
 
-static void *
-map_domain_va(unsigned long domfd, int cpu, void * guest_va)
+void *
+map_domain_va_core(unsigned long domfd, int cpu, void * guest_va,
+                        vcpu_guest_context_t *ctxt)
 {
     unsigned long pde, page;
     unsigned long va = (unsigned long)guest_va;
@@ -99,7 +98,8 @@
     int xc_handle,
     int domfd,
     int *status,
-    int options)
+    int options,
+    vcpu_guest_context_t *ctxt)
 {
     int nr_vcpus;
     int i;
@@ -146,85 +146,6 @@
     return 0;
 }
 
-long
-xc_ptrace_core(
-    int xc_handle,
-    enum __ptrace_request request,
-    uint32_t domfd,
-    long eaddr,
-    long edata)
-{
-    int             status = 0;
-    struct gdb_regs pt;
-    long            retval = 0;
-    unsigned long  *guest_va;
-    int             cpu = VCPU;
-    void           *addr = (char *)eaddr;
-    void           *data = (char *)edata;
-
-#if 0
-    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(domfd, cpu, addr)) == 
NULL) {
-            status = EFAULT;
-            goto error_out;
-        }
-
-        retval = *guest_va;
-        break;
-    case PTRACE_POKETEXT:
-    case PTRACE_POKEDATA:
-        if ((guest_va = (unsigned long *)map_domain_va(domfd, cpu, addr)) == 
NULL) {
-            status = EFAULT;
-            goto error_out;
-        }
-        *guest_va = (unsigned long)data;
-        break;
-    case PTRACE_GETREGS:
-    case PTRACE_GETFPREGS:
-    case PTRACE_GETFPXREGS:
-        if (request == PTRACE_GETREGS) {
-            SET_PT_REGS(pt, ctxt[cpu].user_regs); 
-            memcpy(data, &pt, sizeof(struct gdb_regs));
-        } else if (request == PTRACE_GETFPREGS)
-            memcpy(data, &ctxt[cpu].fpu_ctxt, sizeof(ctxt[cpu].fpu_ctxt));
-        else /*if (request == PTRACE_GETFPXREGS)*/
-            memcpy(data, &ctxt[cpu].fpu_ctxt, sizeof(ctxt[cpu].fpu_ctxt));
-        break;
-    case PTRACE_ATTACH:
-        retval = 0;
-        break;
-    case PTRACE_SETREGS:
-    case PTRACE_SINGLESTEP:
-    case PTRACE_CONT:
-    case PTRACE_DETACH:
-    case PTRACE_SETFPREGS:
-    case PTRACE_SETFPXREGS:
-    case PTRACE_PEEKUSER:
-    case PTRACE_POKEUSER:
-    case PTRACE_SYSCALL:
-    case PTRACE_KILL:
-#ifdef DEBUG
-        printf("unsupported xc_ptrace request %s\n", ptrace_names[request]);
-#endif
-        status = ENOSYS;
-        break;
-    case PTRACE_TRACEME:
-        printf("PTRACE_TRACEME is an invalid request under Xen\n");
-        status = EINVAL;
-    }
-    
-    if (status) {
-        errno = status;
-        retval = -1;
-    }
- error_out:
-    return retval;
-}
-
 /*
  * Local variables:
  * mode: C
diff -r 26eff2448966 -r 8ed131452f27 tools/libxc/xenctrl.h
--- a/tools/libxc/xenctrl.h     Mon Mar  6 11:05:44 2006
+++ b/tools/libxc/xenctrl.h     Mon Mar  6 11:06:55 2006
@@ -98,13 +98,19 @@
     enum __ptrace_request request, 
     uint32_t domid, 
     long addr, 
-    long data);
-
+    long data,
+    vcpu_guest_context_t *ctxt);
+void * map_domain_va_core(
+    unsigned long domfd, 
+    int cpu, 
+    void *guest_va,
+    vcpu_guest_context_t *ctxt);
 int xc_waitdomain_core(
     int xc_handle,
     int domain, 
     int *status, 
-    int options);
+    int options,
+    vcpu_guest_context_t *ctxt);
 
 /*
  * DOMAIN MANAGEMENT FUNCTIONS

_______________________________________________
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®.