17509ff7cSJens Wiklander/* SPDX-License-Identifier: BSD-2-Clause */ 27509ff7cSJens Wiklander/* 37509ff7cSJens Wiklander * Copyright (c) 2019, Linaro Limited 4*baa5161dSBalint Dobszay * Copyright (c) 2020, Arm Limited 57509ff7cSJens Wiklander */ 67509ff7cSJens Wiklander 77509ff7cSJens Wiklander#include <asm.S> 87509ff7cSJens Wiklander#include <elf_common.h> 97509ff7cSJens Wiklander 107509ff7cSJens Wiklander/* 117509ff7cSJens Wiklander * _start() - Entry of ldelf 127509ff7cSJens Wiklander * 137509ff7cSJens Wiklander * See include/ldelf.h for details on TEE Core interaction. 147509ff7cSJens Wiklander * 157509ff7cSJens Wiklander * void start(struct ldelf_arg *arg); 167509ff7cSJens Wiklander */ 177509ff7cSJens WiklanderFUNC _ldelf_start , : 187509ff7cSJens Wiklander /* 197509ff7cSJens Wiklander * First ldelf needs to be relocated. The binary is compiled to 207509ff7cSJens Wiklander * contain only a minimal number of R_ARM_RELATIVE relocations in 217509ff7cSJens Wiklander * read/write memory, leaving read-only and executeble memory 227509ff7cSJens Wiklander * untouched. 237509ff7cSJens Wiklander */ 247509ff7cSJens Wiklander adr r4, reloc_begin_rel 257509ff7cSJens Wiklander ldr r5, reloc_begin_rel 267509ff7cSJens Wiklander ldr r6, reloc_end_rel 277509ff7cSJens Wiklander add r5, r5, r4 287509ff7cSJens Wiklander add r6, r6, r4 297509ff7cSJens Wiklander cmp r5, r6 307509ff7cSJens Wiklander beq 2f 317509ff7cSJens Wiklander 327509ff7cSJens Wiklander adr r4, _ldelf_start /* Get the load offset */ 337509ff7cSJens Wiklander 347509ff7cSJens Wiklander /* Loop over the relocations (Elf32_Rel) and process all entries */ 357509ff7cSJens Wiklander1: ldmia r5!, {r7-r8} /* r7 == r_offset, r8 = r_info */ 367509ff7cSJens Wiklander and r8, r8, #0xff 377509ff7cSJens Wiklander cmp r8, #R_ARM_RELATIVE 387509ff7cSJens Wiklander /* We're currently only supporting R_ARM_RELATIVE relocations */ 397509ff7cSJens Wiklander bne 3f 407509ff7cSJens Wiklander 417509ff7cSJens Wiklander /* Update the pointer at r_offset + load_offset */ 427509ff7cSJens Wiklander add r7, r7, r4 437509ff7cSJens Wiklander ldr r8, [r7] 447509ff7cSJens Wiklander add r8, r8, r4 457509ff7cSJens Wiklander str r8, [r7] 467509ff7cSJens Wiklander 477509ff7cSJens Wiklander cmp r5, r6 487509ff7cSJens Wiklander blo 1b 497509ff7cSJens Wiklander 507509ff7cSJens Wiklander2: bl ldelf 517509ff7cSJens Wiklander mov r0, #0 52*baa5161dSBalint Dobszay bl _ldelf_return 537509ff7cSJens Wiklander3: mov r0, #0 54*baa5161dSBalint Dobszay bl _ldelf_panic 557509ff7cSJens Wiklanderreloc_begin_rel: 567509ff7cSJens Wiklander .word __reloc_begin - reloc_begin_rel 577509ff7cSJens Wiklanderreloc_end_rel: 587509ff7cSJens Wiklander .word __reloc_end - reloc_end_rel 597509ff7cSJens WiklanderEND_FUNC _ldelf_start 60