CVS commit: src/sys/stand/efiboot
Module Name:src Committed By: riastradh Date: Thu Mar 28 18:24:57 UTC 2024 Modified Files: src/sys/stand/efiboot: efiboot.c Log Message: efiboot: Duplicate efi_bootdp before we clobber it in efi_net_probe. Patch from jakllsch@. Makes Socionext Synquacer boot considerably more reliably. PR kern/58075 To generate a diff of this commit: cvs rdiff -u -r1.22 -r1.23 src/sys/stand/efiboot/efiboot.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.c diff -u src/sys/stand/efiboot/efiboot.c:1.22 src/sys/stand/efiboot/efiboot.c:1.23 --- src/sys/stand/efiboot/efiboot.c:1.22 Wed Oct 6 10:13:19 2021 +++ src/sys/stand/efiboot/efiboot.c Thu Mar 28 18:24:57 2024 @@ -1,4 +1,4 @@ -/* $NetBSD: efiboot.c,v 1.22 2021/10/06 10:13:19 jmcneill Exp $ */ +/* $NetBSD: efiboot.c,v 1.23 2024/03/28 18:24:57 riastradh Exp $ */ /*- * Copyright (c) 2018 Jared McNeill @@ -86,6 +86,8 @@ efi_main(EFI_HANDLE imageHandle, EFI_SYS status = uefi_call_wrapper(BS->HandleProtocol, 3, efi_li->DeviceHandle, , (void **)_bootdp); if (EFI_ERROR(status)) efi_bootdp = NULL; + else + efi_bootdp = DuplicateDevicePath(efi_bootdp); #ifdef EFIBOOT_DEBUG Print(L"Loaded image : 0x%" PRIxEFIPTR "\n", efi_li);
CVS commit: src/sys/stand/efiboot
Module Name:src Committed By: riastradh Date: Thu Mar 28 18:24:57 UTC 2024 Modified Files: src/sys/stand/efiboot: efiboot.c Log Message: efiboot: Duplicate efi_bootdp before we clobber it in efi_net_probe. Patch from jakllsch@. Makes Socionext Synquacer boot considerably more reliably. PR kern/58075 To generate a diff of this commit: cvs rdiff -u -r1.22 -r1.23 src/sys/stand/efiboot/efiboot.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
CVS commit: src/sys/stand/efiboot
Module Name:src Committed By: rin Date: Mon Jan 1 13:38:57 UTC 2024 Modified Files: src/sys/stand/efiboot: efinet.c Log Message: MI efiboot: Revert "Stop using efi_bootdp after exclusive open for PXE" http://cvsweb.netbsd.org/bsdweb.cgi/src/sys/stand/efiboot/efinet.c#rev1.7 Some UEFI implementations pass multiple boot options as boot device path, and NULL-clearing it results in boot failures. Thanks skrll@ for pointing it out. To generate a diff of this commit: cvs rdiff -u -r1.8 -r1.9 src/sys/stand/efiboot/efinet.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
CVS commit: src/sys/stand/efiboot
Module Name:src Committed By: rin Date: Mon Jan 1 13:38:57 UTC 2024 Modified Files: src/sys/stand/efiboot: efinet.c Log Message: MI efiboot: Revert "Stop using efi_bootdp after exclusive open for PXE" http://cvsweb.netbsd.org/bsdweb.cgi/src/sys/stand/efiboot/efinet.c#rev1.7 Some UEFI implementations pass multiple boot options as boot device path, and NULL-clearing it results in boot failures. Thanks skrll@ for pointing it out. To generate a diff of this commit: cvs rdiff -u -r1.8 -r1.9 src/sys/stand/efiboot/efinet.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/efinet.c diff -u src/sys/stand/efiboot/efinet.c:1.8 src/sys/stand/efiboot/efinet.c:1.9 --- src/sys/stand/efiboot/efinet.c:1.8 Wed Dec 27 09:40:35 2023 +++ src/sys/stand/efiboot/efinet.c Mon Jan 1 13:38:57 2024 @@ -1,4 +1,4 @@ -/* $NetBSD: efinet.c,v 1.8 2023/12/27 09:40:35 rin Exp $ */ +/* $NetBSD: efinet.c,v 1.9 2024/01/01 13:38:57 rin Exp $ */ /*- * Copyright (c) 2001 Doug Rabson @@ -333,7 +333,7 @@ efi_net_probe(void) EFI_STATUS status; UINTN i, nhandles; int nifs, depth = -1; - bool found, is_bootdp; + bool found; status = LibLocateHandle(ByProtocol, , NULL, , ); @@ -377,9 +377,6 @@ efi_net_probe(void) if (!found) continue; - is_bootdp = depth > 0 && - efi_device_path_ncmp(efi_bootdp, dp0, depth) == 0; - status = uefi_call_wrapper(BS->OpenProtocol, 6, handles[i], , (void **), IH, NULL, EFI_OPEN_PROTOCOL_EXCLUSIVE); @@ -407,21 +404,10 @@ efi_net_probe(void) return; } - if (is_bootdp) { - /* - * This is boot device... - */ + if (depth > 0 && efi_device_path_ncmp(efi_bootdp, dp0, depth) == 0) { char devname[9]; - snprintf(devname, sizeof(devname), "net%u", nifs); set_default_device(devname); - - /* - * and now opened for us excluively. Therefore, - * access via device path is illegal. - */ - efi_bootdp = NULL; - depth = -1; } nifs++;
CVS commit: src/sys/stand/efiboot
Module Name:src Committed By: rin Date: Wed Dec 27 09:40:35 UTC 2023 Modified Files: src/sys/stand/efiboot: efinet.c Log Message: MI efiboot: efi_net_probe: Examine Messaging Device Path also Network devices can be found as Hardware or Messaging Device Paths, see Sec 10.4.4 of UEFI Spec 2.10. In addition to Hardware Device Path, try Messaging Device Path also. This fixes PXE boot on implementations with the latter choice, e.g., Raspberry Pi 4 UEFI firmware. To generate a diff of this commit: cvs rdiff -u -r1.7 -r1.8 src/sys/stand/efiboot/efinet.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
CVS commit: src/sys/stand/efiboot
Module Name:src Committed By: rin Date: Wed Dec 27 09:40:35 UTC 2023 Modified Files: src/sys/stand/efiboot: efinet.c Log Message: MI efiboot: efi_net_probe: Examine Messaging Device Path also Network devices can be found as Hardware or Messaging Device Paths, see Sec 10.4.4 of UEFI Spec 2.10. In addition to Hardware Device Path, try Messaging Device Path also. This fixes PXE boot on implementations with the latter choice, e.g., Raspberry Pi 4 UEFI firmware. To generate a diff of this commit: cvs rdiff -u -r1.7 -r1.8 src/sys/stand/efiboot/efinet.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/efinet.c diff -u src/sys/stand/efiboot/efinet.c:1.7 src/sys/stand/efiboot/efinet.c:1.8 --- src/sys/stand/efiboot/efinet.c:1.7 Wed Dec 27 09:28:04 2023 +++ src/sys/stand/efiboot/efinet.c Wed Dec 27 09:40:35 2023 @@ -1,4 +1,4 @@ -/* $NetBSD: efinet.c,v 1.7 2023/12/27 09:28:04 rin Exp $ */ +/* $NetBSD: efinet.c,v 1.8 2023/12/27 09:40:35 rin Exp $ */ /*- * Copyright (c) 2001 Doug Rabson @@ -346,7 +346,15 @@ efi_net_probe(void) memset(enis, 0, nhandles * sizeof(*enis)); if (efi_bootdp) { + /* + * Either Hardware or Messaging Device Paths can be used + * here, see Sec 10.4.4 of UEFI Spec 2.10. Try both. + */ depth = efi_device_path_depth(efi_bootdp, HARDWARE_DEVICE_PATH); + if (depth == -1) { + depth = efi_device_path_depth(efi_bootdp, + MESSAGING_DEVICE_PATH); + } if (depth == 0) depth = 1; }
CVS commit: src/sys/stand/efiboot
Module Name:src Committed By: rin Date: Wed Dec 27 09:28:04 UTC 2023 Modified Files: src/sys/stand/efiboot: efinet.c Log Message: MI efiboot: Stop using efi_bootdp after exclusive open for PXE Once boot device is exclusively opened for Simple Network Protocol, further access via device path (efi_bootdp) is illegal. For some implementations, boot device path gets corrupted by exclusive open, and subsequent access by efi_device_path_depth(), e.g., causes infinite recursion. Fix PXE boot for QEMU/aarch64 with EDK2 on some Linux distributions. Thanks yamaguchi@ for comments and tests. To generate a diff of this commit: cvs rdiff -u -r1.6 -r1.7 src/sys/stand/efiboot/efinet.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/efinet.c diff -u src/sys/stand/efiboot/efinet.c:1.6 src/sys/stand/efiboot/efinet.c:1.7 --- src/sys/stand/efiboot/efinet.c:1.6 Sun Mar 31 22:24:41 2019 +++ src/sys/stand/efiboot/efinet.c Wed Dec 27 09:28:04 2023 @@ -1,4 +1,4 @@ -/* $NetBSD: efinet.c,v 1.6 2019/03/31 22:24:41 jmcneill Exp $ */ +/* $NetBSD: efinet.c,v 1.7 2023/12/27 09:28:04 rin Exp $ */ /*- * Copyright (c) 2001 Doug Rabson @@ -333,7 +333,7 @@ efi_net_probe(void) EFI_STATUS status; UINTN i, nhandles; int nifs, depth = -1; - bool found; + bool found, is_bootdp; status = LibLocateHandle(ByProtocol, , NULL, , ); @@ -369,6 +369,9 @@ efi_net_probe(void) if (!found) continue; + is_bootdp = depth > 0 && + efi_device_path_ncmp(efi_bootdp, dp0, depth) == 0; + status = uefi_call_wrapper(BS->OpenProtocol, 6, handles[i], , (void **), IH, NULL, EFI_OPEN_PROTOCOL_EXCLUSIVE); @@ -396,10 +399,21 @@ efi_net_probe(void) return; } - if (depth > 0 && efi_device_path_ncmp(efi_bootdp, dp0, depth) == 0) { + if (is_bootdp) { + /* + * This is boot device... + */ char devname[9]; + snprintf(devname, sizeof(devname), "net%u", nifs); set_default_device(devname); + + /* + * and now opened for us excluively. Therefore, + * access via device path is illegal. + */ + efi_bootdp = NULL; + depth = -1; } nifs++;
CVS commit: src/sys/stand/efiboot
Module Name:src Committed By: rin Date: Wed Dec 27 09:28:04 UTC 2023 Modified Files: src/sys/stand/efiboot: efinet.c Log Message: MI efiboot: Stop using efi_bootdp after exclusive open for PXE Once boot device is exclusively opened for Simple Network Protocol, further access via device path (efi_bootdp) is illegal. For some implementations, boot device path gets corrupted by exclusive open, and subsequent access by efi_device_path_depth(), e.g., causes infinite recursion. Fix PXE boot for QEMU/aarch64 with EDK2 on some Linux distributions. Thanks yamaguchi@ for comments and tests. To generate a diff of this commit: cvs rdiff -u -r1.6 -r1.7 src/sys/stand/efiboot/efinet.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
CVS commit: src/sys/stand/efiboot
Module Name:src Committed By: rin Date: Thu Jun 15 03:20:59 UTC 2023 Modified Files: src/sys/stand/efiboot: Makefile.efiboot Log Message: Add missing include paths for libz. Not used at the moment although. To generate a diff of this commit: cvs rdiff -u -r1.28 -r1.29 src/sys/stand/efiboot/Makefile.efiboot 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/Makefile.efiboot diff -u src/sys/stand/efiboot/Makefile.efiboot:1.28 src/sys/stand/efiboot/Makefile.efiboot:1.29 --- src/sys/stand/efiboot/Makefile.efiboot:1.28 Sat Jun 3 21:26:29 2023 +++ src/sys/stand/efiboot/Makefile.efiboot Thu Jun 15 03:20:58 2023 @@ -1,4 +1,4 @@ -# $NetBSD: Makefile.efiboot,v 1.28 2023/06/03 21:26:29 lukem Exp $ +# $NetBSD: Makefile.efiboot,v 1.29 2023/06/15 03:20:58 rin Exp $ S= ${.CURDIR}/../../.. @@ -132,6 +132,7 @@ LIBKERN= ${KERNLIB} ### find out what to use for libz Z_AS= library .include "${S}/lib/libz/Makefile.inc" +CPPFLAGS+= -I${S}/lib/libz -I${S}/../common/dist/zlib LIBZ= ${ZLIB} ### find out what to use for libgnuefi
CVS commit: src/sys/stand/efiboot
Module Name:src Committed By: rin Date: Thu Jun 15 03:20:59 UTC 2023 Modified Files: src/sys/stand/efiboot: Makefile.efiboot Log Message: Add missing include paths for libz. Not used at the moment although. To generate a diff of this commit: cvs rdiff -u -r1.28 -r1.29 src/sys/stand/efiboot/Makefile.efiboot Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
CVS commit: src/sys/stand/efiboot
Module Name:src Committed By: rin Date: Wed Jun 14 10:26:46 UTC 2023 Modified Files: src/sys/stand/efiboot: exec.c Log Message: Use %zd instead of %ld for ssize_t. To generate a diff of this commit: cvs rdiff -u -r1.23 -r1.24 src/sys/stand/efiboot/exec.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
CVS commit: src/sys/stand/efiboot
Module Name:src Committed By: rin Date: Wed Jun 14 10:26:46 UTC 2023 Modified Files: src/sys/stand/efiboot: exec.c Log Message: Use %zd instead of %ld for ssize_t. To generate a diff of this commit: cvs rdiff -u -r1.23 -r1.24 src/sys/stand/efiboot/exec.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/exec.c diff -u src/sys/stand/efiboot/exec.c:1.23 src/sys/stand/efiboot/exec.c:1.24 --- src/sys/stand/efiboot/exec.c:1.23 Wed Oct 6 10:13:19 2021 +++ src/sys/stand/efiboot/exec.c Wed Jun 14 10:26:45 2023 @@ -1,4 +1,4 @@ -/* $NetBSD: exec.c,v 1.23 2021/10/06 10:13:19 jmcneill Exp $ */ +/* $NetBSD: exec.c,v 1.24 2023/06/14 10:26:45 rin Exp $ */ /*- * Copyright (c) 2019 Jason R. Thorpe @@ -109,7 +109,7 @@ load_file(const char *path, u_long extra if (len < 0) { printf(": %s\n", strerror(errno)); } else { - printf(": returned %ld (expected %ld)\n", len, + printf(": returned %zd (expected %zd)\n", len, expectedlen); } return EIO;
CVS commit: src/sys/stand/efiboot
Module Name:src Committed By: rin Date: Wed Jun 14 00:52:25 UTC 2023 Modified Files: src/sys/stand/efiboot: efiblock.c Log Message: Avoid void * pointer arithmetic; cast to UINT8 * explicitly. No binary changes for aarch64 at least. To generate a diff of this commit: cvs rdiff -u -r1.19 -r1.20 src/sys/stand/efiboot/efiblock.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/efiblock.c diff -u src/sys/stand/efiboot/efiblock.c:1.19 src/sys/stand/efiboot/efiblock.c:1.20 --- src/sys/stand/efiboot/efiblock.c:1.19 Sun Apr 24 06:49:38 2022 +++ src/sys/stand/efiboot/efiblock.c Wed Jun 14 00:52:25 2023 @@ -1,4 +1,4 @@ -/* $NetBSD: efiblock.c,v 1.19 2022/04/24 06:49:38 mlelstv Exp $ */ +/* $NetBSD: efiblock.c,v 1.20 2023/06/14 00:52:25 rin Exp $ */ /*- * Copyright (c) 2016 Kimihiro Nonaka @@ -442,7 +442,7 @@ efi_block_find_partitions_gpt(struct efi } for (entry = 0; entry < le32toh(hdr.hdr_entries); entry++) { - memcpy(, buf + (entry * le32toh(hdr.hdr_entsz)), + memcpy(, (UINT8 *)buf + (entry * le32toh(hdr.hdr_entsz)), sizeof(ent)); efi_block_find_partitions_gpt_entry(bdev, , , entry); }
CVS commit: src/sys/stand/efiboot
Module Name:src Committed By: rin Date: Wed Jun 14 00:52:25 UTC 2023 Modified Files: src/sys/stand/efiboot: efiblock.c Log Message: Avoid void * pointer arithmetic; cast to UINT8 * explicitly. No binary changes for aarch64 at least. To generate a diff of this commit: cvs rdiff -u -r1.19 -r1.20 src/sys/stand/efiboot/efiblock.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
CVS commit: src/sys/stand/efiboot
Module Name:src Committed By: rin Date: Wed Jun 14 00:42:21 UTC 2023 Modified Files: src/sys/stand/efiboot: boot.c Log Message: Add missing member for terminating sentinel. To generate a diff of this commit: cvs rdiff -u -r1.44 -r1.45 src/sys/stand/efiboot/boot.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/boot.c diff -u src/sys/stand/efiboot/boot.c:1.44 src/sys/stand/efiboot/boot.c:1.45 --- src/sys/stand/efiboot/boot.c:1.44 Sun Aug 14 11:26:41 2022 +++ src/sys/stand/efiboot/boot.c Wed Jun 14 00:42:21 2023 @@ -1,4 +1,4 @@ -/* $NetBSD: boot.c,v 1.44 2022/08/14 11:26:41 jmcneill Exp $ */ +/* $NetBSD: boot.c,v 1.45 2023/06/14 00:42:21 rin Exp $ */ /*- * Copyright (c) 2016 Kimihiro Nonaka @@ -148,7 +148,7 @@ const struct boot_command commands[] = { { "help", command_help, "help|?" }, { "?", command_help, NULL }, { "quit", command_quit, "quit" }, - { NULL, NULL }, + { NULL, NULL, NULL }, }; static int
CVS commit: src/sys/stand/efiboot
Module Name:src Committed By: rin Date: Wed Jun 14 00:42:21 UTC 2023 Modified Files: src/sys/stand/efiboot: boot.c Log Message: Add missing member for terminating sentinel. To generate a diff of this commit: cvs rdiff -u -r1.44 -r1.45 src/sys/stand/efiboot/boot.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
CVS commit: src/sys/stand/efiboot
Module Name:src Committed By: riastradh Date: Wed Sep 21 14:30:01 UTC 2022 Modified Files: src/sys/stand/efiboot: module.c Log Message: efiboot: Handle 9.99.100 by taking four, not two, digits. We haven't used the revision part of __NetBSD_Version__ = MMmmrrpp00 in almos two decades so we're apparently reclaiming it as MMmm00. To generate a diff of this commit: cvs rdiff -u -r1.1 -r1.2 src/sys/stand/efiboot/module.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
CVS commit: src/sys/stand/efiboot
Module Name:src Committed By: riastradh Date: Wed Sep 21 14:30:01 UTC 2022 Modified Files: src/sys/stand/efiboot: module.c Log Message: efiboot: Handle 9.99.100 by taking four, not two, digits. We haven't used the revision part of __NetBSD_Version__ = MMmmrrpp00 in almos two decades so we're apparently reclaiming it as MMmm00. To generate a diff of this commit: cvs rdiff -u -r1.1 -r1.2 src/sys/stand/efiboot/module.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/module.c diff -u src/sys/stand/efiboot/module.c:1.1 src/sys/stand/efiboot/module.c:1.2 --- src/sys/stand/efiboot/module.c:1.1 Sun Jun 21 17:24:26 2020 +++ src/sys/stand/efiboot/module.c Wed Sep 21 14:30:01 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: module.c,v 1.1 2020/06/21 17:24:26 jmcneill Exp $ */ +/* $NetBSD: module.c,v 1.2 2022/09/21 14:30:01 riastradh Exp $ */ /*- * Copyright (c) 2020 The NetBSD Foundation, Inc. @@ -62,7 +62,7 @@ module_set_prefix(const char *kernel_pat #else const u_int vmajor = netbsd_version / 1; const u_int vminor = netbsd_version / 100 % 100; - const u_int vpatch = netbsd_version / 100 % 100; + const u_int vpatch = netbsd_version / 100 % 1; if (vminor == 99) { snprintf(module_prefix, sizeof(module_prefix),
CVS commit: src/sys/stand/efiboot
Module Name:src Committed By: jmcneill Date: Sun Aug 14 11:26:41 UTC 2022 Modified Files: src/sys/stand/efiboot: boot.c efiacpi.c efiboot.h efifdt.c efigop.c efirng.c src/sys/stand/efiboot/bootaa64: efibootaa64.c Log Message: Align output of "version" command. To generate a diff of this commit: cvs rdiff -u -r1.43 -r1.44 src/sys/stand/efiboot/boot.c cvs rdiff -u -r1.12 -r1.13 src/sys/stand/efiboot/efiacpi.c cvs rdiff -u -r1.19 -r1.20 src/sys/stand/efiboot/efiboot.h cvs rdiff -u -r1.34 -r1.35 src/sys/stand/efiboot/efifdt.c cvs rdiff -u -r1.2 -r1.3 src/sys/stand/efiboot/efigop.c cvs rdiff -u -r1.3 -r1.4 src/sys/stand/efiboot/efirng.c cvs rdiff -u -r1.5 -r1.6 src/sys/stand/efiboot/bootaa64/efibootaa64.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/boot.c diff -u src/sys/stand/efiboot/boot.c:1.43 src/sys/stand/efiboot/boot.c:1.44 --- src/sys/stand/efiboot/boot.c:1.43 Fri Mar 25 21:23:00 2022 +++ src/sys/stand/efiboot/boot.c Sun Aug 14 11:26:41 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: boot.c,v 1.43 2022/03/25 21:23:00 jmcneill Exp $ */ +/* $NetBSD: boot.c,v 1.44 2022/08/14 11:26:41 jmcneill Exp $ */ /*- * Copyright (c) 2016 Kimihiro Nonaka @@ -380,6 +380,18 @@ command_menu(char *arg) } void +command_printtab(const char *key, const char *fmt, ...) +{ + va_list ap; + + printf("%-16s: ", key); + + va_start(ap, fmt); + vprintf(fmt, ap); + va_end(ap); +} + +void command_version(char *arg) { char pathbuf[80]; @@ -387,23 +399,26 @@ command_version(char *arg) const UINT64 *osindsup; int rv; - printf("Version: %s (%s)\n", bootprog_rev, bootprog_kernrev); - printf("EFI: %d.%02d\n", + command_printtab("Version", "%s (%s)\n", + bootprog_rev, bootprog_kernrev); + command_printtab("EFI", "%d.%02d\n", ST->Hdr.Revision >> 16, ST->Hdr.Revision & 0x); + ufirmware = NULL; rv = ucs2_to_utf8(ST->FirmwareVendor, ); if (rv == 0) { - printf("Firmware: %s (rev 0x%x)\n", ufirmware, + command_printtab("Firmware", "%s (rev 0x%x)\n", ufirmware, ST->FirmwareRevision); FreePool(ufirmware); } if (bootcfg_path(pathbuf, sizeof(pathbuf)) == 0) { - printf("Config path: %s\n", pathbuf); + command_printtab("Config path", "%s\n", pathbuf); } osindsup = LibGetVariable(L"OsIndicationsSupported", ); if (osindsup != NULL) { - printf("UEFI OS indications supported: 0x%" PRIx64 "\n", *osindsup); + command_printtab("OS Indications", "0x%" PRIx64 "\n", + *osindsup); } #ifdef EFIBOOT_FDT Index: src/sys/stand/efiboot/efiacpi.c diff -u src/sys/stand/efiboot/efiacpi.c:1.12 src/sys/stand/efiboot/efiacpi.c:1.13 --- src/sys/stand/efiboot/efiacpi.c:1.12 Wed Nov 3 22:02:36 2021 +++ src/sys/stand/efiboot/efiacpi.c Sun Aug 14 11:26:41 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: efiacpi.c,v 1.12 2021/11/03 22:02:36 skrll Exp $ */ +/* $NetBSD: efiacpi.c,v 1.13 2022/08/14 11:26:41 jmcneill Exp $ */ /*- * Copyright (c) 2018 The NetBSD Foundation, Inc. @@ -145,13 +145,15 @@ efi_acpi_show(void) { struct acpi_rdsp *rsdp = acpi_root; - if (!efi_acpi_available()) + if (!efi_acpi_available()) { return; + } - printf("ACPI: v%02d %c%c%c%c%c%c\n", rsdp->revision, + command_printtab("ACPI", "v%02d %c%c%c%c%c%c\n", rsdp->revision, rsdp->oemid[0], rsdp->oemid[1], rsdp->oemid[2], rsdp->oemid[3], rsdp->oemid[4], rsdp->oemid[5]); - if (smbios_table) - printf("SMBIOS: %s\n", efi_acpi_get_model()); + if (smbios_table) { + command_printtab("SMBIOS", "%s\n", efi_acpi_get_model()); + } } Index: src/sys/stand/efiboot/efiboot.h diff -u src/sys/stand/efiboot/efiboot.h:1.19 src/sys/stand/efiboot/efiboot.h:1.20 --- src/sys/stand/efiboot/efiboot.h:1.19 Fri Mar 25 21:23:00 2022 +++ src/sys/stand/efiboot/efiboot.h Sun Aug 14 11:26:41 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: efiboot.h,v 1.19 2022/03/25 21:23:00 jmcneill Exp $ */ +/* $NetBSD: efiboot.h,v 1.20 2022/08/14 11:26:41 jmcneill Exp $ */ /*- * Copyright (c) 2016 Kimihiro Nonaka @@ -58,6 +58,7 @@ void boot(void); void clearit(void); extern const struct boot_command commands[]; void command_help(char *); +void command_printtab(const char *, const char *, ...); int set_default_device(const char *); char *get_default_device(void); void set_default_fstype(int); Index: src/sys/stand/efiboot/efifdt.c diff -u src/sys/stand/efiboot/efifdt.c:1.34 src/sys/stand/efiboot/efifdt.c:1.35 --- src/sys/stand/efiboot/efifdt.c:1.34 Fri Mar 25 21:23:00 2022 +++ src/sys/stand/efiboot/efifdt.c Sun Aug 14 11:26:41 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: efifdt.c,v 1.34 2022/03/25 21:23:00 jmcneill Exp $ */ +/* $NetBSD: efifdt.c,v 1.35 2022/08/14 11:26:41 jmcneill Exp $ */ /*- * Copyright (c) 2019 Jason R. Thorpe @@ -205,12 +205,14 @@ efi_fdt_show(void) const char *model, *compat; int n, ncompat; - if (fdt_data == NULL) + if (fdt_data == NULL) { return; + } model = fdt_getprop(fdt_data,
CVS commit: src/sys/stand/efiboot
Module Name:src Committed By: jmcneill Date: Sun Aug 14 11:26:41 UTC 2022 Modified Files: src/sys/stand/efiboot: boot.c efiacpi.c efiboot.h efifdt.c efigop.c efirng.c src/sys/stand/efiboot/bootaa64: efibootaa64.c Log Message: Align output of "version" command. To generate a diff of this commit: cvs rdiff -u -r1.43 -r1.44 src/sys/stand/efiboot/boot.c cvs rdiff -u -r1.12 -r1.13 src/sys/stand/efiboot/efiacpi.c cvs rdiff -u -r1.19 -r1.20 src/sys/stand/efiboot/efiboot.h cvs rdiff -u -r1.34 -r1.35 src/sys/stand/efiboot/efifdt.c cvs rdiff -u -r1.2 -r1.3 src/sys/stand/efiboot/efigop.c cvs rdiff -u -r1.3 -r1.4 src/sys/stand/efiboot/efirng.c cvs rdiff -u -r1.5 -r1.6 src/sys/stand/efiboot/bootaa64/efibootaa64.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
CVS commit: src/sys/stand/efiboot
Module Name:src Committed By: mlelstv Date: Sun Apr 24 06:49:38 UTC 2022 Modified Files: src/sys/stand/efiboot: conf.c efiblock.c efiblock.h Log Message: Use physical sector size as unit for disk addresses. Provide new ioctl to libsa to query for sector size. To generate a diff of this commit: cvs rdiff -u -r1.5 -r1.6 src/sys/stand/efiboot/conf.c cvs rdiff -u -r1.18 -r1.19 src/sys/stand/efiboot/efiblock.c cvs rdiff -u -r1.6 -r1.7 src/sys/stand/efiboot/efiblock.h 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/conf.c diff -u src/sys/stand/efiboot/conf.c:1.5 src/sys/stand/efiboot/conf.c:1.6 --- src/sys/stand/efiboot/conf.c:1.5 Sun Oct 11 14:03:33 2020 +++ src/sys/stand/efiboot/conf.c Sun Apr 24 06:49:38 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: conf.c,v 1.5 2020/10/11 14:03:33 jmcneill Exp $ */ +/* $NetBSD: conf.c,v 1.6 2022/04/24 06:49:38 mlelstv Exp $ */ /*- * Copyright (c) 2018 Jared McNeill @@ -41,7 +41,7 @@ struct devsw devsw[] = { { "efifile", efi_file_strategy, efi_file_open, efi_file_close, noioctl }, - { "efiblock", efi_block_strategy, efi_block_open, efi_block_close, noioctl }, + { "efiblock", efi_block_strategy, efi_block_open, efi_block_close, efi_block_ioctl }, { "net", net_strategy, net_open, net_close, noioctl }, }; int ndevs = __arraycount(devsw); Index: src/sys/stand/efiboot/efiblock.c diff -u src/sys/stand/efiboot/efiblock.c:1.18 src/sys/stand/efiboot/efiblock.c:1.19 --- src/sys/stand/efiboot/efiblock.c:1.18 Sat Oct 30 11:18:51 2021 +++ src/sys/stand/efiboot/efiblock.c Sun Apr 24 06:49:38 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: efiblock.c,v 1.18 2021/10/30 11:18:51 jmcneill Exp $ */ +/* $NetBSD: efiblock.c,v 1.19 2022/04/24 06:49:38 mlelstv Exp $ */ /*- * Copyright (c) 2016 Kimihiro Nonaka @@ -129,20 +129,21 @@ efi_block_do_read_blockio(struct efi_blo EFI_STATUS status; EFI_LBA lba_start, lba_end; UINT64 blkbuf_offset; - UINT64 blkbuf_size; + UINT64 blkbuf_size, alloc_size; lba_start = off / bdev->bio->Media->BlockSize; - lba_end = (off + bufsize + bdev->bio->Media->BlockSize - 1) / - bdev->bio->Media->BlockSize; + lba_end = (off + bufsize - 1) / bdev->bio->Media->BlockSize; blkbuf_offset = off % bdev->bio->Media->BlockSize; - blkbuf_size = (lba_end - lba_start) * bdev->bio->Media->BlockSize; + blkbuf_size = (lba_end - lba_start + 1) * bdev->bio->Media->BlockSize; + + alloc_size = blkbuf_size; if (bdev->bio->Media->IoAlign > 1) { - blkbuf_size = (blkbuf_size + bdev->bio->Media->IoAlign - 1) / + alloc_size = (blkbuf_size + bdev->bio->Media->IoAlign - 1) / bdev->bio->Media->IoAlign * bdev->bio->Media->IoAlign; } - blkbuf = AllocatePool(blkbuf_size); + blkbuf = AllocatePool(alloc_size); if (blkbuf == NULL) { return EFI_OUT_OF_RESOURCES; } @@ -285,18 +286,16 @@ efi_block_find_partitions_disklabel(stru struct mbr_sector *mbr, uint32_t start, uint32_t size) { struct efi_block_part *bpart; - char buf[DEV_BSIZE]; + char buf[DEV_BSIZE]; /* XXX, arbitrary size >= struct disklabel */ struct disklabel d; struct partition *p; EFI_STATUS status; int n; status = efi_block_read(bdev, - ((EFI_LBA)start + LABELSECTOR) * DEV_BSIZE, buf, sizeof(buf)); - if (EFI_ERROR(status) || getdisklabel(buf, ) != NULL) { - FreePool(buf); + ((EFI_LBA)start + LABELSECTOR) * bdev->bio->Media->BlockSize, buf, sizeof(buf)); + if (EFI_ERROR(status) || getdisklabel(buf, ) != NULL) return EIO; - } if (le32toh(d.d_magic) != DISKMAGIC || le32toh(d.d_magic2) != DISKMAGIC) return EINVAL; @@ -419,7 +418,7 @@ efi_block_find_partitions_gpt(struct efi void *buf; UINTN sz; - status = efi_block_read(bdev, GPT_HDR_BLKNO * DEV_BSIZE, , + status = efi_block_read(bdev, (EFI_LBA)GPT_HDR_BLKNO * bdev->bio->Media->BlockSize, , sizeof(hdr)); if (EFI_ERROR(status)) { return EIO; @@ -436,7 +435,7 @@ efi_block_find_partitions_gpt(struct efi return ENOMEM; status = efi_block_read(bdev, - le64toh(hdr.hdr_lba_table) * DEV_BSIZE, buf, sz); + le64toh(hdr.hdr_lba_table) * bdev->bio->Media->BlockSize, buf, sz); if (EFI_ERROR(status)) { FreePool(buf); return EIO; @@ -682,6 +681,7 @@ int efi_block_strategy(void *devdata, int rw, daddr_t dblk, size_t size, void *buf, size_t *rsize) { struct efi_block_part *bpart = devdata; + struct efi_block_dev *bdev = bpart->bdev; EFI_STATUS status; UINT64 off; @@ -692,13 +692,13 @@ efi_block_strategy(void *devdata, int rw switch (bpart->type) { case EFI_BLOCK_PART_DISKLABEL: - off = (dblk + bpart->disklabel.part.p_offset) * DEV_BSIZE; + off = ((EFI_LBA)dblk + bpart->disklabel.part.p_offset) * bdev->bio->Media->BlockSize; break; case EFI_BLOCK_PART_GPT: - off = (dblk + le64toh(bpart->gpt.ent.ent_lba_start)) * DEV_BSIZE; + off = ((EFI_LBA)dblk + le64toh(bpart->gpt.ent.ent_lba_start)) * bdev->bio->Media->BlockSize; break; case
CVS commit: src/sys/stand/efiboot
Module Name:src Committed By: mlelstv Date: Sun Apr 24 06:49:38 UTC 2022 Modified Files: src/sys/stand/efiboot: conf.c efiblock.c efiblock.h Log Message: Use physical sector size as unit for disk addresses. Provide new ioctl to libsa to query for sector size. To generate a diff of this commit: cvs rdiff -u -r1.5 -r1.6 src/sys/stand/efiboot/conf.c cvs rdiff -u -r1.18 -r1.19 src/sys/stand/efiboot/efiblock.c cvs rdiff -u -r1.6 -r1.7 src/sys/stand/efiboot/efiblock.h Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
CVS commit: src/sys/stand/efiboot
Module Name:src Committed By: jmcneill Date: Fri Mar 25 21:23:00 UTC 2022 Modified Files: src/sys/stand/efiboot: Makefile.efiboot boot.c bootmenu.c efiboot.h efifdt.c efifdt.h version Added Files: src/sys/stand/efiboot: userconf.c Log Message: efiboot: Add support for 'userconf' command. Add support for the 'userconf' command at the boot prompt and in boot.cfg, and for FDT based booting, pass the commands as a string list property named "netbsd,userconf" on the /chosen node. To generate a diff of this commit: cvs rdiff -u -r1.25 -r1.26 src/sys/stand/efiboot/Makefile.efiboot cvs rdiff -u -r1.42 -r1.43 src/sys/stand/efiboot/boot.c cvs rdiff -u -r1.3 -r1.4 src/sys/stand/efiboot/bootmenu.c cvs rdiff -u -r1.18 -r1.19 src/sys/stand/efiboot/efiboot.h cvs rdiff -u -r1.33 -r1.34 src/sys/stand/efiboot/efifdt.c cvs rdiff -u -r1.11 -r1.12 src/sys/stand/efiboot/efifdt.h cvs rdiff -u -r0 -r1.1 src/sys/stand/efiboot/userconf.c cvs rdiff -u -r1.29 -r1.30 src/sys/stand/efiboot/version 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/Makefile.efiboot diff -u src/sys/stand/efiboot/Makefile.efiboot:1.25 src/sys/stand/efiboot/Makefile.efiboot:1.26 --- src/sys/stand/efiboot/Makefile.efiboot:1.25 Sun Oct 17 14:12:54 2021 +++ src/sys/stand/efiboot/Makefile.efiboot Fri Mar 25 21:23:00 2022 @@ -1,4 +1,4 @@ -# $NetBSD: Makefile.efiboot,v 1.25 2021/10/17 14:12:54 jmcneill Exp $ +# $NetBSD: Makefile.efiboot,v 1.26 2022/03/25 21:23:00 jmcneill Exp $ S= ${.CURDIR}/../../.. @@ -22,7 +22,7 @@ AFLAGS.start.S= ${${ACTIVE_CC} == "clang .PATH: ${EFIDIR}/gnuefi SOURCES= crt0-efi-${GNUEFIARCH}.S reloc_${GNUEFIARCH}.c SOURCES+= boot.c bootmenu.c conf.c console.c dev_net.c devopen.c exec.c \ - module.c panic.c prompt.c + module.c panic.c prompt.c userconf.c SOURCES+= efiboot.c efichar.c efidev.c efigetsecs.c \ efifile.c efiblock.c efinet.c efipxe.c efirng.c \ efiwatchdog.c efigop.c smbios.c Index: src/sys/stand/efiboot/boot.c diff -u src/sys/stand/efiboot/boot.c:1.42 src/sys/stand/efiboot/boot.c:1.43 --- src/sys/stand/efiboot/boot.c:1.42 Thu Nov 4 07:28:34 2021 +++ src/sys/stand/efiboot/boot.c Fri Mar 25 21:23:00 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: boot.c,v 1.42 2021/11/04 07:28:34 skrll Exp $ */ +/* $NetBSD: boot.c,v 1.43 2022/03/25 21:23:00 jmcneill Exp $ */ /*- * Copyright (c) 2016 Kimihiro Nonaka @@ -114,6 +114,7 @@ void command_mem(char *); void command_menu(char *); void command_reset(char *); void command_setup(char *); +void command_userconf(char *); void command_version(char *); void command_quit(char *); @@ -141,6 +142,7 @@ const struct boot_command commands[] = { { "reboot", command_reset, "reboot|reset" }, { "reset", command_reset, NULL }, { "setup", command_setup, "setup" }, + { "userconf", command_userconf, "userconf " }, { "version", command_version, "version" }, { "ver", command_version, NULL }, { "help", command_help, "help|?" }, @@ -450,6 +452,12 @@ command_setup(char *arg) efi_reboot(); } +void +command_userconf(char *arg) +{ + userconf_add(arg); +} + int set_default_device(const char *arg) { Index: src/sys/stand/efiboot/bootmenu.c diff -u src/sys/stand/efiboot/bootmenu.c:1.3 src/sys/stand/efiboot/bootmenu.c:1.4 --- src/sys/stand/efiboot/bootmenu.c:1.3 Wed Oct 6 10:13:19 2021 +++ src/sys/stand/efiboot/bootmenu.c Fri Mar 25 21:23:00 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: bootmenu.c,v 1.3 2021/10/06 10:13:19 jmcneill Exp $ */ +/* $NetBSD: bootmenu.c,v 1.4 2022/03/25 21:23:00 jmcneill Exp $ */ /*- * Copyright (c) 2008 The NetBSD Foundation, Inc. @@ -60,10 +60,8 @@ do_bootcfg_command(const char *cmd, char { if (strcmp(cmd, BOOTCFG_CMD_LOAD) == 0) module_add(arg); -#if notyet else if (strcmp(cmd, BOOTCFG_CMD_USERCONF) == 0) userconf_add(arg); -#endif #ifdef EFIBOOT_FDT else if (strcmp(cmd, "dtoverlay") == 0) dtoverlay_add(arg); Index: src/sys/stand/efiboot/efiboot.h diff -u src/sys/stand/efiboot/efiboot.h:1.18 src/sys/stand/efiboot/efiboot.h:1.19 --- src/sys/stand/efiboot/efiboot.h:1.18 Wed Oct 6 10:13:19 2021 +++ src/sys/stand/efiboot/efiboot.h Fri Mar 25 21:23:00 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: efiboot.h,v 1.18 2021/10/06 10:13:19 jmcneill Exp $ */ +/* $NetBSD: efiboot.h,v 1.19 2022/03/25 21:23:00 jmcneill Exp $ */ /*- * Copyright (c) 2016 Kimihiro Nonaka @@ -131,3 +131,7 @@ char *gettrailer(char *); void docommand(char *); char awaitkey(int, int); __dead void bootprompt(void); + +/* userconf.c */ +void userconf_add(const char *); +void userconf_foreach(void (*)(const char *)); Index: src/sys/stand/efiboot/efifdt.c diff -u src/sys/stand/efiboot/efifdt.c:1.33 src/sys/stand/efiboot/efifdt.c:1.34 --- src/sys/stand/efiboot/efifdt.c:1.33 Sat Nov 6 19:44:22 2021 +++ src/sys/stand/efiboot/efifdt.c Fri Mar 25 21:23:00 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: efifdt.c,v 1.33 2021/11/06 19:44:22
CVS commit: src/sys/stand/efiboot
Module Name:src Committed By: jmcneill Date: Fri Mar 25 21:23:00 UTC 2022 Modified Files: src/sys/stand/efiboot: Makefile.efiboot boot.c bootmenu.c efiboot.h efifdt.c efifdt.h version Added Files: src/sys/stand/efiboot: userconf.c Log Message: efiboot: Add support for 'userconf' command. Add support for the 'userconf' command at the boot prompt and in boot.cfg, and for FDT based booting, pass the commands as a string list property named "netbsd,userconf" on the /chosen node. To generate a diff of this commit: cvs rdiff -u -r1.25 -r1.26 src/sys/stand/efiboot/Makefile.efiboot cvs rdiff -u -r1.42 -r1.43 src/sys/stand/efiboot/boot.c cvs rdiff -u -r1.3 -r1.4 src/sys/stand/efiboot/bootmenu.c cvs rdiff -u -r1.18 -r1.19 src/sys/stand/efiboot/efiboot.h cvs rdiff -u -r1.33 -r1.34 src/sys/stand/efiboot/efifdt.c cvs rdiff -u -r1.11 -r1.12 src/sys/stand/efiboot/efifdt.h cvs rdiff -u -r0 -r1.1 src/sys/stand/efiboot/userconf.c cvs rdiff -u -r1.29 -r1.30 src/sys/stand/efiboot/version Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
CVS commit: src/sys/stand/efiboot
Module Name:src Committed By: jmcneill Date: Sat Nov 6 19:44:22 UTC 2021 Modified Files: src/sys/stand/efiboot: efifdt.c Log Message: Revert part of previous commit that broke DT booting. To generate a diff of this commit: cvs rdiff -u -r1.32 -r1.33 src/sys/stand/efiboot/efifdt.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/efifdt.c diff -u src/sys/stand/efiboot/efifdt.c:1.32 src/sys/stand/efiboot/efifdt.c:1.33 --- src/sys/stand/efiboot/efifdt.c:1.32 Wed Nov 3 22:02:36 2021 +++ src/sys/stand/efiboot/efifdt.c Sat Nov 6 19:44:22 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: efifdt.c,v 1.32 2021/11/03 22:02:36 skrll Exp $ */ +/* $NetBSD: efifdt.c,v 1.33 2021/11/06 19:44:22 jmcneill Exp $ */ /*- * Copyright (c) 2019 Jason R. Thorpe @@ -594,11 +594,7 @@ arch_prepare_boot(const char *fname, con } } else #endif - if (!dtb_addr || efi_fdt_set_data((void *)(uintptr_t)dtb_addr) != 0) { - if (!dtb_addr) - printf("boot: no DTB provided\n"); - else - printf("boot: invalid DTB data\n"); + if (dtb_addr && efi_fdt_set_data((void *)(uintptr_t)dtb_addr) != 0) { return EINVAL; }
CVS commit: src/sys/stand/efiboot
Module Name:src Committed By: jmcneill Date: Sat Nov 6 19:44:22 UTC 2021 Modified Files: src/sys/stand/efiboot: efifdt.c Log Message: Revert part of previous commit that broke DT booting. To generate a diff of this commit: cvs rdiff -u -r1.32 -r1.33 src/sys/stand/efiboot/efifdt.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
CVS commit: src/sys/stand/efiboot
Module Name:src Committed By: skrll Date: Thu Nov 4 07:28:34 UTC 2021 Modified Files: src/sys/stand/efiboot: boot.c Log Message: Fix non-ACPI builds. To generate a diff of this commit: cvs rdiff -u -r1.41 -r1.42 src/sys/stand/efiboot/boot.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/boot.c diff -u src/sys/stand/efiboot/boot.c:1.41 src/sys/stand/efiboot/boot.c:1.42 --- src/sys/stand/efiboot/boot.c:1.41 Wed Nov 3 22:02:36 2021 +++ src/sys/stand/efiboot/boot.c Thu Nov 4 07:28:34 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: boot.c,v 1.41 2021/11/03 22:02:36 skrll Exp $ */ +/* $NetBSD: boot.c,v 1.42 2021/11/04 07:28:34 skrll Exp $ */ /*- * Copyright (c) 2016 Kimihiro Nonaka @@ -93,7 +93,9 @@ static char rndseed_path[255]; int set_bootfile(const char *); int set_bootargs(const char *); +#ifdef EFIBOOT_ACPI void command_acpi(char *); +#endif void command_boot(char *); void command_dev(char *); void command_initrd(char *); @@ -116,7 +118,9 @@ void command_version(char *); void command_quit(char *); const struct boot_command commands[] = { +#ifdef EFIBOOT_ACPI { "acpi", command_acpi, "acpi [{on|off}]" }, +#endif { "boot", command_boot, "boot [dev:][filename] [args]\n (ex. \"hd0a:\\netbsd.old -s\"" }, { "dev", command_dev, "dev" }, #ifdef EFIBOOT_FDT @@ -174,6 +178,7 @@ command_help(char *arg) } } +#ifdef EFIBOOT_ACPI void command_acpi(char *arg) { @@ -191,6 +196,8 @@ command_acpi(char *arg) efi_acpi_enabled() ? "en" : "dis"); } } +#endif + void command_boot(char *arg) {
CVS commit: src/sys/stand/efiboot
Module Name:src Committed By: skrll Date: Thu Nov 4 07:28:34 UTC 2021 Modified Files: src/sys/stand/efiboot: boot.c Log Message: Fix non-ACPI builds. To generate a diff of this commit: cvs rdiff -u -r1.41 -r1.42 src/sys/stand/efiboot/boot.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
CVS commit: src/sys/stand/efiboot
Module Name:src Committed By: skrll Date: Wed Nov 3 22:02:36 UTC 2021 Modified Files: src/sys/stand/efiboot: boot.c efiacpi.c efifdt.c Log Message: Provide the ablity to ignore ACPI with an 'acpi' command: acpi [{on|off}] To generate a diff of this commit: cvs rdiff -u -r1.40 -r1.41 src/sys/stand/efiboot/boot.c cvs rdiff -u -r1.11 -r1.12 src/sys/stand/efiboot/efiacpi.c cvs rdiff -u -r1.31 -r1.32 src/sys/stand/efiboot/efifdt.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/boot.c diff -u src/sys/stand/efiboot/boot.c:1.40 src/sys/stand/efiboot/boot.c:1.41 --- src/sys/stand/efiboot/boot.c:1.40 Sun Oct 17 14:12:54 2021 +++ src/sys/stand/efiboot/boot.c Wed Nov 3 22:02:36 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: boot.c,v 1.40 2021/10/17 14:12:54 jmcneill Exp $ */ +/* $NetBSD: boot.c,v 1.41 2021/11/03 22:02:36 skrll Exp $ */ /*- * Copyright (c) 2016 Kimihiro Nonaka @@ -93,6 +93,7 @@ static char rndseed_path[255]; int set_bootfile(const char *); int set_bootargs(const char *); +void command_acpi(char *); void command_boot(char *); void command_dev(char *); void command_initrd(char *); @@ -115,6 +116,7 @@ void command_version(char *); void command_quit(char *); const struct boot_command commands[] = { + { "acpi", command_acpi, "acpi [{on|off}]" }, { "boot", command_boot, "boot [dev:][filename] [args]\n (ex. \"hd0a:\\netbsd.old -s\"" }, { "dev", command_dev, "dev" }, #ifdef EFIBOOT_FDT @@ -173,6 +175,23 @@ command_help(char *arg) } void +command_acpi(char *arg) +{ + if (arg && *arg) { + if (strcmp(arg, "on") == 0) + efi_acpi_enable(1); + else if (strcmp(arg, "off") == 0) + efi_acpi_enable(0); + else { + command_help(""); + return; + } + } else { + printf("ACPI support is %sabled\n", + efi_acpi_enabled() ? "en" : "dis"); + } +} +void command_boot(char *arg) { char *fname = arg; Index: src/sys/stand/efiboot/efiacpi.c diff -u src/sys/stand/efiboot/efiacpi.c:1.11 src/sys/stand/efiboot/efiacpi.c:1.12 --- src/sys/stand/efiboot/efiacpi.c:1.11 Wed Oct 6 10:13:19 2021 +++ src/sys/stand/efiboot/efiacpi.c Wed Nov 3 22:02:36 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: efiacpi.c,v 1.11 2021/10/06 10:13:19 jmcneill Exp $ */ +/* $NetBSD: efiacpi.c,v 1.12 2021/11/03 22:02:36 skrll Exp $ */ /*- * Copyright (c) 2018 The NetBSD Foundation, Inc. @@ -49,10 +49,11 @@ static EFI_GUID Acpi20TableGuid = ACPI_2 static EFI_GUID Smbios3TableGuid = SMBIOS3_TABLE_GUID; static EFI_GUID SmbiosTableGuid = SMBIOS_TABLE_GUID; -static int acpi_enable = 1; static void *acpi_root = NULL; static void *smbios_table = NULL; +static int acpi_enabled = 1; + int efi_acpi_probe(void) { @@ -76,19 +77,13 @@ efi_acpi_probe(void) int efi_acpi_available(void) { - return acpi_root != NULL; + return acpi_root != NULL && acpi_enabled; } int efi_acpi_enabled(void) { - return acpi_enable; -} - -void -efi_acpi_enable(int enable) -{ - acpi_enable = enable; + return acpi_enabled; } void * @@ -105,6 +100,15 @@ efi_acpi_smbios(void) static char model_buf[128]; +void +efi_acpi_enable(int val) +{ + if (acpi_root == NULL) { + printf("No ACPI node\n"); + } else + acpi_enabled = val; +} + const char * efi_acpi_get_model(void) { Index: src/sys/stand/efiboot/efifdt.c diff -u src/sys/stand/efiboot/efifdt.c:1.31 src/sys/stand/efiboot/efifdt.c:1.32 --- src/sys/stand/efiboot/efifdt.c:1.31 Wed Oct 6 10:15:20 2021 +++ src/sys/stand/efiboot/efifdt.c Wed Nov 3 22:02:36 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: efifdt.c,v 1.31 2021/10/06 10:15:20 jmcneill Exp $ */ +/* $NetBSD: efifdt.c,v 1.32 2021/11/03 22:02:36 skrll Exp $ */ /*- * Copyright (c) 2019 Jason R. Thorpe @@ -391,7 +391,7 @@ efi_fdt_gop(void) /* * In ACPI mode, use GOP as console. */ - if (efi_acpi_available() && efi_acpi_enabled()) { + if (efi_acpi_available()) { snprintf(buf, sizeof(buf), "/chosen/framebuffer@%" PRIx64, mode->FrameBufferBase); fdt_setprop_string(fdt_data, chosen, "stdout-path", buf); } @@ -587,17 +587,18 @@ arch_prepare_boot(const char *fname, con #ifdef EFIBOOT_ACPI /* ACPI support only works for little endian kernels */ - efi_acpi_enable(netbsd_elf_data == ELFDATA2LSB); - - if (efi_acpi_available() && efi_acpi_enabled()) { + if (efi_acpi_available() && netbsd_elf_data == ELFDATA2LSB) { int error = efi_fdt_create_acpifdt(); if (error != 0) { return error; } } else #endif - if (dtb_addr && efi_fdt_set_data((void *)(uintptr_t)dtb_addr) != 0) { - printf("boot: invalid DTB data\n"); + if (!dtb_addr || efi_fdt_set_data((void *)(uintptr_t)dtb_addr) != 0) { + if (!dtb_addr) + printf("boot: no DTB provided\n"); + else + printf("boot: invalid DTB data\n"); return EINVAL; }
CVS commit: src/sys/stand/efiboot
Module Name:src Committed By: skrll Date: Wed Nov 3 22:02:36 UTC 2021 Modified Files: src/sys/stand/efiboot: boot.c efiacpi.c efifdt.c Log Message: Provide the ablity to ignore ACPI with an 'acpi' command: acpi [{on|off}] To generate a diff of this commit: cvs rdiff -u -r1.40 -r1.41 src/sys/stand/efiboot/boot.c cvs rdiff -u -r1.11 -r1.12 src/sys/stand/efiboot/efiacpi.c cvs rdiff -u -r1.31 -r1.32 src/sys/stand/efiboot/efifdt.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
CVS commit: src/sys/stand/efiboot
Module Name:src Committed By: jmcneill Date: Sat Oct 30 11:18:51 UTC 2021 Modified Files: src/sys/stand/efiboot: efiblock.c Log Message: If a path is not specified, assume /. This makes "ls" and "ls hd0b:" work as expected. To generate a diff of this commit: cvs rdiff -u -r1.17 -r1.18 src/sys/stand/efiboot/efiblock.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/efiblock.c diff -u src/sys/stand/efiboot/efiblock.c:1.17 src/sys/stand/efiboot/efiblock.c:1.18 --- src/sys/stand/efiboot/efiblock.c:1.17 Wed Jun 23 21:42:43 2021 +++ src/sys/stand/efiboot/efiblock.c Sat Oct 30 11:18:51 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: efiblock.c,v 1.17 2021/06/23 21:42:43 jmcneill Exp $ */ +/* $NetBSD: efiblock.c,v 1.18 2021/10/30 11:18:51 jmcneill Exp $ */ /*- * Copyright (c) 2016 Kimihiro Nonaka @@ -85,6 +85,10 @@ efi_block_parse(const char *fname, struc *pfile = strchr(fname, ':') + 1; } + if (*pfile[0] == '\0') { + *pfile = __UNCONST("/"); + } + if (strncasecmp(full_path, "hd", 2) != 0) return EINVAL; dev = strtoimax(full_path + 2, , 10);
CVS commit: src/sys/stand/efiboot
Module Name:src Committed By: jmcneill Date: Sat Oct 30 11:18:51 UTC 2021 Modified Files: src/sys/stand/efiboot: efiblock.c Log Message: If a path is not specified, assume /. This makes "ls" and "ls hd0b:" work as expected. To generate a diff of this commit: cvs rdiff -u -r1.17 -r1.18 src/sys/stand/efiboot/efiblock.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
CVS commit: src/sys/stand/efiboot
Module Name:src Committed By: jmcneill Date: Sun Oct 17 14:12:54 UTC 2021 Modified Files: src/sys/stand/efiboot: Makefile.efiboot boot.c Log Message: Honour the timeout= entry in boot.cfg To generate a diff of this commit: cvs rdiff -u -r1.24 -r1.25 src/sys/stand/efiboot/Makefile.efiboot cvs rdiff -u -r1.39 -r1.40 src/sys/stand/efiboot/boot.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/Makefile.efiboot diff -u src/sys/stand/efiboot/Makefile.efiboot:1.24 src/sys/stand/efiboot/Makefile.efiboot:1.25 --- src/sys/stand/efiboot/Makefile.efiboot:1.24 Wed Oct 6 10:13:19 2021 +++ src/sys/stand/efiboot/Makefile.efiboot Sun Oct 17 14:12:54 2021 @@ -1,4 +1,4 @@ -# $NetBSD: Makefile.efiboot,v 1.24 2021/10/06 10:13:19 jmcneill Exp $ +# $NetBSD: Makefile.efiboot,v 1.25 2021/10/17 14:12:54 jmcneill Exp $ S= ${.CURDIR}/../../.. @@ -92,6 +92,7 @@ CPPFLAGS+= -DSUPPORT_TFTP CPPFLAGS+= -DLIBSA_ENABLE_LS_OP CPPFLAGS+= -DLIBSA_FFS_EI CPPFLAGS+= -DLIBSA_DISKLABEL_EI +CPPFLAGS+= -DDEFAULT_TIMEOUT=5 #CPPFLAGS+= -DEFIBOOT_DEBUG #CPPFLAGS+= -DARP_DEBUG Index: src/sys/stand/efiboot/boot.c diff -u src/sys/stand/efiboot/boot.c:1.39 src/sys/stand/efiboot/boot.c:1.40 --- src/sys/stand/efiboot/boot.c:1.39 Sat Oct 9 13:09:17 2021 +++ src/sys/stand/efiboot/boot.c Sun Oct 17 14:12:54 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: boot.c,v 1.39 2021/10/09 13:09:17 jmcneill Exp $ */ +/* $NetBSD: boot.c,v 1.40 2021/10/17 14:12:54 jmcneill Exp $ */ /*- * Copyright (c) 2016 Kimihiro Nonaka @@ -88,7 +88,6 @@ static char netbsd_path[255]; static char netbsd_args[255]; static char rndseed_path[255]; -#define DEFTIMEOUT 5 #define DEFFILENAME names[0] int set_bootfile(const char *); @@ -549,7 +548,7 @@ boot(void) printf("booting %s%s%s - starting in ", netbsd_path, netbsd_args[0] != '\0' ? " " : "", netbsd_args); - c = awaitkey(DEFTIMEOUT, 1); + c = awaitkey(bootcfg_info.timeout, 1); if (c != '\r' && c != '\n' && c != '\0') bootprompt(); /* does not return */
CVS commit: src/sys/stand/efiboot
Module Name:src Committed By: jmcneill Date: Sun Oct 17 14:12:54 UTC 2021 Modified Files: src/sys/stand/efiboot: Makefile.efiboot boot.c Log Message: Honour the timeout= entry in boot.cfg To generate a diff of this commit: cvs rdiff -u -r1.24 -r1.25 src/sys/stand/efiboot/Makefile.efiboot cvs rdiff -u -r1.39 -r1.40 src/sys/stand/efiboot/boot.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
CVS commit: src/sys/stand/efiboot
Module Name:src Committed By: jmcneill Date: Sat Oct 9 13:09:17 UTC 2021 Modified Files: src/sys/stand/efiboot: boot.c Log Message: efiboot: add "setup" command The "setup" command sets the 64-bit "OsIndications" variable to the value of EFI_OS_INDICATIONS_BOOT_TO_FW_UI and requests a reboot. On firmware that supports this, after reboot the user will be presented with the firmware setup menu. To generate a diff of this commit: cvs rdiff -u -r1.38 -r1.39 src/sys/stand/efiboot/boot.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/boot.c diff -u src/sys/stand/efiboot/boot.c:1.38 src/sys/stand/efiboot/boot.c:1.39 --- src/sys/stand/efiboot/boot.c:1.38 Wed Oct 6 10:13:19 2021 +++ src/sys/stand/efiboot/boot.c Sat Oct 9 13:09:17 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: boot.c,v 1.38 2021/10/06 10:13:19 jmcneill Exp $ */ +/* $NetBSD: boot.c,v 1.39 2021/10/09 13:09:17 jmcneill Exp $ */ /*- * Copyright (c) 2016 Kimihiro Nonaka @@ -111,6 +111,7 @@ void command_gop(char *); void command_mem(char *); void command_menu(char *); void command_reset(char *); +void command_setup(char *); void command_version(char *); void command_quit(char *); @@ -134,6 +135,7 @@ const struct boot_command commands[] = { { "menu", command_menu, "menu" }, { "reboot", command_reset, "reboot|reset" }, { "reset", command_reset, NULL }, + { "setup", command_setup, "setup" }, { "version", command_version, "version" }, { "ver", command_version, NULL }, { "help", command_help, "help|?" }, @@ -355,6 +357,7 @@ command_version(char *arg) { char pathbuf[80]; char *ufirmware; + const UINT64 *osindsup; int rv; printf("Version: %s (%s)\n", bootprog_rev, bootprog_kernrev); @@ -371,6 +374,11 @@ command_version(char *arg) printf("Config path: %s\n", pathbuf); } + osindsup = LibGetVariable(L"OsIndicationsSupported", ); + if (osindsup != NULL) { + printf("UEFI OS indications supported: 0x%" PRIx64 "\n", *osindsup); + } + #ifdef EFIBOOT_FDT efi_fdt_show(); #endif @@ -394,6 +402,29 @@ command_reset(char *arg) efi_reboot(); } +void +command_setup(char *arg) +{ + EFI_STATUS status; + const UINT64 *osindsup; + UINT64 osind; + + osindsup = LibGetVariable(L"OsIndicationsSupported", ); + if (osindsup == NULL || (*osindsup & EFI_OS_INDICATIONS_BOOT_TO_FW_UI) == 0) { + printf("Not supported by firmware\n"); + return; + } + + osind = EFI_OS_INDICATIONS_BOOT_TO_FW_UI; + status = LibSetNVVariable(L"OsIndications", , sizeof(osind), ); + if (EFI_ERROR(status)) { + printf("Failed to set OsIndications variable: %lu\n", (u_long)status); + return; + } + + efi_reboot(); +} + int set_default_device(const char *arg) {
CVS commit: src/sys/stand/efiboot
Module Name:src Committed By: jmcneill Date: Sat Oct 9 13:09:17 UTC 2021 Modified Files: src/sys/stand/efiboot: boot.c Log Message: efiboot: add "setup" command The "setup" command sets the 64-bit "OsIndications" variable to the value of EFI_OS_INDICATIONS_BOOT_TO_FW_UI and requests a reboot. On firmware that supports this, after reboot the user will be presented with the firmware setup menu. To generate a diff of this commit: cvs rdiff -u -r1.38 -r1.39 src/sys/stand/efiboot/boot.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
CVS commit: src/sys/stand/efiboot/bootriscv64
Module Name:src Committed By: jmcneill Date: Wed Oct 6 11:26:21 UTC 2021 Modified Files: src/sys/stand/efiboot/bootriscv64: Makefile Log Message: EFIBOOT_FDT=yes for riscv64 too To generate a diff of this commit: cvs rdiff -u -r1.2 -r1.3 src/sys/stand/efiboot/bootriscv64/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/bootriscv64/Makefile diff -u src/sys/stand/efiboot/bootriscv64/Makefile:1.2 src/sys/stand/efiboot/bootriscv64/Makefile:1.3 --- src/sys/stand/efiboot/bootriscv64/Makefile:1.2 Wed Oct 6 10:13:20 2021 +++ src/sys/stand/efiboot/bootriscv64/Makefile Wed Oct 6 11:26:21 2021 @@ -1,4 +1,4 @@ -# $NetBSD: Makefile,v 1.2 2021/10/06 10:13:20 jmcneill Exp $ +# $NetBSD: Makefile,v 1.3 2021/10/06 11:26:21 jmcneill Exp $ PROG= bootriscv64.efi OBJFMT= binary @@ -7,6 +7,8 @@ GNUEFIARCH= riscv64 LIBGNUEFI_ARCH= riscv64 OBJCOPY_FORMAT= -O binary +EFIBOOT_FDT= yes + EXTRA_SOURCES= efibootriscv64.c COPTS+= -mcmodel=medany
CVS commit: src/sys/stand/efiboot/bootriscv64
Module Name:src Committed By: jmcneill Date: Wed Oct 6 11:26:21 UTC 2021 Modified Files: src/sys/stand/efiboot/bootriscv64: Makefile Log Message: EFIBOOT_FDT=yes for riscv64 too To generate a diff of this commit: cvs rdiff -u -r1.2 -r1.3 src/sys/stand/efiboot/bootriscv64/Makefile Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
CVS commit: src/sys/stand/efiboot
Module Name:src Committed By: jmcneill Date: Wed Oct 6 10:15:20 UTC 2021 Modified Files: src/sys/stand/efiboot: efifdt.c src/sys/stand/efiboot/bootarm: Makefile Log Message: Fix bootarm build. To generate a diff of this commit: cvs rdiff -u -r1.30 -r1.31 src/sys/stand/efiboot/efifdt.c cvs rdiff -u -r1.7 -r1.8 src/sys/stand/efiboot/bootarm/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.30 src/sys/stand/efiboot/efifdt.c:1.31 --- src/sys/stand/efiboot/efifdt.c:1.30 Wed Oct 6 10:13:19 2021 +++ src/sys/stand/efiboot/efifdt.c Wed Oct 6 10:15:20 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: efifdt.c,v 1.30 2021/10/06 10:13:19 jmcneill Exp $ */ +/* $NetBSD: efifdt.c,v 1.31 2021/10/06 10:15:20 jmcneill Exp $ */ /*- * Copyright (c) 2019 Jason R. Thorpe @@ -387,6 +387,7 @@ efi_fdt_gop(void) fdt_appendprop_u32(fdt_data, fb, "stride", mode->Info->PixelsPerScanLine * 4); /* XXX */ fdt_appendprop_string(fdt_data, fb, "format", "a8b8g8r8"); +#ifdef EFIBOOT_ACPI /* * In ACPI mode, use GOP as console. */ @@ -394,6 +395,7 @@ efi_fdt_gop(void) snprintf(buf, sizeof(buf), "/chosen/framebuffer@%" PRIx64, mode->FrameBufferBase); fdt_setprop_string(fdt_data, chosen, "stdout-path", buf); } +#endif return; } Index: src/sys/stand/efiboot/bootarm/Makefile diff -u src/sys/stand/efiboot/bootarm/Makefile:1.7 src/sys/stand/efiboot/bootarm/Makefile:1.8 --- src/sys/stand/efiboot/bootarm/Makefile:1.7 Wed Oct 6 10:13:20 2021 +++ src/sys/stand/efiboot/bootarm/Makefile Wed Oct 6 10:15:20 2021 @@ -1,4 +1,4 @@ -# $NetBSD: Makefile,v 1.7 2021/10/06 10:13:20 jmcneill Exp $ +# $NetBSD: Makefile,v 1.8 2021/10/06 10:15:20 jmcneill Exp $ PROG= bootarm.efi OBJFMT= binary @@ -7,6 +7,8 @@ GNUEFIARCH= arm LIBGNUEFI_ARCH= arm OBJCOPY_FORMAT= -O binary +EFIBOOT_FDT= yes + EXTRA_SOURCES= efibootarm.c EXTRA_SOURCES+= cache.S
CVS commit: src/sys/stand/efiboot
Module Name:src Committed By: jmcneill Date: Wed Oct 6 10:15:20 UTC 2021 Modified Files: src/sys/stand/efiboot: efifdt.c src/sys/stand/efiboot/bootarm: Makefile Log Message: Fix bootarm build. To generate a diff of this commit: cvs rdiff -u -r1.30 -r1.31 src/sys/stand/efiboot/efifdt.c cvs rdiff -u -r1.7 -r1.8 src/sys/stand/efiboot/bootarm/Makefile Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
CVS commit: src/sys/stand/efiboot
Module Name:src Committed By: jmcneill Date: Wed Oct 6 10:13:20 UTC 2021 Modified Files: src/sys/stand/efiboot: Makefile.efiboot boot.c bootmenu.c efiacpi.c efiacpi.h efiboot.c efiboot.h efifdt.c efifdt.h efigetsecs.c efigop.c exec.c src/sys/stand/efiboot/bootaa64: Makefile src/sys/stand/efiboot/bootarm: Makefile src/sys/stand/efiboot/bootriscv64: Makefile Log Message: efiboot: Make FDT support optional on a per-arch basis. To generate a diff of this commit: cvs rdiff -u -r1.23 -r1.24 src/sys/stand/efiboot/Makefile.efiboot cvs rdiff -u -r1.37 -r1.38 src/sys/stand/efiboot/boot.c cvs rdiff -u -r1.2 -r1.3 src/sys/stand/efiboot/bootmenu.c \ src/sys/stand/efiboot/efiacpi.h cvs rdiff -u -r1.10 -r1.11 src/sys/stand/efiboot/efiacpi.c \ src/sys/stand/efiboot/efifdt.h cvs rdiff -u -r1.21 -r1.22 src/sys/stand/efiboot/efiboot.c cvs rdiff -u -r1.17 -r1.18 src/sys/stand/efiboot/efiboot.h cvs rdiff -u -r1.29 -r1.30 src/sys/stand/efiboot/efifdt.c cvs rdiff -u -r1.4 -r1.5 src/sys/stand/efiboot/efigetsecs.c cvs rdiff -u -r1.1 -r1.2 src/sys/stand/efiboot/efigop.c cvs rdiff -u -r1.22 -r1.23 src/sys/stand/efiboot/exec.c cvs rdiff -u -r1.10 -r1.11 src/sys/stand/efiboot/bootaa64/Makefile cvs rdiff -u -r1.6 -r1.7 src/sys/stand/efiboot/bootarm/Makefile cvs rdiff -u -r1.1 -r1.2 src/sys/stand/efiboot/bootriscv64/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/Makefile.efiboot diff -u src/sys/stand/efiboot/Makefile.efiboot:1.23 src/sys/stand/efiboot/Makefile.efiboot:1.24 --- src/sys/stand/efiboot/Makefile.efiboot:1.23 Tue Sep 28 11:37:45 2021 +++ src/sys/stand/efiboot/Makefile.efiboot Wed Oct 6 10:13:19 2021 @@ -1,4 +1,4 @@ -# $NetBSD: Makefile.efiboot,v 1.23 2021/09/28 11:37:45 jmcneill Exp $ +# $NetBSD: Makefile.efiboot,v 1.24 2021/10/06 10:13:19 jmcneill Exp $ S= ${.CURDIR}/../../.. @@ -22,15 +22,24 @@ AFLAGS.start.S= ${${ACTIVE_CC} == "clang .PATH: ${EFIDIR}/gnuefi SOURCES= crt0-efi-${GNUEFIARCH}.S reloc_${GNUEFIARCH}.c SOURCES+= boot.c bootmenu.c conf.c console.c dev_net.c devopen.c exec.c \ - module.c overlay.c panic.c prompt.c -SOURCES+= efiboot.c efichar.c efidev.c efigetsecs.c efifdt.c \ - efifile.c efiblock.c efinet.c efipxe.c efiacpi.c efirng.c \ + module.c panic.c prompt.c +SOURCES+= efiboot.c efichar.c efidev.c efigetsecs.c \ + efifile.c efiblock.c efinet.c efipxe.c efirng.c \ efiwatchdog.c efigop.c smbios.c +.if ${EFIBOOT_FDT:Uno} == "yes" +CPPFLAGS+= -DEFIBOOT_FDT +SOURCES+= efifdt.c overlay.c .PATH: ${S}/external/bsd/libfdt/dist CPPFLAGS+= -I${S}/external/bsd/libfdt/dist SOURCES+= fdt.c fdt_addresses.c fdt_empty_tree.c fdt_overlay.c SOURCES+= fdt_ro.c fdt_rw.c fdt_strerror.c fdt_sw.c fdt_wip.c +.endif + +.if ${EFIBOOT_ACPI:Uno} == "yes" +CPPFLAGS+= -DEFIBOOT_ACPI +SOURCES+= efiacpi.c +.endif SRCS= ${SOURCES} ${EXTRA_SOURCES} @@ -146,9 +155,9 @@ VERSIONMACHINE=${MACHINE} CLEANFILES+= ${PROG}.so ${PROG}.tmp ${PROG}: ${PROG}.so - ${OBJCOPY} -j .text -j .sdata -j .data -j .dynamic -j .dynsym -j .rel \ + ${OBJCOPY} -j .text -j .sdata -j .data -j .dynamic -j .dynsym \ -j .rela -j .rel.* -j .rela.* -j .rel* -j .rela* \ - -j .reloc -O binary ${PROG}.so ${.TARGET} + -j .reloc ${OBJCOPY_FORMAT} ${PROG}.so ${.TARGET} .include Index: src/sys/stand/efiboot/boot.c diff -u src/sys/stand/efiboot/boot.c:1.37 src/sys/stand/efiboot/boot.c:1.38 --- src/sys/stand/efiboot/boot.c:1.37 Tue Sep 28 11:37:45 2021 +++ src/sys/stand/efiboot/boot.c Wed Oct 6 10:13:19 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: boot.c,v 1.37 2021/09/28 11:37:45 jmcneill Exp $ */ +/* $NetBSD: boot.c,v 1.38 2021/10/06 10:13:19 jmcneill Exp $ */ /*- * Copyright (c) 2016 Kimihiro Nonaka @@ -30,13 +30,19 @@ #include "efiboot.h" #include "efiblock.h" #include "efifile.h" -#include "efifdt.h" -#include "efiacpi.h" #include "efirng.h" #include "module.h" -#include "overlay.h" #include "bootmenu.h" +#ifdef EFIBOOT_FDT +#include "efifdt.h" +#include "overlay.h" +#endif + +#ifdef EFIBOOT_ACPI +#include "efiacpi.h" +#endif + #include #include #include @@ -90,11 +96,13 @@ int set_bootargs(const char *); void command_boot(char *); void command_dev(char *); -void command_dtb(char *); void command_initrd(char *); void command_rndseed(char *); +#ifdef EFIBOOT_FDT +void command_dtb(char *); void command_dtoverlay(char *); void command_dtoverlays(char *); +#endif void command_modules(char *); void command_load(char *); void command_unload(char *); @@ -109,12 +117,14 @@ void command_quit(char *); const struct boot_command commands[] = { { "boot", command_boot, "boot [dev:][filename] [args]\n (ex. \"hd0a:\\netbsd.old -s\"" }, { "dev", command_dev, "dev" }, +#ifdef EFIBOOT_FDT { "dtb", command_dtb, "dtb [dev:][filename]" }, + { "dtoverlay", command_dtoverlay, "dtoverlay [dev:][filename]" }, + {
CVS commit: src/sys/stand/efiboot
Module Name:src Committed By: jmcneill Date: Wed Oct 6 10:13:20 UTC 2021 Modified Files: src/sys/stand/efiboot: Makefile.efiboot boot.c bootmenu.c efiacpi.c efiacpi.h efiboot.c efiboot.h efifdt.c efifdt.h efigetsecs.c efigop.c exec.c src/sys/stand/efiboot/bootaa64: Makefile src/sys/stand/efiboot/bootarm: Makefile src/sys/stand/efiboot/bootriscv64: Makefile Log Message: efiboot: Make FDT support optional on a per-arch basis. To generate a diff of this commit: cvs rdiff -u -r1.23 -r1.24 src/sys/stand/efiboot/Makefile.efiboot cvs rdiff -u -r1.37 -r1.38 src/sys/stand/efiboot/boot.c cvs rdiff -u -r1.2 -r1.3 src/sys/stand/efiboot/bootmenu.c \ src/sys/stand/efiboot/efiacpi.h cvs rdiff -u -r1.10 -r1.11 src/sys/stand/efiboot/efiacpi.c \ src/sys/stand/efiboot/efifdt.h cvs rdiff -u -r1.21 -r1.22 src/sys/stand/efiboot/efiboot.c cvs rdiff -u -r1.17 -r1.18 src/sys/stand/efiboot/efiboot.h cvs rdiff -u -r1.29 -r1.30 src/sys/stand/efiboot/efifdt.c cvs rdiff -u -r1.4 -r1.5 src/sys/stand/efiboot/efigetsecs.c cvs rdiff -u -r1.1 -r1.2 src/sys/stand/efiboot/efigop.c cvs rdiff -u -r1.22 -r1.23 src/sys/stand/efiboot/exec.c cvs rdiff -u -r1.10 -r1.11 src/sys/stand/efiboot/bootaa64/Makefile cvs rdiff -u -r1.6 -r1.7 src/sys/stand/efiboot/bootarm/Makefile cvs rdiff -u -r1.1 -r1.2 src/sys/stand/efiboot/bootriscv64/Makefile Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
CVS commit: src/sys/stand/efiboot
Module Name:src Committed By: jmcneill Date: Tue Sep 28 11:38:07 UTC 2021 Added Files: src/sys/stand/efiboot: efigop.c Log Message: efiboot: Add efigop.c To generate a diff of this commit: cvs rdiff -u -r0 -r1.1 src/sys/stand/efiboot/efigop.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
CVS commit: src/sys/stand/efiboot
Module Name:src Committed By: jmcneill Date: Tue Sep 28 11:38:07 UTC 2021 Added Files: src/sys/stand/efiboot: efigop.c Log Message: efiboot: Add efigop.c To generate a diff of this commit: cvs rdiff -u -r0 -r1.1 src/sys/stand/efiboot/efigop.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files. Added files: Index: src/sys/stand/efiboot/efigop.c diff -u /dev/null src/sys/stand/efiboot/efigop.c:1.1 --- /dev/null Tue Sep 28 11:38:07 2021 +++ src/sys/stand/efiboot/efigop.c Tue Sep 28 11:38:07 2021 @@ -0,0 +1,141 @@ +/* $NetBSD: efigop.c,v 1.1 2021/09/28 11:38:07 jmcneill Exp $ */ + +/*- + * Copyright (c) 2021 Jared McNeill + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + *notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + *notice, this list of conditions and the following disclaimer in the + *documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include "efiboot.h" + +#include + +static EFI_GRAPHICS_OUTPUT_PROTOCOL *gop = NULL; + +void +efi_gop_probe(void) +{ + EFI_HANDLE *gop_handle; + UINTN ngop_handle; + EFI_STATUS status; + + status = LibLocateHandle(ByProtocol, , NULL, + _handle, _handle); + if (EFI_ERROR(status) || ngop_handle == 0) { + return; + } + + for (size_t n = 0; n < ngop_handle; n++) { + status = uefi_call_wrapper(BS->HandleProtocol, 3, + gop_handle[n], , (void **)); + if (EFI_ERROR(status) || gop->Mode == NULL) { + gop = NULL; + continue; + } else { + break; + } + } +} + +static uint32_t +efi_gop_bpp(EFI_GRAPHICS_OUTPUT_MODE_INFORMATION *info) +{ + if (info->PixelFormat == PixelRedGreenBlueReserved8BitPerColor || + info->PixelFormat == PixelBlueGreenRedReserved8BitPerColor) { + return 24; + } + + return popcount32(info->PixelInformation.RedMask) + + popcount32(info->PixelInformation.GreenMask) + + popcount32(info->PixelInformation.BlueMask); +} + +static void +efi_gop_printmode(UINT32 mode, EFI_GRAPHICS_OUTPUT_MODE_INFORMATION *info) +{ + char buf[sizeof("N: HxV BB")]; + + snprintf(buf, sizeof(buf), "%-5u: %ux%u %u", mode, + info->HorizontalResolution, info->VerticalResolution, + efi_gop_bpp(info)); + + printf("%-21s", buf); +} + +void +efi_gop_show(void) +{ + if (gop == NULL) { + return; + } + + printf("GOP: "); + efi_gop_printmode(gop->Mode->Mode, gop->Mode->Info); + printf("\n"); +} + +void +efi_gop_dump(void) +{ + EFI_STATUS status; + EFI_GRAPHICS_OUTPUT_MODE_INFORMATION *info; + UINTN size; + + if (gop == NULL) { + return; + } + + for (UINT32 mode = 0; mode < gop->Mode->MaxMode; mode++) { + status = uefi_call_wrapper(gop->QueryMode, 4, gop, mode, + , ); + if (EFI_ERROR(status)) { + continue; + } + if (mode == gop->Mode->Mode) { + printf(" -> "); + } else { + printf(""); + } + efi_gop_printmode(mode, info); + if (mode != gop->Mode->MaxMode - 1 && + mode % 3 == 2) { + printf("\n"); + } + } + printf("\n"); +} + +void +efi_gop_setmode(UINT32 mode) +{ + EFI_STATUS status; + + if (gop == NULL) { + return; + } + + status = uefi_call_wrapper(gop->SetMode, 2, gop, mode); + if (EFI_ERROR(status)) { + printf("Failed to set video mode: %ld\n", (long)status); + } +}
CVS commit: src/sys/stand/efiboot
Module Name:src Committed By: jmcneill Date: Tue Sep 28 11:37:45 UTC 2021 Modified Files: src/sys/stand/efiboot: Makefile.efiboot boot.c efiboot.c efiboot.h version Log Message: efiboot: Add support for changing the video mode. Add a new "gop" command that can query the list of available video modes. With a mode number as argument (eg. "gop 16"), the new display mode will be selected. The "version" command prints the current display mode. To generate a diff of this commit: cvs rdiff -u -r1.22 -r1.23 src/sys/stand/efiboot/Makefile.efiboot cvs rdiff -u -r1.36 -r1.37 src/sys/stand/efiboot/boot.c cvs rdiff -u -r1.20 -r1.21 src/sys/stand/efiboot/efiboot.c cvs rdiff -u -r1.16 -r1.17 src/sys/stand/efiboot/efiboot.h cvs rdiff -u -r1.28 -r1.29 src/sys/stand/efiboot/version 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/Makefile.efiboot diff -u src/sys/stand/efiboot/Makefile.efiboot:1.22 src/sys/stand/efiboot/Makefile.efiboot:1.23 --- src/sys/stand/efiboot/Makefile.efiboot:1.22 Sun Jun 20 19:10:47 2021 +++ src/sys/stand/efiboot/Makefile.efiboot Tue Sep 28 11:37:45 2021 @@ -1,4 +1,4 @@ -# $NetBSD: Makefile.efiboot,v 1.22 2021/06/20 19:10:47 jmcneill Exp $ +# $NetBSD: Makefile.efiboot,v 1.23 2021/09/28 11:37:45 jmcneill Exp $ S= ${.CURDIR}/../../.. @@ -24,8 +24,8 @@ SOURCES= crt0-efi-${GNUEFIARCH}.S reloc_ SOURCES+= boot.c bootmenu.c conf.c console.c dev_net.c devopen.c exec.c \ module.c overlay.c panic.c prompt.c SOURCES+= efiboot.c efichar.c efidev.c efigetsecs.c efifdt.c \ - efifile.c efiblock.c efinet.c efipxe.c efiacpi.c efirng.c efiwatchdog.c \ - smbios.c + efifile.c efiblock.c efinet.c efipxe.c efiacpi.c efirng.c \ + efiwatchdog.c efigop.c smbios.c .PATH: ${S}/external/bsd/libfdt/dist CPPFLAGS+= -I${S}/external/bsd/libfdt/dist Index: src/sys/stand/efiboot/boot.c diff -u src/sys/stand/efiboot/boot.c:1.36 src/sys/stand/efiboot/boot.c:1.37 --- src/sys/stand/efiboot/boot.c:1.36 Tue Sep 7 11:41:31 2021 +++ src/sys/stand/efiboot/boot.c Tue Sep 28 11:37:45 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: boot.c,v 1.36 2021/09/07 11:41:31 nia Exp $ */ +/* $NetBSD: boot.c,v 1.37 2021/09/28 11:37:45 jmcneill Exp $ */ /*- * Copyright (c) 2016 Kimihiro Nonaka @@ -99,6 +99,7 @@ void command_modules(char *); void command_load(char *); void command_unload(char *); void command_ls(char *); +void command_gop(char *); void command_mem(char *); void command_menu(char *); void command_reset(char *); @@ -118,6 +119,7 @@ const struct boot_command commands[] = { { "load", command_load, "load " }, { "unload", command_unload, "unload " }, { "ls", command_ls, "ls [hdNn:/path]" }, + { "gop", command_gop, "gop [mode]" }, { "mem", command_mem, "mem" }, { "menu", command_menu, "menu" }, { "reboot", command_reset, "reboot|reset" }, @@ -290,6 +292,20 @@ command_ls(char *arg) } void +command_gop(char *arg) +{ + UINT32 mode; + + if (!arg || !*arg) { + efi_gop_dump(); + return; + } + + mode = atoi(arg); + efi_gop_setmode(mode); +} + +void command_mem(char *arg) { EFI_MEMORY_DESCRIPTOR *md, *memmap; @@ -347,6 +363,7 @@ command_version(char *arg) efi_acpi_show(); efi_rng_show(); efi_md_show(); + efi_gop_show(); } void Index: src/sys/stand/efiboot/efiboot.c diff -u src/sys/stand/efiboot/efiboot.c:1.20 src/sys/stand/efiboot/efiboot.c:1.21 --- src/sys/stand/efiboot/efiboot.c:1.20 Fri Jun 26 03:23:04 2020 +++ src/sys/stand/efiboot/efiboot.c Tue Sep 28 11:37:45 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: efiboot.c,v 1.20 2020/06/26 03:23:04 thorpej Exp $ */ +/* $NetBSD: efiboot.c,v 1.21 2021/09/28 11:37:45 jmcneill Exp $ */ /*- * Copyright (c) 2018 Jared McNeill @@ -98,6 +98,7 @@ efi_main(EFI_HANDLE imageHandle, EFI_SYS efi_file_system_probe(); efi_block_probe(); efi_rng_probe(); + efi_gop_probe(); boot(); Index: src/sys/stand/efiboot/efiboot.h diff -u src/sys/stand/efiboot/efiboot.h:1.16 src/sys/stand/efiboot/efiboot.h:1.17 --- src/sys/stand/efiboot/efiboot.h:1.16 Tue Sep 7 11:41:31 2021 +++ src/sys/stand/efiboot/efiboot.h Tue Sep 28 11:37:45 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: efiboot.h,v 1.16 2021/09/07 11:41:31 nia Exp $ */ +/* $NetBSD: efiboot.h,v 1.17 2021/09/28 11:37:45 jmcneill Exp $ */ /*- * Copyright (c) 2016 Kimihiro Nonaka @@ -106,6 +106,12 @@ bool efi_pxe_match_booted_interface(cons /* efiwatchdog.c */ void efi_set_watchdog(uint32_t, uint64_t); +/* efigop.c */ +void efi_gop_probe(void); +void efi_gop_show(void); +void efi_gop_dump(void); +void efi_gop_setmode(UINT32); + /* exec.c */ int exec_netbsd(const char *, const char *); Index: src/sys/stand/efiboot/version diff -u src/sys/stand/efiboot/version:1.28 src/sys/stand/efiboot/version:1.29 --- src/sys/stand/efiboot/version:1.28 Sun Aug 8 21:50:10 2021 +++ src/sys/stand/efiboot/version Tue Sep 28 11:37:45 2021 @@ -1,4 +1,4 @@ -$NetBSD: version,v 1.28
CVS commit: src/sys/stand/efiboot
Module Name:src Committed By: jmcneill Date: Tue Sep 28 11:37:45 UTC 2021 Modified Files: src/sys/stand/efiboot: Makefile.efiboot boot.c efiboot.c efiboot.h version Log Message: efiboot: Add support for changing the video mode. Add a new "gop" command that can query the list of available video modes. With a mode number as argument (eg. "gop 16"), the new display mode will be selected. The "version" command prints the current display mode. To generate a diff of this commit: cvs rdiff -u -r1.22 -r1.23 src/sys/stand/efiboot/Makefile.efiboot cvs rdiff -u -r1.36 -r1.37 src/sys/stand/efiboot/boot.c cvs rdiff -u -r1.20 -r1.21 src/sys/stand/efiboot/efiboot.c cvs rdiff -u -r1.16 -r1.17 src/sys/stand/efiboot/efiboot.h cvs rdiff -u -r1.28 -r1.29 src/sys/stand/efiboot/version Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
CVS commit: src/sys/stand/efiboot
Module Name:src Committed By: jmcneill Date: Sat Nov 30 13:02:18 UTC 2019 Modified Files: src/sys/stand/efiboot: Makefile.efiboot efiacpi.c version Added Files: src/sys/stand/efiboot: smbios.c smbios.h Log Message: Use SMBIOS system vendor and product strings to create a "model" string for the root node in the fabricated ACPI device tree, when possible. To generate a diff of this commit: cvs rdiff -u -r1.8 -r1.9 src/sys/stand/efiboot/Makefile.efiboot cvs rdiff -u -r1.4 -r1.5 src/sys/stand/efiboot/efiacpi.c cvs rdiff -u -r0 -r1.1 src/sys/stand/efiboot/smbios.c \ src/sys/stand/efiboot/smbios.h cvs rdiff -u -r1.12 -r1.13 src/sys/stand/efiboot/version Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
CVS commit: src/sys/stand/efiboot
Module Name:src Committed By: jmcneill Date: Sat Nov 30 13:02:18 UTC 2019 Modified Files: src/sys/stand/efiboot: Makefile.efiboot efiacpi.c version Added Files: src/sys/stand/efiboot: smbios.c smbios.h Log Message: Use SMBIOS system vendor and product strings to create a "model" string for the root node in the fabricated ACPI device tree, when possible. To generate a diff of this commit: cvs rdiff -u -r1.8 -r1.9 src/sys/stand/efiboot/Makefile.efiboot cvs rdiff -u -r1.4 -r1.5 src/sys/stand/efiboot/efiacpi.c cvs rdiff -u -r0 -r1.1 src/sys/stand/efiboot/smbios.c \ src/sys/stand/efiboot/smbios.h cvs rdiff -u -r1.12 -r1.13 src/sys/stand/efiboot/version 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/Makefile.efiboot diff -u src/sys/stand/efiboot/Makefile.efiboot:1.8 src/sys/stand/efiboot/Makefile.efiboot:1.9 --- src/sys/stand/efiboot/Makefile.efiboot:1.8 Sun Jul 21 17:01:39 2019 +++ src/sys/stand/efiboot/Makefile.efiboot Sat Nov 30 13:02:18 2019 @@ -1,4 +1,4 @@ -# $NetBSD: Makefile.efiboot,v 1.8 2019/07/21 17:01:39 rin Exp $ +# $NetBSD: Makefile.efiboot,v 1.9 2019/11/30 13:02:18 jmcneill Exp $ S= ${.CURDIR}/../../.. @@ -22,7 +22,7 @@ AFLAGS.start.S= ${${ACTIVE_CC} == "clang .PATH: ${EFIDIR}/gnuefi SOURCES= crt0-efi-${GNUEFIARCH}.S reloc_${GNUEFIARCH}.c SOURCES+= boot.c conf.c console.c dev_net.c devopen.c exec.c panic.c prompt.c -SOURCES+= efiboot.c efichar.c efidev.c efienv.c efigetsecs.c efifdt.c efifile.c efiblock.c efinet.c efipxe.c efiacpi.c +SOURCES+= efiboot.c efichar.c efidev.c efienv.c efigetsecs.c efifdt.c efifile.c efiblock.c efinet.c efipxe.c efiacpi.c smbios.c .PATH: ${S}/external/bsd/libfdt/dist CPPFLAGS+= -I${S}/external/bsd/libfdt/dist Index: src/sys/stand/efiboot/efiacpi.c diff -u src/sys/stand/efiboot/efiacpi.c:1.4 src/sys/stand/efiboot/efiacpi.c:1.5 --- src/sys/stand/efiboot/efiacpi.c:1.4 Thu Aug 1 13:11:16 2019 +++ src/sys/stand/efiboot/efiacpi.c Sat Nov 30 13:02:18 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: efiacpi.c,v 1.4 2019/08/01 13:11:16 jmcneill Exp $ */ +/* $NetBSD: efiacpi.c,v 1.5 2019/11/30 13:02:18 jmcneill Exp $ */ /*- * Copyright (c) 2018 The NetBSD Foundation, Inc. @@ -32,6 +32,7 @@ #include "efiboot.h" #include "efiacpi.h" #include "efifdt.h" +#include "smbios.h" #include @@ -77,6 +78,39 @@ efi_acpi_show(void) printf("\n"); } +static char model_buf[128]; + +static const char * +efi_acpi_get_model(void) +{ + struct smbtable smbios; + struct smbios_sys *psys; + const char *s; + char *buf; + + memset(model_buf, 0, sizeof(model_buf)); + + if (smbios3_table != NULL) { + smbios_init(smbios3_table); + + buf = model_buf; + smbios.cookie = 0; + if (smbios_find_table(SMBIOS_TYPE_SYSTEM, )) { + psys = smbios.tblhdr; + if ((s = smbios_get_string(, psys->vendor, buf, 64)) != NULL) { +buf += strlen(s); +*buf++ = ' '; + } + smbios_get_string(, psys->product, buf, 64); + } + } + + if (model_buf[0] == '\0') + strcpy(model_buf, "ACPI"); + + return model_buf; +} + int efi_acpi_create_fdt(void) { @@ -94,8 +128,10 @@ efi_acpi_create_fdt(void) if (error) return EIO; + const char *model = efi_acpi_get_model(); + fdt_setprop_string(fdt, fdt_path_offset(fdt, "/"), "compatible", "netbsd,generic-acpi"); - fdt_setprop_string(fdt, fdt_path_offset(fdt, "/"), "model", "ACPI"); + fdt_setprop_string(fdt, fdt_path_offset(fdt, "/"), "model", model); fdt_setprop_cell(fdt, fdt_path_offset(fdt, "/"), "#address-cells", 2); fdt_setprop_cell(fdt, fdt_path_offset(fdt, "/"), "#size-cells", 2); Index: src/sys/stand/efiboot/version diff -u src/sys/stand/efiboot/version:1.12 src/sys/stand/efiboot/version:1.13 --- src/sys/stand/efiboot/version:1.12 Thu Aug 1 13:11:16 2019 +++ src/sys/stand/efiboot/version Sat Nov 30 13:02:18 2019 @@ -1,4 +1,4 @@ -$NetBSD: version,v 1.12 2019/08/01 13:11:16 jmcneill Exp $ +$NetBSD: version,v 1.13 2019/11/30 13:02:18 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 @@ -16,3 +16,4 @@ is taken as the current. 1.9: Add support for efiboot.plist and loading device tree overlays. 1.10: Add support for EFI GOP framebuffers in ACPI mode. 1.11: Add full UEFI memory map to /chosen node. +1.12: Derive ACPI model string from SMBIOS. Added files: Index: src/sys/stand/efiboot/smbios.c diff -u /dev/null src/sys/stand/efiboot/smbios.c:1.1 --- /dev/null Sat Nov 30 13:02:18 2019 +++ src/sys/stand/efiboot/smbios.c Sat Nov 30 13:02:18 2019 @@ -0,0 +1,190 @@ +/* $NetBSD: smbios.c,v 1.1 2019/11/30 13:02:18 jmcneill Exp $ */ + +/* + * Copyright (c) 1999 The NetBSD Foundation, Inc. + * All rights reserved. + * + * This code is derived from software contributed to The NetBSD Foundation + * by Jason R. Thorpe of the Numerical Aerospace Simulation Facility, + * NASA Ames Research
CVS commit: src/sys/stand/efiboot
Module Name:src Committed By: jakllsch Date: Sun Sep 29 00:52:26 UTC 2019 Modified Files: src/sys/stand/efiboot: prompt.c Log Message: Increase MI efiboot bootprompt() input buffer from 80 bytes to LINE_MAX. This allows you to load a kernel from a build directory deep in some file system after you accidentally boot an old kernel with a new userland and are otherwise unable to get yourself back to a matching kernel. To generate a diff of this commit: cvs rdiff -u -r1.4 -r1.5 src/sys/stand/efiboot/prompt.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/prompt.c diff -u src/sys/stand/efiboot/prompt.c:1.4 src/sys/stand/efiboot/prompt.c:1.5 --- src/sys/stand/efiboot/prompt.c:1.4 Wed Oct 31 23:49:34 2018 +++ src/sys/stand/efiboot/prompt.c Sun Sep 29 00:52:26 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: prompt.c,v 1.4 2018/10/31 23:49:34 jmcneill Exp $ */ +/* $NetBSD: prompt.c,v 1.5 2019/09/29 00:52:26 jakllsch Exp $ */ /* * Copyright (c) 1996, 1997 @@ -40,6 +40,7 @@ #include "efiboot.h" #include +#include #define POLL_FREQ 10 @@ -136,7 +137,7 @@ docommand(char *arg) __dead void bootprompt(void) { - char input[80]; + char input[LINE_MAX]; for (;;) { char *c = input;
CVS commit: src/sys/stand/efiboot
Module Name:src Committed By: jakllsch Date: Sun Sep 29 00:52:26 UTC 2019 Modified Files: src/sys/stand/efiboot: prompt.c Log Message: Increase MI efiboot bootprompt() input buffer from 80 bytes to LINE_MAX. This allows you to load a kernel from a build directory deep in some file system after you accidentally boot an old kernel with a new userland and are otherwise unable to get yourself back to a matching kernel. To generate a diff of this commit: cvs rdiff -u -r1.4 -r1.5 src/sys/stand/efiboot/prompt.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
CVS commit: src/sys/stand/efiboot
Module Name:src Committed By: jakllsch Date: Fri Sep 27 20:10:43 UTC 2019 Modified Files: src/sys/stand/efiboot: efiblock.c Log Message: Use roundup2() instead of open coding something almost the same that truncates 64-bit quantities. Fixes disk access and booting in bootaa64.efi on SoftIron OverDrive 1000 (which does not have any memory below 4GiB). To generate a diff of this commit: cvs rdiff -u -r1.6 -r1.7 src/sys/stand/efiboot/efiblock.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
CVS commit: src/sys/stand/efiboot
Module Name:src Committed By: jakllsch Date: Fri Sep 27 20:10:43 UTC 2019 Modified Files: src/sys/stand/efiboot: efiblock.c Log Message: Use roundup2() instead of open coding something almost the same that truncates 64-bit quantities. Fixes disk access and booting in bootaa64.efi on SoftIron OverDrive 1000 (which does not have any memory below 4GiB). To generate a diff of this commit: cvs rdiff -u -r1.6 -r1.7 src/sys/stand/efiboot/efiblock.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/efiblock.c diff -u src/sys/stand/efiboot/efiblock.c:1.6 src/sys/stand/efiboot/efiblock.c:1.7 --- src/sys/stand/efiboot/efiblock.c:1.6 Sat Sep 21 10:19:37 2019 +++ src/sys/stand/efiboot/efiblock.c Fri Sep 27 20:10:42 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: efiblock.c,v 1.6 2019/09/21 10:19:37 jmcneill Exp $ */ +/* $NetBSD: efiblock.c,v 1.7 2019/09/27 20:10:42 jakllsch Exp $ */ /*- * Copyright (c) 2016 Kimihiro Nonaka @@ -108,8 +108,8 @@ efi_block_allocate_device_buffer(struct *buf_start = buf = AllocatePool(size); else { buf = AllocatePool(size + bdev->bio->Media->IoAlign - 1); - *buf_start = (buf == NULL) ? NULL : (void *)(((intptr_t)buf + - bdev->bio->Media->IoAlign - 1) & ~(bdev->bio->Media->IoAlign - 1)); + *buf_start = (buf == NULL) ? NULL : + (void *)roundup2((intptr_t)buf, bdev->bio->Media->IoAlign); } return buf;
CVS commit: src/sys/stand/efiboot
Module Name:src Committed By: jmcneill Date: Thu Sep 26 14:28:14 UTC 2019 Modified Files: src/sys/stand/efiboot: efiboot.c Log Message: Do a full reset of the console at startup To generate a diff of this commit: cvs rdiff -u -r1.16 -r1.17 src/sys/stand/efiboot/efiboot.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
CVS commit: src/sys/stand/efiboot
Module Name:src Committed By: jmcneill Date: Thu Sep 26 14:28:14 UTC 2019 Modified Files: src/sys/stand/efiboot: efiboot.c Log Message: Do a full reset of the console at startup To generate a diff of this commit: cvs rdiff -u -r1.16 -r1.17 src/sys/stand/efiboot/efiboot.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.c diff -u src/sys/stand/efiboot/efiboot.c:1.16 src/sys/stand/efiboot/efiboot.c:1.17 --- src/sys/stand/efiboot/efiboot.c:1.16 Sun Apr 21 22:30:41 2019 +++ src/sys/stand/efiboot/efiboot.c Thu Sep 26 14:28:14 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: efiboot.c,v 1.16 2019/04/21 22:30:41 thorpej Exp $ */ +/* $NetBSD: efiboot.c,v 1.17 2019/09/26 14:28:14 jmcneill Exp $ */ /*- * Copyright (c) 2018 Jared McNeill @@ -68,7 +68,10 @@ efi_main(EFI_HANDLE imageHandle, EFI_SYS InitializeLib(imageHandle, systemTable); - (void)uefi_call_wrapper(ST->ConOut->Reset, 2, ST->ConOut, FALSE); + uefi_call_wrapper(ST->ConOut->Reset, 2, ST->ConOut, TRUE); + uefi_call_wrapper(ST->ConOut->SetMode, 2, ST->ConOut, 0); + uefi_call_wrapper(ST->ConOut->EnableCursor, 2, ST->ConOut, TRUE); + uefi_call_wrapper(ST->ConOut->ClearScreen, 1, ST->ConOut); status = uefi_call_wrapper(BS->AllocatePages, 4, AllocateAnyPages, EfiLoaderData, sz, _start); if (EFI_ERROR(status))
CVS commit: src/sys/stand/efiboot
Module Name:src Committed By: jmcneill Date: Sat Sep 21 10:19:37 UTC 2019 Modified Files: src/sys/stand/efiboot: efiblock.c Log Message: Honour block device's IO alignment requirements. Patch from Simon South in PR# 54554 To generate a diff of this commit: cvs rdiff -u -r1.5 -r1.6 src/sys/stand/efiboot/efiblock.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/efiblock.c diff -u src/sys/stand/efiboot/efiblock.c:1.5 src/sys/stand/efiboot/efiblock.c:1.6 --- src/sys/stand/efiboot/efiblock.c:1.5 Sat Mar 9 13:16:42 2019 +++ src/sys/stand/efiboot/efiblock.c Sat Sep 21 10:19:37 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: efiblock.c,v 1.5 2019/03/09 13:16:42 jmcneill Exp $ */ +/* $NetBSD: efiblock.c,v 1.6 2019/09/21 10:19:37 jmcneill Exp $ */ /*- * Copyright (c) 2016 Kimihiro Nonaka @@ -98,6 +98,23 @@ efi_block_generate_hash_mbr(struct efi_b MD5Final(bpart->hash, ); } +static void * +efi_block_allocate_device_buffer(struct efi_block_dev *bdev, UINTN size, + void **buf_start) +{ + void *buf; + + if (bdev->bio->Media->IoAlign <= 1) + *buf_start = buf = AllocatePool(size); + else { + buf = AllocatePool(size + bdev->bio->Media->IoAlign - 1); + *buf_start = (buf == NULL) ? NULL : (void *)(((intptr_t)buf + + bdev->bio->Media->IoAlign - 1) & ~(bdev->bio->Media->IoAlign - 1)); + } + + return buf; +} + static int efi_block_find_partitions_disklabel(struct efi_block_dev *bdev, struct mbr_sector *mbr, uint32_t start, uint32_t size) { @@ -106,19 +123,19 @@ efi_block_find_partitions_disklabel(stru struct partition *p; EFI_STATUS status; EFI_LBA lba; - uint8_t *buf; + void *buf, *buf_start; UINT32 sz; int n; sz = __MAX(sizeof(d), bdev->bio->Media->BlockSize); sz = roundup(sz, bdev->bio->Media->BlockSize); - buf = AllocatePool(sz); - if (!buf) + if ((buf = efi_block_allocate_device_buffer(bdev, sz, _start)) == NULL) return ENOMEM; lba = (((EFI_LBA)start + LABELSECTOR) * DEV_BSIZE) / bdev->bio->Media->BlockSize; - status = uefi_call_wrapper(bdev->bio->ReadBlocks, 5, bdev->bio, bdev->media_id, lba, sz, buf); - if (EFI_ERROR(status) || getdisklabel(buf, ) != NULL) { + status = uefi_call_wrapper(bdev->bio->ReadBlocks, 5, bdev->bio, bdev->media_id, + lba, sz, buf_start); + if (EFI_ERROR(status) || getdisklabel(buf_start, ) != NULL) { FreePool(buf); return EIO; } @@ -159,22 +176,22 @@ efi_block_find_partitions_mbr(struct efi struct mbr_sector mbr; struct mbr_partition *mbr_part; EFI_STATUS status; - uint8_t *buf; + void *buf, *buf_start; UINT32 sz; int n; sz = __MAX(sizeof(mbr), bdev->bio->Media->BlockSize); sz = roundup(sz, bdev->bio->Media->BlockSize); - buf = AllocatePool(sz); - if (!buf) + if ((buf = efi_block_allocate_device_buffer(bdev, sz, _start)) == NULL) return ENOMEM; - status = uefi_call_wrapper(bdev->bio->ReadBlocks, 5, bdev->bio, bdev->media_id, 0, sz, buf); + status = uefi_call_wrapper(bdev->bio->ReadBlocks, 5, bdev->bio, bdev->media_id, + 0, sz, buf_start); if (EFI_ERROR(status)) { FreePool(buf); return EIO; } - memcpy(, buf, sizeof(mbr)); + memcpy(, buf_start, sizeof(mbr)); FreePool(buf); if (le32toh(mbr.mbr_magic) != MBR_MAGIC) @@ -240,21 +257,21 @@ efi_block_find_partitions_gpt(struct efi struct gpt_hdr hdr; struct gpt_ent ent; EFI_STATUS status; + void *buf, *buf_start; UINT32 sz, entry; - uint8_t *buf; sz = __MAX(sizeof(hdr), bdev->bio->Media->BlockSize); sz = roundup(sz, bdev->bio->Media->BlockSize); - buf = AllocatePool(sz); - if (!buf) + if ((buf = efi_block_allocate_device_buffer(bdev, sz, _start)) == NULL) return ENOMEM; - status = uefi_call_wrapper(bdev->bio->ReadBlocks, 5, bdev->bio, bdev->media_id, GPT_HDR_BLKNO, sz, buf); + status = uefi_call_wrapper(bdev->bio->ReadBlocks, 5, bdev->bio, bdev->media_id, + GPT_HDR_BLKNO, sz, buf_start); if (EFI_ERROR(status)) { FreePool(buf); return EIO; } - memcpy(, buf, sizeof(hdr)); + memcpy(, buf_start, sizeof(hdr)); FreePool(buf); if (memcmp(hdr.hdr_sig, GPT_HDR_SIG, sizeof(hdr.hdr_sig)) != 0) @@ -264,18 +281,19 @@ efi_block_find_partitions_gpt(struct efi sz = __MAX(le32toh(hdr.hdr_entsz) * le32toh(hdr.hdr_entries), bdev->bio->Media->BlockSize); sz = roundup(sz, bdev->bio->Media->BlockSize); - buf = AllocatePool(sz); - if (!buf) + if ((buf = efi_block_allocate_device_buffer(bdev, sz, _start)) == NULL) return ENOMEM; - status = uefi_call_wrapper(bdev->bio->ReadBlocks, 5, bdev->bio, bdev->media_id, le64toh(hdr.hdr_lba_table), sz, buf); + status = uefi_call_wrapper(bdev->bio->ReadBlocks, 5, bdev->bio, bdev->media_id, + le64toh(hdr.hdr_lba_table), sz, buf_start); if (EFI_ERROR(status)) { FreePool(buf); return EIO; } for (entry = 0; entry < le32toh(hdr.hdr_entries); entry++) { - memcpy(, buf + (entry * le32toh(hdr.hdr_entsz)), sizeof(ent)); + memcpy(, buf_start + (entry *
CVS commit: src/sys/stand/efiboot
Module Name:src Committed By: jmcneill Date: Sat Sep 21 10:19:37 UTC 2019 Modified Files: src/sys/stand/efiboot: efiblock.c Log Message: Honour block device's IO alignment requirements. Patch from Simon South in PR# 54554 To generate a diff of this commit: cvs rdiff -u -r1.5 -r1.6 src/sys/stand/efiboot/efiblock.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
CVS commit: src/sys/stand/efiboot
Module Name:src Committed By: jmcneill Date: Fri Aug 30 00:01:33 UTC 2019 Modified Files: src/sys/stand/efiboot: efifdt.c Log Message: Only set #address-cells and #size-cells properties on /chosen if we are fabricating a devicetree (ACPI mode). Fixes PR# 54494 To generate a diff of this commit: cvs rdiff -u -r1.18 -r1.19 src/sys/stand/efiboot/efifdt.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/efifdt.c diff -u src/sys/stand/efiboot/efifdt.c:1.18 src/sys/stand/efiboot/efifdt.c:1.19 --- src/sys/stand/efiboot/efifdt.c:1.18 Thu Aug 1 13:11:16 2019 +++ src/sys/stand/efiboot/efifdt.c Fri Aug 30 00:01:33 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: efifdt.c,v 1.18 2019/08/01 13:11:16 jmcneill Exp $ */ +/* $NetBSD: efifdt.c,v 1.19 2019/08/30 00:01:33 jmcneill Exp $ */ /*- * Copyright (c) 2019 Jason R. Thorpe @@ -292,8 +292,15 @@ efi_fdt_gop(void) continue; } + fdt_setprop_u32(fdt_data, + fdt_path_offset(fdt_data, FDT_CHOSEN_NODE_PATH), "#address-cells", 2); + fdt_setprop_u32(fdt_data, + fdt_path_offset(fdt_data, FDT_CHOSEN_NODE_PATH), "#size-cells", 2); + fdt_setprop_empty(fdt_data, + fdt_path_offset(fdt_data, FDT_CHOSEN_NODE_PATH), "ranges"); + snprintf(buf, sizeof(buf), "framebuffer@%" PRIx64, mode->FrameBufferBase); - fb = fdt_add_subnode(fdt_data, fdt_path_offset(fdt_data, "/chosen"), buf); + fb = fdt_add_subnode(fdt_data, fdt_path_offset(fdt_data, FDT_CHOSEN_NODE_PATH), buf); if (fb < 0) panic("FDT: Failed to create framebuffer node"); @@ -327,10 +334,6 @@ efi_fdt_bootargs(const char *bootargs) if (chosen < 0) panic("FDT: Failed to create " FDT_CHOSEN_NODE_PATH " node"); - fdt_setprop_u32(fdt_data, chosen, "#address-cells", 2); - fdt_setprop_u32(fdt_data, chosen, "#size-cells", 2); - fdt_setprop_empty(fdt_data, chosen, "ranges"); - if (*bootargs) fdt_setprop_string(fdt_data, chosen, "bootargs", bootargs);
CVS commit: src/sys/stand/efiboot
Module Name:src Committed By: jmcneill Date: Fri Aug 30 00:01:33 UTC 2019 Modified Files: src/sys/stand/efiboot: efifdt.c Log Message: Only set #address-cells and #size-cells properties on /chosen if we are fabricating a devicetree (ACPI mode). Fixes PR# 54494 To generate a diff of this commit: cvs rdiff -u -r1.18 -r1.19 src/sys/stand/efiboot/efifdt.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
CVS commit: src/sys/stand/efiboot
Module Name:src Committed By: jmcneill Date: Thu Aug 1 13:11:16 UTC 2019 Modified Files: src/sys/stand/efiboot: efiacpi.c efifdt.c version Log Message: Add full UEFI memory map to the /chosen node. To generate a diff of this commit: cvs rdiff -u -r1.3 -r1.4 src/sys/stand/efiboot/efiacpi.c cvs rdiff -u -r1.17 -r1.18 src/sys/stand/efiboot/efifdt.c cvs rdiff -u -r1.11 -r1.12 src/sys/stand/efiboot/version Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
CVS commit: src/sys/stand/efiboot
Module Name:src Committed By: jmcneill Date: Thu Aug 1 13:11:16 UTC 2019 Modified Files: src/sys/stand/efiboot: efiacpi.c efifdt.c version Log Message: Add full UEFI memory map to the /chosen node. To generate a diff of this commit: cvs rdiff -u -r1.3 -r1.4 src/sys/stand/efiboot/efiacpi.c cvs rdiff -u -r1.17 -r1.18 src/sys/stand/efiboot/efifdt.c cvs rdiff -u -r1.11 -r1.12 src/sys/stand/efiboot/version 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/efiacpi.c diff -u src/sys/stand/efiboot/efiacpi.c:1.3 src/sys/stand/efiboot/efiacpi.c:1.4 --- src/sys/stand/efiboot/efiacpi.c:1.3 Sun Oct 28 10:17:47 2018 +++ src/sys/stand/efiboot/efiacpi.c Thu Aug 1 13:11:16 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: efiacpi.c,v 1.3 2018/10/28 10:17:47 jmcneill Exp $ */ +/* $NetBSD: efiacpi.c,v 1.4 2019/08/01 13:11:16 jmcneill Exp $ */ /*- * Copyright (c) 2018 The NetBSD Foundation, Inc. @@ -35,7 +35,7 @@ #include -#define ACPI_FDT_SIZE (64 * 1024) +#define ACPI_FDT_SIZE (128 * 1024) static EFI_GUID Acpi20TableGuid = ACPI_20_TABLE_GUID; static EFI_GUID Smbios3TableGuid = SMBIOS3_TABLE_GUID; Index: src/sys/stand/efiboot/efifdt.c diff -u src/sys/stand/efiboot/efifdt.c:1.17 src/sys/stand/efiboot/efifdt.c:1.18 --- src/sys/stand/efiboot/efifdt.c:1.17 Thu Jul 25 11:44:14 2019 +++ src/sys/stand/efiboot/efifdt.c Thu Aug 1 13:11:16 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: efifdt.c,v 1.17 2019/07/25 11:44:14 skrll Exp $ */ +/* $NetBSD: efifdt.c,v 1.18 2019/08/01 13:11:16 jmcneill Exp $ */ /*- * Copyright (c) 2019 Jason R. Thorpe @@ -206,14 +206,14 @@ efi_fdt_memory_map(void) memmap = LibMemoryMap(, , , ); for (n = 0, md = memmap; n < nentries; n++, md = NextMemoryDescriptor(md, descsize)) { + fdt_appendprop_u32(fdt_data, fdt_path_offset(fdt_data, FDT_CHOSEN_NODE_PATH), "netbsd,uefi-memmap", md->Type); + fdt_appendprop_u64(fdt_data, fdt_path_offset(fdt_data, FDT_CHOSEN_NODE_PATH), "netbsd,uefi-memmap", md->PhysicalStart); + fdt_appendprop_u64(fdt_data, fdt_path_offset(fdt_data, FDT_CHOSEN_NODE_PATH), "netbsd,uefi-memmap", md->NumberOfPages); + fdt_appendprop_u64(fdt_data, fdt_path_offset(fdt_data, FDT_CHOSEN_NODE_PATH), "netbsd,uefi-memmap", md->Attribute); + if ((md->Attribute & EFI_MEMORY_RUNTIME) != 0) continue; - fdt_appendprop_u32(fdt_data, chosen, "netbsd,uefi-memory-map", md->Type); - fdt_appendprop_u64(fdt_data, chosen, "netbsd,uefi-memory-map", md->PhysicalStart); - fdt_appendprop_u64(fdt_data, chosen, "netbsd,uefi-memory-map", md->NumberOfPages); - fdt_appendprop_u64(fdt_data, chosen, "netbsd,uefi-memory-map", md->Attribute); - if ((md->Attribute & EFI_MEMORY_WB) == 0) continue; if (!FDT_MEMORY_USABLE(md)) Index: src/sys/stand/efiboot/version diff -u src/sys/stand/efiboot/version:1.11 src/sys/stand/efiboot/version:1.12 --- src/sys/stand/efiboot/version:1.11 Wed Jul 24 11:40:36 2019 +++ src/sys/stand/efiboot/version Thu Aug 1 13:11:16 2019 @@ -1,4 +1,4 @@ -$NetBSD: version,v 1.11 2019/07/24 11:40:36 jmcneill Exp $ +$NetBSD: version,v 1.12 2019/08/01 13:11:16 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 @@ -15,3 +15,4 @@ is taken as the current. 1.8: Add support for "bootargs" environment variable. 1.9: Add support for efiboot.plist and loading device tree overlays. 1.10: Add support for EFI GOP framebuffers in ACPI mode. +1.11: Add full UEFI memory map to /chosen node.
CVS commit: src/sys/stand/efiboot
Module Name:src Committed By: skrll Date: Thu Jul 25 11:44:14 UTC 2019 Modified Files: src/sys/stand/efiboot: efifdt.c Log Message: Fix arm build To generate a diff of this commit: cvs rdiff -u -r1.16 -r1.17 src/sys/stand/efiboot/efifdt.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/efifdt.c diff -u src/sys/stand/efiboot/efifdt.c:1.16 src/sys/stand/efiboot/efifdt.c:1.17 --- src/sys/stand/efiboot/efifdt.c:1.16 Wed Jul 24 11:40:36 2019 +++ src/sys/stand/efiboot/efifdt.c Thu Jul 25 11:44:14 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: efifdt.c,v 1.16 2019/07/24 11:40:36 jmcneill Exp $ */ +/* $NetBSD: efifdt.c,v 1.17 2019/07/25 11:44:14 skrll Exp $ */ /*- * Copyright (c) 2019 Jason R. Thorpe @@ -292,7 +292,7 @@ efi_fdt_gop(void) continue; } - snprintf(buf, sizeof(buf), "framebuffer@%lx", mode->FrameBufferBase); + snprintf(buf, sizeof(buf), "framebuffer@%" PRIx64, mode->FrameBufferBase); fb = fdt_add_subnode(fdt_data, fdt_path_offset(fdt_data, "/chosen"), buf); if (fb < 0) panic("FDT: Failed to create framebuffer node"); @@ -306,7 +306,7 @@ efi_fdt_gop(void) fdt_appendprop_u32(fdt_data, fb, "stride", mode->Info->PixelsPerScanLine * 4); /* XXX */ fdt_appendprop_string(fdt_data, fb, "format", "a8b8g8r8"); - snprintf(buf, sizeof(buf), "/chosen/framebuffer@%lx", mode->FrameBufferBase); + snprintf(buf, sizeof(buf), "/chosen/framebuffer@%" PRIx64, mode->FrameBufferBase); fdt_setprop_string(fdt_data, fdt_path_offset(fdt_data, FDT_CHOSEN_NODE_PATH), "stdout-path", buf);
CVS commit: src/sys/stand/efiboot
Module Name:src Committed By: skrll Date: Thu Jul 25 11:44:14 UTC 2019 Modified Files: src/sys/stand/efiboot: efifdt.c Log Message: Fix arm build To generate a diff of this commit: cvs rdiff -u -r1.16 -r1.17 src/sys/stand/efiboot/efifdt.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
CVS commit: src/sys/stand/efiboot
Module Name:src Committed By: jmcneill Date: Wed Jul 24 11:40:37 UTC 2019 Modified Files: src/sys/stand/efiboot: efifdt.c efifdt.h exec.c version Log Message: Add support for simple framebuffers when booting in ACPI mode. To generate a diff of this commit: cvs rdiff -u -r1.15 -r1.16 src/sys/stand/efiboot/efifdt.c cvs rdiff -u -r1.5 -r1.6 src/sys/stand/efiboot/efifdt.h cvs rdiff -u -r1.10 -r1.11 src/sys/stand/efiboot/exec.c \ src/sys/stand/efiboot/version 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.15 src/sys/stand/efiboot/efifdt.c:1.16 --- src/sys/stand/efiboot/efifdt.c:1.15 Sun Apr 21 22:30:41 2019 +++ src/sys/stand/efiboot/efifdt.c Wed Jul 24 11:40:36 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: efifdt.c,v 1.15 2019/04/21 22:30:41 thorpej Exp $ */ +/* $NetBSD: efifdt.c,v 1.16 2019/07/24 11:40:36 jmcneill Exp $ */ /*- * Copyright (c) 2019 Jason R. Thorpe @@ -185,7 +185,7 @@ efi_fdt_memory_map(void) EFI_MEMORY_DESCRIPTOR *md, *memmap; UINT32 descver; UINT64 phys_start, phys_size; - int n, memory; + int n, memory, chosen; memory = fdt_path_offset(fdt_data, FDT_MEMORY_NODE_PATH); if (memory < 0) @@ -193,6 +193,12 @@ efi_fdt_memory_map(void) if (memory < 0) panic("FDT: Failed to create " FDT_MEMORY_NODE_PATH " node"); + chosen = fdt_path_offset(fdt_data, FDT_CHOSEN_NODE_PATH); + if (chosen < 0) + chosen = fdt_add_subnode(fdt_data, fdt_path_offset(fdt_data, "/"), FDT_CHOSEN_NODE_NAME); + if (chosen < 0) + panic("FDT: Failed to create " FDT_CHOSEN_NODE_PATH " node"); + fdt_delprop(fdt_data, memory, "reg"); const int address_cells = fdt_address_cells(fdt_data, fdt_path_offset(fdt_data, "/")); @@ -202,6 +208,12 @@ efi_fdt_memory_map(void) for (n = 0, md = memmap; n < nentries; n++, md = NextMemoryDescriptor(md, descsize)) { if ((md->Attribute & EFI_MEMORY_RUNTIME) != 0) continue; + + fdt_appendprop_u32(fdt_data, chosen, "netbsd,uefi-memory-map", md->Type); + fdt_appendprop_u64(fdt_data, chosen, "netbsd,uefi-memory-map", md->PhysicalStart); + fdt_appendprop_u64(fdt_data, chosen, "netbsd,uefi-memory-map", md->NumberOfPages); + fdt_appendprop_u64(fdt_data, chosen, "netbsd,uefi-memory-map", md->Attribute); + if ((md->Attribute & EFI_MEMORY_WB) == 0) continue; if (!FDT_MEMORY_USABLE(md)) @@ -239,6 +251,70 @@ efi_fdt_memory_map(void) } void +efi_fdt_gop(void) +{ + EFI_STATUS status; + EFI_GRAPHICS_OUTPUT_PROTOCOL *gop; + EFI_GRAPHICS_OUTPUT_PROTOCOL_MODE *mode; + EFI_HANDLE *gop_handle; + UINTN ngop_handle, n; + char buf[48]; + int fb; + + status = LibLocateHandle(ByProtocol, , NULL, _handle, _handle); + if (EFI_ERROR(status) || ngop_handle == 0) + return; + + for (n = 0; n < ngop_handle; n++) { + status = uefi_call_wrapper(BS->HandleProtocol, 3, gop_handle[n], , (void **)); + if (EFI_ERROR(status)) + continue; + + mode = gop->Mode; + if (mode == NULL) + continue; + +#ifdef EFIBOOT_DEBUG + printf("GOP: FB @ 0x%lx size 0x%lx\n", mode->FrameBufferBase, mode->FrameBufferSize); + printf("GOP: Version %d\n", mode->Info->Version); + printf("GOP: HRes %d VRes %d\n", mode->Info->HorizontalResolution, mode->Info->VerticalResolution); + printf("GOP: PixelFormat %d\n", mode->Info->PixelFormat); + printf("GOP: PixelBitmask R 0x%x G 0x%x B 0x%x Res 0x%x\n", + mode->Info->PixelInformation.RedMask, + mode->Info->PixelInformation.GreenMask, + mode->Info->PixelInformation.BlueMask, + mode->Info->PixelInformation.ReservedMask); + printf("GOP: Pixels per scanline %d\n", mode->Info->PixelsPerScanLine); +#endif + + if (mode->Info->PixelFormat == PixelBltOnly) { + printf("GOP: PixelBltOnly pixel format not supported\n"); + continue; + } + + snprintf(buf, sizeof(buf), "framebuffer@%lx", mode->FrameBufferBase); + fb = fdt_add_subnode(fdt_data, fdt_path_offset(fdt_data, "/chosen"), buf); + if (fb < 0) + panic("FDT: Failed to create framebuffer node"); + + fdt_appendprop_string(fdt_data, fb, "compatible", "simple-framebuffer"); + fdt_appendprop_string(fdt_data, fb, "status", "okay"); + fdt_appendprop_u64(fdt_data, fb, "reg", mode->FrameBufferBase); + fdt_appendprop_u64(fdt_data, fb, "reg", mode->FrameBufferSize); + fdt_appendprop_u32(fdt_data, fb, "width", mode->Info->HorizontalResolution); + fdt_appendprop_u32(fdt_data, fb, "height", mode->Info->VerticalResolution); + fdt_appendprop_u32(fdt_data, fb, "stride", mode->Info->PixelsPerScanLine * 4); /* XXX */ + fdt_appendprop_string(fdt_data, fb, "format", "a8b8g8r8"); + + snprintf(buf, sizeof(buf), "/chosen/framebuffer@%lx", mode->FrameBufferBase); + fdt_setprop_string(fdt_data, fdt_path_offset(fdt_data, FDT_CHOSEN_NODE_PATH), + "stdout-path", buf); + + return; + } +} + +void efi_fdt_bootargs(const char *bootargs) { struct efi_block_part *bpart = efi_block_boot_part(); @@ -251,6 +327,10 @@
CVS commit: src/sys/stand/efiboot
Module Name:src Committed By: jmcneill Date: Wed Jul 24 11:40:37 UTC 2019 Modified Files: src/sys/stand/efiboot: efifdt.c efifdt.h exec.c version Log Message: Add support for simple framebuffers when booting in ACPI mode. To generate a diff of this commit: cvs rdiff -u -r1.15 -r1.16 src/sys/stand/efiboot/efifdt.c cvs rdiff -u -r1.5 -r1.6 src/sys/stand/efiboot/efifdt.h cvs rdiff -u -r1.10 -r1.11 src/sys/stand/efiboot/exec.c \ src/sys/stand/efiboot/version Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
CVS commit: src/sys/stand/efiboot
Module Name:src Committed By: rin Date: Sun Jul 21 17:01:39 UTC 2019 Modified Files: src/sys/stand/efiboot: Makefile.efiboot Log Message: Enable us to load kernel image of different byte order. Now, earmv7hf-eb kernel can successfully boot from EFI bootloader. XXX We need to recognize disklabel and filesystem written in opposite byte oder. To generate a diff of this commit: cvs rdiff -u -r1.7 -r1.8 src/sys/stand/efiboot/Makefile.efiboot 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/Makefile.efiboot diff -u src/sys/stand/efiboot/Makefile.efiboot:1.7 src/sys/stand/efiboot/Makefile.efiboot:1.8 --- src/sys/stand/efiboot/Makefile.efiboot:1.7 Sun Apr 21 22:30:41 2019 +++ src/sys/stand/efiboot/Makefile.efiboot Sun Jul 21 17:01:39 2019 @@ -1,4 +1,4 @@ -# $NetBSD: Makefile.efiboot,v 1.7 2019/04/21 22:30:41 thorpej Exp $ +# $NetBSD: Makefile.efiboot,v 1.8 2019/07/21 17:01:39 rin Exp $ S= ${.CURDIR}/../../.. @@ -97,6 +97,7 @@ SAMISCMAKEFLAGS+="SA_USE_LOADFILE=yes" SAMISCMAKEFLAGS+="SA_USE_CREAD=yes" SAMISCMAKEFLAGS+="SA_INCLUDE_NET=yes" SAMISCMAKEFLAGS+="SA_ENABLE_LS_OP=yes" +SAMISCMAKEFLAGS+="SA_ENABLE_BIENDIAN=yes" .include "${S}/lib/libsa/Makefile.inc" LIBSA= ${SALIB}
CVS commit: src/sys/stand/efiboot
Module Name:src Committed By: rin Date: Sun Jul 21 17:01:39 UTC 2019 Modified Files: src/sys/stand/efiboot: Makefile.efiboot Log Message: Enable us to load kernel image of different byte order. Now, earmv7hf-eb kernel can successfully boot from EFI bootloader. XXX We need to recognize disklabel and filesystem written in opposite byte oder. To generate a diff of this commit: cvs rdiff -u -r1.7 -r1.8 src/sys/stand/efiboot/Makefile.efiboot Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.