files in gdbserver directory.
diff -uNpr
orig/BUILD/xen-3.1.1-ovs/tools/debugger/gdb/gdb-6.2.1-xen-sparse/gdb/gdbserver/linux-xen-low.c
new/BUILD/xen-3.1.1-ovs/tools/debugger/gdb/gdb-6.2.1-xen-sparse/gdb/gdbserver/linux-xen-low.c
---
orig/BUILD/xen-3.1.1-ovs/tools/debugger/gdb/gdb-6.2.1-xen-sparse/gdb/gdbserver/linux-xen-low.c
2007-09-12 17:43:17.000000000 -0700
+++
new/BUILD/xen-3.1.1-ovs/tools/debugger/gdb/gdb-6.2.1-xen-sparse/gdb/gdbserver/linux-xen-low.c
2007-11-02 16:21:26.464696000 -0700
@@ -69,8 +69,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 +162,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 +267,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 +319,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 +398,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 +425,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 +433,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 +451,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
orig/BUILD/xen-3.1.1-ovs/tools/debugger/gdb/gdb-6.2.1-xen-sparse/gdb/gdbserver/Makefile.in
new/BUILD/xen-3.1.1-ovs/tools/debugger/gdb/gdb-6.2.1-xen-sparse/gdb/gdbserver/Makefile.in
---
orig/BUILD/xen-3.1.1-ovs/tools/debugger/gdb/gdb-6.2.1-xen-sparse/gdb/gdbserver/Makefile.in
2007-09-12 17:43:17.000000000 -0700
+++
new/BUILD/xen-3.1.1-ovs/tools/debugger/gdb/gdb-6.2.1-xen-sparse/gdb/gdbserver/Makefile.in
2007-11-02 16:21:26.459696000 -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
orig/BUILD/xen-3.1.1-ovs/tools/debugger/gdb/gdb-6.2.1-xen-sparse/include/sys/user.h
new/BUILD/xen-3.1.1-ovs/tools/debugger/gdb/gdb-6.2.1-xen-sparse/include/sys/user.h
---
orig/BUILD/xen-3.1.1-ovs/tools/debugger/gdb/gdb-6.2.1-xen-sparse/include/sys/user.h
1969-12-31 16:00:00.000000000 -0800
+++
new/BUILD/xen-3.1.1-ovs/tools/debugger/gdb/gdb-6.2.1-xen-sparse/include/sys/user.h
2007-11-02 16:21:26.469696000 -0700
@@ -0,0 +1,181 @@
+/* Copyright (C) 2001, 2002, 2004 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, write to the Free
+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+ 02111-1307 USA. */
+
+#ifndef _SYS_USER_H
+#define _SYS_USER_H 1
+
+/* The whole purpose of this file is for GDB and GDB only. Don't read
+ too much into it. Don't use it for anything other than GDB unless
+ you know what you are doing. */
+
+#include <bits/wordsize.h>
+
+#if defined(_GDB_CROSS_COMP)
+#define cross_reg_t unsigned long long
+#elif __WORDSIZE == 64
+#define cross_reg_t unsigned long
+#endif
+
+#if __WORDSIZE == 64
+
+struct user_fpregs_struct
+{
+ __uint16_t cwd;
+ __uint16_t swd;
+ __uint16_t ftw;
+ __uint16_t fop;
+ __uint64_t rip;
+ __uint64_t rdp;
+ __uint32_t mxcsr;
+ __uint32_t mxcr_mask;
+ __uint32_t st_space[32]; /* 8*16 bytes for each FP-reg = 128
bytes */
+ __uint32_t xmm_space[64]; /* 16*16 bytes for each XMM-reg = 256
bytes */
+ __uint32_t padding[24];
+};
+
+struct user_regs_struct
+{
+ cross_reg_t r15;
+ cross_reg_t r14;
+ cross_reg_t r13;
+ cross_reg_t r12;
+ cross_reg_t rbp;
+ cross_reg_t rbx;
+ cross_reg_t r11;
+ cross_reg_t r10;
+ cross_reg_t r9;
+ cross_reg_t r8;
+ cross_reg_t rax;
+ cross_reg_t rcx;
+ cross_reg_t rdx;
+ cross_reg_t rsi;
+ cross_reg_t rdi;
+ cross_reg_t orig_rax;
+ cross_reg_t rip;
+ cross_reg_t cs;
+ cross_reg_t eflags;
+ cross_reg_t rsp;
+ cross_reg_t ss;
+ cross_reg_t fs_base;
+ cross_reg_t gs_base;
+ cross_reg_t ds;
+ cross_reg_t es;
+ cross_reg_t fs;
+ cross_reg_t gs;
+};
+
+struct user
+{
+ struct user_regs_struct regs;
+ int u_fpvalid;
+ struct user_fpregs_struct i387;
+ cross_reg_t int u_tsize;
+ cross_reg_t int u_dsize;
+ cross_reg_t int u_ssize;
+ cross_reg_t start_code;
+ cross_reg_t start_stack;
+ cross_reg_t signal;
+ int reserved;
+ struct user_regs_struct* u_ar0;
+ struct user_fpregs_struct* u_fpstate;
+ cross_reg_t magic;
+ char u_comm [32];
+ cross_reg_t u_debugreg [8];
+};
+
+#else
+/* These are the 32-bit x86 structures. */
+struct user_fpregs_struct
+{
+ long int cwd;
+ long int swd;
+ long int twd;
+ long int fip;
+ long int fcs;
+ long int foo;
+ long int fos;
+ long int st_space [20];
+};
+
+struct user_fpxregs_struct
+{
+ unsigned short int cwd;
+ unsigned short int swd;
+ unsigned short int twd;
+ unsigned short int fop;
+ long int fip;
+ long int fcs;
+ long int foo;
+ long int fos;
+ long int mxcsr;
+ long int reserved;
+ long int st_space[32]; /* 8*16 bytes for each FP-reg = 128 bytes */
+ long int xmm_space[32]; /* 8*16 bytes for each XMM-reg = 128 bytes */
+ long int padding[56];
+};
+
+struct user_regs_struct
+{
+ long int ebx;
+ long int ecx;
+ long int edx;
+ long int esi;
+ long int edi;
+ long int ebp;
+ long int eax;
+ long int xds;
+ long int xes;
+ long int xfs;
+ long int xgs;
+ long int orig_eax;
+ long int eip;
+ long int xcs;
+ long int eflags;
+ long int esp;
+ long int xss;
+};
+
+struct user
+{
+ struct user_regs_struct regs;
+ int u_fpvalid;
+ struct user_fpregs_struct i387;
+ unsigned long int u_tsize;
+ unsigned long int u_dsize;
+ unsigned long int u_ssize;
+ unsigned long start_code;
+ unsigned long start_stack;
+ long int signal;
+ int reserved;
+ struct user_regs_struct* u_ar0;
+ struct user_fpregs_struct* u_fpstate;
+ unsigned long int magic;
+ char u_comm [32];
+ int u_debugreg [8];
+};
+#endif /* __WORDSIZE */
+
+#define PAGE_SHIFT 12
+#define PAGE_SIZE (1UL << PAGE_SHIFT)
+#define PAGE_MASK (~(PAGE_SIZE-1))
+#define NBPG PAGE_SIZE
+#define UPAGES 1
+#define HOST_TEXT_START_ADDR (u.start_code)
+#define HOST_STACK_END_ADDR (u.start_stack + u.u_ssize * NBPG)
+
+#endif /* _SYS_USER_H */
diff -uNpr
orig/BUILD/xen-3.1.1-ovs/tools/debugger/gdb/gdb-6.2.1-xen-sparse/mkbuildtree
new/BUILD/xen-3.1.1-ovs/tools/debugger/gdb/gdb-6.2.1-xen-sparse/mkbuildtree
---
orig/BUILD/xen-3.1.1-ovs/tools/debugger/gdb/gdb-6.2.1-xen-sparse/mkbuildtree
2007-09-12 17:43:17.000000000 -0700
+++ new/BUILD/xen-3.1.1-ovs/tools/debugger/gdb/gdb-6.2.1-xen-sparse/mkbuildtree
2007-11-02 16:21:26.473697000 -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 orig/BUILD/xen-3.1.1-ovs/tools/debugger/gdb/gdbbuild
new/BUILD/xen-3.1.1-ovs/tools/debugger/gdb/gdbbuild
--- orig/BUILD/xen-3.1.1-ovs/tools/debugger/gdb/gdbbuild 2007-09-12
17:43:17.000000000 -0700
+++ new/BUILD/xen-3.1.1-ovs/tools/debugger/gdb/gdbbuild 2007-11-02
16:21:26.477698000 -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 orig/BUILD/xen-3.1.1-ovs/tools/debugger/gdb/README
new/BUILD/xen-3.1.1-ovs/tools/debugger/gdb/README
--- orig/BUILD/xen-3.1.1-ovs/tools/debugger/gdb/README 2007-09-12
17:43:17.000000000 -0700
+++ new/BUILD/xen-3.1.1-ovs/tools/debugger/gdb/README 2007-11-02
16:21:26.481697000 -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
|