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 */

Reply via email to