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

[Xen-devel] [PATCH 1/2] 32bit gdbserver-xen/libxc to debug 64bit guest



part 1 : files changed in gdbserver xen-sparse tree.
diff -uNpr 
xen-3.1.1-ovs.orig/tools/debugger/gdb/gdb-6.2.1-xen-sparse/gdb/gdbserver/linux-xen-low.c
 
xen-3.1.1-ovs.new/tools/debugger/gdb/gdb-6.2.1-xen-sparse/gdb/gdbserver/linux-xen-low.c
--- 
xen-3.1.1-ovs.orig/tools/debugger/gdb/gdb-6.2.1-xen-sparse/gdb/gdbserver/linux-xen-low.c
    2007-09-12 17:43:17.000000000 -0700
+++ 
xen-3.1.1-ovs.new/tools/debugger/gdb/gdb-6.2.1-xen-sparse/gdb/gdbserver/linux-xen-low.c
     2007-10-31 16:52:29.291343000 -0700
@@ -22,6 +22,10 @@
 #include "server.h"
 #include "linux-low.h"
 
+#ifdef _GDB_CROSS_COMP
+#include "user.h"
+#endif
+
 #include <sys/wait.h>
 #include <stdio.h>
 #include <sys/param.h>
@@ -69,8 +73,13 @@ struct pending_signals
   struct pending_signals *prev;
 };
 
-#define PTRACE_ARG3_TYPE long
-#define PTRACE_XFER_TYPE long
+#ifdef _GDB_CROSS_COMP
+#define PTRACE_ARG3_TYPE unsigned long long
+#define PTRACE_XFER_TYPE unsigned long long
+#else
+#define PTRACE_ARG3_TYPE unsigned long 
+#define PTRACE_XFER_TYPE unsigned long
+#endif
 
 static int use_regsets_p = 1;
 
@@ -157,7 +166,8 @@ linux_attach (int domid)
     add_thread (0, new_process);
     new_process->stop_expected = 0;
 
-    if (xc_ptrace (xc_handle, PTRACE_ATTACH, domid, 0, isfile) != 0) {
+    if (xc_ptrace(xc_handle, PTRACE_ATTACH, domid, 0,(PTRACE_XFER_TYPE)isfile))
+    {
        fprintf (stderr, "Cannot attach to domain %d: %s (%d)\n", domid,
                 strerror (errno), errno);
        fflush (stderr);
@@ -261,8 +271,7 @@ regsets_fetch_inferior_registers ()
 
       buf = malloc (regset->size);
       res = xc_ptrace (xc_handle, regset->get_request, 
-                     curvcpuid(),
-                     0, (PTRACE_XFER_TYPE)buf);
+                     curvcpuid(), 0, (PTRACE_XFER_TYPE)buf);
       if (res < 0)
        {
          if (errno == EIO)
@@ -314,7 +323,8 @@ regsets_store_inferior_registers ()
 
       buf = malloc (regset->size);
       regset->fill_function (buf);
-      res = xc_ptrace (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)
@@ -392,7 +402,8 @@ linux_read_memory (CORE_ADDR memaddr, ch
   for (i = 0; i < count; i++, addr += sizeof (PTRACE_XFER_TYPE))
     {
       errno = 0;
-      buffer[i] = xc_ptrace (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;
     }
@@ -418,7 +429,7 @@ linux_write_memory (CORE_ADDR memaddr, c
   register int count
   = (((memaddr + len) - addr) + sizeof (PTRACE_XFER_TYPE) - 1) / sizeof 
(PTRACE_XFER_TYPE);
   /* Allocate buffer of that many longwords.  */
-  register PTRACE_XFER_TYPE *buffer = (PTRACE_XFER_TYPE *) alloca (count * 
sizeof (PTRACE_XFER_TYPE));
+  register PTRACE_XFER_TYPE *buffer = (PTRACE_XFER_TYPE*)alloca(count * 
sizeof(PTRACE_XFER_TYPE));
   extern int errno;
 
   TRACE_ENTER;
@@ -426,15 +437,13 @@ linux_write_memory (CORE_ADDR memaddr, c
   /* Fill start and end extra bytes of buffer with existing memory data.  */
 
   buffer[0] = xc_ptrace (xc_handle, PTRACE_PEEKTEXT, curvcpuid(),
-                     (PTRACE_ARG3_TYPE) addr, 0);
+                        (PTRACE_ARG3_TYPE)addr, 0);
 
   if (count > 1)
     {
       buffer[count - 1]
        = xc_ptrace (xc_handle, PTRACE_PEEKTEXT, curvcpuid(),
-                 (PTRACE_ARG3_TYPE) (addr + (count - 1)
-                                     * sizeof (PTRACE_XFER_TYPE)),
-                 0);
+                    (PTRACE_ARG3_TYPE)(addr + (count - 1) * 
sizeof(PTRACE_ARG3_TYPE)), 0);
     }
 
   /* Copy data to be written over corresponding part of buffer */
@@ -446,7 +455,7 @@ linux_write_memory (CORE_ADDR memaddr, c
     {
       errno = 0;
       xc_ptrace (xc_handle, PTRACE_POKETEXT, curvcpuid(), 
-               (PTRACE_ARG3_TYPE) addr, buffer[i]);
+                (PTRACE_ARG3_TYPE) addr, buffer[i]);
       if (errno)
        return errno;
     }
diff -uNpr 
xen-3.1.1-ovs.orig/tools/debugger/gdb/gdb-6.2.1-xen-sparse/gdb/gdbserver/Makefile.in
 
xen-3.1.1-ovs.new/tools/debugger/gdb/gdb-6.2.1-xen-sparse/gdb/gdbserver/Makefile.in
--- 
xen-3.1.1-ovs.orig/tools/debugger/gdb/gdb-6.2.1-xen-sparse/gdb/gdbserver/Makefile.in
        2007-09-12 17:43:17.000000000 -0700
+++ 
xen-3.1.1-ovs.new/tools/debugger/gdb/gdb-6.2.1-xen-sparse/gdb/gdbserver/Makefile.in
 2007-10-31 16:52:29.286344000 -0700
@@ -135,6 +135,14 @@ OBS = inferiors.o regcache.o remote-util
        $(DEPFILES)
 GDBSERVER_LIBS = @GDBSERVER_LIBS@
 
+# if cross compiling to get a 32binary on a 64bit system, we statically link
+# the xenctrl lib, so as not to break anything
+ifneq "$(findstring _GDB_CROSS_COMP, $(CFLAGS))" ""
+        STATIC_LNK=-Wl,-Bstatic
+        STATIC_UNLNK=-Wl,-Bdynamic
+endif
+
+
 # Prevent Sun make from putting in the machine type.  Setting
 # TARGET_ARCH to nothing works for SunOS 3, 4.0, but not for 4.1.
 .c.o:
@@ -172,7 +180,7 @@ clean-info:
 gdbserver-xen: $(OBS) ${ADD_DEPS} ${CDEPS}
        rm -f gdbserver-xen
        ${CC-LD} $(GLOBAL_CFLAGS) $(LDFLAGS) -o gdbserver-xen $(OBS) \
-         $(GDBSERVER_LIBS) $(XM_CLIBS)
+         $(STATIC_LNK) $(GDBSERVER_LIBS) $(STATIC_UNLNK) $(XM_CLIBS)
 
 gdbreplay: gdbreplay.o
        rm -f gdbreplay
diff -uNpr 
xen-3.1.1-ovs.orig/tools/debugger/gdb/gdb-6.2.1-xen-sparse/mkbuildtree 
xen-3.1.1-ovs.new/tools/debugger/gdb/gdb-6.2.1-xen-sparse/mkbuildtree
--- xen-3.1.1-ovs.orig/tools/debugger/gdb/gdb-6.2.1-xen-sparse/mkbuildtree      
2007-09-12 17:43:17.000000000 -0700
+++ xen-3.1.1-ovs.new/tools/debugger/gdb/gdb-6.2.1-xen-sparse/mkbuildtree       
2007-10-31 16:52:29.330342000 -0700
@@ -66,7 +66,7 @@ relative_lndir ()
     (
     cd $i
     pref=`echo $i | sed -e 's#/[^/]*#../#g' -e 's#^\.##'`
-    for j in `find . -type f -o -type l -maxdepth 1`; do
+    for j in `find . -maxdepth 1 -type f -o -type l`; do
       ln -sf ${pref}${REAL_DIR}/$i/$j ${SYMLINK_DIR}/$i/$j
     done
     )
diff -uNpr xen-3.1.1-ovs.orig/tools/debugger/gdb/gdbbuild 
xen-3.1.1-ovs.new/tools/debugger/gdb/gdbbuild
--- xen-3.1.1-ovs.orig/tools/debugger/gdb/gdbbuild      2007-09-12 
17:43:17.000000000 -0700
+++ xen-3.1.1-ovs.new/tools/debugger/gdb/gdbbuild       2007-10-31 
16:52:29.334344000 -0700
@@ -22,7 +22,14 @@ cd gdb-$GDB_VERSION-linux-i386-xen
 if [ "$MAKE" ]; then
     $MAKE
 elif which gmake ; then
-    gmake -j4
+    MAKE="gmake -j4"
 else
-    make -j4
+    MAKE="make -j4"
+fi
+
+if [[ $1 == _GDB_CROSS_COMP ]]
+then
+       $MAKE CFLAGS="-m32 -D_GDB_CROSS_COMP -D __x86_64__" LDFLAGS="-m32"
+else
+       $MAKE
 fi
diff -uNpr xen-3.1.1-ovs.orig/tools/debugger/gdb/README 
xen-3.1.1-ovs.new/tools/debugger/gdb/README
--- xen-3.1.1-ovs.orig/tools/debugger/gdb/README        2007-09-12 
17:43:17.000000000 -0700
+++ xen-3.1.1-ovs.new/tools/debugger/gdb/README 2007-11-01 17:41:37.059119000 
-0700
@@ -5,11 +5,37 @@ DomU & HVM GDB server for 32-bit (PAE an
 Lines marked below with [*] are optional, if you want full
 source-level debugging of your kernel image.
 
-To build the GDB server:
- 0. Build rest of the Xen first from the base directory
- 1. Run ./gdbbuild from within this directory.
- 2. Copy ./gdb-6.2.1-linux-i386-xen/gdb/gdbserver/gdbserver-xen
-    to your test machine.
+gdbserver can run on 32bit or 64bit dom0. It can attach to a 32 bit non-PAE,
+a 32bit PAE, or an x86_64 guest:
+
+            32 non-PAE        32 PAE        x86_64
+32 dom0:        Y               Y             Y
+64 dom0:        ?               ?             Y
+
+
+TO BUILD: Involves two steps, building libxc and gdbserver-xen. After building,
+          copy gdbserver-xen, and possibly libxc to dom0:
+
+32 non-PAE (build on 32bit box) or x86_64 (build on x86_64 box) :
+    1. Build libxc first by running >make
+    2. Build gdbserver-xen by running >gdbbuild
+    3. copy ./gdb-6.2.1-linux-i386-xen/gdb/gdbserver/gdbserver-xen to dom0
+
+32 PAE (build on 32bit box) :
+    1. Build libxc first by running 
+        >CFLAGS="-D_CROSS_COMP_PAE" make
+    2. Build gdbserver-xen by running 
+        >gdbbuild
+    3. copy gdbserver-xen  and libxenctrl.so.3.0.0 to dom0
+
+x86_64 (build on x86_64 box to run on 32 domU) :
+    1. Build libxc first by running 
+        >CFLAGS="-m32 -D_GDB_CROSS_COMP" make
+    2. Build gdbserver-xen by running 
+        >gdbbuild  _GDB_CROSS_COMP
+    3. copy gdbserver-xen to dom0 (libxenctrl is statically linked in this 
case)
+
+
 
 To build a debuggable guest domU kernel image:
  1. cd linux-2.6.xx-xenU
@@ -28,6 +54,8 @@ To debug a running guest:
     # target remote 127.0.0.1:9999
     # bt
     # disass
+ 5. gdb could be running on a different host, in which case:
+    # target remote 127.11.11.11:9999 where 127.11.11.11 is the xen host.
 
 To debug a crashed domU guest:
  1. Add '(enable-dump yes)' to /etc/xen/xend-config.sxp before
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel

 


Rackspace

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