Module Name: src Committed By: nonaka Date: Mon Apr 2 09:44:19 UTC 2018
Modified Files: src/sys/arch/i386/stand/efiboot: TODO.efiboot boot.c devopen.c devopen.h efidisk.c efidisk.h src/sys/arch/i386/stand/lib: biosdisk.c biosdisk.h bootmenu.c bootmenu.h src/sys/lib/libsa: bootcfg.c bootcfg.h Log Message: efiboot: try to read boot.cfg from /EFI/NetBSD on ESP of the booted disk. To generate a diff of this commit: cvs rdiff -u -r1.4 -r1.5 src/sys/arch/i386/stand/efiboot/TODO.efiboot \ src/sys/arch/i386/stand/efiboot/efidisk.c cvs rdiff -u -r1.8 -r1.9 src/sys/arch/i386/stand/efiboot/boot.c cvs rdiff -u -r1.3 -r1.4 src/sys/arch/i386/stand/efiboot/devopen.c cvs rdiff -u -r1.1 -r1.2 src/sys/arch/i386/stand/efiboot/devopen.h cvs rdiff -u -r1.2 -r1.3 src/sys/arch/i386/stand/efiboot/efidisk.h cvs rdiff -u -r1.48 -r1.49 src/sys/arch/i386/stand/lib/biosdisk.c cvs rdiff -u -r1.9 -r1.10 src/sys/arch/i386/stand/lib/biosdisk.h cvs rdiff -u -r1.16 -r1.17 src/sys/arch/i386/stand/lib/bootmenu.c cvs rdiff -u -r1.5 -r1.6 src/sys/arch/i386/stand/lib/bootmenu.h cvs rdiff -u -r1.2 -r1.3 src/sys/lib/libsa/bootcfg.c cvs rdiff -u -r1.1 -r1.2 src/sys/lib/libsa/bootcfg.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/arch/i386/stand/efiboot/TODO.efiboot diff -u src/sys/arch/i386/stand/efiboot/TODO.efiboot:1.4 src/sys/arch/i386/stand/efiboot/TODO.efiboot:1.5 --- src/sys/arch/i386/stand/efiboot/TODO.efiboot:1.4 Thu Mar 8 10:34:33 2018 +++ src/sys/arch/i386/stand/efiboot/TODO.efiboot Mon Apr 2 09:44:18 2018 @@ -1,6 +1,5 @@ - efiboot * handle UEFI variables - * load boot.cfg from EFI system partition (FAT32) - kernel * handle UEFI variables (/dev/efivar) Index: src/sys/arch/i386/stand/efiboot/efidisk.c diff -u src/sys/arch/i386/stand/efiboot/efidisk.c:1.4 src/sys/arch/i386/stand/efiboot/efidisk.c:1.5 --- src/sys/arch/i386/stand/efiboot/efidisk.c:1.4 Tue Mar 27 14:15:05 2018 +++ src/sys/arch/i386/stand/efiboot/efidisk.c Mon Apr 2 09:44:18 2018 @@ -1,4 +1,4 @@ -/* $NetBSD: efidisk.c,v 1.4 2018/03/27 14:15:05 nonaka Exp $ */ +/* $NetBSD: efidisk.c,v 1.5 2018/04/02 09:44:18 nonaka Exp $ */ /*- * Copyright (c) 2016 Kimihiro Nonaka <non...@netbsd.org> @@ -213,3 +213,37 @@ get_harddrives(void) { return nefidisks; } + +int +efidisk_get_efi_system_partition(int dev, int *partition) +{ + extern const struct uuid GET_efi; + const struct efidiskinfo *edi; + struct biosdisk_partition *part; + int i, nparts; + + edi = efidisk_getinfo(dev); + if (edi == NULL) + return ENXIO; + + if (edi->type != BIOSDISK_TYPE_HD) + return ENOTSUP; + + if (biosdisk_readpartition(edi->dev, &part, &nparts)) + return EIO; + + for (i = 0; i < nparts; i++) { + if (part[i].size == 0) + continue; + if (part[i].fstype == FS_UNUSED) + continue; + if (guid_is_equal(part[i].guid->guid, &GET_efi)) + break; + } + dealloc(part, sizeof(*part) * nparts); + if (i == nparts) + return ENOENT; + + *partition = i; + return 0; +} Index: src/sys/arch/i386/stand/efiboot/boot.c diff -u src/sys/arch/i386/stand/efiboot/boot.c:1.8 src/sys/arch/i386/stand/efiboot/boot.c:1.9 --- src/sys/arch/i386/stand/efiboot/boot.c:1.8 Tue Mar 27 14:15:05 2018 +++ src/sys/arch/i386/stand/efiboot/boot.c Mon Apr 2 09:44:18 2018 @@ -1,4 +1,4 @@ -/* $NetBSD: boot.c,v 1.8 2018/03/27 14:15:05 nonaka Exp $ */ +/* $NetBSD: boot.c,v 1.9 2018/04/02 09:44:18 nonaka Exp $ */ /*- * Copyright (c) 2016 Kimihiro Nonaka <non...@netbsd.org> @@ -55,7 +55,9 @@ static const char * const names[][2] = { #define NUMNAMES __arraycount(names) #define DEFFILENAME names[0][0] -#define MAXDEVNAME 16 +#ifndef EFIBOOTCFG_FILENAME +#define EFIBOOTCFG_FILENAME "esp:/EFI/NetBSD/boot.cfg" +#endif void command_help(char *); void command_quit(char *); @@ -273,6 +275,10 @@ boot(void) default_filename = DEFFILENAME; if (!(boot_params.bp_flags & X86_BP_FLAGS_NOBOOTCONF)) { +#ifdef EFIBOOTCFG_FILENAME + int rv = parsebootconf(EFIBOOTCFG_FILENAME); + if (rv) +#endif parsebootconf(BOOTCFG_FILENAME); } else { bootcfg_info.timeout = boot_params.bp_timeout; Index: src/sys/arch/i386/stand/efiboot/devopen.c diff -u src/sys/arch/i386/stand/efiboot/devopen.c:1.3 src/sys/arch/i386/stand/efiboot/devopen.c:1.4 --- src/sys/arch/i386/stand/efiboot/devopen.c:1.3 Tue Mar 20 10:16:17 2018 +++ src/sys/arch/i386/stand/efiboot/devopen.c Mon Apr 2 09:44:18 2018 @@ -1,4 +1,4 @@ -/* $NetBSD: devopen.c,v 1.3 2018/03/20 10:16:17 nonaka Exp $ */ +/* $NetBSD: devopen.c,v 1.4 2018/04/02 09:44:18 nonaka Exp $ */ /*- * Copyright (c) 2005 The NetBSD Foundation, Inc. @@ -59,6 +59,7 @@ #include <biosdisk.h> #include "devopen.h" #include <bootinfo.h> +#include "efidisk.h" static int dev2bios(char *devname, int unit, int *biosdev) @@ -103,9 +104,20 @@ devopen(struct open_file *f, const char int biosdev; int error; - if ((error = parsebootfile(fname, &fsname, &devname, - &unit, &partition, (const char **) file)) - || (error = dev2bios(devname, unit, &biosdev))) + error = parsebootfile(fname, &fsname, &devname, &unit, &partition, + (const char **) file); + if (error) + return error; + + if (strcmp(devname, "esp") == 0) { + bios2dev(boot_biosdev, boot_biossector, &devname, &unit, + &partition); + if (efidisk_get_efi_system_partition(boot_biosdev, &partition)) + return ENXIO; + } + + error = dev2bios(devname, unit, &biosdev); + if (error) return error; f->f_dev = &devsw[0]; /* must be biosdisk */ Index: src/sys/arch/i386/stand/efiboot/devopen.h diff -u src/sys/arch/i386/stand/efiboot/devopen.h:1.1 src/sys/arch/i386/stand/efiboot/devopen.h:1.2 --- src/sys/arch/i386/stand/efiboot/devopen.h:1.1 Tue Jan 24 11:09:14 2017 +++ src/sys/arch/i386/stand/efiboot/devopen.h Mon Apr 2 09:44:18 2018 @@ -1,4 +1,4 @@ -/* $NetBSD: devopen.h,v 1.1 2017/01/24 11:09:14 nonaka Exp $ */ +/* $NetBSD: devopen.h,v 1.2 2018/04/02 09:44:18 nonaka Exp $ */ /*- * Copyright (c) 2016 Kimihiro Nonaka <non...@netbsd.org> @@ -27,5 +27,8 @@ */ extern int boot_biosdev; +extern daddr_t boot_biossector; + +#define MAXDEVNAME 16 void bios2dev(int, daddr_t, char **, int *, int *); Index: src/sys/arch/i386/stand/efiboot/efidisk.h diff -u src/sys/arch/i386/stand/efiboot/efidisk.h:1.2 src/sys/arch/i386/stand/efiboot/efidisk.h:1.3 --- src/sys/arch/i386/stand/efiboot/efidisk.h:1.2 Thu Mar 8 10:34:33 2018 +++ src/sys/arch/i386/stand/efiboot/efidisk.h Mon Apr 2 09:44:18 2018 @@ -1,4 +1,4 @@ -/* $NetBSD: efidisk.h,v 1.2 2018/03/08 10:34:33 nonaka Exp $ */ +/* $NetBSD: efidisk.h,v 1.3 2018/04/02 09:44:18 nonaka Exp $ */ /*- * Copyright (c) 2016 Kimihiro Nonaka <non...@netbsd.org> @@ -40,3 +40,4 @@ struct efidiskinfo { TAILQ_HEAD(efidiskinfo_lh, efidiskinfo); const struct efidiskinfo *efidisk_getinfo(int); +int efidisk_get_efi_system_partition(int, int *); Index: src/sys/arch/i386/stand/lib/biosdisk.c diff -u src/sys/arch/i386/stand/lib/biosdisk.c:1.48 src/sys/arch/i386/stand/lib/biosdisk.c:1.49 --- src/sys/arch/i386/stand/lib/biosdisk.c:1.48 Tue Mar 20 10:21:01 2018 +++ src/sys/arch/i386/stand/lib/biosdisk.c Mon Apr 2 09:44:18 2018 @@ -1,4 +1,4 @@ -/* $NetBSD: biosdisk.c,v 1.48 2018/03/20 10:21:01 nonaka Exp $ */ +/* $NetBSD: biosdisk.c,v 1.49 2018/04/02 09:44:18 nonaka Exp $ */ /* * Copyright (c) 1996, 1998 @@ -249,14 +249,14 @@ md5(void *hash, const void *data, size_t #endif #ifndef NO_GPT -static bool +bool guid_is_nil(const struct uuid *u) { static const struct uuid nil = { .time_low = 0 }; return (memcmp(u, &nil, sizeof(*u)) == 0 ? true : false); } -static bool +bool guid_is_equal(const struct uuid *a, const struct uuid *b) { return (memcmp(a, b, sizeof(*a)) == 0 ? true : false); Index: src/sys/arch/i386/stand/lib/biosdisk.h diff -u src/sys/arch/i386/stand/lib/biosdisk.h:1.9 src/sys/arch/i386/stand/lib/biosdisk.h:1.10 --- src/sys/arch/i386/stand/lib/biosdisk.h:1.9 Thu Mar 8 10:34:33 2018 +++ src/sys/arch/i386/stand/lib/biosdisk.h Mon Apr 2 09:44:18 2018 @@ -1,4 +1,4 @@ -/* $NetBSD: biosdisk.h,v 1.9 2018/03/08 10:34:33 nonaka Exp $ */ +/* $NetBSD: biosdisk.h,v 1.10 2018/04/02 09:44:18 nonaka Exp $ */ /* * Copyright (c) 1996 @@ -44,3 +44,9 @@ int biosdisk_close(struct open_file *); int biosdisk_ioctl(struct open_file *, u_long, void *); int biosdisk_findpartition(int, daddr_t); int biosdisk_readpartition(int, struct biosdisk_partition **, int *); + +#if !defined(NO_GPT) +struct uuid; +bool guid_is_nil(const struct uuid *); +bool guid_is_equal(const struct uuid *, const struct uuid *); +#endif Index: src/sys/arch/i386/stand/lib/bootmenu.c diff -u src/sys/arch/i386/stand/lib/bootmenu.c:1.16 src/sys/arch/i386/stand/lib/bootmenu.c:1.17 --- src/sys/arch/i386/stand/lib/bootmenu.c:1.16 Sat Jun 11 06:20:11 2016 +++ src/sys/arch/i386/stand/lib/bootmenu.c Mon Apr 2 09:44:18 2018 @@ -1,4 +1,4 @@ -/* $NetBSD: bootmenu.c,v 1.16 2016/06/11 06:20:11 dholland Exp $ */ +/* $NetBSD: bootmenu.c,v 1.17 2018/04/02 09:44:18 nonaka Exp $ */ /*- * Copyright (c) 2008 The NetBSD Foundation, Inc. @@ -63,10 +63,10 @@ do_bootcfg_command(const char *cmd, char userconf_add(arg); } -void +int parsebootconf(const char *conf) { - perform_bootcfg(conf, &do_bootcfg_command, 32768); + return perform_bootcfg(conf, &do_bootcfg_command, 32768); } /* Index: src/sys/arch/i386/stand/lib/bootmenu.h diff -u src/sys/arch/i386/stand/lib/bootmenu.h:1.5 src/sys/arch/i386/stand/lib/bootmenu.h:1.6 --- src/sys/arch/i386/stand/lib/bootmenu.h:1.5 Sun Aug 10 07:40:49 2014 +++ src/sys/arch/i386/stand/lib/bootmenu.h Mon Apr 2 09:44:18 2018 @@ -1,4 +1,4 @@ -/* $NetBSD: bootmenu.h,v 1.5 2014/08/10 07:40:49 isaki Exp $ */ +/* $NetBSD: bootmenu.h,v 1.6 2018/04/02 09:44:18 nonaka Exp $ */ /*- * Copyright (c) 2008 The NetBSD Foundation, Inc. @@ -31,7 +31,7 @@ #define COMMAND_SEPARATOR ';' -void parsebootconf(const char *); +int parsebootconf(const char *); void doboottypemenu(void); void bootdefault(void); Index: src/sys/lib/libsa/bootcfg.c diff -u src/sys/lib/libsa/bootcfg.c:1.2 src/sys/lib/libsa/bootcfg.c:1.3 --- src/sys/lib/libsa/bootcfg.c:1.2 Sun Aug 10 07:40:49 2014 +++ src/sys/lib/libsa/bootcfg.c Mon Apr 2 09:44:19 2018 @@ -1,4 +1,4 @@ -/* $NetBSD: bootcfg.c,v 1.2 2014/08/10 07:40:49 isaki Exp $ */ +/* $NetBSD: bootcfg.c,v 1.3 2018/04/02 09:44:19 nonaka Exp $ */ /*- * Copyright (c) 2008 The NetBSD Foundation, Inc. @@ -94,7 +94,7 @@ bootcfg_do_noop(const char *cmd, char *a * consdev=com0 * default=1 */ -void +int perform_bootcfg(const char *conf, bootcfg_command command, const off_t maxsz) { char *bc, *c; @@ -114,25 +114,25 @@ perform_bootcfg(const char *conf, bootcf fd = open(conf, 0); if (fd < 0) - return; + return ENOENT; err = fstat(fd, &st); if (err == -1) { close(fd); - return; + return EIO; } /* if a maximum size is being requested for the boot.cfg enforce it. */ if (0 < maxsz && st.st_size > maxsz) { close(fd); - return; + return EFBIG; } bc = alloc(st.st_size + 1); if (bc == NULL) { printf("Could not allocate memory for boot configuration\n"); close(fd); - return; + return ENOMEM; } /* @@ -269,4 +269,6 @@ perform_bootcfg(const char *conf, bootcf bootcfg_info.def = 0; if (bootcfg_info.def >= cmenu) bootcfg_info.def = cmenu - 1; + + return 0; } Index: src/sys/lib/libsa/bootcfg.h diff -u src/sys/lib/libsa/bootcfg.h:1.1 src/sys/lib/libsa/bootcfg.h:1.2 --- src/sys/lib/libsa/bootcfg.h:1.1 Sat Jun 28 09:16:18 2014 +++ src/sys/lib/libsa/bootcfg.h Mon Apr 2 09:44:19 2018 @@ -1,4 +1,4 @@ -/* $NetBSD: bootcfg.h,v 1.1 2014/06/28 09:16:18 rtr Exp $ */ +/* $NetBSD: bootcfg.h,v 1.2 2018/04/02 09:44:19 nonaka Exp $ */ /*- * Copyright (c) 2008 The NetBSD Foundation, Inc. @@ -50,7 +50,7 @@ struct bootcfg_def { int clear; /* Clear the screen? */ } extern bootcfg_info; -void perform_bootcfg(const char *, bootcfg_command, const off_t); +int perform_bootcfg(const char *, bootcfg_command, const off_t); void bootcfg_do_noop(const char *, char *); #endif /* !_BOOTCFG_H */