1/*
2 * Copyright (C) 2013, 2014 Linaro Ltd;  <roy.franz@linaro.org>
3 *
4 * This file implements the EFI boot stub for the arm64 kernel.
5 * Adapted from ARM version by Mark Salter <msalter@redhat.com>
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License version 2 as
9 * published by the Free Software Foundation.
10 *
11 */
12#include <linux/efi.h>
13#include <asm/efi.h>
14#include <asm/sections.h>
15
16efi_status_t __init handle_kernel_image(efi_system_table_t *sys_table,
17					unsigned long *image_addr,
18					unsigned long *image_size,
19					unsigned long *reserve_addr,
20					unsigned long *reserve_size,
21					unsigned long dram_base,
22					efi_loaded_image_t *image)
23{
24	efi_status_t status;
25	unsigned long kernel_size, kernel_memsize = 0;
26
27	/* Relocate the image, if required. */
28	kernel_size = _edata - _text;
29	if (*image_addr != (dram_base + TEXT_OFFSET)) {
30		kernel_memsize = kernel_size + (_end - _edata);
31		status = efi_low_alloc(sys_table, kernel_memsize + TEXT_OFFSET,
32				       SZ_2M, reserve_addr);
33		if (status != EFI_SUCCESS) {
34			pr_efi_err(sys_table, "Failed to relocate kernel\n");
35			return status;
36		}
37		memcpy((void *)*reserve_addr + TEXT_OFFSET, (void *)*image_addr,
38		       kernel_size);
39		*image_addr = *reserve_addr + TEXT_OFFSET;
40		*reserve_size = kernel_memsize + TEXT_OFFSET;
41	}
42
43
44	return EFI_SUCCESS;
45}
46