summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--arch/arm/lib/crt0_aarch64_efi.S3
-rw-r--r--cmd/bootefi.c4
-rw-r--r--disk/part_efi.c3
-rw-r--r--include/asm-generic/pe.h2
-rw-r--r--lib/efi_loader/efi_disk.c10
-rw-r--r--lib/efi_loader/efi_setup.c4
-rw-r--r--lib/efi_selftest/efi_selftest_block_device.c21
-rw-r--r--tools/.gitignore1
8 files changed, 38 insertions, 10 deletions
diff --git a/arch/arm/lib/crt0_aarch64_efi.S b/arch/arm/lib/crt0_aarch64_efi.S
index 368933ecf2..492195f765 100644
--- a/arch/arm/lib/crt0_aarch64_efi.S
+++ b/arch/arm/lib/crt0_aarch64_efi.S
@@ -18,7 +18,8 @@
.globl ImageBase
ImageBase:
.short IMAGE_DOS_SIGNATURE /* 'MZ' */
- .skip 58 /* 'MZ' + pad + offset == 64 */
+ .skip 54 /* 'MZ' + pad + offset == 64 */
+ .long LINUX_ARM64_MAGIC /* For GRUB's linux command */
.long pe_header - ImageBase /* Offset to the PE header */
pe_header:
.long IMAGE_NT_SIGNATURE /* 'PE' */
diff --git a/cmd/bootefi.c b/cmd/bootefi.c
index c8eb5c32b0..81dd8e0284 100644
--- a/cmd/bootefi.c
+++ b/cmd/bootefi.c
@@ -8,6 +8,7 @@
#define LOG_CATEGORY LOGC_EFI
#include <common.h>
+#include <bootm.h>
#include <charset.h>
#include <command.h>
#include <dm.h>
@@ -338,6 +339,9 @@ static efi_status_t do_bootefi_exec(efi_handle_t handle, void *load_options)
efi_uintn_t exit_data_size = 0;
u16 *exit_data = NULL;
+ /* On ARM switch from EL3 or secure mode to EL2 or non-secure mode */
+ switch_to_non_secure_mode();
+
/* Call our payload! */
ret = EFI_CALL(efi_start_image(handle, &exit_data_size, &exit_data));
if (ret != EFI_SUCCESS) {
diff --git a/disk/part_efi.c b/disk/part_efi.c
index 2f922662e6..7a24e33d18 100644
--- a/disk/part_efi.c
+++ b/disk/part_efi.c
@@ -867,6 +867,9 @@ int write_mbr_and_gpt_partitions(struct blk_desc *dev_desc, void *buf)
return 1;
}
+ /* Update the partition table entries*/
+ part_init(dev_desc);
+
return 0;
}
#endif
diff --git a/include/asm-generic/pe.h b/include/asm-generic/pe.h
index b247519a3d..a1df747134 100644
--- a/include/asm-generic/pe.h
+++ b/include/asm-generic/pe.h
@@ -51,4 +51,6 @@
#define IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER 12
#define IMAGE_SUBSYSTEM_EFI_ROM 13
+#define LINUX_ARM64_MAGIC 0x644d5241
+
#endif /* _ASM_PE_H */
diff --git a/lib/efi_loader/efi_disk.c b/lib/efi_loader/efi_disk.c
index c0804effde..d0aad0252a 100644
--- a/lib/efi_loader/efi_disk.c
+++ b/lib/efi_loader/efi_disk.c
@@ -142,8 +142,9 @@ static efi_status_t EFIAPI efi_disk_read_blocks(struct efi_block_io *this,
return EFI_MEDIA_CHANGED;
if (!this->media->media_present)
return EFI_NO_MEDIA;
- /* media->io_align is a power of 2 */
- if ((uintptr_t)buffer & (this->media->io_align - 1))
+ /* media->io_align is a power of 2 or 0 */
+ if (this->media->io_align &&
+ (uintptr_t)buffer & (this->media->io_align - 1))
return EFI_INVALID_PARAMETER;
if (lba * this->media->block_size + buffer_size >
this->media->last_block * this->media->block_size)
@@ -209,8 +210,9 @@ static efi_status_t EFIAPI efi_disk_write_blocks(struct efi_block_io *this,
return EFI_MEDIA_CHANGED;
if (!this->media->media_present)
return EFI_NO_MEDIA;
- /* media->io_align is a power of 2 */
- if ((uintptr_t)buffer & (this->media->io_align - 1))
+ /* media->io_align is a power of 2 or 0 */
+ if (this->media->io_align &&
+ (uintptr_t)buffer & (this->media->io_align - 1))
return EFI_INVALID_PARAMETER;
if (lba * this->media->block_size + buffer_size >
this->media->last_block * this->media->block_size)
diff --git a/lib/efi_loader/efi_setup.c b/lib/efi_loader/efi_setup.c
index 5800cbf6d4..b1c5125032 100644
--- a/lib/efi_loader/efi_setup.c
+++ b/lib/efi_loader/efi_setup.c
@@ -6,7 +6,6 @@
*/
#include <common.h>
-#include <bootm.h>
#include <efi_loader.h>
#include <efi_variable.h>
@@ -188,9 +187,6 @@ efi_status_t efi_init_obj_list(void)
/* Allow unaligned memory access */
allow_unaligned();
- /* On ARM switch from EL3 or secure mode to EL2 or non-secure mode */
- switch_to_non_secure_mode();
-
/* Initialize root node */
ret = efi_root_node_register();
if (ret != EFI_SUCCESS)
diff --git a/lib/efi_selftest/efi_selftest_block_device.c b/lib/efi_selftest/efi_selftest_block_device.c
index 5eb297d285..15f03751ac 100644
--- a/lib/efi_selftest/efi_selftest_block_device.c
+++ b/lib/efi_selftest/efi_selftest_block_device.c
@@ -194,7 +194,7 @@ static int setup(const efi_handle_t handle,
decompress(&image);
block_io.media->block_size = 1 << LB_BLOCK_SIZE;
- block_io.media->last_block = img.length >> LB_BLOCK_SIZE;
+ block_io.media->last_block = (img.length >> LB_BLOCK_SIZE) - 1;
ret = boottime->install_protocol_interface(
&disk_handle, &block_io_protocol_guid,
@@ -301,6 +301,7 @@ static int execute(void)
efi_handle_t *handles;
efi_handle_t handle_partition = NULL;
struct efi_device_path *dp_partition;
+ struct efi_block_io *block_io_protocol;
struct efi_simple_file_system_protocol *file_system;
struct efi_file_handle *root, *file;
struct {
@@ -309,6 +310,7 @@ static int execute(void)
} system_info;
efi_uintn_t buf_size;
char buf[16] __aligned(ARCH_DMA_MINALIGN);
+ u32 part1_size;
u64 pos;
/* Connect controller to virtual disk */
@@ -353,6 +355,23 @@ static int execute(void)
return EFI_ST_FAILURE;
}
+ /* Open the block_io_protocol */
+ ret = boottime->open_protocol(handle_partition,
+ &block_io_protocol_guid,
+ (void **)&block_io_protocol, NULL, NULL,
+ EFI_OPEN_PROTOCOL_GET_PROTOCOL);
+ if (ret != EFI_SUCCESS) {
+ efi_st_error("Failed to open block IO protocol\n");
+ return EFI_ST_FAILURE;
+ }
+ /* Get size of first MBR partition */
+ memcpy(&part1_size, image + 0x1ca, sizeof(u32));
+ if (block_io_protocol->media->last_block != part1_size - 1) {
+ efi_st_error("Last LBA of partition %x, expected %x\n",
+ (unsigned int)block_io_protocol->media->last_block,
+ part1_size - 1);
+ return EFI_ST_FAILURE;
+ }
/* Open the simple file system protocol */
ret = boottime->open_protocol(handle_partition,
&guid_simple_file_system_protocol,
diff --git a/tools/.gitignore b/tools/.gitignore
index a021ea95cd..a88453f64d 100644
--- a/tools/.gitignore
+++ b/tools/.gitignore
@@ -20,6 +20,7 @@
/kwboot
/lib/
/mips-relocs
+/mkeficapsule
/mkenvimage
/mkexynosspl
/mkimage