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.
This commit is contained in:
parent
168c675fdb
commit
c06bee84e7
lib/libc/arch/alpha/gen
@ -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 @@ __longjmp14(jmp_buf env, int val)
|
||||
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 @@ __longjmp14(jmp_buf env, int val)
|
||||
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] =
|
||||
|
@ -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 @@ LEAF(__setjmp14, 1)
|
||||
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
|
||||
|
Loading…
x
Reference in New Issue
Block a user