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.
This commit is contained in:
parent
6b6e2954dd
commit
4cf36aa101
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=347193
@ -25,7 +25,7 @@ CWARNFLAGS.zfs_module.c += -Wno-unused-parameter
|
||||
CWARNFLAGS.zfs_module.c += -Wno-unused-function
|
||||
|
||||
# architecture-specific loader code
|
||||
SRCS+= boot1.c self_reloc.c start.S ufs_module.c
|
||||
SRCS+= boot1.c self_reloc.c start.S ufs_module.c devpath.c
|
||||
.if ${MK_LOADER_ZFS} != "no"
|
||||
SRCS+= zfs_module.c
|
||||
CFLAGS.zfs_module.c+= -I${ZFSSRC}
|
||||
@ -50,6 +50,7 @@ CFLAGS+= -DEFI_DEBUG
|
||||
.PATH: ${EFISRC}/loader/arch/${MACHINE}
|
||||
.PATH: ${EFISRC}/loader
|
||||
.PATH: ${LDRSRC}
|
||||
.PATH: ${EFISRC}/libefi
|
||||
CFLAGS+= -I${LDRSRC}
|
||||
|
||||
FILES= ${BOOT1}.efi ${BOOT1}.efifat
|
||||
|
@ -78,66 +78,6 @@ Free(void *buf, const char *file __unused, int line __unused)
|
||||
(void)BS->FreePool(buf);
|
||||
}
|
||||
|
||||
/*
|
||||
* 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 *
|
||||
devpath_last(EFI_DEVICE_PATH *devpath)
|
||||
{
|
||||
|
||||
while (!IsDevicePathEnd(NextDevicePathNode(devpath)))
|
||||
devpath = NextDevicePathNode(devpath);
|
||||
|
||||
return (devpath);
|
||||
}
|
||||
|
||||
/*
|
||||
* load_loader attempts to load the loader image data.
|
||||
*
|
||||
@ -225,7 +165,7 @@ try_boot(void)
|
||||
buf = NULL;
|
||||
}
|
||||
|
||||
if ((status = BS->LoadImage(TRUE, IH, devpath_last(dev->devpath),
|
||||
if ((status = BS->LoadImage(TRUE, IH, efi_devpath_last_node(dev->devpath),
|
||||
loaderbuf, loadersize, &loaderhandle)) != EFI_SUCCESS) {
|
||||
printf("Failed to load image provided by %s, size: %zu, (%lu)\n",
|
||||
mod->name, loadersize, EFI_ERROR_CODE(status));
|
||||
@ -321,7 +261,7 @@ probe_handle(EFI_HANDLE h, EFI_DEVICE_PATH *imgpath, BOOLEAN *preferred)
|
||||
if (!blkio->Media->LogicalPartition)
|
||||
return (EFI_UNSUPPORTED);
|
||||
|
||||
*preferred = device_paths_match(imgpath, devpath);
|
||||
*preferred = efi_devpath_match(imgpath, devpath);
|
||||
|
||||
/* Run through each module, see if it can load this partition */
|
||||
for (i = 0; i < NUM_BOOT_MODULES; i++) {
|
||||
|
Loading…
Reference in New Issue
Block a user