Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 4 Jun 2019 21:28:31 +0900
From:      Tomoaki AOKI <junchoon@dec.sakura.ne.jp>
To:        freebsd-current@freebsd.org
Cc:        johalun@FreeBSD.org, imp@FreeBSD.org
Subject:   Re: UEFI boot broken in 13?
Message-ID:  <20190604212831.360fd1a0c34c9f329e3084fc@dec.sakura.ne.jp>
In-Reply-To: <71a0c9f7-0b1f-3757-fc04-4c0d0a1e1085@FreeBSD.org>
References:  <71a0c9f7-0b1f-3757-fc04-4c0d0a1e1085@FreeBSD.org>

next in thread | previous in thread | raw e-mail | index | archive | help
This is a multi-part message in MIME format.

--Multipart=_Tue__4_Jun_2019_21_28_31_+0900_MxCTCUDeohEuf_Wy
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: 7bit

Hi.

Try attached patch for stand/efi/boot1/boot1.c.
This partially reverts r347193 and works at least for me.

Without this, boot1.efi (bootx64.efi) forcibly boot from
first physical HDD/SSD, even if forcibly booted from other
physical drive via BIOS (UEFI firmware) menu.

Remaining parts of r347193 and following some commits does not
affect.

 *Hand-crafted reverse patch from commit mail [1].
  Reverting whole r347193 is fine, too.

[1]
https://lists.freebsd.org/pipermail/svn-src-head/2019-May/124677.html


On Mon, 3 Jun 2019 18:38:47 -0700 Johannes Lundberg
<johalun@FreeBSD.org> wrote:

> Hi
> 
> I'm using poudriere-image to create usb memstick images. The images are
> identical except OS version. They are tested on a laptop with 13-CURRENT
> installed as only OS, having UEFI boot and root on zfs.
> 
> 12-STABLE memstick boots fine with in UEFI mode.
> 
> With 13-CURRENT memstick it boots the installed FreeBSD from the SSD
> instead (I choose USB UEFI OS in boot menu but it silently boots from
> the SSD instead). If I switch to legacy boot, the memstick image boots fine.
> 
> Any ideas?
> 
> /Johannes
> 
> 
> _______________________________________________
> freebsd-current@freebsd.org mailing list
> https://lists.freebsd.org/mailman/listinfo/freebsd-current
> To unsubscribe, send any mail to "freebsd-current-unsubscribe@freebsd.org"


-- 
Tomoaki AOKI    <junchoon@dec.sakura.ne.jp>

--Multipart=_Tue__4_Jun_2019_21_28_31_+0900_MxCTCUDeohEuf_Wy
Content-Type: text/x-diff;
 name="REV_r347193-2_Reach_over_and_pull_in_devpath.c_from_libefi-stand_efi_boot1_boot1.c.diff"
Content-Disposition: attachment;
 filename="REV_r347193-2_Reach_over_and_pull_in_devpath.c_from_libefi-stand_efi_boot1_boot1.c.diff"
Content-Transfer-Encoding: 7bit

Author: imp
Date: Mon May  6 18:38:46 2019
New Revision: 347193
URL: https://svnweb.freebsd.org/changeset/base/347193

Log:
  Reach over and pull in devpath.c from libefi
  
  This allows us to remove three nearly identical functions because the
  differences don't matter, and the size difference is trivial.

Modified:
  head/stand/efi/boot1/Makefile
  head/stand/efi/boot1/boot1.c

Modified: head/stand/efi/boot1/boot1.c
==============================================================================
--- head/stand/efi/boot1/boot1.c	Mon May  6 18:24:07 2019	(r347192)
+++ head/stand/efi/boot1/boot1.c	Mon May  6 18:38:46 2019	(r347193)
@@ -79,6 +79,53 @@ Free(void *buf, const char *file __unused, int line __
 }
 
 /*
+ * nodes_match returns TRUE if the imgpath isn't NULL and the nodes match,
+ * FALSE otherwise.
+ */
+static BOOLEAN
+nodes_match(EFI_DEVICE_PATH *imgpath, EFI_DEVICE_PATH *devpath)
+{
+	size_t len;
+
+	if (imgpath == NULL || imgpath->Type != devpath->Type ||
+	    imgpath->SubType != devpath->SubType)
+		return (FALSE);
+
+	len = DevicePathNodeLength(imgpath);
+	if (len != DevicePathNodeLength(devpath))
+		return (FALSE);
+
+	return (memcmp(imgpath, devpath, (size_t)len) == 0);
+}
+
+/*
+ * device_paths_match returns TRUE if the imgpath isn't NULL and all nodes
+ * in imgpath and devpath match up to their respective occurrences of a
+ * media node, FALSE otherwise.
+ */
+static BOOLEAN
+device_paths_match(EFI_DEVICE_PATH *imgpath, EFI_DEVICE_PATH *devpath)
+{
+
+	if (imgpath == NULL)
+		return (FALSE);
+
+	while (!IsDevicePathEnd(imgpath) && !IsDevicePathEnd(devpath)) {
+		if (IsDevicePathType(imgpath, MEDIA_DEVICE_PATH) &&
+		    IsDevicePathType(devpath, MEDIA_DEVICE_PATH))
+			return (TRUE);
+
+		if (!nodes_match(imgpath, devpath))
+			return (FALSE);
+
+		imgpath = NextDevicePathNode(imgpath);
+		devpath = NextDevicePathNode(devpath);
+	}
+
+	return (FALSE);
+}
+
+/*
  * load_loader attempts to load the loader image data.
  *
  * It tries each module and its respective devices, identified by mod->probe,
@@ -261,7 +308,7 @@ probe_handle(EFI_HANDLE h, EFI_DEVICE_PATH *imgpath, B
 	if (!blkio->Media->LogicalPartition)
 		return (EFI_UNSUPPORTED);
 
-	*preferred = efi_devpath_match(imgpath, devpath);
+	*preferred = device_paths_match(imgpath, devpath);
 
 	/* Run through each module, see if it can load this partition */
 	for (i = 0; i < NUM_BOOT_MODULES; i++) {
--Multipart=_Tue__4_Jun_2019_21_28_31_+0900_MxCTCUDeohEuf_Wy--



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20190604212831.360fd1a0c34c9f329e3084fc>