:: commit ceb51518afe229ce77aaa272bcb6525deff1d23f

mintsuki <mintsuki@protonmail.com> — 2020-11-05 16:18

parents: 1ead86ef70

misc: Remove 512-byte sector assumptions from various places

diff --git a/limine-pxe.bin b/limine-pxe.bin
index 53b2b850..66287d00 100644
Binary files a/limine-pxe.bin and b/limine-pxe.bin differ
diff --git a/limine.bin b/limine.bin
index 3ff7b904..94aa765e 100644
Binary files a/limine.bin and b/limine.bin differ
diff --git a/stage2/drivers/disk.c b/stage2/drivers/disk.c
index 2df218ee..47568ea0 100644
--- a/stage2/drivers/disk.c
+++ b/stage2/drivers/disk.c
@@ -60,7 +60,7 @@ static int cache_block(int drive, uint64_t block, int sector_size) {
     return 0;
 }
 
-int disk_read(int drive, void *buffer, uint64_t loc, uint64_t count) {
+int disk_get_sector_size(int drive) {
     struct rm_regs r = {0};
     struct bios_drive_params drive_params;
 
@@ -78,7 +78,11 @@ int disk_read(int drive, void *buffer, uint64_t loc, uint64_t count) {
         panic("Disk error %x. Drive %x.\n", ah, drive);
     }
 
-    int sector_size = drive_params.bytes_per_sect;
+    return drive_params.bytes_per_sect;
+}
+
+int disk_read(int drive, void *buffer, uint64_t loc, uint64_t count) {
+    int sector_size = disk_get_sector_size(drive);
 
     uint64_t progress = 0;
     while (progress < count) {
diff --git a/stage2/drivers/disk.h b/stage2/drivers/disk.h
index 166264b2..eade9f5f 100644
--- a/stage2/drivers/disk.h
+++ b/stage2/drivers/disk.h
@@ -14,6 +14,7 @@ struct bios_drive_params {
     uint32_t edd;
 } __attribute__((packed));
 
+int disk_get_sector_size(int drive);
 int disk_read(int drive, void *buffer, uint64_t loc, uint64_t count);
 
 #endif
diff --git a/stage2/lib/part.c b/stage2/lib/part.c
index ef4083fb..a905919d 100644
--- a/stage2/lib/part.c
+++ b/stage2/lib/part.c
@@ -53,8 +53,10 @@ struct gpt_entry {
 static int gpt_get_part(struct part *ret, int drive, int partition) {
     struct gpt_table_header header = {0};
 
+    int sector_size = disk_get_sector_size(drive);
+
     // read header, located after the first block
-    disk_read(drive, &header, 512, sizeof(header));
+    disk_read(drive, &header, sector_size * 1, sizeof(header));
 
     // check the header
     // 'EFI PART'
@@ -69,17 +71,18 @@ static int gpt_get_part(struct part *ret, int drive, int partition) {
 
     struct gpt_entry entry = {0};
     disk_read(drive, &entry,
-         (header.partition_entry_lba * 512) + (partition * sizeof(entry)),
+         (header.partition_entry_lba * sector_size) + (partition * sizeof(entry)),
          sizeof(entry));
 
     struct guid empty_guid = {0};
     if (!memcmp(&entry.unique_partition_guid, &empty_guid, sizeof(struct guid)))
         return NO_PARTITION;
 
-    ret->drive      = drive;
-    ret->partition  = partition;
-    ret->first_sect = entry.starting_lba;
-    ret->sect_count = (entry.ending_lba - entry.starting_lba) + 1;
+    ret->drive       = drive;
+    ret->partition   = partition;
+    ret->sector_size = sector_size;
+    ret->first_sect  = entry.starting_lba;
+    ret->sect_count  = (entry.ending_lba - entry.starting_lba) + 1;
 
     struct guid guid;
     if (!fs_get_guid(&guid, ret)) {
@@ -124,10 +127,11 @@ static int mbr_get_part(struct part *ret, int drive, int partition) {
     if (entry.type == 0)
         return NO_PARTITION;
 
-    ret->drive      = drive;
-    ret->partition  = partition;
-    ret->first_sect = entry.first_sect;
-    ret->sect_count = entry.sect_count;
+    ret->drive       = drive;
+    ret->partition   = partition;
+    ret->sector_size = disk_get_sector_size(drive);
+    ret->first_sect  = entry.first_sect;
+    ret->sect_count  = entry.sect_count;
 
     struct guid guid;
     if (!fs_get_guid(&guid, ret)) {
@@ -217,5 +221,6 @@ bool part_get_by_guid(struct part *part, struct guid *guid) {
 }
 
 int part_read(struct part *part, void *buffer, uint64_t loc, uint64_t count) {
-    return disk_read(part->drive, buffer, loc + (part->first_sect * 512), count);
+    return disk_read(part->drive, buffer,
+                     loc + (part->first_sect * part->sector_size), count);
 }
diff --git a/stage2/lib/part.h b/stage2/lib/part.h
index cd31a7fc..c7848160 100644
--- a/stage2/lib/part.h
+++ b/stage2/lib/part.h
@@ -8,6 +8,7 @@
 struct part {
     int drive;
     int partition;
+    int sector_size;
     uint64_t first_sect;
     uint64_t sect_count;
     bool guid_valid;
tab: 248 wrap: offon