Module Name: src Committed By: skrll Date: Thu Aug 15 06:15:17 UTC 2024
Modified Files: src/sys/stand/efiboot: efiboot_machdep.h efifdt.c version src/sys/stand/efiboot/bootaa64: efibootaa64.c src/sys/stand/efiboot/bootarm: efibootarm.c src/sys/stand/efiboot/bootriscv64: efibootriscv64.c Log Message: Allow an MD check in prepare_boot and use it on arm64 (aarch64) to check that, if a big endian kernel is seen, the CPU is capable of supporting BE data accesses at EL0 via ID_AA64MMFR0_EL1.BigEnd. To generate a diff of this commit: cvs rdiff -u -r1.4 -r1.5 src/sys/stand/efiboot/efiboot_machdep.h cvs rdiff -u -r1.36 -r1.37 src/sys/stand/efiboot/efifdt.c cvs rdiff -u -r1.31 -r1.32 src/sys/stand/efiboot/version cvs rdiff -u -r1.6 -r1.7 src/sys/stand/efiboot/bootaa64/efibootaa64.c cvs rdiff -u -r1.3 -r1.4 src/sys/stand/efiboot/bootarm/efibootarm.c cvs rdiff -u -r1.1 -r1.2 src/sys/stand/efiboot/bootriscv64/efibootriscv64.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/stand/efiboot/efiboot_machdep.h diff -u src/sys/stand/efiboot/efiboot_machdep.h:1.4 src/sys/stand/efiboot/efiboot_machdep.h:1.5 --- src/sys/stand/efiboot/efiboot_machdep.h:1.4 Tue Aug 1 07:04:16 2023 +++ src/sys/stand/efiboot/efiboot_machdep.h Thu Aug 15 06:15:16 2024 @@ -1,4 +1,4 @@ -/* $NetBSD: efiboot_machdep.h,v 1.4 2023/08/01 07:04:16 mrg Exp $ */ +/* $NetBSD: efiboot_machdep.h,v 1.5 2024/08/15 06:15:16 skrll Exp $ */ /*- * Copyright (c) 2018 Jared McNeill <jmcne...@invisible.ca> @@ -33,3 +33,4 @@ void efi_dcache_flush(u_long, u_long); void efi_boot_kernel(u_long[MARK_MAX]); void efi_md_show(void); +int efi_md_prepare_boot(const char *, const char *, u_long *); Index: src/sys/stand/efiboot/efifdt.c diff -u src/sys/stand/efiboot/efifdt.c:1.36 src/sys/stand/efiboot/efifdt.c:1.37 --- src/sys/stand/efiboot/efifdt.c:1.36 Thu Aug 15 05:59:49 2024 +++ src/sys/stand/efiboot/efifdt.c Thu Aug 15 06:15:16 2024 @@ -1,4 +1,4 @@ -/* $NetBSD: efifdt.c,v 1.36 2024/08/15 05:59:49 skrll Exp $ */ +/* $NetBSD: efifdt.c,v 1.37 2024/08/15 06:15:16 skrll Exp $ */ /*- * Copyright (c) 2019 Jason R. Thorpe @@ -598,13 +598,19 @@ load_modules(const char *kernel_name) int efi_fdt_prepare_boot(const char *fname, const char *args, u_long *marks) { + int error; + load_file(get_initrd_path(), 0, false, &initrd_addr, &initrd_size); load_file(get_dtb_path(), 0, false, &dtb_addr, &dtb_size); + error = efi_md_prepare_boot(fname, args, marks); + if (error) { + return error; + } #ifdef EFIBOOT_ACPI /* ACPI support only works for little endian kernels */ if (efi_acpi_available() && netbsd_elf_data == ELFDATA2LSB) { - int error = efi_fdt_create_acpifdt(); + error = efi_fdt_create_acpifdt(); if (error != 0) { return error; } Index: src/sys/stand/efiboot/version diff -u src/sys/stand/efiboot/version:1.31 src/sys/stand/efiboot/version:1.32 --- src/sys/stand/efiboot/version:1.31 Sat Apr 2 11:16:07 2022 +++ src/sys/stand/efiboot/version Thu Aug 15 06:15:16 2024 @@ -1,4 +1,4 @@ -$NetBSD: version,v 1.31 2022/04/02 11:16:07 skrll Exp $ +$NetBSD: version,v 1.32 2024/08/15 06:15:16 skrll Exp $ NOTE ANY CHANGES YOU MAKE TO THE EFI BOOTLOADER HERE. The format of this file is important - make sure the entries are appended on end, last item @@ -34,3 +34,4 @@ is taken as the current. 2.11: Add support for changing the video mode. 2.12: Add userconf support. 2.13: Add Arm RT support and change Arm64 (aarch64) RT VAs. +2.14: Arm64: check cpu support for big endian kernel. Index: src/sys/stand/efiboot/bootaa64/efibootaa64.c diff -u src/sys/stand/efiboot/bootaa64/efibootaa64.c:1.6 src/sys/stand/efiboot/bootaa64/efibootaa64.c:1.7 --- src/sys/stand/efiboot/bootaa64/efibootaa64.c:1.6 Sun Aug 14 11:26:41 2022 +++ src/sys/stand/efiboot/bootaa64/efibootaa64.c Thu Aug 15 06:15:17 2024 @@ -1,4 +1,4 @@ -/* $NetBSD: efibootaa64.c,v 1.6 2022/08/14 11:26:41 jmcneill Exp $ */ +/* $NetBSD: efibootaa64.c,v 1.7 2024/08/15 06:15:17 skrll Exp $ */ /*- * Copyright (c) 2016 Kimihiro Nonaka <non...@netbsd.org> @@ -29,6 +29,7 @@ #include "../efiboot.h" #include "../efifdt.h" +#include <sys/cdefs.h> #include <sys/bootblock.h> #include <loadfile.h> @@ -76,8 +77,29 @@ efi_aarch64_current_el(void) return (el >> 2) & 0x3; } +static bool +efi_aarch64_BigEnd(void) +{ + uint64_t id_aa64mmfr0_el1; + __asm __volatile ("mrs %[mmfr0], id_aa64mmfr0_el1" + : [mmfr0] "=r" (id_aa64mmfr0_el1) :: "memory"); + return __SHIFTOUT(id_aa64mmfr0_el1, __BITS(11, 8)) == 1; +} + void efi_md_show(void) { command_printtab("CurrentEL", "EL%u\n", efi_aarch64_current_el()); } + +int +efi_md_prepare_boot(const char *fname, const char *args, u_long *marks) +{ + if (netbsd_elf_data == ELFDATA2MSB) { + if (!efi_aarch64_BigEnd()) { + printf("Processor does not support big endian at EL1\n"); + return ENOTSUP; + } + } + return 0; +} Index: src/sys/stand/efiboot/bootarm/efibootarm.c diff -u src/sys/stand/efiboot/bootarm/efibootarm.c:1.3 src/sys/stand/efiboot/bootarm/efibootarm.c:1.4 --- src/sys/stand/efiboot/bootarm/efibootarm.c:1.3 Sat Nov 28 14:02:09 2020 +++ src/sys/stand/efiboot/bootarm/efibootarm.c Thu Aug 15 06:15:17 2024 @@ -1,4 +1,4 @@ -/* $NetBSD: efibootarm.c,v 1.3 2020/11/28 14:02:09 jmcneill Exp $ */ +/* $NetBSD: efibootarm.c,v 1.4 2024/08/15 06:15:17 skrll Exp $ */ /*- * Copyright (c) 2019 Jared McNeill <jmcne...@invisible.ca> @@ -63,3 +63,9 @@ void efi_md_show(void) { } + +int +efi_md_prepare_boot(const char *fname, const char *args, u_long *marks) +{ + return 0; +} Index: src/sys/stand/efiboot/bootriscv64/efibootriscv64.c diff -u src/sys/stand/efiboot/bootriscv64/efibootriscv64.c:1.1 src/sys/stand/efiboot/bootriscv64/efibootriscv64.c:1.2 --- src/sys/stand/efiboot/bootriscv64/efibootriscv64.c:1.1 Sun May 2 15:22:27 2021 +++ src/sys/stand/efiboot/bootriscv64/efibootriscv64.c Thu Aug 15 06:15:17 2024 @@ -1,4 +1,4 @@ -/* $NetBSD: efibootriscv64.c,v 1.1 2021/05/02 15:22:27 jmcneill Exp $ */ +/* $NetBSD: efibootriscv64.c,v 1.2 2024/08/15 06:15:17 skrll Exp $ */ /*- * Copyright (c) 2021 Jared McNeill <jmcne...@invisible.ca> @@ -76,3 +76,9 @@ void efi_dcache_flush(u_long start, u_long size) { } + +int +efi_md_prepare_boot(const char *fname, const char *args, u_long *marks) +{ + return 0; +}