This is the mail archive of the
libc-alpha@sources.redhat.com
mailing list for the glibc project.
Re: [RFHelp] Linux, threads, and regsets in thread_db
- From: "H . J . Lu" <hjl at lucon dot org>
- To: Mark Kettenis <kettenis at science dot uva dot nl>
- Cc: Daniel Jacobowitz <drow at mvista dot com>,GNU C Library <libc-alpha at sourceware dot cygnus dot com>
- Date: Wed, 14 Nov 2001 13:55:02 -0800
- Subject: Re: [RFHelp] Linux, threads, and regsets in thread_db
- References: <20010924212808.A20851@nevyn.them.org> <s3ig09b37mi.fsf@debye.wins.uva.nl>
On Tue, Sep 25, 2001 at 12:08:37PM +0200, Mark Kettenis wrote:
> Daniel Jacobowitz <drow@mvista.com> writes:
>
> > I spent a while this summer making thread debugging work on some more
> > non-x86 targets, with great frustration. Eventually I reached the
> > decision that my problem was in fact a glibc bug; the attached messages
> > explain it. Ulrich has categorically (and without explanation, when
> > asked. sigh.) refused the patch.
>
> Seems that Ulrich is still confused about the regset issues. I asked
> the port maintainers to clean this up when I fixed it for i386. Jakub
> Jellinek cleaned up sparc, but nothing else happened.
>
> > Could someone on this list at least sanity check my patch? I have a
> > (disgusting) workaround for GDB if the header is not changed, but I'd
> > much rather someone convince Ulrich that I'm not crazy. Especially
> > since I can not get the workaround to compile without warnings. C
> > behaves badly in the presence of casts to/from array types.
>
> In principle, your patch is the right thing. There may be
> interactions with <sys/user.h> and <sys/elf.h> though. Look at the
> i386 port to see how things should be done.
>
Here is a patch for mips. It seems to work for me.
H.J.
-----
2001-11-14 H.J. Lu <hjl@gnu.org>
* sysdeps/unix/sysv/linux/mips/sys/procfs.h: Don't include
<signal.h>, <sys/ucontext.h> nor <asm/elf.h>. Updated for gdb.
* sysdeps/unix/sysv/linux/mips/sys/user.h: New.
--- sysdeps/unix/sysv/linux/mips/sys/procfs.h.gdb Sat Jul 7 16:46:18 2001
+++ sysdeps/unix/sysv/linux/mips/sys/procfs.h Wed Nov 14 12:30:19 2001
@@ -24,12 +24,19 @@
used on Linux. */
#include <features.h>
-#include <signal.h>
#include <sys/time.h>
#include <sys/types.h>
-#include <sys/ucontext.h>
#include <sys/user.h>
-#include <asm/elf.h>
+
+/* ELF register definitions */
+#define ELF_NGREG 45
+#define ELF_NFPREG 33
+
+typedef unsigned long elf_greg_t;
+typedef elf_greg_t elf_gregset_t[ELF_NGREG];
+
+typedef double elf_fpreg_t;
+typedef elf_fpreg_t elf_fpregset_t[ELF_NFPREG];
__BEGIN_DECLS
@@ -50,19 +57,10 @@ struct elf_siginfo
marked with "XXX". */
struct elf_prstatus
{
-#if 0
- long int pr_flags; /* XXX Process flags. */
- short int pr_why; /* XXX Reason for process halt. */
- short int pr_what; /* XXX More detailed reason. */
-#endif
struct elf_siginfo pr_info; /* Info associated with signal. */
short int pr_cursig; /* Current signal. */
unsigned long int pr_sigpend; /* Set of pending signals. */
unsigned long int pr_sighold; /* Set of held signals. */
-#if 0
- struct sigaltstack pr_altstack; /* Alternate stack info. */
- struct sigaction pr_action; /* Signal action for current sig. */
-#endif
__pid_t pr_pid;
__pid_t pr_ppid;
__pid_t pr_pgrp;
@@ -71,9 +69,6 @@ struct elf_prstatus
struct timeval pr_stime; /* System time. */
struct timeval pr_cutime; /* Cumulative user time. */
struct timeval pr_cstime; /* Cumulative system time. */
-#if 0
- long int pr_instr; /* Current instruction. */
-#endif
elf_gregset_t pr_reg; /* GP registers. */
int pr_fpvalid; /* True if math copro being used. */
};
@@ -101,8 +96,8 @@ struct elf_prpsinfo
typedef void *psaddr_t;
/* Register sets. Linux has different names. */
-typedef gregset_t prgregset_t;
-typedef fpregset_t prfpregset_t;
+typedef elf_gregset_t prgregset_t;
+typedef elf_fpregset_t prfpregset_t;
/* We don't have any differences between processes and threads,
therefore habe only ine PID type. */
--- sysdeps/unix/sysv/linux/mips/sys/user.h.gdb Wed Nov 14 12:04:50 2001
+++ sysdeps/unix/sysv/linux/mips/sys/user.h Wed Nov 14 12:32:11 2001
@@ -0,0 +1,74 @@
+/* Copyright (C) 2001 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 <asm/reg.h>
+
+/*
+ * Core file format: The core file is written in such a way that gdb
+ * can understand it and provide useful information to the user (under
+ * linux we use the `trad-core' bfd, NOT the irix-core). The file
+ * contents are as follows:
+ *
+ * upage: 1 page consisting of a user struct that tells gdb
+ * what is present in the file. Directly after this is a
+ * copy of the task_struct, which is currently not used by gdb,
+ * but it may come in handy at some point. All of the registers
+ * are stored as part of the upage. The upage should always be
+ * only one page long.
+ * data: The data segment follows next. We use current->end_text to
+ * current->brk to pick up all of the user variables, plus any memory
+ * that may have been sbrk'ed. No attempt is made to determine if a
+ * page is demand-zero or if a page is totally unused, we just cover
+ * the entire range. All of the addresses are rounded in such a way
+ * that an integral number of pages is written.
+ * stack: We need the stack information in order to get a meaningful
+ * backtrace. We need to write the data from usp to
+ * current->start_stack, so we round each of these in order to be able
+ * to write an integer number of pages.
+ */
+struct user {
+ unsigned long regs[EF_SIZE/4+64]; /* integer and fp regs */
+ size_t u_tsize; /* text size (pages) */
+ size_t u_dsize; /* data size (pages) */
+ size_t u_ssize; /* stack size (pages) */
+ unsigned long start_code; /* text starting address */
+ unsigned long start_data; /* data starting address */
+ unsigned long start_stack; /* stack starting address */
+ long int signal; /* signal causing core dump */
+ void* u_ar0; /* help gdb find registers */
+ unsigned long magic; /* identifies a core file */
+ char u_comm[32]; /* user command name */
+};
+
+#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_DATA_START_ADDR (u.start_data)
+#define HOST_STACK_END_ADDR (u.start_stack + u.u_ssize * NBPG)
+
+#endif /* _SYS_USER_H */