drivers/disk: Skip EFI handles with VenHw(7CCE9C94-983F-4D0A-8143-B6C05545B223)

See https://github.com/limine-bootloader/limine/issues/521#issuecomment-3160168795
This commit is contained in:
Mintsuki
2025-10-29 00:01:44 +01:00
parent 17f3b890c0
commit 42e5fb9ded

View File

@@ -408,6 +408,47 @@ static struct volume *volume_by_unique_sector(void *b2b) {
return NULL;
}
static bool is_efi_handle_to_skip(EFI_HANDLE efi_handle) {
EFI_STATUS status;
EFI_GUID dp_guid = EFI_DEVICE_PATH_PROTOCOL_GUID;
EFI_DEVICE_PATH_PROTOCOL *dp = NULL;
EFI_GUID guids_to_skip[] = {
// skip 7CCE9C94-983F-4D0A-8143-B6C05545B223 since it is apparently used by exposed
// ROM devices that we do not want to touch
// (see https://github.com/limine-bootloader/limine/issues/521#issuecomment-3160168795)
{0x7CCE9C94, 0x983F, 0x4D0A, {0x81, 0x43, 0xB6, 0xC0, 0x55, 0x45, 0xB2, 0x23}},
};
status = gBS->HandleProtocol(efi_handle, &dp_guid, (void **)&dp);
if (status) {
return false;
}
for (;; dp = (void *)dp + *(uint16_t *)dp->Length) {
if (dp->Type == END_DEVICE_PATH_TYPE && dp->SubType == END_ENTIRE_DEVICE_PATH_SUBTYPE) {
break;
}
if (dp->Type != HARDWARE_DEVICE_PATH) {
continue;
}
if (dp->SubType == HW_VENDOR_DP) {
EFI_GUID *vendor_guid = (void *)dp + sizeof(EFI_DEVICE_PATH_PROTOCOL);
for (size_t i = 0; i < SIZEOF_ARRAY(guids_to_skip); i++) {
if (memcmp(vendor_guid, &guids_to_skip[i], sizeof(EFI_GUID)) == 0) {
return true;
}
}
}
}
return false;
}
static bool is_efi_handle_hdd(EFI_HANDLE efi_handle) {
EFI_STATUS status;
@@ -445,6 +486,10 @@ struct volume *disk_volume_from_efi_handle(EFI_HANDLE efi_handle) {
EFI_GUID block_io_guid = BLOCK_IO_PROTOCOL;
EFI_BLOCK_IO *block_io = NULL;
if (is_efi_handle_to_skip(efi_handle)) {
return NULL;
}
status = gBS->HandleProtocol(efi_handle, &block_io_guid, (void **)&block_io);
if (status) {
return pxe_from_efi_handle(efi_handle);
@@ -655,6 +700,10 @@ fail:
for (size_t i = 0; i < handle_count; i++) {
EFI_BLOCK_IO *drive = NULL;
if (is_efi_handle_to_skip(handles[i])) {
continue;
}
status = gBS->HandleProtocol(handles[i], &block_io_guid, (void **)&drive);
if (status != 0 || drive == NULL || drive->Media->LastBlock == 0)