grub-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: does disk geometry depend on partition table?


From: Hollis Blanchard
Subject: Re: does disk geometry depend on partition table?
Date: Mon, 13 Nov 2006 21:40:39 -0600

On Mon, 2006-11-06 at 17:07 +0800, Zhixu Liu wrote:
> Hi, all, 
> 
> We encounter a strange problem recently. In short, following is the
> output of geometry of
> hd0 in situation with correct partition in disk and without partition
> in disk.
> When with correct partition table in disk hd0:
> 
>     grub> geometry (hd0)
>     drive 0x80: C/H/S = 500/16/32, The number of sectors = 256000, LBA
>
> When without partition table in disk hd0:
>     grub> geometry (hd0)
>     drive 0x80: C/H/S = 126/32/63, The number of sectors = 256000, LBA
> 
> The former is correct! However, it's strange that the disk geometry
> depend on the partition table?!
> Maybe this is due to a buggy BIOS implementation. We also check the
> code in disk/i386/pc/biosdisk.c
> or (stage2/bios.c) for grub-0.97, and for code in function
> grub_biosdisk_open (or get_diskinfo in grub-0.97), 
> there is a standard int13 check of disk after check with ext int13, 
> 
>   if(drive & 0x80) {
>      ...
>     version = grub_biosdisk_check_int13_extension(); 
>       if(version) {
>          grub_biosdisk_get_diskinfo_int13_extensions();
>       }
>    }
> 
>    grub_biosdisk_get_diskinfo_standard()
> 
> We're wondering does it really need to call
> grub_biosdisk_get_diskinfo_standard() again if we have get the
> necessary information 
> from ext int13? I think we call the later only if ext int13 failed for
> some reason. Especially in our case the code should be . 
> 
>   if(drive & 0x80) {
>      ...
>     version = grub_biosdisk_check_int13_extension();
>       if(version) {
>          grub_biosdisk_get_diskinfo_int13_extensions();
>       } else {
>          grub_biosdisk_get_diskinfo_standard()
>       }
>    }
> 
> and it do works!

Thanks for your report, Zhixu. Does this patch work?

Index: disk/i386/pc/biosdisk.c
===================================================================
RCS file: /cvsroot/grub/grub2/disk/i386/pc/biosdisk.c,v
retrieving revision 1.9
diff -u -p -r1.9 biosdisk.c
--- disk/i386/pc/biosdisk.c     29 Jul 2006 10:11:01 -0000      1.9
+++ disk/i386/pc/biosdisk.c     14 Nov 2006 03:39:47 -0000
@@ -133,21 +133,24 @@ grub_biosdisk_open (const char *name, gr
        }
     }

-  if (grub_biosdisk_get_diskinfo_standard (drive,
-                                          &data->cylinders,
-                                          &data->heads,
-                                          &data->sectors) != 0)
+  if (! total_sectors)
     {
-      grub_free (data);
-      return grub_error (GRUB_ERR_BAD_DEVICE, "cannot get C/H/S values");
-    }
+      /* FDD, or HDD without int13 extensions.  */
+      if (grub_biosdisk_get_diskinfo_standard (drive,
+                                              &data->cylinders,
+                                              &data->heads,
+                                              &data->sectors) != 0)
+       {
+         grub_free (data);
+         return grub_error (GRUB_ERR_BAD_DEVICE, "cannot get C/H/S values");
+       }

-  if (! total_sectors)
-    total_sectors = data->cylinders * data->heads * data->sectors;
+      total_sectors = data->cylinders * data->heads * data->sectors;
+    }

   disk->total_sectors = total_sectors;
   disk->data = data;
-
+
   return GRUB_ERR_NONE;
 }


-Hollis





reply via email to

[Prev in Thread] Current Thread [Next in Thread]