diff --git a/stage23/drivers/disk.s2.c b/stage23/drivers/disk.s2.c index 4a199385..b1ab82a7 100644 --- a/stage23/drivers/disk.s2.c +++ b/stage23/drivers/disk.s2.c @@ -12,6 +12,8 @@ #include #include +#define MAX_VOLUMES 64 + #if bios == 1 struct bios_drive_params { @@ -124,64 +126,16 @@ bool disk_read_sectors(struct volume *volume, void *buf, uint64_t block, size_t } void disk_create_index(void) { - size_t volume_count = 0; - - for (uint8_t drive = 0x80; drive < 0xf0; drive++) { - struct rm_regs r = {0}; - struct bios_drive_params drive_params; - - r.eax = 0x4800; - r.edx = drive; - r.ds = rm_seg(&drive_params); - r.esi = rm_off(&drive_params); - - drive_params.buf_size = sizeof(struct bios_drive_params); - - rm_int(0x13, &r, &r); - - if (r.eflags & EFLAGS_CF) - continue; - - if (drive_params.lba_count == 0 || drive_params.bytes_per_sect == 0) - continue; - - struct volume block = {0}; - - block.drive = drive; - block.sector_size = drive_params.bytes_per_sect; - block.first_sect = 0; - block.sect_count = drive_params.lba_count; - - if (drive_params.info_flags & (1 << 2)) { - // The medium could not be present (e.g.: CD-ROMs) - // Do a test run to see if we can actually read it - if (!disk_read_sectors(&block, NULL, 0, 1)) { - continue; - } - } - - block.fastest_xfer_size = 8; - - volume_count++; - - for (int part = 0; ; part++) { - struct volume p = {0}; - int ret = part_get(&p, &block, part); - - if (ret == END_OF_TABLE || ret == INVALID_TABLE) - break; - if (ret == NO_PARTITION) - continue; - - volume_count++; - } - } - - volume_index = ext_mem_alloc(sizeof(struct volume) * volume_count); + volume_index = ext_mem_alloc(sizeof(struct volume) * MAX_VOLUMES); int optical_indices = 1, hdd_indices = 1; for (uint8_t drive = 0x80; drive < 0xf0; drive++) { + if (volume_index_i == MAX_VOLUMES) { + print("WARNING: TOO MANY VOLUMES!"); + break; + } + struct rm_regs r = {0}; struct bios_drive_params drive_params; @@ -339,8 +293,6 @@ bool disk_read_sectors(struct volume *volume, void *buf, uint64_t block, size_t void disk_create_index(void) { EFI_STATUS status; - size_t volume_count = 0; - EFI_GUID block_io_guid = BLOCK_IO_PROTOCOL; EFI_HANDLE *handles = NULL; UINTN handles_size = 0; @@ -353,47 +305,16 @@ void disk_create_index(void) { uefi_call_wrapper(gBS->LocateHandle, 5, ByProtocol, &block_io_guid, NULL, &handles_size, handles); - for (size_t i = 0; i < handles_size / sizeof(EFI_HANDLE); i++) { - struct volume block = {0}; - - EFI_BLOCK_IO *block_io = NULL; - - status = uefi_call_wrapper(gBS->HandleProtocol, 3, handles[i], - &block_io_guid, (void **)&block_io); - - if (status != 0 || block_io == NULL || block_io->Media->LastBlock == 0) - continue; - - if (block_io->Media->LogicalPartition) - continue; - - volume_count++; - - block.efi_handle = handles[i]; - block.sector_size = block_io->Media->BlockSize; - block.first_sect = 0; - block.sect_count = block_io->Media->LastBlock + 1; - - block.fastest_xfer_size = 8; - - for (int part = 0; ; part++) { - struct volume trash = {0}; - int ret = part_get(&trash, &block, part); - - if (ret == END_OF_TABLE || ret == INVALID_TABLE) - break; - if (ret == NO_PARTITION) - continue; - - volume_count++; - } - } - - volume_index = ext_mem_alloc(sizeof(struct volume) * volume_count); + volume_index = ext_mem_alloc(sizeof(struct volume) * MAX_VOLUMES); int optical_indices = 1, hdd_indices = 1; for (size_t i = 0; i < handles_size / sizeof(EFI_HANDLE); i++) { + if (volume_index_i == MAX_VOLUMES) { + print("WARNING: TOO MANY VOLUMES!"); + break; + } + EFI_GUID disk_io_guid = DISK_IO_PROTOCOL; EFI_DISK_IO *disk_io = NULL;