Update support for x86 Solaris 2.
* config/i386/tm-i386sol2.h, nm-i386sol2.h: New configuration
files for x86 Solaris 2.
* config/i386/i386sol2.mt, i386sol2.mh: Use them.
* config/sparc/tm-sun4sol2.h (PROCFS_GET_CARRY): New macro, extract
carry flag from a given regset.
(IS_STATIC_TRANSFORM_NAME): New macro, check if a symbol name
is a SunPro transformed name.
* i386-tdep.c (sunpro_static_transform_name): New function to
extract the source name from a SunPro transformed name.
* inferior.h (procfs_first_available, procfs_get_pid_fd):
Add prototypes.
* infrun.c (wait_for_inferior): Handle breakpoint hit in
signal handler without intervening stop in sigtramp.
* procfs.c (procfs_lwp_creation_handler): Use PROCFS_GET_CARRY
instead of direct access to the status register.
(procfs_get_pid_fd): New function, returns procfs fd for a given pid.
* sol-thread.c (ps_lgetLDT): New function, returns LDT for a given
lwpid.
(sol_find_new_threads): Handle failed libthread_db initialization
gracefully.
* stabsread.c (define_symbol): Use IS_STATIC_TRANSFORM_NAME
to check for a SunPro transformed symbol name.
+Fri Apr 10 22:36:28 1998 Peter Schauer (pes@regent.e-technik.tu-muenchen.de)
+
+ Update support for x86 Solaris 2.
+ * config/i386/tm-i386sol2.h, nm-i386sol2.h: New configuration
+ files for x86 Solaris 2.
+ * config/i386/i386sol2.mt, i386sol2.mh: Use them.
+ * config/sparc/tm-sun4sol2.h (PROCFS_GET_CARRY): New macro, extract
+ carry flag from a given regset.
+ (IS_STATIC_TRANSFORM_NAME): New macro, check if a symbol name
+ is a SunPro transformed name.
+ * i386-tdep.c (sunpro_static_transform_name): New function to
+ extract the source name from a SunPro transformed name.
+ * inferior.h (procfs_first_available, procfs_get_pid_fd):
+ Add prototypes.
+ * infrun.c (wait_for_inferior): Handle breakpoint hit in
+ signal handler without intervening stop in sigtramp.
+ * procfs.c (procfs_lwp_creation_handler): Use PROCFS_GET_CARRY
+ instead of direct access to the status register.
+ (procfs_get_pid_fd): New function, returns procfs fd for a given pid.
+ * sol-thread.c (ps_lgetLDT): New function, returns LDT for a given
+ lwpid.
+ (sol_find_new_threads): Handle failed libthread_db initialization
+ gracefully.
+ * stabsread.c (define_symbol): Use IS_STATIC_TRANSFORM_NAME
+ to check for a SunPro transformed symbol name.
+
Fri Apr 10 10:35:35 1998 John Metzler <jmetzler@cygnus.com>
* utils.c (fmthex): A formatting function for hexdumps
using MAX_REGISTER_RAW_SIZE.
Sat Apr 4 10:05:00 1998 Dawn Perchik <dawn@cygnus.com>
+
* infrun.c: Fix prototype of signals_info to match static funtion.
Thu Apr 2 12:47:41 1998 Frank Ch. Eigler <fche@cygnus.com>
+
* sol-thread.c (sol_thread_store_registers): Save & restore new
value of single updated register to prevent accidental clobbering.
/* Macro definitions for GDB for a Sun 4 running Solaris 2
- Copyright 1989, 1992, 1993, 1994, 1995 Free Software Foundation, Inc.
+ Copyright 1989, 1992, 1993, 1994, 1995, 1997, 1998
+ Free Software Foundation, Inc.
This file is part of GDB.
extern char *sunpro_static_transform_name PARAMS ((char *));
#define STATIC_TRANSFORM_NAME(x) sunpro_static_transform_name (x)
+#define IS_STATIC_TRANSFORM_NAME(name) ((name)[0] == '$')
#define FAULTED_USE_SIGINFO
#define PIDGET(pid) ((pid) & 0xffff)
#define TIDGET(pid) (((pid) >> 16) & 0xffff)
+/* Macro to extract carry from given regset. */
+#define PROCFS_GET_CARRY(regset) ((regset)[R_PSR] & PS_FLAG_CARRY)
+
#ifdef HAVE_THREAD_DB_LIB
extern char *solaris_pid_to_str PARAMS ((int pid));
Don't confuse that with hitting the breakpoint.
What we check for is that 1) stepping is going on
and 2) the pc before the last insn does not match
- the address of the breakpoint before the current pc. */
- (prev_pc != stop_pc - DECR_PC_AFTER_BREAK
- && CURRENTLY_STEPPING ()) :
+ the address of the breakpoint before the current pc
+ and 3) we didn't hit a breakpoint in a signal handler
+ without an intervening stop in sigtramp, which is
+ detected by a new stack pointer value below
+ any usual function calling stack adjustments. */
+ (CURRENTLY_STEPPING ()
+ && prev_pc != stop_pc - DECR_PC_AFTER_BREAK
+ && !(step_range_end
+ && read_sp () INNER_THAN (step_sp - 16))) :
0)
);
/* Following in case break condition called a
/* Machine independent support for SVR4 /proc (process file system) for GDB.
- Copyright 1991, 1992-96, 1997 Free Software Foundation, Inc.
+ Copyright 1991, 1992-97, 1998 Free Software Foundation, Inc.
Written by Fred Fish at Cygnus Support. Changes for sysv4.2mp procfs
compatibility by Geoffrey Noer at Cygnus Solutions.
/* If lwp_create failed, then nothing interesting happened. Continue the
process and go back to sleep. */
- if (pi->prstatus.pr_reg[R_PSR] & PS_FLAG_CARRY)
+ if (PROCFS_GET_CARRY (pi->prstatus.pr_reg))
{ /* _lwp_create failed */
pi->prrun.pr_flags &= PRSTEP;
pi->prrun.pr_flags |= PRCFAULT;
return -1;
}
+int
+procfs_get_pid_fd (pid)
+ int pid;
+{
+ struct procinfo *pi = find_procinfo (pid, 1);
+
+ if (pi == NULL)
+ return -1;
+
+ return pi->ctl_fd;
+}
+
/* Send a SIGINT to the process group. This acts just like the user typed a
^C on the controlling terminal.
/* Low level interface for debugging Solaris threads for GDB, the GNU debugger.
- Copyright 1996 Free Software Foundation, Inc.
+ Copyright 1996, 1997, 1998 Free Software Foundation, Inc.
This file is part of GDB.
error ("sol_thread_store_registers: td_thr_getfpregs %s",
td_err_string (val));
- /* restore register value */
+ /* restore new register value */
memcpy(& registers[REGISTER_BYTE(regno)], old_value, REGISTER_SIZE);
#if 0
return PS_OK;
}
+
+#ifdef TM_I386SOL2_H
+
+/* Get local descriptor table. */
+
+#include <sys/procfs.h>
+#include <sys/reg.h>
+#include <sys/sysi86.h>
+
+static int nldt_allocated = 0;
+static struct ssd *ldt_bufp = NULL;
+
+ps_err_e
+ps_lgetLDT (const struct ps_prochandle *ph, lwpid_t lwpid,
+ struct ssd *pldt)
+{
+ gregset_t gregset;
+ int lwp_fd;
+ ps_err_e val;
+ int nldt;
+ int i;
+
+ /* Get procfs file descriptor for the LWP. */
+ lwp_fd = procfs_get_pid_fd (BUILD_LWP (lwpid, PIDGET (inferior_pid)));
+ if (lwp_fd < 0)
+ return PS_BADLID;
+
+ /* Fetch registers und LDT descriptors. */
+ if (ioctl (lwp_fd, PIOCGREG, &gregset) == -1)
+ return PS_ERR;
+
+ if (ioctl (lwp_fd, PIOCNLDT, &nldt) == -1)
+ return PS_ERR;
+
+ if (nldt_allocated < nldt)
+ {
+ ldt_bufp
+ = (struct ssd *) xrealloc (ldt_bufp, (nldt + 1) * sizeof (struct ssd));
+ nldt_allocated = nldt;
+ }
+
+ if (ioctl (lwp_fd, PIOCLDT, ldt_bufp) == -1)
+ return PS_ERR;
+
+ /* Search LDT for the LWP via register GS. */
+ for (i = 0; i < nldt; i++)
+ {
+ if (ldt_bufp[i].sel == gregset[GS])
+ {
+ *pldt = ldt_bufp[i];
+ return PS_OK;
+ }
+ }
+
+ /* LDT not found. */
+ return PS_ERR;
+}
+#endif /* TM_I386SOL2_H */
\f
/* Convert a pid to printable form. */
void
sol_find_new_threads()
{
+ /* don't do anything if init failed to resolve the libthread_db library */
+ if (!procfs_suppress_run)
+ return;
+
if (inferior_pid == -1)
{
printf_filtered("No process.\n");
SYMBOL_CLASS (sym) = LOC_STATIC;
SYMBOL_VALUE_ADDRESS (sym) = valu;
#ifdef STATIC_TRANSFORM_NAME
- if (SYMBOL_NAME (sym)[0] == '$')
+ if (IS_STATIC_TRANSFORM_NAME (SYMBOL_NAME (sym)))
{
struct minimal_symbol *msym;
msym = lookup_minimal_symbol (SYMBOL_NAME (sym), NULL, objfile);
SYMBOL_CLASS (sym) = LOC_STATIC;
SYMBOL_VALUE_ADDRESS (sym) = valu;
#ifdef STATIC_TRANSFORM_NAME
- if (SYMBOL_NAME (sym)[0] == '$')
+ if (IS_STATIC_TRANSFORM_NAME (SYMBOL_NAME (sym)))
{
struct minimal_symbol *msym;
msym = lookup_minimal_symbol (SYMBOL_NAME (sym), NULL, objfile);