/*
 * reloc_arm.c - position-independent ARM ELF shared object relocator
 *
 * Copyright (C) 2014 Linaro Ltd. <ard.biesheuvel@linaro.org>
 * Copyright (C) 1999 Hewlett-Packard Co.
 * Contributed by David Mosberger <davidm@hpl.hp.com>.
 *
 * All rights reserved.
 *
 * SPDX-License-Identifier:	BSD-3-Clause
 *
 * This file is taken and modified from the gnu-efi project.
 */

#include <efi.h>
#include <elf.h>

efi_status_t _relocate(long ldbase, Elf32_Dyn *dyn, efi_handle_t image,
		       struct efi_system_table *systab)
{
	long relsz = 0, relent = 0;
	Elf32_Rel *rel = 0;
	ulong *addr;
	int i;

	for (i = 0; dyn[i].d_tag != DT_NULL; ++i) {
		switch (dyn[i].d_tag) {
		case DT_REL:
			rel = (Elf32_Rel *)((ulong)dyn[i].d_un.d_ptr
					+ ldbase);
			break;
		case DT_RELSZ:
			relsz = dyn[i].d_un.d_val;
			break;
		case DT_RELENT:
			relent = dyn[i].d_un.d_val;
			break;
		default:
			break;
		}
	}

	if (!rel && relent == 0)
		return EFI_SUCCESS;

	if (!rel || relent == 0)
		return EFI_LOAD_ERROR;

	while (relsz > 0) {
		/* apply the relocs */
		switch (ELF32_R_TYPE(rel->r_info)) {
		case R_ARM_NONE:
			break;
		case R_ARM_RELATIVE:
			addr = (ulong *)(ldbase + rel->r_offset);
			*addr += ldbase;
			break;
		default:
			break;
		}
		rel = (Elf32_Rel *)((char *)rel + relent);
		relsz -= relent;
	}

	return EFI_SUCCESS;
}
