:: commit 712f4c02e6da3bbcf46997d752e50711c4349217

mintsuki <mintsuki@protonmail.com> — 2021-08-22 16:05

parents: 9a934eb683

disk: Remove redundant code used to get volume count

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 <mm/pmm.h>
 #include <sys/cpu.h>
 
+#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;
 
tab: 248 wrap: offon