|
From: | Zhixu Liu |
Subject: | Re: does disk geometry depend on partition table? |
Date: | Tue, 14 Nov 2006 13:03:12 +0800 |
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 = "">-
+
return GRUB_ERR_NONE;
}
-Hollis
_______________________________________________
Grub-devel mailing list
address@hidden
http://lists.gnu.org/mailman/listinfo/grub-devel
[Prev in Thread] | Current Thread | [Next in Thread] |