This is the mail archive of the
gdb-patches@sources.redhat.com
mailing list for the GDB project.
Re: RFA: ia64 portion of libunwind patch updated
- From: Marcel Moolenaar <marcel at xcllnt dot net>
- To: "J. Johnston" <jjohnstn at redhat dot com>
- Cc: Kevin Buettner <kevinb at redhat dot com>, gdb-patches at sources dot redhat dot com, Andrew Cagney <ac131313 at redhat dot com>, Daniel Jacobowitz <drow at mvista dot com>
- Date: Mon, 17 Nov 2003 14:31:52 -0800
- Subject: Re: RFA: ia64 portion of libunwind patch updated
- References: <1031024175718.ZM3475@localhost.localdomain> <3F996D88.9060505@redhat.com> <1031024185625.ZM9827@localhost.localdomain> <3F9F0180.2010702@redhat.com> <20031029012833.GA11070@nevyn.them.org> <3FA043B2.6090401@redhat.com> <3FA7F97B.4090909@redhat.com> <3FAA830F.50607@redhat.com> <1031117170511.ZM31835@localhost.localdomain> <3FB9404B.8070201@redhat.com>
On Mon, Nov 17, 2003 at 04:40:27PM -0500, J. Johnston wrote:
> Patch checked in. Thanks.
Cool! Thanks for the effort. Now I can play with it on FreeBSD
as well.
BTW: libunwind-0.93 doesn't compile on Red Hat AS 2.1 due to
sigcontext changes. Does it make sense to spend some time
trying to fix that or is AS 2.1 really too old for that?
Or can we use an older version of libunwind there (IOW is
the API compatible)?
Some background information:
\begin{libunwind-build-log}
gcc -DHAVE_CONFIG_H -I. -I../../../src/libunwind-0.93/src -I../include -I../../../src/libunwind-0.93/include -I. -D_GNU_SOURCE -DDEBUG -g -Wall -Wsign-compare -c ../../../src/libunwind-0.93/src/ia64/Ginit-ia64.c -MT Ginit-ia64.lo -MD -MP -MF .deps/Ginit-ia64.TPlo -fPIC -o .libs/Ginit-ia64.o
../../../src/libunwind-0.93/src/ia64/Ginit-ia64.c: In function `uc_addr':
../../../src/libunwind-0.93/src/ia64/Ginit-ia64.c:110: structure has no member named `sc_rbs_base'
gmake[2]: *** [Ginit-ia64.lo] Error 1
gmake[2]: Leaving directory `/proj/eclipse/extra/marcel/unwind/obj/libunwind-0.93/src'
gmake[1]: *** [all] Error 2
\end{libunwind-build-log}
The sigcontext between AS3.0 and AS2.1 changed in the following way:
\begin{diff}
--- sigcontext.h.as2.1 2003-11-17 14:26:11.000000000 -0800
+++ sigcontext.h.as3.0 2003-11-17 14:26:36.000000000 -0800
@@ -2,13 +2,14 @@
#define _ASM_IA64_SIGCONTEXT_H
/*
- * Copyright (C) 1998, 1999 Hewlett-Packard Co
- * Copyright (C) 1998, 1999 David Mosberger-Tang <davidm@hpl.hp.com>
+ * Copyright (C) 1998, 1999, 2001 Hewlett-Packard Co
+ * Copyright (C) 1998, 1999, 2001 David Mosberger-Tang <davidm@hpl.hp.com>
*/
#include <asm/fpu.h>
+#include <asm/signal.h>
-#define IA64_SC_FLAG_ONSTACK_BIT 1 /* is handler running on signal stack? */
+#define IA64_SC_FLAG_ONSTACK_BIT 0 /* is handler running on signal stack? */
#define IA64_SC_FLAG_IN_SYSCALL_BIT 1 /* did signal interrupt a syscall? */
#define IA64_SC_FLAG_FPH_VALID_BIT 2 /* is state in f[32]-f[127] valid? */
@@ -18,6 +19,19 @@
# ifndef __ASSEMBLY__
+/*
+ * Note on handling of register backing store: sc_ar_bsp contains the address that would
+ * be found in ar.bsp after executing a "cover" instruction the context in which the
+ * signal was raised. If signal delivery required switching to an alternate signal stack
+ * (sc_rbs_base is not NULL), the "dirty" partition (as it would exist after executing the
+ * imaginary "cover" instruction) is backed by the *alternate* signal stack, not the
+ * original one. In this case, sc_rbs_base contains the base address of the new register
+ * backing store. The number of registers in the dirty partition can be calculated as:
+ *
+ * ndirty = ia64_rse_num_regs(sc_rbs_base, sc_rbs_base + (sc_loadrs >> 16))
+ *
+ */
+
struct sigcontext {
unsigned long sc_flags; /* see manifest constants above */
unsigned long sc_nat; /* bit i == 1 iff scratch reg gr[i] is a NaT */
@@ -40,8 +54,12 @@
unsigned long sc_gr[32]; /* general registers (static partition) */
struct ia64_fpreg sc_fr[128]; /* floating-point registers */
- unsigned long sc_rsvd[16]; /* reserved for future use */
+ unsigned long sc_rbs_base; /* NULL or new base of sighandler's rbs */
+ unsigned long sc_loadrs; /* see description above */
+ unsigned long sc_ar25; /* cmp8xchg16 uses this */
+ unsigned long sc_ar26; /* rsvd for scratch use */
+ unsigned long sc_rsvd[12]; /* reserved for future use */
/*
* The mask must come last so we can increase _NSIG_WORDS
* without breaking binary compatibility.
\end{diff}
--
Marcel Moolenaar USPA: A-39004 marcel@xcllnt.net