diff options
-rw-r--r-- | libexec/ld.so/alpha/ldasm.S | 114 |
1 files changed, 113 insertions, 1 deletions
diff --git a/libexec/ld.so/alpha/ldasm.S b/libexec/ld.so/alpha/ldasm.S index 32b3ebf1992..7e6bfbfd110 100644 --- a/libexec/ld.so/alpha/ldasm.S +++ b/libexec/ld.so/alpha/ldasm.S @@ -1,4 +1,4 @@ -/* $OpenBSD: ldasm.S,v 1.2 2001/05/29 08:52:11 art Exp $ */ +/* $OpenBSD: ldasm.S,v 1.3 2001/06/13 08:42:03 art Exp $ */ /* * Copyright (c) 2001 Niklas Hallqvist @@ -31,6 +31,32 @@ * SUCH DAMAGE. * */ +/* + * Copyright 1996 Matt Thomas <matt@3am-software.com> + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ #include <machine/asm.h> #include <machine/pal.h> @@ -88,6 +114,92 @@ L3: END(_dl_start) /* + * Lazy binding entry point, called via PLT. + */ +NESTED_NOPROFILE(_dl_bind_start, 0, 168, ra, 0, 0) + .set noat + /* at_reg already used by PLT code. */ + + /* + * Allocate stack frame and preserve all registers that the caller + * would have normally saved themselves. + */ + lda sp, -168(sp) + stq ra, 0(sp) + stq v0, 8(sp) + stq t0, 16(sp) + stq t1, 24(sp) + stq t2, 32(sp) + stq t3, 40(sp) + stq t4, 48(sp) + stq t5, 56(sp) + stq t6, 64(sp) + stq t7, 72(sp) + stq a0, 80(sp) + stq a1, 88(sp) + stq a2, 96(sp) + stq a3, 104(sp) + stq a4, 112(sp) + stq a5, 120(sp) + stq t8, 128(sp) + stq t9, 136(sp) + stq t10, 144(sp) + stq t11, 152(sp) + stq gp, 160(sp) + + /* + * Load our global pointer. Note, can't use pv, since it is + * already used by the PLT code. + */ + br t0, L100 +L100: LDGP(t0) + + /* Set up the arguments for _dl_bind. */ + subq at_reg, t12, a1 + ldq a0, 8(t12) + subq a1, 20, a1 + addq a1, a1, a1 + CALL(_dl_bind) + + /* Move the destination address into position. */ + mov v0, pv + + /* Restore program registers. */ + ldq ra, 0(sp) + ldq v0, 8(sp) + ldq t0, 16(sp) + ldq t1, 24(sp) + ldq t2, 32(sp) + ldq t3, 40(sp) + ldq t4, 48(sp) + ldq t5, 56(sp) + ldq t6, 64(sp) + ldq t7, 72(sp) + ldq a0, 80(sp) + ldq a1, 88(sp) + ldq a2, 96(sp) + ldq a3, 104(sp) + ldq a4, 112(sp) + ldq a5, 120(sp) + ldq t8, 128(sp) + ldq t9, 136(sp) + ldq t10, 144(sp) + ldq t11, 152(sp) + ldq gp, 160(sp) + /* XXX LDGP? */ + + /* + * We've patched the PLT; sync the I-stream. + */ + imb + + /* Pop the stack frame and turn control to the destination. */ + lda sp, 168(sp) + jmp zero, (pv) +END(_dl_bind_start) + + +/* * In reality these are not leaves, but they are stubs which does not need * further register saving. */ |