xref: /optee_os/ldelf/start_a32.S (revision baa5161d50da0b430760fa9e2180496c2806f839)
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