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 <[email protected]>
@@ -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 <[email protected]>
@@ -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 <[email protected]>
@@ -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 <[email protected]>
@@ -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;
+}