Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F152945575
D13026.id35404.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
4 KB
Referenced Files
None
Subscribers
None
D13026.id35404.diff
View Options
Index: stand/efi/libefi/efipart.c
===================================================================
--- stand/efi/libefi/efipart.c
+++ stand/efi/libefi/efipart.c
@@ -196,6 +196,72 @@
}
/*
+ * Determine if the provided device path is hdd.
+ *
+ * There really is no simple fool proof way to classify the devices.
+ * Since we do build three lists of devices - floppy, cd and hdd, we
+ * will try to see if the device is floppy or cd, and list anything else
+ * as hdd.
+ */
+static bool
+efipart_hdd(EFI_DEVICE_PATH *dp)
+{
+ unsigned i, nin;
+ EFI_DEVICE_PATH *devpath, *node;
+ EFI_BLOCK_IO *blkio;
+ EFI_STATUS status;
+
+ if (dp == NULL)
+ return (false);
+
+ if ((node = efi_devpath_last_node(dp)) == NULL)
+ return (false);
+
+ if (efipart_floppy(node) != NULL)
+ return (false);
+
+ /*
+ * Test every EFI BLOCK IO handle to make sure dp is not device path
+ * for CD/DVD.
+ */
+ nin = efipart_nhandles / sizeof (*efipart_handles);
+ for (i = 0; i < nin; i++) {
+ devpath = efi_lookup_devpath(efipart_handles[i]);
+ if (devpath == NULL)
+ return (false);
+
+ /* Only continue testing when dp is prefix in devpath. */
+ if (!efi_devpath_is_prefix(dp, devpath))
+ continue;
+
+ /*
+ * The device path has to have last node describing the
+ * device, or we can not test the type.
+ */
+ if ((node = efi_devpath_last_node(devpath)) == NULL)
+ return (false);
+
+ if (DevicePathType(node) == MEDIA_DEVICE_PATH &&
+ DevicePathSubType(node) == MEDIA_CDROM_DP) {
+ return (false);
+ }
+
+ /* Make sure we do have the media. */
+ status = BS->HandleProtocol(efipart_handles[i],
+ &blkio_guid, (void **)&blkio);
+ if (EFI_ERROR(status))
+ return (false);
+
+ /* USB or SATA cd without the media. */
+ if (blkio->Media->RemovableMedia &&
+ !blkio->Media->MediaPresent) {
+ return (false);
+ }
+ }
+ return (true);
+}
+
+/*
* Add or update entries with new handle data.
*/
static int
@@ -308,9 +374,13 @@
if ((node = efi_devpath_last_node(devpath)) == NULL)
continue;
+
if (efipart_floppy(node) != NULL)
continue;
+ if (efipart_hdd(devpath))
+ continue;
+
status = BS->HandleProtocol(efipart_handles[i],
&blkio_guid, (void **)&blkio);
if (EFI_ERROR(status))
@@ -380,13 +450,21 @@
pdinfo_t *hd, *pd, *last;
disk_devpath = efi_lookup_devpath(disk_handle);
- part_devpath = efi_lookup_devpath(part_handle);
- if (disk_devpath == NULL || part_devpath == NULL) {
+ if (disk_devpath == NULL)
return (ENOENT);
+
+ if (part_handle != NULL) {
+ part_devpath = efi_lookup_devpath(part_handle);
+ if (part_devpath == NULL)
+ return (ENOENT);
+ node = (HARDDRIVE_DEVICE_PATH *)
+ efi_devpath_last_node(part_devpath);
+ if (node == NULL)
+ return (ENOENT); /* This should not happen. */
+ } else {
+ part_devpath = NULL;
+ node = NULL;
}
- node = (HARDDRIVE_DEVICE_PATH *)efi_devpath_last_node(part_devpath);
- if (node == NULL)
- return (ENOENT); /* This should not happen. */
pd = calloc(1, sizeof(pdinfo_t));
if (pd == NULL) {
@@ -397,6 +475,9 @@
STAILQ_FOREACH(hd, &hdinfo, pd_link) {
if (efi_devpath_match(hd->pd_devpath, disk_devpath) == true) {
+ if (part_devpath == NULL)
+ return (0);
+
/* Add the partition. */
pd->pd_handle = part_handle;
pd->pd_unit = node->PartitionNumber;
@@ -419,6 +500,9 @@
hd->pd_devpath = disk_devpath;
STAILQ_INSERT_TAIL(&hdinfo, hd, pd_link);
+ if (part_devpath == NULL)
+ return (0);
+
pd = calloc(1, sizeof(pdinfo_t));
if (pd == NULL) {
printf("Failed to add partition, out of memory\n");
@@ -541,7 +625,8 @@
if ((node = efi_devpath_last_node(devpath)) == NULL)
continue;
- if (efipart_floppy(node) != NULL)
+
+ if (!efipart_hdd(devpath))
continue;
status = BS->HandleProtocol(efipart_handles[i],
@@ -550,6 +635,12 @@
continue;
if (DevicePathType(node) == MEDIA_DEVICE_PATH &&
+ DevicePathSubType(node) == MEDIA_FILEPATH_DP) {
+ efipart_hdinfo_add_filepath(efipart_handles[i]);
+ continue;
+ }
+
+ if (DevicePathType(node) == MEDIA_DEVICE_PATH &&
DevicePathSubType(node) == MEDIA_HARDDRIVE_DP) {
devpathcpy = efi_devpath_trim(devpath);
if (devpathcpy == NULL)
@@ -568,18 +659,16 @@
continue;
if ((node = efi_devpath_last_node(devpathcpy)) == NULL)
continue;
+
if (DevicePathType(node) == MEDIA_DEVICE_PATH &&
DevicePathSubType(node) == MEDIA_HARDDRIVE_DP)
continue;
+
efipart_hdinfo_add(handle, efipart_handles[i]);
continue;
}
- if (DevicePathType(node) == MEDIA_DEVICE_PATH &&
- DevicePathSubType(node) == MEDIA_FILEPATH_DP) {
- efipart_hdinfo_add_filepath(efipart_handles[i]);
- continue;
- }
+ efipart_hdinfo_add(efipart_handles[i], NULL);
}
}
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Sun, Apr 19, 6:09 AM (5 h, 30 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
31750174
Default Alt Text
D13026.id35404.diff (4 KB)
Attached To
Mode
D13026: loader.efi: efipart does not recognize partitionless disks
Attached
Detach File
Event Timeline
Log In to Comment