1/* RISC-V PLT trampoline
2 Copyright (C) 2017-2022 Free Software Foundation, Inc.
3
4 This file is part of the GNU C Library.
5
6 The GNU C Library is free software; you can redistribute it and/or
7 modify it under the terms of the GNU Lesser General Public
8 License as published by the Free Software Foundation; either
9 version 2.1 of the License, or (at your option) any later version.
10
11 The GNU C Library is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 Lesser General Public License for more details.
15
16 You should have received a copy of the GNU Lesser General Public
17 License along with the GNU C Library. If not, see
18 <https://www.gnu.org/licenses/>. */
19
20#include <sysdep.h>
21#include <sys/asm.h>
22
23/* Assembler veneer called from the PLT header code for lazy loading.
24 The PLT header passes its own args in t0-t2. */
25
26#ifdef __riscv_float_abi_soft
27# define FRAME_SIZE (-((-10 * SZREG) & ALMASK))
28#else
29# define FRAME_SIZE (-((-10 * SZREG - 8 * SZFREG) & ALMASK))
30#endif
31
32ENTRY (_dl_runtime_resolve)
33 # Save arguments to stack.
34 addi sp, sp, -FRAME_SIZE
35 REG_S ra, 9*SZREG(sp)
36 REG_S a0, 1*SZREG(sp)
37 REG_S a1, 2*SZREG(sp)
38 REG_S a2, 3*SZREG(sp)
39 REG_S a3, 4*SZREG(sp)
40 REG_S a4, 5*SZREG(sp)
41 REG_S a5, 6*SZREG(sp)
42 REG_S a6, 7*SZREG(sp)
43 REG_S a7, 8*SZREG(sp)
44
45#ifndef __riscv_float_abi_soft
46 FREG_S fa0, (10*SZREG + 0*SZFREG)(sp)
47 FREG_S fa1, (10*SZREG + 1*SZFREG)(sp)
48 FREG_S fa2, (10*SZREG + 2*SZFREG)(sp)
49 FREG_S fa3, (10*SZREG + 3*SZFREG)(sp)
50 FREG_S fa4, (10*SZREG + 4*SZFREG)(sp)
51 FREG_S fa5, (10*SZREG + 5*SZFREG)(sp)
52 FREG_S fa6, (10*SZREG + 6*SZFREG)(sp)
53 FREG_S fa7, (10*SZREG + 7*SZFREG)(sp)
54#endif
55
56 # Update .got.plt and obtain runtime address of callee.
57 slli a1, t1, 1
58 mv a0, t0 # link map
59 add a1, a1, t1 # reloc offset (== thrice the .got.plt offset)
60 la a2, _dl_fixup
61 jalr a2
62 mv t1, a0
63
64 # Restore arguments from stack.
65 REG_L ra, 9*SZREG(sp)
66 REG_L a0, 1*SZREG(sp)
67 REG_L a1, 2*SZREG(sp)
68 REG_L a2, 3*SZREG(sp)
69 REG_L a3, 4*SZREG(sp)
70 REG_L a4, 5*SZREG(sp)
71 REG_L a5, 6*SZREG(sp)
72 REG_L a6, 7*SZREG(sp)
73 REG_L a7, 8*SZREG(sp)
74
75#ifndef __riscv_float_abi_soft
76 FREG_L fa0, (10*SZREG + 0*SZFREG)(sp)
77 FREG_L fa1, (10*SZREG + 1*SZFREG)(sp)
78 FREG_L fa2, (10*SZREG + 2*SZFREG)(sp)
79 FREG_L fa3, (10*SZREG + 3*SZFREG)(sp)
80 FREG_L fa4, (10*SZREG + 4*SZFREG)(sp)
81 FREG_L fa5, (10*SZREG + 5*SZFREG)(sp)
82 FREG_L fa6, (10*SZREG + 6*SZFREG)(sp)
83 FREG_L fa7, (10*SZREG + 7*SZFREG)(sp)
84#endif
85
86 addi sp, sp, FRAME_SIZE
87
88 # Invoke the callee.
89 jr t1
90END (_dl_runtime_resolve)
91

source code of glibc/sysdeps/riscv/dl-trampoline.S