My reading of the source-code path for gub-setup.c indicates that dest_dev->disk->id is not set by the time the drive number test is done.
utils/i386/pc/grub-setup.c::setup()
dest_dev = grub_device_open (dest);
kern/device.c::grub_device_open(const char *dest name)
disk = grub_disk_open(name);
kern/disk.c::grub_disk_open(const char *name)
disk = (grub_disk_t) grub_zalloc(sizeof(*disk));
disk->name = grub_strdup (name);
...
disk->dev = dev;
...
return disk;
dev->disk = disk;
return dev;
...
/* If DEST_DRIVE is a hard disk, enable the workaround, which is
for buggy BIOSes which don't pass boot drive correctly. Instead,
they pass 0x00 or 0x01 even when booted from 0x80. */
if (dest_dev->disk->id & 0x80)
/* Replace the jmp (2 bytes) with double nop's. */
*boot_drive_check = 0x9090;
To test this I added a small patch to report the value of disk->id (attached) and built the binary. When run on the target system it reveals:
./grub-setup: info: the size of hd0 is 78140160
./grub-setup: info: setting the root device to 'hd0,1'.
./grub-setup: info: disk->id = 0.
and the resulting boot sector contained the jmp instruction.
My reading of the source-code path for gub-setup.c indicates that dest_dev->disk->id is not set by the time the drive number test is done.
utils/i386/ pc/grub- setup.c: :setup( ) device. c::grub_ device_ open(const char *dest name) open(name) ; disk.c: :grub_disk_ open(const char *name) sizeof( *disk)) ;
dest_dev = grub_device_open (dest);
kern/
disk = grub_disk_
kern/
disk = (grub_disk_t) grub_zalloc(
disk->name = grub_strdup (name);
...
disk->dev = dev;
...
return disk;
dev->disk = disk;
return dev;
...
/* If DEST_DRIVE is a hard disk, enable the workaround, which is
for buggy BIOSes which don't pass boot drive correctly. Instead,
they pass 0x00 or 0x01 even when booted from 0x80. */
if (dest_dev->disk->id & 0x80)
/* Replace the jmp (2 bytes) with double nop's. */
*boot_drive_check = 0x9090;
To test this I added a small patch to report the value of disk->id (attached) and built the binary. When run on the target system it reveals:
./grub-setup: info: the size of hd0 is 78140160
./grub-setup: info: setting the root device to 'hd0,1'.
./grub-setup: info: disk->id = 0.
and the resulting boot sector contained the jmp instruction.