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