wrong CHS limit check
PATCH 1/1 wrong CHS limit check
This patch fixes (I think) the grub_biosdisk_rw() CHS limit check, which as described in http://www.allensmith.net/Storage/HDDlimit/Int13h.htm is slightly below LBA-24, not LBA-32 as current code assumes.
Signature · 5 lines
Robert Millan <GPLv2> I know my rights; I want my phone call! <DRM> What use is a phone call… if you are unable to speak? (as seen on /.)
2008-03-21 Robert Millan <[email protected]>
* disk/i386/pc/biosdisk.c (grub_biosdisk_rw): Fix CHS limit check, as per http://www.allensmith.net/Storage/HDDlimit/Int13h.htm
disk/i386/pc/biosdisk.c +8 -6
@@ -237,15 +237,17 @@ grub_biosdisk_rw (int cmd, grub_disk_t d {unsigned coff, hoff, soff;unsigned head; -unsigned real_sector = (unsigned ) sector; -/* It is impossible to reach over 2TB with the traditional -CHS access. */ -if (sector > ~0UL ) +/* It is impossible to reach over 8064 MiB (a bit less than LBA24) with +the traditional CHS access. */ +if (sector > +1024 /* cylinders */ * +256 /* heads */ * +63 /* spt */ )return grub_error (GRUB_ERR_OUT_OF_RANGE ,"out of disk" ); - soff = real_sector % data->sectors +1 ; - head = real_sector / data->sectors; + soff = sector % data->sectors +1 ; + head = sector / data->sectors; hoff = head % data->heads; coff = head / data->heads;
disk/i386/pc/biosdisk.c grub_biosdisk_rw (int cmd, grub_disk_t d · line 250
Quoted 2 lines · Robert Millan
disk/i386/pc/biosdisk.c +2
-0+ soff = sector % data->sectors +1 ; + head = sector / data->sectors;
Or rather, as pointed out by Bean on IRC:
soff = ((grub_uint32_t) sector) % data->sectors + 1; head = ((grub_uint32_t) sector) / data->sectors;
to avoid gratuitous 64-bit division where 32-bit is enough.
Signature · 5 lines
Robert Millan <GPLv2> I know my rights; I want my phone call! <DRM> What use is a phone call… if you are unable to speak? (as seen on /.)
Committed.
Quoted 49 lines · Robert Millan
This patch fixes (I think) the
grub_biosdisk_rw()CHS limit check, which as described in http://www.allensmith.net/Storage/HDDlimit/Int13h.htm is slightly below LBA-24, not LBA-32 as current code assumes.Signature · 12 lines
Robert Millan <GPLv2> I know my rights; I want my phone call! <DRM> What use is a phone call… if you are unable to speak? (as seen on /.) 2008-03-21 Robert Millan <[email protected]> * disk/i386/pc/biosdisk.c (grub_biosdisk_rw): Fix CHS limit check, as per http://www.allensmith.net/Storage/HDDlimit/Int13h.htm diff -urp grub2/disk/i386/pc/biosdisk.c tmp/disk/i386/pc/biosdisk.cdisk/i386/pc/biosdisk.c +8
-6@@ -237,15 +237,17 @@ grub_biosdisk_rw (int cmd, grub_disk_t d {unsigned coff, hoff, soff;unsigned head; -unsigned real_sector = (unsigned ) sector; -/* It is impossible to reach over 2TB with the traditional -CHS access. */ -if (sector > ~0UL ) +/* It is impossible to reach over 8064 MiB (a bit less than LBA24) with +the traditional CHS access. */ +if (sector > +1024 /* cylinders */ * +256 /* heads */ * +63 /* spt */ )return grub_error (GRUB_ERR_OUT_OF_RANGE ,"out of disk" ); - soff = real_sector % data->sectors +1 ; - head = real_sector / data->sectors; + soff = sector % data->sectors +1 ; + head = sector / data->sectors; hoff = head % data->heads; coff = head / data->heads;_______________________________________________
Grub-devel mailing list
[email protected]
http://lists.gnu.org/mailman/listinfo/grub-devel
Signature · 5 lines
Robert Millan <GPLv2> I know my rights; I want my phone call! <DRM> What use is a phone call… if you are unable to speak? (as seen on /.)