Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/lib/libc/arch/alpha/gen Save the GP register value and resto...



details:   https://anonhg.NetBSD.org/src/rev/3280ba0696ba
branches:  trunk
changeset: 785407:3280ba0696ba
user:      martin <martin%NetBSD.org@localhost>
date:      Tue Mar 12 19:38:20 2013 +0000

description:
Save the GP register value and restore it on longjmp.

While formally GP is not a callee-saved register, for static linking
the link time optimization described in section 3.2.3 of the "Calling
Standard for Alpha Systems" allows the caller to rely on GP being the
value needed within setjmp() - and not restore it after return if setjmp
and the call site share a GP value.

This fixes longjmp/setjmp for statically linked programs, e.g. /rescue/csh
or the static tcsh variant from pkgsrc.

diffstat:

 lib/libc/arch/alpha/gen/__longjmp14.c |  5 ++++-
 lib/libc/arch/alpha/gen/__setjmp14.S  |  3 ++-
 2 files changed, 6 insertions(+), 2 deletions(-)

diffs (43 lines):

diff -r ab0a7b68c10b -r 3280ba0696ba lib/libc/arch/alpha/gen/__longjmp14.c
--- a/lib/libc/arch/alpha/gen/__longjmp14.c     Tue Mar 12 15:17:58 2013 +0000
+++ b/lib/libc/arch/alpha/gen/__longjmp14.c     Tue Mar 12 19:38:20 2013 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: __longjmp14.c,v 1.5 2008/04/28 20:22:55 martin Exp $   */
+/*     $NetBSD: __longjmp14.c,v 1.6 2013/03/12 19:38:20 martin Exp $   */
 
 /*-
  * Copyright (c) 2003 The NetBSD Foundation, Inc.
@@ -56,6 +56,8 @@
        if (val == 0)
                val = -1;
 
+       memset(&uc, 0, sizeof uc);
+
        /* Set _UC_SIGMASK and _UC_CPU */
        uc.uc_flags = _UC_SIGMASK | _UC_CPU;
 
@@ -74,6 +76,7 @@
        uc.uc_mcontext.__gregs[_REG_S5] = sc->sc_regs[R_S5];
        uc.uc_mcontext.__gregs[_REG_S6] = sc->sc_regs[R_S6];
        uc.uc_mcontext.__gregs[_REG_RA] = sc->sc_regs[R_RA];
+       uc.uc_mcontext.__gregs[_REG_GP] = sc->sc_regs[R_GP];
        uc.uc_mcontext.__gregs[_REG_SP] = sc->sc_sp;
        uc.uc_mcontext.__gregs[_REG_PC] = sc->sc_pc;
        uc.uc_mcontext.__gregs[_REG_PS] =
diff -r ab0a7b68c10b -r 3280ba0696ba lib/libc/arch/alpha/gen/__setjmp14.S
--- a/lib/libc/arch/alpha/gen/__setjmp14.S      Tue Mar 12 15:17:58 2013 +0000
+++ b/lib/libc/arch/alpha/gen/__setjmp14.S      Tue Mar 12 19:38:20 2013 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: __setjmp14.S,v 1.5 2011/06/12 05:44:36 matt Exp $ */
+/* $NetBSD: __setjmp14.S,v 1.6 2013/03/12 19:38:20 martin Exp $ */
 
 /*
  * Copyright (c) 1994, 1995 Carnegie-Mellon University.
@@ -55,6 +55,7 @@
        stq     s6, (SC_REGS+_REG_S6)(a0)
        stq     ra, (SC_REGS+_REG_RA)(a0)
        stq     sp, (SC_REGS+_REG_SP)(a0)
+       stq     gp, (SC_REGS+_REG_GP)(a0)
 
        /*
         * get signal information



Home | Main Index | Thread Index | Old Index