[U-Boot] [PATCH] arm: disable alignment fault checking with EFI_LOADER
Alexander Graf
agraf at suse.de
Mon Aug 7 13:16:21 UTC 2017
> Am 07.08.2017 um 13:19 schrieb Rob Clark <robdclark at gmail.com>:
>
> Device-path structures in UEFI are only byte aligned, which can result
> in unaligned access faults (either in u-boot or the efi payload which is
> loaded). From the UEFI spec (sect 10.3.1 in UEFI spec v2.7):
>
> A Device Path is a series of generic Device Path nodes. The first
> Device Path node starts at byte offset zero of the Device Path.
> The next Device Path node starts at the end of the previous Device
> Path node. Therefore all nodes are byte-packed data structures that
> may appear on any byte boundary. All code references to device path
> notes must assume all fields are unaligned. Since every Device Path
> node contains a length field in a known place, it is possible to
> traverse Device Path nodes that are of an unknown type. There is
> no limit to the number, type, or sequence of nodes in a Device Path.
>
> This isn't a matter of "just fix u-boot", it is baked into the spec.
> Not enabling alignment faults is consistent with what TianoCore edk2
> does.
>
> For armv6 and earlier, we probably still need hacks to pad the device-
> path nodes, which isn't quite in line with the spec, and sanitize
> device-paths passed in from the efi payload. But we can at least dtrt
> on armv7 (and aarch64 which already doesn't enable alignment faults).
>
> Probably we can skip clearing the bit when EFI_LOADER is enabled, since
> '0' is the reset value. But I guess safest to clear it just in case an
> early stage in the boot chain set it.
>
> Signed-off-by: Rob Clark <robdclark at gmail.com>
> ---
> Only tested in qemu, and it is unclear if alignment faults are even
> trapped in qemu. If someone wants to test, then try (on top of the
> "enough UEFI for standard distro boot" patchset[1]) either fallback.efi
> (which uses gnu-efi lib to parse device-paths to string) or any efi
> payload that uses the device-path-to-text protocol. Either of those
> should trigger unaligned accesses. Grub's lsefi command should also
> trigger unaligned faults.
It's unfortunately much harder. To have working hardware alignment fixups, you need to enable the MMU as well. That's why I rewrote the MMU management for AArch64 back then.
The reason it worked out so far for me at least is that grub on 32bit as well as u-boot are compiled with unaligned checks.
Alex
>
> arch/arm/cpu/armv7/start.S | 4 ++++
> 1 file changed, 4 insertions(+)
>
> diff --git a/arch/arm/cpu/armv7/start.S b/arch/arm/cpu/armv7/start.S
> index f06fd28940..c1cec30af6 100644
> --- a/arch/arm/cpu/armv7/start.S
> +++ b/arch/arm/cpu/armv7/start.S
> @@ -149,7 +149,11 @@ ENTRY(cpu_init_cp15)
> mrc p15, 0, r0, c1, c0, 0
> bic r0, r0, #0x00002000 @ clear bits 13 (--V-)
> bic r0, r0, #0x00000007 @ clear bits 2:0 (-CAM)
> +#ifdef EFI_LOADER
> + bic r0, r0, #0x00000002 @ clear bit 1 (--A-) Align
> +#else
> orr r0, r0, #0x00000002 @ set bit 1 (--A-) Align
> +#endif
> orr r0, r0, #0x00000800 @ set bit 11 (Z---) BTB
> #ifdef CONFIG_SYS_ICACHE_OFF
> bic r0, r0, #0x00001000 @ clear bit 12 (I) I-cache
> --
> 2.13.0
>
More information about the U-Boot
mailing list