From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 27401 invoked by alias); 28 Feb 2004 19:40:24 -0000 Mailing-List: contact gdb-patches-help@sources.redhat.com; run by ezmlm Precedence: bulk List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sources.redhat.com Received: (qmail 27392 invoked from network); 28 Feb 2004 19:40:23 -0000 Received: from unknown (HELO localhost.redhat.com) (24.157.170.238) by sources.redhat.com with SMTP; 28 Feb 2004 19:40:23 -0000 Received: from gnu.org (localhost [127.0.0.1]) by localhost.redhat.com (Postfix) with ESMTP id EBC2E2B92; Sat, 28 Feb 2004 14:40:21 -0500 (EST) Message-ID: <4040EEA5.8090807@gnu.org> Date: Sat, 28 Feb 2004 19:40:00 -0000 From: Andrew Cagney User-Agent: Mozilla/5.0 (X11; U; NetBSD macppc; en-US; rv:1.4.1) Gecko/20040217 MIME-Version: 1.0 To: Mark Kettenis Cc: ac131313@redhat.com, gdb-patches@sources.redhat.com Subject: Re: [rfa:amd64] Fetch 32-bit thread area References: <403E9C5F.2050803@redhat.com> <200402281151.i1SBpN4u000732@elgar.kettenis.dyndns.org> <4040B235.2090405@gnu.org> <200402281737.i1SHbMx4017932@elgar.kettenis.dyndns.org> In-Reply-To: <200402281737.i1SHbMx4017932@elgar.kettenis.dyndns.org> Content-Type: multipart/mixed; boundary="------------020706090405040506030205" X-SW-Source: 2004-02/txt/msg00856.txt.bz2 This is a multi-part message in MIME format. --------------020706090405040506030205 Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit Content-length: 1263 > Date: Sat, 28 Feb 2004 10:22:29 -0500 > From: Andrew Cagney > > > Date: Thu, 26 Feb 2004 20:24:47 -0500 > > From: Andrew Cagney > > > > Hello, > > > > This modifies the amd64 code so that, when 32-bit, it fetches the 32-bit > > thread area register (I think this has been posted before?). > > > > Why #if 0 ... #else ... #endif? > > Tipo from testing. > > Typo? You mean that you intended to remove the #if 0 block before > submitting the patch? Or what? Yes, "tipo". As Stan Shebs where the word comes from. > > Anyway, I'm not really happy with the > > > > switch (TARGET_ARCHITECTURE->mach) > > > > construction. The other AMD64 native code uses an > > > > if (gdbarch_ptr_bit (current_gdbarch) == 32) > > > > to distinguish between 32-bit and 64-bit code. While this may not be > > completely correct (someone might come up with a native AMD64 ABI with > > 32-bit pointers), I'd rather not use multiple variations of the > > 32-bit/64-bit check in the code. > > Is it ok with that change? > > If you remove the #if 0 block and re-indent the #else block. Yes. Done. Committed the attached. Andrew --------------020706090405040506030205 Content-Type: text/plain; name="diffs" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="diffs" Content-length: 2989 2004-02-28 Andrew Cagney * amd64-linux-nat.c (ps_get_thread_area): When architecture is i386 use PTRACE_GET_THREAD_AREA. Suggested by Roland McGrath. Index: amd64-linux-nat.c =================================================================== RCS file: /cvs/src/src/gdb/amd64-linux-nat.c,v retrieving revision 1.3 diff -u -r1.3 amd64-linux-nat.c --- amd64-linux-nat.c 28 Feb 2004 18:54:31 -0000 1.3 +++ amd64-linux-nat.c 28 Feb 2004 19:28:56 -0000 @@ -350,31 +350,60 @@ } +/* This function is called by libthread_db as part of its handling of + a request for a thread's local storage address. */ + ps_err_e ps_get_thread_area (const struct ps_prochandle *ph, lwpid_t lwpid, int idx, void **base) { -/* This definition comes from prctl.h, but some kernels may not have it. */ + if (gdbarch_ptr_bit (current_gdbarch) == 32) + { + /* The full structure is found in . The second + integer is the LDT's base_address and that is used to locate + the thread's local storage. See i386-linux-nat.c more + info. */ + unsigned int desc[4]; + + /* This code assumes that "int" is 32 bits and that + GET_THREAD_AREA returns no more than 4 int values. */ + gdb_assert (sizeof (int) == 4); +#ifndef PTRACE_GET_THREAD_AREA +#define PTRACE_GET_THREAD_AREA 25 +#endif + if (ptrace (PTRACE_GET_THREAD_AREA, + lwpid, (void *) (long) idx, (unsigned long) &desc) < 0) + return PS_ERR; + + /* Extend the value to 64 bits. Here it's assumed that a "long" + and a "void *" are the same. */ + (*base) = (void *) (long) desc[1]; + return PS_OK; + } + else + { + /* This definition comes from prctl.h, but some kernels may not + have it. */ #ifndef PTRACE_ARCH_PRCTL #define PTRACE_ARCH_PRCTL 30 #endif - - /* FIXME: ezannoni-2003-07-09 see comment above about include file order. - We could be getting bogus values for these two. */ - gdb_assert (FS < ELF_NGREG); - gdb_assert (GS < ELF_NGREG); - switch (idx) - { - case FS: - if (ptrace (PTRACE_ARCH_PRCTL, lwpid, base, ARCH_GET_FS) == 0) - return PS_OK; - break; - case GS: - if (ptrace (PTRACE_ARCH_PRCTL, lwpid, base, ARCH_GET_GS) == 0) - return PS_OK; - break; - default: /* Should not happen. */ - return PS_BADADDR; + /* FIXME: ezannoni-2003-07-09 see comment above about include + file order. We could be getting bogus values for these two. */ + gdb_assert (FS < ELF_NGREG); + gdb_assert (GS < ELF_NGREG); + switch (idx) + { + case FS: + if (ptrace (PTRACE_ARCH_PRCTL, lwpid, base, ARCH_GET_FS) == 0) + return PS_OK; + break; + case GS: + if (ptrace (PTRACE_ARCH_PRCTL, lwpid, base, ARCH_GET_GS) == 0) + return PS_OK; + break; + default: /* Should not happen. */ + return PS_BADADDR; + } } return PS_ERR; /* ptrace failed. */ } --------------020706090405040506030205--