svn commit: r323131 - head/sys/boot/efi/boot1
Warner Losh
imp at FreeBSD.org
Sat Sep 2 18:18:50 UTC 2017
Author: imp
Date: Sat Sep 2 18:18:49 2017
New Revision: 323131
URL: https://svnweb.freebsd.org/changeset/base/323131
Log:
Revert r322941: Eliminate redundant device matching functions
Turns out, they are subtly different. I'll refactor anew in the future
if it's worth it then.
Sponsored by: Netflix
Reported by: Tomoaki AOKI-san
Modified:
head/sys/boot/efi/boot1/boot1.c
Modified: head/sys/boot/efi/boot1/boot1.c
==============================================================================
--- head/sys/boot/efi/boot1/boot1.c Sat Sep 2 17:16:28 2017 (r323130)
+++ head/sys/boot/efi/boot1/boot1.c Sat Sep 2 18:18:49 2017 (r323131)
@@ -109,6 +109,53 @@ efi_setenv_freebsd_wcs(const char *varname, CHAR16 *va
}
/*
+ * 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);
+}
+
+/*
* devpath_last returns the last non-path end node in devpath.
*/
static EFI_DEVICE_PATH *
@@ -304,7 +351,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++) {
More information about the svn-src-head
mailing list