RFA: ia64 portion of libunwind patch updated

Marcel Moolenaar marcel@xcllnt.net
Mon Nov 17 22:32:00 GMT 2003


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



More information about the Gdb-patches mailing list