Module Name:    src
Committed By:   jmcneill
Date:           Sat Dec  7 19:29:04 UTC 2024

Modified Files:
        src/sys/stand/efiboot: efifdt.c version
        src/sys/stand/efiboot/bootaa64: Makefile

Log Message:
efiboot: Use 1:1 PA to VA mappings for RT services.

UEFI firmware on Snapdragon X Elite devices crashes when
SetVirtualAddressMap is called with runtime mappings that are not 1:1.
Always do this on arm64 as it won't interfere with KVA and will help us
avoid avoid a very common class of firmware bugs.


To generate a diff of this commit:
cvs rdiff -u -r1.37 -r1.38 src/sys/stand/efiboot/efifdt.c
cvs rdiff -u -r1.32 -r1.33 src/sys/stand/efiboot/version
cvs rdiff -u -r1.12 -r1.13 src/sys/stand/efiboot/bootaa64/Makefile

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/efifdt.c
diff -u src/sys/stand/efiboot/efifdt.c:1.37 src/sys/stand/efiboot/efifdt.c:1.38
--- src/sys/stand/efiboot/efifdt.c:1.37	Thu Aug 15 06:15:16 2024
+++ src/sys/stand/efiboot/efifdt.c	Sat Dec  7 19:29:04 2024
@@ -1,4 +1,4 @@
-/* $NetBSD: efifdt.c,v 1.37 2024/08/15 06:15:16 skrll Exp $ */
+/* $NetBSD: efifdt.c,v 1.38 2024/12/07 19:29:04 jmcneill Exp $ */
 
 /*-
  * Copyright (c) 2019 Jason R. Thorpe
@@ -722,8 +722,9 @@ efi_fdt_create_acpifdt(void)
 
 #ifdef EFIBOOT_RUNTIME_ADDRESS
 static uint64_t
-efi_fdt_runtime_alloc_va(uint64_t npages)
+efi_fdt_runtime_alloc_va(uint64_t pa, uint64_t npages)
 {
+#if EFIBOOT_RUNTIME_ADDRESS != 0
 	static uint64_t va = EFIBOOT_RUNTIME_ADDRESS;
 	static uint64_t sz = EFIBOOT_RUNTIME_SIZE;
 	uint64_t nva;
@@ -738,6 +739,9 @@ efi_fdt_runtime_alloc_va(uint64_t npages
 	sz -= (npages * EFI_PAGE_SIZE);
 
 	return nva;
+#else
+	return pa;
+#endif
 }
 
 void
@@ -763,7 +767,8 @@ efi_fdt_set_virtual_address_map(EFI_MEMO
 			continue;
 		}
 
-		md->VirtualStart = efi_fdt_runtime_alloc_va(md->NumberOfPages);
+		md->VirtualStart =
+		    efi_fdt_runtime_alloc_va(md->PhysicalStart, md->NumberOfPages);
 
 		switch (md->Type) {
 		case EfiRuntimeServicesCode:

Index: src/sys/stand/efiboot/version
diff -u src/sys/stand/efiboot/version:1.32 src/sys/stand/efiboot/version:1.33
--- src/sys/stand/efiboot/version:1.32	Thu Aug 15 06:15:16 2024
+++ src/sys/stand/efiboot/version	Sat Dec  7 19:29:04 2024
@@ -1,4 +1,4 @@
-$NetBSD: version,v 1.32 2024/08/15 06:15:16 skrll Exp $
+$NetBSD: version,v 1.33 2024/12/07 19:29:04 jmcneill 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
@@ -35,3 +35,4 @@ is taken as the current.
 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.
+2.15:	Arm64: Use 1:1 PA to VA mappings for RT services.

Index: src/sys/stand/efiboot/bootaa64/Makefile
diff -u src/sys/stand/efiboot/bootaa64/Makefile:1.12 src/sys/stand/efiboot/bootaa64/Makefile:1.13
--- src/sys/stand/efiboot/bootaa64/Makefile:1.12	Sat Apr  2 11:16:07 2022
+++ src/sys/stand/efiboot/bootaa64/Makefile	Sat Dec  7 19:29:04 2024
@@ -1,4 +1,4 @@
-# $NetBSD: Makefile,v 1.12 2022/04/02 11:16:07 skrll Exp $
+# $NetBSD: Makefile,v 1.13 2024/12/07 19:29:04 jmcneill Exp $
 
 PROG=		bootaa64.efi
 OBJFMT=		binary
@@ -16,8 +16,7 @@ EXTRA_SOURCES+=	cache.S
 COPTS+=		-mgeneral-regs-only -mlittle-endian -fno-jump-tables
 AFLAGS+=	-mlittle-endian
 CFLAGS+=	-DEFIBOOT_ALIGN=0x200000
-CFLAGS+=	-DEFIBOOT_RUNTIME_ADDRESS=0x0000000200200000UL
-CFLAGS+=	-DEFIBOOT_RUNTIME_SIZE=0xfe00000UL
+CFLAGS+=	-DEFIBOOT_RUNTIME_ADDRESS=0	# 1:1 PA to VA mappings
 CFLAGS+=	-DEFIBOOT_MODULE_MACHINE=\"evbarm\"
 LDFLAGS+=	-EL
 

Reply via email to