xref: /optee_os/ldelf/start_rv64.S (revision 8fab4371e333936b8d965c1fa6f853774c2c0252)
1*8fab4371Sliushiwei/* SPDX-License-Identifier: BSD-2-Clause */
2*8fab4371Sliushiwei/*
3*8fab4371Sliushiwei * Copyright  2022  Beijing ESWIN Computing Technology Co., Ltd.
4*8fab4371Sliushiwei */
5*8fab4371Sliushiwei
6*8fab4371Sliushiwei#include <asm.S>
7*8fab4371Sliushiwei#include <elf_common.h>
8*8fab4371Sliushiwei
9*8fab4371Sliushiwei/*
10*8fab4371Sliushiwei * _ldelf_start() - Entry of ldelf
11*8fab4371Sliushiwei *
12*8fab4371Sliushiwei * See include/ldelf.h for details on TEE Core interaction.
13*8fab4371Sliushiwei *
14*8fab4371Sliushiwei * void _ldelf_start(struct ldelf_arg *arg);
15*8fab4371Sliushiwei */
16*8fab4371SliushiweiFUNC _ldelf_start , :
17*8fab4371Sliushiwei	/*
18*8fab4371Sliushiwei	 * First ldelf needs to be relocated. The binary is compiled to
19*8fab4371Sliushiwei	 * contain only a minimal number of R_RISCV_RELATIVE relocations in
20*8fab4371Sliushiwei	 * read/write memory, leaving read-only and executable memory
21*8fab4371Sliushiwei	 * untouched.
22*8fab4371Sliushiwei	 */
23*8fab4371Sliushiwei	lla	a1, reloc_end_rel
24*8fab4371Sliushiwei	lw	a3, 0(a1)
25*8fab4371Sliushiwei	lla	a1, reloc_begin_rel
26*8fab4371Sliushiwei	lw	a2, 0(a1)
27*8fab4371Sliushiwei	add	a2, a2, a1
28*8fab4371Sliushiwei	add	a3, a3, a1
29*8fab4371Sliushiwei	beq	a2, a3, 2f
30*8fab4371Sliushiwei
31*8fab4371Sliushiwei	lla	a1, _ldelf_start	/* Get the load offset */
32*8fab4371Sliushiwei
33*8fab4371Sliushiwei	/* Loop over the relocations (Elf64_Rela) and process all entries */
34*8fab4371Sliushiwei1:
35*8fab4371Sliushiwei	ld	t1, 0(a2)	/* t1 = r_offset */
36*8fab4371Sliushiwei	ld	t2, 8(a2)	/* t2 = r_info */
37*8fab4371Sliushiwei	ld	t3, 16(a2)	/* t3 = r_addend */
38*8fab4371Sliushiwei	addi	a2, a2, 24
39*8fab4371Sliushiwei	and	t2, t2, 0xff
40*8fab4371Sliushiwei	addi	t4, zero, R_RISCV_RELATIVE
41*8fab4371Sliushiwei	bne	t2, t4, 3f
42*8fab4371Sliushiwei
43*8fab4371Sliushiwei	/* Update the pointer at r_offset + load offset */
44*8fab4371Sliushiwei	add	t1, a1, t1
45*8fab4371Sliushiwei	ld	t4, 0(t1)
46*8fab4371Sliushiwei	add	t4, t4, t3
47*8fab4371Sliushiwei	add	t4, t4, a1
48*8fab4371Sliushiwei	sd	t4, 0(t1)
49*8fab4371Sliushiwei	ble	a2, a3, 1b
50*8fab4371Sliushiwei2:
51*8fab4371Sliushiwei	jal	ldelf
52*8fab4371Sliushiwei	addi	a0, a0, 0
53*8fab4371Sliushiwei	jal	_ldelf_return
54*8fab4371Sliushiwei3:
55*8fab4371Sliushiwei	addi	a0, a0, 0
56*8fab4371Sliushiwei	jal	_ldelf_panic
57*8fab4371Sliushiweireloc_begin_rel:
58*8fab4371Sliushiwei    .word __reloc_begin - reloc_begin_rel
59*8fab4371Sliushiweireloc_end_rel:
60*8fab4371Sliushiwei    .word __reloc_end - reloc_end_rel
61*8fab4371SliushiweiEND_FUNC _ldelf_start
62