2003-08-26 Andrew Cagney <cagney@redhat.com>

* i386-linux-nat.c (ps_get_thread_area): Make "desc" four "int"s
	in size.  Add comments.
This commit is contained in:
Andrew Cagney 2003-08-26 19:34:53 +00:00
parent af8b88dd22
commit cc7ad3eab3
2 changed files with 26 additions and 1 deletions

View File

@ -1,3 +1,8 @@
2003-08-26 Andrew Cagney <cagney@redhat.com>
* i386-linux-nat.c (ps_get_thread_area): Make "desc" four "int"s
in size. Add comments.
2003-08-26 Jeff Johnston <jjohnstn@redhat.com>
* ia64-tdep.c (ia64_convert_from_func_addr): New function.

View File

@ -687,11 +687,31 @@ i386_linux_dr_set (int regnum, unsigned long value)
perror_with_name ("Couldn't write debug register");
}
/* Called by libthread_db. Return's a pointer to the thread local
storage (or it's descriptor). */
extern ps_err_e
ps_get_thread_area(const struct ps_prochandle *ph,
lwpid_t lwpid, int idx, void **base)
{
unsigned long int desc[3];
/* NOTE: cagney/2003-08-26: The definition of this buffer is found
in the kernel header <asm-i386/ldt.h>. It, after padding, is 4 x
4 byte integers in size: "entry_number", "base_addr", "limit",
and a bunch of status bits.
The values returned by this ptrace call should be part of the
regcache buffer, and ps_get_thread_area should channel its
request through the regcache. That way remote targets could
provide the value using the remote protocol and not this direct
call.
Is this function needed? I'm guessing that the "base" is the
address of a a descriptor that libthread_db uses to find the
thread local address base that GDB needs. Perhaphs that
descriptor is defined by the ABI. Anyway, given that
libthread_db calls this function without prompting (gdb
requesting tls base) I guess it needs info in there anyway. */
unsigned int desc[4];
gdb_assert (sizeof (int) == 4);
#define PTRACE_GET_THREAD_AREA 25
if (ptrace (PTRACE_GET_THREAD_AREA,