:: commit 351031e21220c36c370d64fbe4d92f250ce0988c

mintsuki <mintsuki@protonmail.com> — 2022-01-14 01:04

parents: c842fc650f

disk: UEFI related adjustments

diff --git a/stage23/drivers/disk.s2.c b/stage23/drivers/disk.s2.c
index dbbdaf04..4ddd70c9 100644
--- a/stage23/drivers/disk.s2.c
+++ b/stage23/drivers/disk.s2.c
@@ -217,7 +217,7 @@ int disk_read_sectors(struct volume *volume, void *buf, uint64_t block, size_t c
     }
 }
 
-static alignas(4096) uint8_t unique_sector_pool[8192];
+static alignas(4096) uint8_t unique_sector_pool[4096];
 
 struct volume *disk_volume_from_efi_handle(EFI_HANDLE efi_handle) {
     EFI_STATUS status;
@@ -235,17 +235,21 @@ struct volume *disk_volume_from_efi_handle(EFI_HANDLE efi_handle) {
             continue;
         }
 
-        size_t unique_sector = (volume_index[i]->unique_sector * volume_index[i]->sector_size) / block_io->Media->BlockSize;
+        if (volume_index[i]->unique_sector % block_io->Media->BlockSize) {
+            continue;
+        }
+
+        size_t unique_sector = volume_index[i]->unique_sector / block_io->Media->BlockSize;
 
         status = block_io->ReadBlocks(block_io, block_io->Media->MediaId,
                                       unique_sector,
-                                      volume_index[i]->sector_size,
+                                      4096,
                                       unique_sector_pool);
         if (status != 0) {
             continue;
         }
 
-        uint32_t crc32 = get_crc32(unique_sector_pool, volume_index[i]->sector_size);
+        uint32_t crc32 = get_crc32(unique_sector_pool, 4096);
 
         if (crc32 == volume_index[i]->unique_sector_crc32) {
             return volume_index[i];
@@ -320,7 +324,7 @@ struct volume *disk_volume_from_efi_handle(EFI_HANDLE efi_handle) {
     return NULL;
 }
 
-static struct volume *volume_by_unique_sector(size_t sect, uint32_t crc32) {
+static struct volume *volume_by_unique_sector(uint64_t sect, uint32_t crc32) {
     for (size_t i = 0; i < volume_index_i; i++) {
         if (volume_index[i]->unique_sector_valid == false) {
             continue;
@@ -342,27 +346,29 @@ static void find_unique_sectors(void) {
 
     for (size_t i = 0; i < volume_index_i; i++) {
         for (size_t j = 0; j < UNIQUE_SECT_MAX_SEARCH_RANGE; j++) {
-            if (volume_index[i]->first_sect % (volume_index[i]->sector_size / 512)) {
+            if ((volume_index[i]->first_sect * 512) % volume_index[i]->block_io->Media->BlockSize) {
                 break;
             }
 
-            size_t first_sect = volume_index[i]->first_sect / (volume_index[i]->sector_size / 512);
+            size_t first_sect = (volume_index[i]->first_sect * 512) / volume_index[i]->block_io->Media->BlockSize;
 
             status = volume_index[i]->block_io->ReadBlocks(
                                 volume_index[i]->block_io,
                                 volume_index[i]->block_io->Media->MediaId,
                                 first_sect + j,
-                                volume_index[i]->sector_size,
+                                4096,
                                 unique_sector_pool);
             if (status != 0) {
                 break;
             }
 
-            uint32_t crc32 = get_crc32(unique_sector_pool, volume_index[i]->sector_size);
+            uint32_t crc32 = get_crc32(unique_sector_pool, 4096);
+
+            uint64_t uniq = (uint64_t)j * volume_index[i]->block_io->Media->BlockSize;
 
-            if (volume_by_unique_sector(j, crc32) == NULL) {
+            if (volume_by_unique_sector(uniq, crc32) == NULL) {
                 volume_index[i]->unique_sector_valid = true;
-                volume_index[i]->unique_sector = j;
+                volume_index[i]->unique_sector = uniq;
                 volume_index[i]->unique_sector_crc32 = crc32;
                 break;
             }
diff --git a/stage23/lib/part.h b/stage23/lib/part.h
index 398e9d86..fc8849a0 100644
--- a/stage23/lib/part.h
+++ b/stage23/lib/part.h
@@ -20,7 +20,7 @@ struct volume {
     EFI_BLOCK_IO *block_io;
 
     bool unique_sector_valid;
-    size_t unique_sector;
+    uint64_t unique_sector;
     uint32_t unique_sector_crc32;
 #elif bios == 1
     int drive;
tab: 248 wrap: offon