e4999021b07d5e4685794207c16e504e47934187
[deliverable/linux.git] / arch / arm64 / kernel / efi-stub.c
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
16 /* Include shared EFI stub code */
17 #include "../../../drivers/firmware/efi/efi-stub-helper.c"
18 #include "../../../drivers/firmware/efi/fdt.c"
19 #include "../../../drivers/firmware/efi/arm-stub.c"
20
21
22 efi_status_t handle_kernel_image(efi_system_table_t *sys_table,
23 unsigned long *image_addr,
24 unsigned long *image_size,
25 unsigned long *reserve_addr,
26 unsigned long *reserve_size,
27 unsigned long dram_base,
28 efi_loaded_image_t *image)
29 {
30 efi_status_t status;
31 unsigned long kernel_size, kernel_memsize = 0;
32
33 /* Relocate the image, if required. */
34 kernel_size = _edata - _text;
35 if (*image_addr != (dram_base + TEXT_OFFSET)) {
36 kernel_memsize = kernel_size + (_end - _edata);
37 status = efi_relocate_kernel(sys_table, image_addr,
38 kernel_size, kernel_memsize,
39 dram_base + TEXT_OFFSET,
40 PAGE_SIZE);
41 if (status != EFI_SUCCESS) {
42 pr_efi_err(sys_table, "Failed to relocate kernel\n");
43 return status;
44 }
45 if (*image_addr != (dram_base + TEXT_OFFSET)) {
46 pr_efi_err(sys_table, "Failed to alloc kernel memory\n");
47 efi_free(sys_table, kernel_memsize, *image_addr);
48 return EFI_LOAD_ERROR;
49 }
50 *image_size = kernel_memsize;
51 }
52
53
54 return EFI_SUCCESS;
55 }
This page took 0.036191 seconds and 4 git commands to generate.