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