Current code imposes limitations on the amount of sectors read in
a single call according to CHS layout of the disk even in LBA
read mode. There's no need to obey CHS layout restrictions for
LBA reads on LBA disks. It only slows down booting process.
See: https://lore.kernel.org/grub-devel/
d42a11fa-2a59-b5e7-08b1-
d2c60444bb99@valdikss.org.ru/
Signed-off-by: ValdikSS <iam@valdikss.org.ru>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
struct grub_biosdisk_dap *dap;
dap = (struct grub_biosdisk_dap *) (GRUB_MEMORY_MACHINE_SCRATCH_ADDR
- + (data->sectors
+ + (GRUB_DISK_MAX_LBA_SECTORS
<< disk->log_sector_size));
dap->length = sizeof (*dap);
dap->reserved = 0;
struct grub_biosdisk_data *data = disk->data;
grub_uint32_t sectors = data->sectors;
+ if (data->flags & GRUB_BIOSDISK_FLAG_LBA)
+ sectors = GRUB_DISK_MAX_LBA_SECTORS;
+
/* OFFSET = SECTOR % SECTORS */
grub_divmod64 (sector, sectors, &offset);
#define GRUB_DISK_MAX_MAX_AGGLOMERATE ((1 << (30 - GRUB_DISK_CACHE_BITS - GRUB_DISK_SECTOR_BITS)) - 1)
+/* Maximum number of sectors to read in LBA mode at once. */
+#define GRUB_DISK_MAX_LBA_SECTORS 63
+
/* Return value of grub_disk_native_sectors() in case disk size is unknown. */
#define GRUB_DISK_SIZE_UNKNOWN 0xffffffffffffffffULL