Skip to contentSkip to conversation

wrong CHS limit check

PATCH In review Robert Millan 1 participant 3 messages Mar 21, 2008 – Apr 13, 2008

lore
Share & tools
lore
#0 lore raw

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
diff -urp grub2/disk/i386/pc/biosdisk.c tmp/disk/i386/pc/biosdisk.c
@@ -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;
 
#1 lore raw

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 /.)
#2 lore raw
In reply to Robert Millan

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.c
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;
 

_______________________________________________
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 /.)