diff options
author | Tom Rini <trini@konsulko.com> | 2019-11-19 17:42:46 -0500 |
---|---|---|
committer | Tom Rini <trini@konsulko.com> | 2019-11-19 17:42:46 -0500 |
commit | 99f9682cae45604ed3ad923cf2caa8fdd0e273e3 (patch) | |
tree | da06ca42bb24ad32f2b7f6afefd61db8b8a275bc | |
parent | d4a31e8ee5592072d8d5208b3e950cba2d89b6bd (diff) | |
parent | 38064ee04c9b42a299f914c36a093144bd86ac50 (diff) | |
download | u-boot-99f9682cae45604ed3ad923cf2caa8fdd0e273e3.tar.gz |
Merge tag 'efi-2020-01-rc4' of https://gitlab.denx.de/u-boot/custodians/u-boot-efi
Pull request for UEFI sub-system for efi-2020-01-rc4
Fix errors due to unaligned memory access:
* disable UEFI except for ARMv8, ARMv7, ARM11
* enable unaligned access support on ARM11
Remove an unused function.
-rw-r--r-- | arch/arm/cpu/arm11/Makefile | 4 | ||||
-rw-r--r-- | arch/arm/cpu/arm11/sctlr.S | 25 | ||||
-rw-r--r-- | include/efi_loader.h | 1 | ||||
-rw-r--r-- | lib/efi_loader/Kconfig | 7 | ||||
-rw-r--r-- | lib/efi_loader/efi_device_path.c | 18 |
5 files changed, 37 insertions, 18 deletions
diff --git a/arch/arm/cpu/arm11/Makefile b/arch/arm/cpu/arm11/Makefile index 5d721fce12..5dfa01ae8d 100644 --- a/arch/arm/cpu/arm11/Makefile +++ b/arch/arm/cpu/arm11/Makefile @@ -4,3 +4,7 @@ # Wolfgang Denk, DENX Software Engineering, wd@denx.de. obj-y = cpu.o + +ifneq ($(CONFIG_SPL_BUILD),y) +obj-$(CONFIG_EFI_LOADER) += sctlr.o +endif diff --git a/arch/arm/cpu/arm11/sctlr.S b/arch/arm/cpu/arm11/sctlr.S new file mode 100644 index 0000000000..74a7fc4a25 --- /dev/null +++ b/arch/arm/cpu/arm11/sctlr.S @@ -0,0 +1,25 @@ +/* SPDX-License-Identifier: GPL-2.0+ */ +/* + * Routines to access the system control register + * + * Copyright (c) 2019 Heinrich Schuchardt + */ + +#include <linux/linkage.h> + +/* + * void allow_unaligned(void) - allow unaligned access + * + * This routine sets the enable unaligned data support flag and clears the + * aligned flag in the system control register. + * After calling this routine unaligned access does no longer leads to a + * data abort or undefined behavior but is handled by the CPU. + * For details see the "ARM Architecture Reference Manual" for ARMv6. + */ +ENTRY(allow_unaligned) + mrc p15, 0, r0, c1, c0, 0 @ load system control register + orr r0, r0, #1 << 22 @ set unaligned data support flag + bic r0, r0, #2 @ clear aligned flag + mcr p15, 0, r0, c1, c0, 0 @ write system control register + bx lr @ return +ENDPROC(allow_unaligned) diff --git a/include/efi_loader.h b/include/efi_loader.h index 381da80cdc..16a1b258b1 100644 --- a/include/efi_loader.h +++ b/include/efi_loader.h @@ -543,7 +543,6 @@ struct efi_device_path *efi_dp_get_next_instance(struct efi_device_path **dp, /* Check if a device path contains muliple instances */ bool efi_dp_is_multi_instance(const struct efi_device_path *dp); -struct efi_device_path *efi_dp_from_dev(struct udevice *dev); struct efi_device_path *efi_dp_from_part(struct blk_desc *desc, int part); /* Create a device node for a block device partition. */ struct efi_device_path *efi_dp_part_node(struct blk_desc *desc, int part); diff --git a/lib/efi_loader/Kconfig b/lib/efi_loader/Kconfig index c7027a9676..7984d6f42d 100644 --- a/lib/efi_loader/Kconfig +++ b/lib/efi_loader/Kconfig @@ -1,6 +1,11 @@ config EFI_LOADER bool "Support running UEFI applications" - depends on (ARM || X86 || RISCV || SANDBOX) && OF_LIBFDT + depends on OF_LIBFDT && ( \ + ARM && (SYS_CPU = arm1136 || \ + SYS_CPU = arm1176 || \ + SYS_CPU = armv7 || \ + SYS_CPU = armv8) || \ + X86 || RISCV || SANDBOX) # We need EFI_STUB_64BIT to be set on x86_64 with EFI_STUB depends on !EFI_STUB || !X86_64 || EFI_STUB_64BIT # We need EFI_STUB_32BIT to be set on x86_32 with EFI_STUB diff --git a/lib/efi_loader/efi_device_path.c b/lib/efi_loader/efi_device_path.c index 17a0c5bb45..73f1fe75a8 100644 --- a/lib/efi_loader/efi_device_path.c +++ b/lib/efi_loader/efi_device_path.c @@ -422,7 +422,7 @@ bool efi_dp_is_multi_instance(const struct efi_device_path *dp) /* size of device-path not including END node for device and all parents * up to the root device. */ -static unsigned dp_size(struct udevice *dev) +__maybe_unused static unsigned int dp_size(struct udevice *dev) { if (!dev || !dev->driver) return sizeof(ROOT); @@ -494,7 +494,7 @@ static unsigned dp_size(struct udevice *dev) * @dev device * @return pointer to the end of the device path */ -static void *dp_fill(void *buf, struct udevice *dev) +__maybe_unused static void *dp_fill(void *buf, struct udevice *dev) { if (!dev || !dev->driver) return buf; @@ -654,20 +654,6 @@ static void *dp_fill(void *buf, struct udevice *dev) return dp_fill(buf, dev->parent); } } - -/* Construct a device-path from a device: */ -struct efi_device_path *efi_dp_from_dev(struct udevice *dev) -{ - void *buf, *start; - - start = buf = dp_alloc(dp_size(dev) + sizeof(END)); - if (!buf) - return NULL; - buf = dp_fill(buf, dev); - *((struct efi_device_path *)buf) = END; - - return start; -} #endif static unsigned dp_part_size(struct blk_desc *desc, int part) |