:: commit 605623bd05578ff730c956d7053ab53a2a8e067f

mintsuki <mintsuki@protonmail.com> — 2021-08-25 23:33

parents: 57c44befee

disk: Improve algorithm to determine fastest transfer size

diff --git a/stage23/drivers/disk.s2.c b/stage23/drivers/disk.s2.c
index ebcc9788..bd53a30f 100644
--- a/stage23/drivers/disk.s2.c
+++ b/stage23/drivers/disk.s2.c
@@ -59,23 +59,24 @@ static size_t fastest_xfer_size(struct volume *volume) {
         dap.offset  = rm_off(xfer_buf);
         dap.lba     = 0;
 
-        struct rm_regs r = {0};
-        r.eax = 0x4200;
-        r.edx = volume->drive;
-        r.esi = (uint32_t)rm_off(&dap);
-        r.ds  = rm_seg(&dap);
-
         uint64_t start_timestamp = rdtsc();
-        rm_int(0x13, &r, &r);
-        uint64_t end_timestamp = rdtsc();
-
-        if (r.eflags & EFLAGS_CF) {
-            int ah = (r.eax >> 8) & 0xff;
-            printv("Disk error %x. Drive %x", ah, volume->drive);
-            continue;
+        for (size_t j = 0; j < XFER_BUF_SIZE / 512; j += xfer_sizes[i]) {
+            struct rm_regs r = {0};
+            r.eax = 0x4200;
+            r.edx = volume->drive;
+            r.esi = (uint32_t)rm_off(&dap);
+            r.ds  = rm_seg(&dap);
+            rm_int(0x13, &r, &r);
+            if (r.eflags & EFLAGS_CF) {
+                int ah = (r.eax >> 8) & 0xff;
+                printv("Disk error %x. Drive %x", ah, volume->drive);
+                return 8;
+            }
+            dap.lba += xfer_sizes[i];
         }
+        uint64_t end_timestamp = rdtsc();
 
-        uint64_t speed = (end_timestamp - start_timestamp) / xfer_sizes[i];
+        uint64_t speed = end_timestamp - start_timestamp;
 
         if (speed < last_speed) {
             last_speed = speed;
tab: 248 wrap: offon