/* Name the devices. */ static void name_devices (struct grub_efidisk_data *devices) { struct grub_efidisk_data *d; /* First, identify devices by media device paths. */ for (d = devices; d; d = d->next) { grub_efi_device_path_t *dp; dp = d->last_device_path; if (! dp) continue; if (GRUB_EFI_DEVICE_PATH_TYPE (dp) == GRUB_EFI_MEDIA_DEVICE_PATH_TYPE) { int is_hard_drive = 0; switch (GRUB_EFI_DEVICE_PATH_SUBTYPE (dp)) { case GRUB_EFI_HARD_DRIVE_DEVICE_PATH_SUBTYPE: is_hard_drive = 1; /* Fall through by intention. */ case GRUB_EFI_CDROM_DEVICE_PATH_SUBTYPE: { struct grub_efidisk_data *parent, *parent2; parent = find_parent_device (devices, d); if (!parent) { #ifdef DEBUG_NAMES grub_printf ("skipping orphaned partition: "); grub_efi_print_device_path (d->device_path); #endif break; } parent2 = find_parent_device (devices, parent); if (parent2) { #ifdef DEBUG_NAMES grub_printf ("skipping subpartition: "); grub_efi_print_device_path (d->device_path); #endif /* Mark itself as used. */ d->last_device_path = 0; break; } if (!parent->last_device_path) { d->last_device_path = 0; break; } if (is_hard_drive) { #ifdef DEBUG_NAMES grub_printf ("adding a hard drive by a partition: "); grub_efi_print_device_path (parent->device_path); #endif add_device (&hd_devices, parent); } else { #ifdef DEBUG_NAMES grub_printf ("adding a cdrom by a partition: "); grub_efi_print_device_path (parent->device_path); #endif add_device (&cd_devices, parent); } /* Mark the parent as used. */ parent->last_device_path = 0; } /* Mark itself as used. */ d->last_device_path = 0; break; default: #ifdef DEBUG_NAMES grub_printf ("skipping other type: "); grub_efi_print_device_path (d->device_path); #endif /* For now, ignore the others. */ break; } } else { #ifdef DEBUG_NAMES grub_printf ("skipping non-media: "); grub_efi_print_device_path (d->device_path); #endif } } /* Let's see what can be added more. */ for (d = devices; d; d = d->next) { grub_efi_device_path_t *dp; grub_efi_block_io_media_t *m; int is_floppy = 0; dp = d->last_device_path; if (! dp) continue; m = d->block_io->media; if (GRUB_EFI_DEVICE_PATH_TYPE (dp) == GRUB_EFI_ACPI_DEVICE_PATH_TYPE && GRUB_EFI_DEVICE_PATH_SUBTYPE (dp) == GRUB_EFI_ACPI_DEVICE_PATH_SUBTYPE) { grub_efi_acpi_device_path_t *acpi = (grub_efi_acpi_device_path_t *) dp; /* Floppy EISA ID. */ if (acpi->hid == 0x60441d0 || acpi->hid == 0x70041d0 || acpi->hid == 0x70141d1) is_floppy = 1; } if (is_floppy) { #ifdef DEBUG_NAMES grub_printf ("adding a floppy: "); grub_efi_print_device_path (d->device_path); #endif add_device (&fd_devices, d); } else if (m->read_only && m->block_size > GRUB_DISK_SECTOR_SIZE) { /* This check is too heuristic, but assume that this is a CDROM drive. */ #ifdef DEBUG_NAMES grub_printf ("adding a cdrom by guessing: "); grub_efi_print_device_path (d->device_path); #endif add_device (&cd_devices, d); } else { /* The default is a hard drive. */ #ifdef DEBUG_NAMES grub_printf ("adding a hard drive by guessing: "); grub_efi_print_device_path (d->device_path); #endif add_device (&hd_devices, d); } } }
/* Name the devices. */ static void name_devices (struct grub_efidisk_data *devices) { struct grub_efidisk_data *d; /* First, identify devices by media device paths. */ for (d = devices; d; d = d->next) { grub_efi_device_path_t *dp; dp = d->last_device_path; if (! dp) continue; if (GRUB_EFI_DEVICE_PATH_TYPE (dp) == GRUB_EFI_MEDIA_DEVICE_PATH_TYPE) { int is_hard_drive = 0; switch (GRUB_EFI_DEVICE_PATH_SUBTYPE (dp)) { case GRUB_EFI_HARD_DRIVE_DEVICE_PATH_SUBTYPE: is_hard_drive = 1; /* Fall through by intention. */ case GRUB_EFI_CDROM_DEVICE_PATH_SUBTYPE: { struct grub_efidisk_data *parent; parent = find_parent_device (devices, d); if (parent) { if (is_hard_drive) { #if 0 grub_printf ("adding a hard drive by a partition: "); grub_print_device_path (parent->device_path); #endif add_device (&hd_devices, parent); } else { #if 0 grub_printf ("adding a cdrom by a partition: "); grub_print_device_path (parent->device_path); #endif add_device (&cd_devices, parent); } /* Mark the parent as used. */ parent->last_device_path = 0; } } /* Mark itself as used. */ d->last_device_path = 0; break; default: /* For now, ignore the others. */ break; } } } /* Let's see what can be added more. */ for (d = devices; d; d = d->next) { grub_efi_device_path_t *dp; grub_efi_block_io_media_t *m; dp = d->last_device_path; if (! dp) continue; m = d->block_io->media; if (m->logical_partition) { /* Only one partition in a non-media device. Assume that this is a floppy drive. */ #if 0 grub_printf ("adding a floppy by guessing: "); grub_print_device_path (d->device_path); #endif add_device (&fd_devices, d); } else if (m->read_only && m->block_size > GRUB_DISK_SECTOR_SIZE) { /* This check is too heuristic, but assume that this is a CDROM drive. */ #if 0 grub_printf ("adding a cdrom by guessing: "); grub_print_device_path (d->device_path); #endif add_device (&cd_devices, d); } else { /* The default is a hard drive. */ #if 0 grub_printf ("adding a hard drive by guessing: "); grub_print_device_path (d->device_path); #endif add_device (&hd_devices, d); } } }