[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
grub2 ChangeLog boot/i386/pc/boot.S boot/i386/p...
From: |
Yoshinori K. Okuji |
Subject: |
grub2 ChangeLog boot/i386/pc/boot.S boot/i386/p... |
Date: |
Sun, 04 Jun 2006 15:56:55 +0000 |
CVSROOT: /cvsroot/grub
Module name: grub2
Changes by: Yoshinori K. Okuji <okuji> 06/06/04 15:56:55
Modified files:
. : ChangeLog
boot/i386/pc : boot.S diskboot.S
commands : blocklist.c cmp.c configfile.c ls.c
commands/i386/pc: play.c
disk : loopback.c
disk/efi : efidisk.c
disk/i386/pc : biosdisk.c
disk/ieee1275 : ofdisk.c
font : manager.c
fs : affs.c ext2.c fat.c fshelp.c hfs.c hfsplus.c
iso9660.c jfs.c minix.c sfs.c ufs.c xfs.c
include/grub : disk.h file.h fs.h fshelp.h misc.h partition.h
types.h
include/grub/i386/pc: boot.h
io : gzio.c
kern : disk.c file.c fs.c misc.c
loader/i386/pc : multiboot.c
normal : lexer.c parser.y script.c
partmap : amiga.c gpt.c pc.c
util/i386/pc : biosdisk.c grub-setup.c
Log message:
2006-06-04 Yoshinori K. Okuji <address@hidden>
Clean up the code to support 64-bit addressing in disks and
files. This change is not enough for filesystems yet.
* util/i386/pc/grub-setup.c (struct boot_blocklist): Change the
type of "start" to grub_uint64_t.
(setup): Change the types of KERNEL_SECTOR and FIRST_SECTOR to
grub_disk_addr_t * and grub_disk_addr_t. Fix the format string
in
save_first_sector and save_blocklists. Use grub_le_to_cpu64 to
convert addresses.
* util/i386/pc/biosdisk.c (open_device): Change the type of
SECTOR
to grub_disk_addr_t.
* partmap/gpt.c (gpt_partition_map_iterate): Fix the format
string.
* partmap/pc.c (pc_partition_map_iterate): Likewise.
* partmap/amiga.c (amiga_partition_map_iterate): Cast RDSK.MAGIC
to char *.
* normal/script.c (grub_script_parse): Remove unused MEMFREE.
* normal/parser.y (YYLTYPE_IS_TRIVIAL): New macro.
* normal/lexer.c (grub_script_yyerror): Specify unused to LEX.
* loader/i386/pc/multiboot.c (grub_multiboot_load_elf64): Cast
-1
to grub_off_t, to detect an error from grub_file_seek.
(grub_multiboot_load_elf32): Likewise.
* kern/misc.c (grub_strtoul): Use grub_strtoull. Return the
maximum unsigned long value when an overflow is detected.
(grub_strtoull): New function.
(grub_divmod64): Likewise.
(grub_lltoa): use grub_divmod64.
* kern/fs.c (struct grub_fs_block): Change the type of "offset"
to
grub_disk_addr_t.
(grub_fs_blocklist_open): Increase P if P is not NULL to advance
the pointer to next character. Use grub_strtoull instead of
grub_strtoul.
(grub_fs_blocklist_read): Change the types of SECTOR, OFFSET and
SIZE to grub_disk_addr_t, grub_off_t and grub_size_t,
respectively.
* kern/file.c (grub_file_read): Prevent an oveflow of LEN, as
the
return value is signed.
(grub_file_seek): Change the type of OLD to grub_off_t. Do not
test if OFFSET is less than zero, as OFFSET is unsigned now.
* kern/disk.c (struct grub_disk_cache): Change the type of
"sector" to grub_disk_addr_t.
(grub_disk_cache_get_index): Change the type of SECTOR to
grub_disk_addr_t. Calculate the hash with SECTOR casted to
unsigned after shifting.
(grub_disk_cache_invalidate): Change the type of SECTOR to
grub_disk_addr_t.
(grub_disk_cache_unlock): Likewise.
(grub_disk_cache_store): Likewise.
(grub_disk_check_range): Change the types of SECTOR, OFFSET,
SIZE,
START and LEN to grub_disk_addr_t *, grub_off_t *, grub_size_t,
grub_disk_addr_t and grub_uint64_t, respectively.
(grub_disk_read): Use an unsigned variable REAL_OFFSET for the
body, as the value of OFFSET is tweaked by
grub_disk_check_range. Change the types of START_SECTOR, LEN and
POS to grub_disk_addr_t, grub_size_t and grub_size_t,
respectively.
(grub_disk_write): Use an unsigned variable REAL_OFFSET for the
body, as the value of OFFSET is tweaked by
grub_disk_check_range. Change the types of LEN and N to
grub_size_t.
* io/gzio.c (struct grub_gzio): Change the types of
"data_offset"
and "saved_offset" to grub_off_t.
(test_header): Cast BUF to char *.
(get_byte): Cast GZIO->DATA_OFFSET to grub_off_t. Cast
GZIO->INBUF
to char *.
(grub_gzio_read): Change the types of OFFSET and SIZE to
grub_off_t and grub_size_t, respectively.
* include/grub/i386/pc/boot.h (GRUB_BOOT_MACHINE_FORCE_LBA):
Removed.
(GRUB_BOOT_MACHINE_BOOT_DRIVE): Changed to 0x4c.
(GRUB_BOOT_MACHINE_KERNEL_ADDRESS): Changed to 0x40.
(GRUB_BOOT_MACHINE_KERNEL_SEGMENT): Changed to 0x42.
(GRUB_BOOT_MACHINE_DRIVE_CHECK): Changed to 0x4e.
(GRUB_BOOT_MACHINE_LIST_SIZE): Increased to 12.
* include/grub/types.h (grub_off_t): Unconditionally set to
grub_uint64_t.
(grub_disk_addr_t): Changed to grub_uint64_t.
* include/grub/partition.h (struct grub_partition): Change the
types of "start", "len" and "offset" to grub_disk_addr_t,
grub_uint64_t and grub_disk_addr_t, respectively.
(grub_partition_get_start): Return grub_disk_addr_t.
(grub_partition_get_len): Return grub_uint64_t.
* include/grub/misc.h (grub_strtoull): New prototype.
(grub_divmod64): Likewise.
* include/grub/fshelp.h (grub_fshelp_read_file): Change the
types
of SECTOR, LEN and FILESIZE to grub_disk_addr_t, grub_size_t and
grub_off_t, respectively.
All callers and references changed.
* include/grub/fs.h (struct grub_fs): Change the type of LEN to
grub_size_t in "read".
All callers and references changed.
* include/grub/file.h (struct grub_file): Change the types of
"offset" and "size" to grub_off_t and grub_off_t,
respectively. Change the type of SECTOR to grub_disk_addr_t in
"read_hook".
(grub_file_read): Change the type of LEN to grub_size_t.
(grub_file_seek): Return grub_off_t. Change the type of OFFSET
to
grub_off_t.
(grub_file_size): Return grub_off_t.
(grub_file_tell): Likewise.
All callers and references changed.
* include/grub/disk.h (struct grub_disk_dev): Change the types
of
SECTOR and SIZE to grub_disk_addr_t and grub_size_t in "read"
and
"write".
(struct grub_disk): Change the type of "total_sectors" to
grub_uint64_t. Change the type of SECTOR to grub_disk_addr_t in
"read_hook".
(grub_disk_read): Change the types of SECTOR, OFFSET and SIZE to
grub_disk_addr_t, grub_off_t and grub_size_t, respectively.
(grub_disk_write): Likewise.
All callers and references changed.
* fs/iso9660.c (grub_iso9660_susp_iterate): Cast parameters to
char * for grub_strncmp to silence gcc.
(grub_iso9660_mount): Likewise.
(grub_iso9660_mount): Likewise.
(grub_iso9660_read_symlink): Likewise. Also, remove the nonsense
return statement.
(grub_iso9660_iterate_dir): Likewise.
(grub_iso9660_label): Cast DATA->VOLDESC.VOLNAME to char *.
* fs/hfs.c (grub_hfs_read_file): Change the types of SECTOR and
LEN to grub_disk_addr_t and grub_size_t, respectively.
* fs/hfsplus.c (grub_hfsplus_read_file): Likewise.
* fs/jfs.c (grub_jfs_read_file): Likewise.
* fs/minix.c (grub_jfs_read_file): Likewise.
* fs/sfs.c (grub_jfs_read_file): Likewise.
* fs/ufs.c (grub_jfs_read_file): Likewise.
* fs/xfs.c (grub_jfs_read_file): Likewise.
* fs/fat.c (grub_fat_read_data): Change the types of SECTOR, LEN
and SIZE to grub_disk_addr_t, grub_size_t and grub_size_t,
respectively.
* fs/ext2.c (grub_ext2_read_block): When an error happens, set
BLKNR to -1 instead of returning GRUB_ERRNO.
(grub_ext2_read_file): Change the types of SECTOR and
LEN to grub_disk_addr_t and grub_size_t, respectively.
* fs/affs.c (grub_affs_read_file): Change the types of SECTOR
and
LEN to grub_disk_addr_t and grub_size_t, respectively.
* font/manager.c (grub_font_get_glyph): Cast BITMAP to char *
for
grub_file_read.
* disk/ieee1275/ofdisk.c (grub_ofdisk_read): Fix the format
string. Do not cast SECTOR explicitly.
* disk/i386/pc/biosdisk.c (grub_biosdisk_open): Change the type
of
TOTAL_SECTORS to grub_uint64_t. Do not mask DRP->TOTAL_SECTORS.
(grub_biosdisk_rw): Change the types of SECTOR and SIZE to
grub_disk_addr_t and grub_size_t, respectively. If the sector is
over 2TB and LBA mode is not supported, raise an error.
(get_safe_sectors): New function.
(grub_biosdisk_read): Use get_safe_sectors.
(grub_biosdisk_write): Likewise.
* disk/efi/efidisk.c (grub_efidisk_read): Fix the format string.
(grub_efidisk_write): Likewise.
* disk/loopback.c (delete_loopback): Cosmetic changes.
(grub_cmd_loopback): Likewise. Also, test NEWDEV->FILENAME
correctly.
(grub_loopback_open): Likewise.
(grub_loopback_read): Likewise. Also, change the type of POS to
grub_off_t, and fix the usage of grub_memset.
* commands/i386/pc/play.c: Include grub/machine/time.h.
* commands/ls.c (grub_ls_list_files): Use "llu" instead of "d"
to
print FILE->SIZE.
* commands/configfile.c: Include grub/env.h.
* commands/cmp.c (grub_cmd_cmp): Do not use ERR, but use
GRUB_ERRNO directly instead. Change the type of POS to
grub_off_t. Follow the coding standard.
* commands/blocklist.c: Include grub/partition.h.
(grub_cmd_blocklist): Return an error if the underlying device
is
not a disk. Take the starting sector of a partition into
account,
if a partition is used.
* boot/i386/pc/diskboot.S (bootloop): Adapted to the new offset
of
a length field.
(lba_mode): Support 64-bit addresses.
(chs_mode): Likewise.
(copy_buffer): Adapted to the new offsets of a length field and
a
segment field.
(blocklist_default_start): Allocate 64-bit space.
* boot/i386/pc/boot.S (force_lba): Removed.
(boot_drive): Moved to under KERNEL_SECTOR.
(kernel_sector): Moved to under KENREL_SEGMENT. Allocate 64-bit
space.
(real_start): Set %si earlier. Remove code for FORCE_LBA, since
it
is useless.
(lba_mode): Refactored to support a 64-bit address. More size
optimization.
(setup_sectors): Likewise.
CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/grub2/ChangeLog?cvsroot=grub&r1=1.278&r2=1.279
http://cvs.savannah.gnu.org/viewcvs/grub2/boot/i386/pc/boot.S?cvsroot=grub&r1=1.8&r2=1.9
http://cvs.savannah.gnu.org/viewcvs/grub2/boot/i386/pc/diskboot.S?cvsroot=grub&r1=1.3&r2=1.4
http://cvs.savannah.gnu.org/viewcvs/grub2/commands/blocklist.c?cvsroot=grub&r1=1.1&r2=1.2
http://cvs.savannah.gnu.org/viewcvs/grub2/commands/cmp.c?cvsroot=grub&r1=1.6&r2=1.7
http://cvs.savannah.gnu.org/viewcvs/grub2/commands/configfile.c?cvsroot=grub&r1=1.5&r2=1.6
http://cvs.savannah.gnu.org/viewcvs/grub2/commands/ls.c?cvsroot=grub&r1=1.13&r2=1.14
http://cvs.savannah.gnu.org/viewcvs/grub2/commands/i386/pc/play.c?cvsroot=grub&r1=1.1&r2=1.2
http://cvs.savannah.gnu.org/viewcvs/grub2/disk/loopback.c?cvsroot=grub&r1=1.3&r2=1.4
http://cvs.savannah.gnu.org/viewcvs/grub2/disk/efi/efidisk.c?cvsroot=grub&r1=1.3&r2=1.4
http://cvs.savannah.gnu.org/viewcvs/grub2/disk/i386/pc/biosdisk.c?cvsroot=grub&r1=1.7&r2=1.8
http://cvs.savannah.gnu.org/viewcvs/grub2/disk/ieee1275/ofdisk.c?cvsroot=grub&r1=1.2&r2=1.3
http://cvs.savannah.gnu.org/viewcvs/grub2/font/manager.c?cvsroot=grub&r1=1.8&r2=1.9
http://cvs.savannah.gnu.org/viewcvs/grub2/fs/affs.c?cvsroot=grub&r1=1.3&r2=1.4
http://cvs.savannah.gnu.org/viewcvs/grub2/fs/ext2.c?cvsroot=grub&r1=1.12&r2=1.13
http://cvs.savannah.gnu.org/viewcvs/grub2/fs/fat.c?cvsroot=grub&r1=1.14&r2=1.15
http://cvs.savannah.gnu.org/viewcvs/grub2/fs/fshelp.c?cvsroot=grub&r1=1.5&r2=1.6
http://cvs.savannah.gnu.org/viewcvs/grub2/fs/hfs.c?cvsroot=grub&r1=1.6&r2=1.7
http://cvs.savannah.gnu.org/viewcvs/grub2/fs/hfsplus.c?cvsroot=grub&r1=1.7&r2=1.8
http://cvs.savannah.gnu.org/viewcvs/grub2/fs/iso9660.c?cvsroot=grub&r1=1.2&r2=1.3
http://cvs.savannah.gnu.org/viewcvs/grub2/fs/jfs.c?cvsroot=grub&r1=1.4&r2=1.5
http://cvs.savannah.gnu.org/viewcvs/grub2/fs/minix.c?cvsroot=grub&r1=1.4&r2=1.5
http://cvs.savannah.gnu.org/viewcvs/grub2/fs/sfs.c?cvsroot=grub&r1=1.4&r2=1.5
http://cvs.savannah.gnu.org/viewcvs/grub2/fs/ufs.c?cvsroot=grub&r1=1.5&r2=1.6
http://cvs.savannah.gnu.org/viewcvs/grub2/fs/xfs.c?cvsroot=grub&r1=1.7&r2=1.8
http://cvs.savannah.gnu.org/viewcvs/grub2/include/grub/disk.h?cvsroot=grub&r1=1.9&r2=1.10
http://cvs.savannah.gnu.org/viewcvs/grub2/include/grub/file.h?cvsroot=grub&r1=1.3&r2=1.4
http://cvs.savannah.gnu.org/viewcvs/grub2/include/grub/fs.h?cvsroot=grub&r1=1.14&r2=1.15
http://cvs.savannah.gnu.org/viewcvs/grub2/include/grub/fshelp.h?cvsroot=grub&r1=1.2&r2=1.3
http://cvs.savannah.gnu.org/viewcvs/grub2/include/grub/misc.h?cvsroot=grub&r1=1.19&r2=1.20
http://cvs.savannah.gnu.org/viewcvs/grub2/include/grub/partition.h?cvsroot=grub&r1=1.5&r2=1.6
http://cvs.savannah.gnu.org/viewcvs/grub2/include/grub/types.h?cvsroot=grub&r1=1.8&r2=1.9
http://cvs.savannah.gnu.org/viewcvs/grub2/include/grub/i386/pc/boot.h?cvsroot=grub&r1=1.6&r2=1.7
http://cvs.savannah.gnu.org/viewcvs/grub2/io/gzio.c?cvsroot=grub&r1=1.3&r2=1.4
http://cvs.savannah.gnu.org/viewcvs/grub2/kern/disk.c?cvsroot=grub&r1=1.12&r2=1.13
http://cvs.savannah.gnu.org/viewcvs/grub2/kern/file.c?cvsroot=grub&r1=1.5&r2=1.6
http://cvs.savannah.gnu.org/viewcvs/grub2/kern/fs.c?cvsroot=grub&r1=1.4&r2=1.5
http://cvs.savannah.gnu.org/viewcvs/grub2/kern/misc.c?cvsroot=grub&r1=1.30&r2=1.31
http://cvs.savannah.gnu.org/viewcvs/grub2/loader/i386/pc/multiboot.c?cvsroot=grub&r1=1.10&r2=1.11
http://cvs.savannah.gnu.org/viewcvs/grub2/normal/lexer.c?cvsroot=grub&r1=1.5&r2=1.6
http://cvs.savannah.gnu.org/viewcvs/grub2/normal/parser.y?cvsroot=grub&r1=1.5&r2=1.6
http://cvs.savannah.gnu.org/viewcvs/grub2/normal/script.c?cvsroot=grub&r1=1.6&r2=1.7
http://cvs.savannah.gnu.org/viewcvs/grub2/partmap/amiga.c?cvsroot=grub&r1=1.4&r2=1.5
http://cvs.savannah.gnu.org/viewcvs/grub2/partmap/gpt.c?cvsroot=grub&r1=1.2&r2=1.3
http://cvs.savannah.gnu.org/viewcvs/grub2/partmap/pc.c?cvsroot=grub&r1=1.7&r2=1.8
http://cvs.savannah.gnu.org/viewcvs/grub2/util/i386/pc/biosdisk.c?cvsroot=grub&r1=1.11&r2=1.12
http://cvs.savannah.gnu.org/viewcvs/grub2/util/i386/pc/grub-setup.c?cvsroot=grub&r1=1.17&r2=1.18
Patches:
Index: ChangeLog
===================================================================
RCS file: /cvsroot/grub/grub2/ChangeLog,v
retrieving revision 1.278
retrieving revision 1.279
diff -u -b -r1.278 -r1.279
--- ChangeLog 4 Jun 2006 12:59:19 -0000 1.278
+++ ChangeLog 4 Jun 2006 15:56:53 -0000 1.279
@@ -1,5 +1,235 @@
2006-06-04 Yoshinori K. Okuji <address@hidden>
+ Clean up the code to support 64-bit addressing in disks and
+ files. This change is not enough for filesystems yet.
+
+ * util/i386/pc/grub-setup.c (struct boot_blocklist): Change the
+ type of "start" to grub_uint64_t.
+ (setup): Change the types of KERNEL_SECTOR and FIRST_SECTOR to
+ grub_disk_addr_t * and grub_disk_addr_t. Fix the format string in
+ save_first_sector and save_blocklists. Use grub_le_to_cpu64 to
+ convert addresses.
+
+ * util/i386/pc/biosdisk.c (open_device): Change the type of SECTOR
+ to grub_disk_addr_t.
+
+ * partmap/gpt.c (gpt_partition_map_iterate): Fix the format
+ string.
+
+ * partmap/pc.c (pc_partition_map_iterate): Likewise.
+
+ * partmap/amiga.c (amiga_partition_map_iterate): Cast RDSK.MAGIC
+ to char *.
+
+ * normal/script.c (grub_script_parse): Remove unused MEMFREE.
+
+ * normal/parser.y (YYLTYPE_IS_TRIVIAL): New macro.
+
+ * normal/lexer.c (grub_script_yyerror): Specify unused to LEX.
+
+ * loader/i386/pc/multiboot.c (grub_multiboot_load_elf64): Cast -1
+ to grub_off_t, to detect an error from grub_file_seek.
+ (grub_multiboot_load_elf32): Likewise.
+
+ * kern/misc.c (grub_strtoul): Use grub_strtoull. Return the
+ maximum unsigned long value when an overflow is detected.
+ (grub_strtoull): New function.
+ (grub_divmod64): Likewise.
+ (grub_lltoa): use grub_divmod64.
+
+ * kern/fs.c (struct grub_fs_block): Change the type of "offset" to
+ grub_disk_addr_t.
+ (grub_fs_blocklist_open): Increase P if P is not NULL to advance
+ the pointer to next character. Use grub_strtoull instead of
+ grub_strtoul.
+ (grub_fs_blocklist_read): Change the types of SECTOR, OFFSET and
+ SIZE to grub_disk_addr_t, grub_off_t and grub_size_t,
+ respectively.
+
+ * kern/file.c (grub_file_read): Prevent an oveflow of LEN, as the
+ return value is signed.
+ (grub_file_seek): Change the type of OLD to grub_off_t. Do not
+ test if OFFSET is less than zero, as OFFSET is unsigned now.
+
+ * kern/disk.c (struct grub_disk_cache): Change the type of
+ "sector" to grub_disk_addr_t.
+ (grub_disk_cache_get_index): Change the type of SECTOR to
+ grub_disk_addr_t. Calculate the hash with SECTOR casted to
+ unsigned after shifting.
+ (grub_disk_cache_invalidate): Change the type of SECTOR to
+ grub_disk_addr_t.
+ (grub_disk_cache_unlock): Likewise.
+ (grub_disk_cache_store): Likewise.
+ (grub_disk_check_range): Change the types of SECTOR, OFFSET, SIZE,
+ START and LEN to grub_disk_addr_t *, grub_off_t *, grub_size_t,
+ grub_disk_addr_t and grub_uint64_t, respectively.
+ (grub_disk_read): Use an unsigned variable REAL_OFFSET for the
+ body, as the value of OFFSET is tweaked by
+ grub_disk_check_range. Change the types of START_SECTOR, LEN and
+ POS to grub_disk_addr_t, grub_size_t and grub_size_t,
+ respectively.
+ (grub_disk_write): Use an unsigned variable REAL_OFFSET for the
+ body, as the value of OFFSET is tweaked by
+ grub_disk_check_range. Change the types of LEN and N to
+ grub_size_t.
+
+ * io/gzio.c (struct grub_gzio): Change the types of "data_offset"
+ and "saved_offset" to grub_off_t.
+ (test_header): Cast BUF to char *.
+ (get_byte): Cast GZIO->DATA_OFFSET to grub_off_t. Cast GZIO->INBUF
+ to char *.
+ (grub_gzio_read): Change the types of OFFSET and SIZE to
+ grub_off_t and grub_size_t, respectively.
+
+ * include/grub/i386/pc/boot.h (GRUB_BOOT_MACHINE_FORCE_LBA):
+ Removed.
+ (GRUB_BOOT_MACHINE_BOOT_DRIVE): Changed to 0x4c.
+ (GRUB_BOOT_MACHINE_KERNEL_ADDRESS): Changed to 0x40.
+ (GRUB_BOOT_MACHINE_KERNEL_SEGMENT): Changed to 0x42.
+ (GRUB_BOOT_MACHINE_DRIVE_CHECK): Changed to 0x4e.
+ (GRUB_BOOT_MACHINE_LIST_SIZE): Increased to 12.
+
+ * include/grub/types.h (grub_off_t): Unconditionally set to
+ grub_uint64_t.
+ (grub_disk_addr_t): Changed to grub_uint64_t.
+
+ * include/grub/partition.h (struct grub_partition): Change the
+ types of "start", "len" and "offset" to grub_disk_addr_t,
+ grub_uint64_t and grub_disk_addr_t, respectively.
+ (grub_partition_get_start): Return grub_disk_addr_t.
+ (grub_partition_get_len): Return grub_uint64_t.
+
+ * include/grub/misc.h (grub_strtoull): New prototype.
+ (grub_divmod64): Likewise.
+
+ * include/grub/fshelp.h (grub_fshelp_read_file): Change the types
+ of SECTOR, LEN and FILESIZE to grub_disk_addr_t, grub_size_t and
+ grub_off_t, respectively.
+ All callers and references changed.
+
+ * include/grub/fs.h (struct grub_fs): Change the type of LEN to
+ grub_size_t in "read".
+ All callers and references changed.
+
+ * include/grub/file.h (struct grub_file): Change the types of
+ "offset" and "size" to grub_off_t and grub_off_t,
+ respectively. Change the type of SECTOR to grub_disk_addr_t in
+ "read_hook".
+ (grub_file_read): Change the type of LEN to grub_size_t.
+ (grub_file_seek): Return grub_off_t. Change the type of OFFSET to
+ grub_off_t.
+ (grub_file_size): Return grub_off_t.
+ (grub_file_tell): Likewise.
+ All callers and references changed.
+
+ * include/grub/disk.h (struct grub_disk_dev): Change the types of
+ SECTOR and SIZE to grub_disk_addr_t and grub_size_t in "read" and
+ "write".
+ (struct grub_disk): Change the type of "total_sectors" to
+ grub_uint64_t. Change the type of SECTOR to grub_disk_addr_t in
+ "read_hook".
+ (grub_disk_read): Change the types of SECTOR, OFFSET and SIZE to
+ grub_disk_addr_t, grub_off_t and grub_size_t, respectively.
+ (grub_disk_write): Likewise.
+ All callers and references changed.
+
+ * fs/iso9660.c (grub_iso9660_susp_iterate): Cast parameters to
+ char * for grub_strncmp to silence gcc.
+ (grub_iso9660_mount): Likewise.
+ (grub_iso9660_mount): Likewise.
+ (grub_iso9660_read_symlink): Likewise. Also, remove the nonsense
+ return statement.
+ (grub_iso9660_iterate_dir): Likewise.
+ (grub_iso9660_label): Cast DATA->VOLDESC.VOLNAME to char *.
+
+ * fs/hfs.c (grub_hfs_read_file): Change the types of SECTOR and
+ LEN to grub_disk_addr_t and grub_size_t, respectively.
+
+ * fs/hfsplus.c (grub_hfsplus_read_file): Likewise.
+
+ * fs/jfs.c (grub_jfs_read_file): Likewise.
+
+ * fs/minix.c (grub_jfs_read_file): Likewise.
+
+ * fs/sfs.c (grub_jfs_read_file): Likewise.
+
+ * fs/ufs.c (grub_jfs_read_file): Likewise.
+
+ * fs/xfs.c (grub_jfs_read_file): Likewise.
+
+ * fs/fat.c (grub_fat_read_data): Change the types of SECTOR, LEN
+ and SIZE to grub_disk_addr_t, grub_size_t and grub_size_t,
+ respectively.
+
+ * fs/ext2.c (grub_ext2_read_block): When an error happens, set
+ BLKNR to -1 instead of returning GRUB_ERRNO.
+ (grub_ext2_read_file): Change the types of SECTOR and
+ LEN to grub_disk_addr_t and grub_size_t, respectively.
+
+ * fs/affs.c (grub_affs_read_file): Change the types of SECTOR and
+ LEN to grub_disk_addr_t and grub_size_t, respectively.
+
+ * font/manager.c (grub_font_get_glyph): Cast BITMAP to char * for
+ grub_file_read.
+
+ * disk/ieee1275/ofdisk.c (grub_ofdisk_read): Fix the format
+ string. Do not cast SECTOR explicitly.
+
+ * disk/i386/pc/biosdisk.c (grub_biosdisk_open): Change the type of
+ TOTAL_SECTORS to grub_uint64_t. Do not mask DRP->TOTAL_SECTORS.
+ (grub_biosdisk_rw): Change the types of SECTOR and SIZE to
+ grub_disk_addr_t and grub_size_t, respectively. If the sector is
+ over 2TB and LBA mode is not supported, raise an error.
+ (get_safe_sectors): New function.
+ (grub_biosdisk_read): Use get_safe_sectors.
+ (grub_biosdisk_write): Likewise.
+
+ * disk/efi/efidisk.c (grub_efidisk_read): Fix the format string.
+ (grub_efidisk_write): Likewise.
+
+ * disk/loopback.c (delete_loopback): Cosmetic changes.
+ (grub_cmd_loopback): Likewise. Also, test NEWDEV->FILENAME
+ correctly.
+ (grub_loopback_open): Likewise.
+ (grub_loopback_read): Likewise. Also, change the type of POS to
+ grub_off_t, and fix the usage of grub_memset.
+
+ * commands/i386/pc/play.c: Include grub/machine/time.h.
+
+ * commands/ls.c (grub_ls_list_files): Use "llu" instead of "d" to
+ print FILE->SIZE.
+
+ * commands/configfile.c: Include grub/env.h.
+
+ * commands/cmp.c (grub_cmd_cmp): Do not use ERR, but use
+ GRUB_ERRNO directly instead. Change the type of POS to
+ grub_off_t. Follow the coding standard.
+
+ * commands/blocklist.c: Include grub/partition.h.
+ (grub_cmd_blocklist): Return an error if the underlying device is
+ not a disk. Take the starting sector of a partition into account,
+ if a partition is used.
+
+ * boot/i386/pc/diskboot.S (bootloop): Adapted to the new offset of
+ a length field.
+ (lba_mode): Support 64-bit addresses.
+ (chs_mode): Likewise.
+ (copy_buffer): Adapted to the new offsets of a length field and a
+ segment field.
+ (blocklist_default_start): Allocate 64-bit space.
+
+ * boot/i386/pc/boot.S (force_lba): Removed.
+ (boot_drive): Moved to under KERNEL_SECTOR.
+ (kernel_sector): Moved to under KENREL_SEGMENT. Allocate 64-bit
+ space.
+ (real_start): Set %si earlier. Remove code for FORCE_LBA, since it
+ is useless.
+ (lba_mode): Refactored to support a 64-bit address. More size
+ optimization.
+ (setup_sectors): Likewise.
+
+2006-06-04 Yoshinori K. Okuji <address@hidden>
+
* DISTLIST: Added include/grub/i386/linux.h. Removed
include/grub/i386/pc/linux.h
Index: boot/i386/pc/boot.S
===================================================================
RCS file: /cvsroot/grub/grub2/boot/i386/pc/boot.S,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -b -r1.8 -r1.9
--- boot/i386/pc/boot.S 20 May 2006 14:54:45 -0000 1.8
+++ boot/i386/pc/boot.S 4 Jun 2006 15:56:53 -0000 1.9
@@ -1,7 +1,7 @@
/* -*-Asm-*- */
/*
* GRUB -- GRand Unified Bootloader
- * Copyright (C) 1999,2000,2001,2002,2005 Free Software Foundation, Inc.
+ * Copyright (C) 1999,2000,2001,2002,2005,2006 Free Software Foundation, Inc.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -91,17 +91,15 @@
boot_version:
.byte GRUB_BOOT_VERSION_MAJOR, GRUB_BOOT_VERSION_MINOR
-boot_drive:
- .byte 0xff /* the disk to load kernel from */
- /* 0xff means use the boot drive */
-force_lba:
- .byte 0
kernel_address:
.word GRUB_BOOT_MACHINE_KERNEL_ADDR
-kernel_sector:
- .long 1
kernel_segment:
.word GRUB_BOOT_MACHINE_KERNEL_SEG
+kernel_sector:
+ .long 1, 0
+boot_drive:
+ .byte 0xff /* the disk to load kernel from */
+ /* 0xff means use the boot drive */
after_BPB:
@@ -155,6 +153,9 @@
/* print a notification message on the screen */
MSG(notification_string)
+ /* set %si to the disk address packet */
+ movw $ABS(disk_address_packet), %si
+
/* do not probe LBA if the drive is a floppy */
testb $GRUB_BOOT_MACHINE_BIOS_HD_FLAG, %dl
jz chs_mode
@@ -176,35 +177,28 @@
cmpw $0xaa55, %bx
jne chs_mode
- /* set %si to the disk address packet */
- movw $ABS(disk_address_packet), %si
-
- /* check if AH=0x42 is supported if FORCE_LBA is zero */
- MOV_MEM_TO_AL(ABS(force_lba)) /* movb ABS(force_lba), %al */
- testb %al, %al
- jnz lba_mode
andw $1, %cx
jz chs_mode
lba_mode:
- xorl %eax, %eax
+ xorw %ax, %ax
movw %ax, 4(%si)
- movl %eax, 12(%si)
incw %ax
/* set the mode to non-zero */
movb %al, -1(%si)
- movl ABS(kernel_sector), %ebx
+ /* the blocks */
+ movw %ax, 2(%si)
/* the size and the reserved byte */
movw $0x0010, (%si)
- /* the blocks */
- movw %ax, 2(%si)
-
- /* the absolute address (low 32 bits) */
+ /* the absolute address */
+ movl ABS(kernel_sector), %ebx
movl %ebx, 8(%si)
+ movl ABS(kernel_sector + 4), %ebx
+ movl %ebx, 12(%si)
/* the segment of buffer address */
movw $GRUB_BOOT_MACHINE_BUFFER_SEG, 6(%si)
@@ -247,16 +241,14 @@
final_init:
/* set the mode to zero */
- movb $0, -1(%si)
+ movzbl %dh, %eax
+ movb %ah, -1(%si)
/* save number of heads */
- xorl %eax, %eax
- movb %dh, %al
incw %ax
movl %eax, 4(%si)
- xorw %dx, %dx
- movb %cl, %dl
+ movzbw %cl, %dx
shlw $2, %dx
movb %ch, %al
movb %dh, %ah
@@ -265,14 +257,18 @@
incw %ax
movw %ax, 8(%si)
- xorw %ax, %ax
- movb %dl, %al
+ movzbw %dl, %ax
shrb $2, %al
/* save number of sectors */
movl %eax, (%si)
setup_sectors:
+ /* load logical sector start (top half) */
+ movl ABS(kernel_sector + 4), %eax
+ orl %eax, %eax
+ jnz geometry_error
+
/* load logical sector start (bottom half) */
movl ABS(kernel_sector), %eax
@@ -283,41 +279,34 @@
divl (%si)
/* save sector start */
- movb %dl, 10(%si)
+ movb %dl, %cl
- xorl %edx, %edx /* zero %edx */
+ xorw %dx, %dx /* zero %edx */
divl 4(%si) /* divide by number of heads */
- /* save head start */
- movb %dl, 11(%si)
-
- /* save cylinder start */
- movw %ax, 12(%si)
-
/* do we need too many cylinders? */
cmpw 8(%si), %ax
jge geometry_error
-/*
- * This is the loop for taking care of BIOS geometry translation (ugh!)
- */
+ /* normalize sector start (1-based) */
+ incb %cl
- /* get high bits of cylinder */
- movb 13(%si), %dl
+ /* low bits of cylinder start */
+ movb %al, %ch
- shlb $6, %dl /* shift left by 6 bits */
- movb 10(%si), %cl /* get sector */
+ /* high bits of cylinder start */
+ xorb %al, %al
+ shrw $2, %ax
+ orb %al, %cl
- incb %cl /* normalize sector (sectors go
- from 1-N, not 0-(N-1) ) */
- orb %dl, %cl /* composite together */
- movb 12(%si), %ch /* sector+hcyl in cl, cylinder in ch */
+ /* save head start */
+ movb %dl, %al
- /* restore %dx */
+ /* restore %dl */
popw %dx
- /* head number */
- movb 11(%si), %dh
+ /* head start */
+ movb %al, %dh
/*
* BIOS call "INT 0x13 Function 0x2" to read sectors from disk into memory
Index: boot/i386/pc/diskboot.S
===================================================================
RCS file: /cvsroot/grub/grub2/boot/i386/pc/diskboot.S,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -b -r1.3 -r1.4
--- boot/i386/pc/diskboot.S 4 Apr 2004 13:45:59 -0000 1.3
+++ boot/i386/pc/diskboot.S 4 Jun 2006 15:56:53 -0000 1.4
@@ -1,6 +1,6 @@
/*
* GRUB -- GRand Unified Bootloader
- * Copyright (C) 1999,2000,2001,2002 Free Software Foundation, Inc.
+ * Copyright (C) 1999,2000,2001,2002,2006 Free Software Foundation, Inc.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -71,7 +71,7 @@
bootloop:
/* check the number of sectors to read */
- cmpw $0, 4(%di)
+ cmpw $0, 8(%di)
/* if zero, go to the start function */
je bootit
@@ -86,26 +86,28 @@
lba_mode:
/* load logical sector start */
movl (%di), %ebx
+ movl 4(%di), %ecx
/* the maximum is limited to 0x7f because of Phoenix EDD */
xorl %eax, %eax
movb $0x7f, %al
/* how many do we really want to read? */
- cmpw %ax, 4(%di) /* compare against total number of sectors */
+ cmpw %ax, 8(%di) /* compare against total number of sectors */
/* which is greater? */
jg 1f
/* if less than, set to total */
- movw 4(%di), %ax
+ movw 8(%di), %ax
1:
/* subtract from total */
- subw %ax, 4(%di)
+ subw %ax, 8(%di)
/* add into logical sector start */
addl %eax, (%di)
+ adcl $0, 4(%di)
/* set up disk address packet */
@@ -115,8 +117,9 @@
/* the number of sectors */
movw %ax, 2(%si)
- /* the absolute address (low 32 bits) */
+ /* the absolute address */
movl %ebx, 8(%si)
+ movl %ecx, 12(%si)
/* the segment of buffer address */
movw $GRUB_BOOT_MACHINE_BUFFER_SEG, 6(%si)
@@ -124,15 +127,8 @@
/* save %ax from destruction! */
pushw %ax
- /* zero %eax */
- xorl %eax, %eax
-
/* the offset of buffer address */
- movw %ax, 4(%si)
-
- /* the absolute address (high 32 bits) */
- movl %eax, 12(%si)
-
+ movw $0, 4(%si)
/*
* BIOS call "INT 0x13 Function 0x42" to read sectors from disk into memory
@@ -152,6 +148,11 @@
jmp copy_buffer
chs_mode:
+ /* load logical sector start (top half) */
+ movl 4(%di), %eax
+ orl %eax, %eax
+ jnz geometry_error
+
/* load logical sector start (bottom half) */
movl (%di), %eax
@@ -184,21 +185,22 @@
subb 10(%si), %al
/* how many do we really want to read? */
- cmpw %ax, 4(%di) /* compare against total number of sectors */
+ cmpw %ax, 8(%di) /* compare against total number of sectors */
/* which is greater? */
jg 2f
/* if less than, set to total */
- movw 4(%di), %ax
+ movw 8(%di), %ax
2:
/* subtract from total */
- subw %ax, 4(%di)
+ subw %ax, 8(%di)
/* add into logical sector start */
addl %eax, (%di)
+ adcl $0, 4(%di)
/*
* This is the loop for taking care of BIOS geometry translation (ugh!)
@@ -252,7 +254,7 @@
copy_buffer:
/* load addresses for copy from disk buffer to destination */
- movw 6(%di), %es /* load destination segment */
+ movw 10(%di), %es /* load destination segment */
/* restore %ax */
popw %ax
@@ -260,7 +262,7 @@
/* determine the next possible destination address (presuming
512 byte sectors!) */
shlw $5, %ax /* shift %ax five bits to the left */
- addw %ax, 6(%di) /* add the corrected value to the destination
+ addw %ax, 10(%di) /* add the corrected value to the destination
address for next time */
/* save addressing regs */
@@ -288,7 +290,7 @@
popa
/* check if finished with this dataset */
- cmpw $0, 4(%di)
+ cmpw $0, 8(%di)
jne setup_sectors
/* update position to load from */
@@ -374,7 +376,7 @@
blocklist_default_start:
/* this is the sector start parameter, in logical sectors from
the start of the disk, sector 0 */
- .long 2
+ .long 2, 0
blocklist_default_len:
/* this is the number of sectors to read the command "install"
will fill this up */
Index: commands/blocklist.c
===================================================================
RCS file: /cvsroot/grub/grub2/commands/blocklist.c,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -b -r1.1 -r1.2
--- commands/blocklist.c 27 May 2006 21:09:25 -0000 1.1
+++ commands/blocklist.c 4 Jun 2006 15:56:54 -0000 1.2
@@ -25,6 +25,7 @@
#include <grub/file.h>
#include <grub/mm.h>
#include <grub/disk.h>
+#include <grub/partition.h>
static grub_err_t
grub_cmd_blocklist (struct grub_arg_list *state __attribute__ ((unused)),
@@ -35,12 +36,13 @@
unsigned long start_sector = 0;
unsigned num_sectors = 0;
int num_entries = 0;
- auto void read_blocklist (unsigned long sector, unsigned offset,
+ grub_disk_addr_t part_start = 0;
+ auto void read_blocklist (grub_disk_addr_t sector, unsigned offset,
unsigned length);
- auto void print_blocklist (unsigned long sector, unsigned num,
+ auto void print_blocklist (grub_disk_addr_t sector, unsigned num,
unsigned offset, unsigned length);
- void read_blocklist (unsigned long sector, unsigned offset,
+ void read_blocklist (grub_disk_addr_t sector, unsigned offset,
unsigned length)
{
if (num_sectors > 0)
@@ -65,13 +67,13 @@
print_blocklist (sector, 0, offset, length);
}
- void print_blocklist (unsigned long sector, unsigned num,
+ void print_blocklist (grub_disk_addr_t sector, unsigned num,
unsigned offset, unsigned length)
{
if (num_entries++)
grub_printf (",");
- grub_printf ("%lu", sector);
+ grub_printf ("%llu", sector - part_start);
if (num > 0)
grub_printf ("+%u", num);
if (offset != 0 || length != 0)
@@ -85,6 +87,13 @@
if (! file)
return grub_errno;
+ if (! file->device->disk)
+ return grub_error (GRUB_ERR_BAD_DEVICE,
+ "this command is available only for disk devices.");
+
+ if (file->device->disk->partition)
+ part_start = grub_partition_get_start (file->device->disk->partition);
+
file->read_hook = read_blocklist;
while (grub_file_read (file, buf, sizeof (buf)) > 0)
Index: commands/cmp.c
===================================================================
RCS file: /cvsroot/grub/grub2/commands/cmp.c,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -b -r1.6 -r1.7
--- commands/cmp.c 13 Nov 2005 15:47:08 -0000 1.6
+++ commands/cmp.c 4 Jun 2006 15:56:54 -0000 1.7
@@ -1,7 +1,7 @@
/* cmd.c - command to cmp an operating system */
/*
* GRUB -- GRand Unified Bootloader
- * Copyright (C) 2003,2005 Free Software Foundation, Inc.
+ * Copyright (C) 2003,2005,2006 Free Software Foundation, Inc.
*
* GRUB is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -32,9 +32,8 @@
grub_cmd_cmp (struct grub_arg_list *state __attribute__ ((unused)),
int argc, char **args)
{
- grub_err_t err;
grub_ssize_t rd1, rd2;
- grub_uint32_t pos;
+ grub_off_t pos;
grub_file_t file1 = 0;
grub_file_t file2 = 0;
char *buf1 = 0;
@@ -46,25 +45,29 @@
grub_printf ("Compare `%s' and `%s':\n", args[0],
args[1]);
- if (! (file1 = grub_gzfile_open (args[0], 1) ) ||
- ! (file2 = grub_gzfile_open (args[1], 1) ) )
+ file1 = grub_gzfile_open (args[0], 1);
+ file2 = grub_gzfile_open (args[1], 1);
+ if (! file1 || ! file2)
goto cleanup;
if (grub_file_size (file1) != grub_file_size (file2))
- grub_printf ("Differ in size: %d [%s], %d [%s]\n",
+ grub_printf ("Differ in size: %llu [%s], %llu [%s]\n",
grub_file_size (file1), args[0],
grub_file_size (file2), args[1]);
-
else
{
pos = 0;
- if (! (buf1 = (char *) grub_malloc (BUFFER_SIZE) ) ||
- ! (buf2 = (char *) grub_malloc (BUFFER_SIZE) ) )
+ buf1 = grub_malloc (BUFFER_SIZE);
+ buf2 = grub_malloc (BUFFER_SIZE);
+
+ if (! buf1 || ! buf2)
goto cleanup;
+
do
{
int i;
+
rd1 = grub_file_read (file1, buf1, BUFFER_SIZE);
rd2 = grub_file_read (file2, buf2, BUFFER_SIZE);
@@ -75,7 +78,7 @@
{
if (buf1[i] != buf2[i])
{
- grub_printf ("Differ at the offset %d: 0x%x [%s], 0x%x
[%s]\n",
+ grub_printf ("Differ at the offset %llu: 0x%x [%s], 0x%x
[%s]\n",
i + pos, buf1[i], args[0],
buf2[i], args[1]);
goto cleanup;
@@ -83,12 +86,14 @@
}
pos += BUFFER_SIZE;
- } while (rd2);
+ }
+ while (rd2);
+
grub_printf ("The files are identical.\n");
}
cleanup:
- err=grub_errno;
+
if (buf1)
grub_free (buf1);
if (buf2)
@@ -98,7 +103,7 @@
if (file2)
grub_file_close (file2);
- return err;
+ return grub_errno;
}
Index: commands/configfile.c
===================================================================
RCS file: /cvsroot/grub/grub2/commands/configfile.c,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -b -r1.5 -r1.6
--- commands/configfile.c 30 Apr 2006 20:48:05 -0000 1.5
+++ commands/configfile.c 4 Jun 2006 15:56:54 -0000 1.6
@@ -23,6 +23,7 @@
#include <grub/arg.h>
#include <grub/term.h>
#include <grub/misc.h>
+#include <grub/env.h>
static grub_err_t
grub_cmd_configfile (struct grub_arg_list *state __attribute__ ((unused)),
Index: commands/ls.c
===================================================================
RCS file: /cvsroot/grub/grub2/commands/ls.c,v
retrieving revision 1.13
retrieving revision 1.14
diff -u -b -r1.13 -r1.14
--- commands/ls.c 13 Nov 2005 15:47:08 -0000 1.13
+++ commands/ls.c 4 Jun 2006 15:56:54 -0000 1.14
@@ -106,7 +106,7 @@
}
if (! human)
- grub_printf ("%-12d", file->size);
+ grub_printf ("%-12llu", file->size);
else
{
float fsize = file->size;
@@ -127,7 +127,7 @@
grub_printf ("%-12s", buf);
}
else
- grub_printf ("%-12d", file->size);
+ grub_printf ("%-12llu", file->size);
}
grub_file_close (file);
Index: commands/i386/pc/play.c
===================================================================
RCS file: /cvsroot/grub/grub2/commands/i386/pc/play.c,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -b -r1.1 -r1.2
--- commands/i386/pc/play.c 3 Dec 2005 16:18:27 -0000 1.1
+++ commands/i386/pc/play.c 4 Jun 2006 15:56:54 -0000 1.2
@@ -27,6 +27,7 @@
#include <grub/disk.h>
#include <grub/term.h>
#include <grub/misc.h>
+#include <grub/machine/time.h>
#define BASE_TEMPO 120
Index: disk/loopback.c
===================================================================
RCS file: /cvsroot/grub/grub2/disk/loopback.c,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -b -r1.3 -r1.4
--- disk/loopback.c 13 Nov 2005 15:47:09 -0000 1.3
+++ disk/loopback.c 4 Jun 2006 15:56:54 -0000 1.4
@@ -1,7 +1,7 @@
/* loopback.c - command to add loopback devices. */
/*
* GRUB -- GRand Unified Bootloader
- * Copyright (C) 2005 Free Software Foundation, Inc.
+ * Copyright (C) 2005,2006 Free Software Foundation, Inc.
*
* GRUB is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -53,10 +53,12 @@
/* Search for the device. */
for (dev = loopback_list, prev = &loopback_list;
- dev; prev = &dev->next, dev = dev->next)
- if (!grub_strcmp (dev->devname, name))
+ dev;
+ prev = &dev->next, dev = dev->next)
+ if (grub_strcmp (dev->devname, name) == 0)
break;
- if (!dev)
+
+ if (! dev)
return grub_error (GRUB_ERR_BAD_DEVICE, "Device not found");
/* Remove the device from the list. */
@@ -96,12 +98,13 @@
/* First try to replace the old device. */
for (newdev = loopback_list; newdev; newdev = newdev->next)
- if (!grub_strcmp (newdev->devname, args[0]))
+ if (grub_strcmp (newdev->devname, args[0]) == 0)
break;
+
if (newdev)
{
char *newname = grub_strdup (args[1]);
- if (!newname)
+ if (! newname)
return grub_errno;
grub_free (newdev->filename);
@@ -115,18 +118,18 @@
/* Unable to replace it, make a new entry. */
newdev = grub_malloc (sizeof (struct grub_loopback));
- if (!newdev)
+ if (! newdev)
return grub_errno;
newdev->devname = grub_strdup (args[0]);
- if (!newdev->devname)
+ if (! newdev->devname)
{
grub_free (newdev);
return grub_errno;
}
newdev->filename = grub_strdup (args[1]);
- if (!newdev->devname)
+ if (! newdev->filename)
{
grub_free (newdev->devname);
grub_free (newdev);
@@ -163,7 +166,7 @@
struct grub_loopback *dev;
for (dev = loopback_list; dev; dev = dev->next)
- if (!grub_strcmp (dev->devname, name))
+ if (grub_strcmp (dev->devname, name) == 0)
break;
if (! dev)
@@ -193,26 +196,26 @@
}
static grub_err_t
-grub_loopback_read (grub_disk_t disk, unsigned long sector,
- unsigned long size, char *buf)
+grub_loopback_read (grub_disk_t disk, grub_disk_addr_t sector,
+ grub_size_t size, char *buf)
{
grub_file_t file = (grub_file_t) disk->data;
- long pos;
+ grub_off_t pos;
- grub_file_seek (file, sector * GRUB_DISK_SECTOR_SIZE);
+ grub_file_seek (file, sector << GRUB_DISK_SECTOR_BITS);
- grub_file_read (file, buf, size * GRUB_DISK_SECTOR_SIZE);
+ grub_file_read (file, buf, size << GRUB_DISK_SECTOR_BITS);
if (grub_errno)
return grub_errno;
/* In case there is more data read than there is available, in case
of files that are not a multiple of GRUB_DISK_SECTOR_SIZE, fill
the rest with zeros. */
- pos = sector * GRUB_DISK_SECTOR_SIZE + size * GRUB_DISK_SECTOR_SIZE;
+ pos = (sector + size) << GRUB_DISK_SECTOR_BITS;
if (pos > file->size)
{
- unsigned long amount = pos - file->size;
- grub_memset (buf + pos - amount, amount, 0);
+ grub_size_t amount = pos - file->size;
+ grub_memset (buf + size - amount, 0, amount);
}
return 0;
@@ -220,8 +223,8 @@
static grub_err_t
grub_loopback_write (grub_disk_t disk __attribute ((unused)),
- unsigned long sector __attribute ((unused)),
- unsigned long size __attribute ((unused)),
+ grub_disk_addr_t sector __attribute ((unused)),
+ grub_size_t size __attribute ((unused)),
const char *buf __attribute ((unused)))
{
return GRUB_ERR_NOT_IMPLEMENTED_YET;
@@ -243,7 +246,7 @@
GRUB_MOD_INIT(loop)
{
- (void)mod; /* To stop warning. */
+ (void) mod; /* To stop warning. */
grub_register_command ("loopback", grub_cmd_loopback, GRUB_COMMAND_FLAG_BOTH,
"loopback [-d|-p] DEVICENAME FILE",
"Make a device of a file.", options);
@@ -255,4 +258,3 @@
grub_unregister_command ("loopback");
grub_disk_dev_unregister (&grub_loopback_dev);
}
-
Index: disk/efi/efidisk.c
===================================================================
RCS file: /cvsroot/grub/grub2/disk/efi/efidisk.c,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -b -r1.3 -r1.4
--- disk/efi/efidisk.c 30 Apr 2006 21:09:37 -0000 1.3
+++ disk/efi/efidisk.c 4 Jun 2006 15:56:54 -0000 1.4
@@ -558,8 +558,8 @@
}
static grub_err_t
-grub_efidisk_read (struct grub_disk *disk, unsigned long sector,
- unsigned long size, char *buf)
+grub_efidisk_read (struct grub_disk *disk, grub_disk_addr_t sector,
+ grub_size_t size, char *buf)
{
/* For now, use the disk io interface rather than the block io's. */
struct grub_efidisk_data *d;
@@ -571,7 +571,8 @@
dio = d->disk_io;
bio = d->block_io;
- grub_dprintf ("efidisk", "reading 0x%lx sectors at the sector 0x%lx from
%s\n",
+ grub_dprintf ("efidisk",
+ "reading 0x%x sectors at the sector 0x%llx from %s\n",
size, sector, disk->name);
status = dio->read (dio, bio->media->media_id,
@@ -585,8 +586,8 @@
}
static grub_err_t
-grub_efidisk_write (struct grub_disk *disk, unsigned long sector,
- unsigned long size, const char *buf)
+grub_efidisk_write (struct grub_disk *disk, grub_disk_addr_t sector,
+ grub_size_t size, const char *buf)
{
/* For now, use the disk io interface rather than the block io's. */
struct grub_efidisk_data *d;
@@ -598,7 +599,8 @@
dio = d->disk_io;
bio = d->block_io;
- grub_dprintf ("efidisk", "writing 0x%lx sectors at the sector 0x%lx to %s\n",
+ grub_dprintf ("efidisk",
+ "writing 0x%x sectors at the sector 0x%llx to %s\n",
size, sector, disk->name);
status = dio->write (dio, bio->media->media_id,
Index: disk/i386/pc/biosdisk.c
===================================================================
RCS file: /cvsroot/grub/grub2/disk/i386/pc/biosdisk.c,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -b -r1.7 -r1.8
--- disk/i386/pc/biosdisk.c 15 Feb 2005 00:07:01 -0000 1.7
+++ disk/i386/pc/biosdisk.c 4 Jun 2006 15:56:54 -0000 1.8
@@ -1,6 +1,6 @@
/*
* GRUB -- GRand Unified Bootloader
- * Copyright (C) 1999,2000,2001,2002,2003,2004,2005 Free Software
Foundation, Inc.
+ * Copyright (C) 1999,2000,2001,2002,2003,2004,2005,2006 Free Software
Foundation, Inc.
*
* GRUB is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -126,7 +126,7 @@
static grub_err_t
grub_biosdisk_open (const char *name, grub_disk_t disk)
{
- unsigned long total_sectors = 0;
+ grub_uint64_t total_sectors = 0;
int drive;
struct grub_biosdisk_data *data;
@@ -158,13 +158,12 @@
/* Clear out the DRP. */
grub_memset (drp, 0, sizeof (*drp));
drp->size = sizeof (*drp);
- if (!grub_biosdisk_get_diskinfo_int13_extensions (drive, drp))
+ if (! grub_biosdisk_get_diskinfo_int13_extensions (drive, drp))
{
data->flags = GRUB_BIOSDISK_FLAG_LBA;
- /* FIXME: 2TB limit. */
if (drp->total_sectors)
- total_sectors = drp->total_sectors & ~0L;
+ total_sectors = drp->total_sectors;
else
/* Some buggy BIOSes doesn't return the total sectors
correctly but returns zero. So if it is zero, compute
@@ -204,7 +203,7 @@
static grub_err_t
grub_biosdisk_rw (int cmd, grub_disk_t disk,
- unsigned long sector, unsigned long size,
+ grub_disk_addr_t sector, grub_size_t size,
unsigned segment)
{
struct grub_biosdisk_data *data = disk->data;
@@ -234,9 +233,15 @@
{
unsigned coff, hoff, soff;
unsigned head;
+ unsigned real_sector = (unsigned) sector;
- soff = sector % data->sectors + 1;
- head = sector / data->sectors;
+ /* It is impossible to reach over 2TB with the traditional
+ CHS access. */
+ if (sector > ~0UL)
+ return grub_error (GRUB_ERR_OUT_OF_RANGE, "out of disk");
+
+ soff = real_sector % data->sectors + 1;
+ head = real_sector / data->sectors;
hoff = head % data->heads;
coff = head / data->heads;
@@ -259,17 +264,36 @@
return GRUB_ERR_NONE;
}
+/* Return the number of sectors which can be read safely at a time. */
+static grub_size_t
+get_safe_sectors (grub_disk_addr_t sector, grub_uint32_t sectors)
+{
+ grub_size_t size;
+ grub_uint32_t offset;
+
+ /* OFFSET = SECTOR % SECTORS */
+ grub_divmod64 (sector, sectors, &offset);
+
+ size = sectors - offset;
+
+ /* Limit the max to 0x7f because of Phoenix EDD. */
+ if (size > 0x7f)
+ size = 0x7f;
+
+ return size;
+}
+
static grub_err_t
-grub_biosdisk_read (grub_disk_t disk, unsigned long sector,
- unsigned long size, char *buf)
+grub_biosdisk_read (grub_disk_t disk, grub_disk_addr_t sector,
+ grub_size_t size, char *buf)
{
struct grub_biosdisk_data *data = disk->data;
while (size)
{
- unsigned long len;
+ grub_size_t len;
- len = data->sectors - (sector % data->sectors);
+ len = get_safe_sectors (sector, data->sectors);
if (len > size)
len = size;
@@ -288,16 +312,16 @@
}
static grub_err_t
-grub_biosdisk_write (grub_disk_t disk, unsigned long sector,
- unsigned long size, const char *buf)
+grub_biosdisk_write (grub_disk_t disk, grub_disk_addr_t sector,
+ grub_size_t size, const char *buf)
{
struct grub_biosdisk_data *data = disk->data;
while (size)
{
- unsigned long len;
+ grub_size_t len;
- len = data->sectors - (sector % data->sectors);
+ len = get_safe_sectors (sector, data->sectors);
if (len > size)
len = size;
Index: disk/ieee1275/ofdisk.c
===================================================================
RCS file: /cvsroot/grub/grub2/disk/ieee1275/ofdisk.c,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -b -r1.2 -r1.3
--- disk/ieee1275/ofdisk.c 21 Aug 2005 18:42:53 -0000 1.2
+++ disk/ieee1275/ofdisk.c 4 Jun 2006 15:56:54 -0000 1.3
@@ -1,7 +1,7 @@
/* ofdisk.c - Open Firmware disk access. */
/*
* GRUB -- GRand Unified Bootloader
- * Copyright (C) 2004 Free Software Foundation, Inc.
+ * Copyright (C) 2004,2006 Free Software Foundation, Inc.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -122,35 +122,37 @@
}
static grub_err_t
-grub_ofdisk_read (grub_disk_t disk, unsigned long sector,
- unsigned long size, char *buf)
+grub_ofdisk_read (grub_disk_t disk, grub_disk_addr_t sector,
+ grub_size_t size, char *buf)
{
grub_ssize_t status, actual;
unsigned long long pos;
grub_dprintf ("disk",
- "Reading handle %p: sector 0x%lx, size 0x%lx, buf %p.\n",
+ "Reading handle %p: sector 0x%llx, size 0x%lx, buf %p.\n",
(void *) disk->data, sector, size, buf);
- pos = (unsigned long long) sector * 512UL;
+ pos = sector * 512UL;
grub_ieee1275_seek ((grub_ieee1275_ihandle_t) disk->data, (int) (pos >> 32),
(int) pos & 0xFFFFFFFFUL, &status);
if (status != 0)
return grub_error (GRUB_ERR_READ_ERROR,
- "Seek error, can't seek block %d", sector);
+ "Seek error, can't seek block %llu",
+ sector);
grub_ieee1275_read ((grub_ieee1275_ihandle_t) disk->data, buf,
size * 512UL, &actual);
if (actual != actual)
- return grub_error (GRUB_ERR_READ_ERROR, "Read error on block: %d", sector);
+ return grub_error (GRUB_ERR_READ_ERROR, "Read error on block: %llu",
+ sector);
return 0;
}
static grub_err_t
grub_ofdisk_write (grub_disk_t disk __attribute ((unused)),
- unsigned long sector __attribute ((unused)),
- unsigned long size __attribute ((unused)),
+ grub_disk_addr_t sector __attribute ((unused)),
+ grub_size_t size __attribute ((unused)),
const char *buf __attribute ((unused)))
{
return GRUB_ERR_NOT_IMPLEMENTED_YET;
Index: font/manager.c
===================================================================
RCS file: /cvsroot/grub/grub2/font/manager.c,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -b -r1.8 -r1.9
--- font/manager.c 31 Mar 2006 13:32:52 -0000 1.8
+++ font/manager.c 4 Jun 2006 15:56:54 -0000 1.9
@@ -207,7 +207,7 @@
}
if (bitmap
- && (grub_file_read (font->file, bitmap, w * 16)
+ && (grub_file_read (font->file, (char *) bitmap, w * 16)
!= (grub_ssize_t) w * 16))
{
remove_font (font);
Index: fs/affs.c
===================================================================
RCS file: /cvsroot/grub/grub2/fs/affs.c,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -b -r1.3 -r1.4
--- fs/affs.c 26 Apr 2006 21:58:35 -0000 1.3
+++ fs/affs.c 4 Jun 2006 15:56:54 -0000 1.4
@@ -1,7 +1,7 @@
/* affs.c - Amiga Fast FileSystem. */
/*
* GRUB -- GRand Unified Bootloader
- * Copyright (C) 2005 Free Software Foundation, Inc.
+ * Copyright (C) 2005,2006 Free Software Foundation, Inc.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -150,9 +150,9 @@
POS. Return the amount of read bytes in READ. */
static grub_ssize_t
grub_affs_read_file (grub_fshelp_node_t node,
- void (*read_hook) (unsigned long sector,
+ void (*read_hook) (grub_disk_addr_t sector,
unsigned offset, unsigned length),
- int pos, unsigned int len, char *buf)
+ int pos, grub_size_t len, char *buf)
{
return grub_fshelp_read_file (node->data->disk, node, read_hook,
pos, len, buf, grub_affs_read_block,
@@ -439,7 +439,7 @@
/* Read LEN bytes data from FILE into BUF. */
static grub_ssize_t
-grub_affs_read (grub_file_t file, char *buf, grub_ssize_t len)
+grub_affs_read (grub_file_t file, char *buf, grub_size_t len)
{
struct grub_affs_data *data =
(struct grub_affs_data *) file->data;
Index: fs/ext2.c
===================================================================
RCS file: /cvsroot/grub/grub2/fs/ext2.c,v
retrieving revision 1.12
retrieving revision 1.13
diff -u -b -r1.12 -r1.13
--- fs/ext2.c 13 Nov 2005 15:47:09 -0000 1.12
+++ fs/ext2.c 4 Jun 2006 15:56:54 -0000 1.13
@@ -241,7 +241,7 @@
{
grub_error (GRUB_ERR_NOT_IMPLEMENTED_YET,
"ext2fs doesn't support tripple indirect blocks");
- return grub_errno;
+ blknr = -1;
}
return blknr;
@@ -252,9 +252,9 @@
POS. Return the amount of read bytes in READ. */
static grub_ssize_t
grub_ext2_read_file (grub_fshelp_node_t node,
- void (*read_hook) (unsigned long sector,
+ void (*read_hook) (grub_disk_addr_t sector,
unsigned offset, unsigned length),
- int pos, unsigned int len, char *buf)
+ int pos, grub_size_t len, char *buf)
{
return grub_fshelp_read_file (node->data->disk, node, read_hook,
pos, len, buf, grub_ext2_read_block,
@@ -534,7 +534,7 @@
/* Read LEN bytes data from FILE into BUF. */
static grub_ssize_t
-grub_ext2_read (grub_file_t file, char *buf, grub_ssize_t len)
+grub_ext2_read (grub_file_t file, char *buf, grub_size_t len)
{
struct grub_ext2_data *data =
(struct grub_ext2_data *) file->data;
Index: fs/fat.c
===================================================================
RCS file: /cvsroot/grub/grub2/fs/fat.c,v
retrieving revision 1.14
retrieving revision 1.15
diff -u -b -r1.14 -r1.15
--- fs/fat.c 26 Apr 2006 21:58:35 -0000 1.14
+++ fs/fat.c 4 Jun 2006 15:56:54 -0000 1.15
@@ -310,11 +310,11 @@
static grub_ssize_t
grub_fat_read_data (grub_disk_t disk, struct grub_fat_data *data,
- void (*read_hook) (unsigned long sector,
+ void (*read_hook) (grub_disk_addr_t sector,
unsigned offset, unsigned length),
- grub_ssize_t offset, grub_ssize_t len, char *buf)
+ grub_off_t offset, grub_size_t len, char *buf)
{
- grub_ssize_t size;
+ grub_size_t size;
grub_uint32_t logical_cluster;
unsigned logical_cluster_bits;
grub_ssize_t ret = 0;
@@ -716,7 +716,7 @@
}
static grub_ssize_t
-grub_fat_read (grub_file_t file, char *buf, grub_ssize_t len)
+grub_fat_read (grub_file_t file, char *buf, grub_size_t len)
{
return grub_fat_read_data (file->device->disk, file->data, file->read_hook,
file->offset, len, buf);
Index: fs/fshelp.c
===================================================================
RCS file: /cvsroot/grub/grub2/fs/fshelp.c,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -b -r1.5 -r1.6
--- fs/fshelp.c 25 Dec 2005 15:59:50 -0000 1.5
+++ fs/fshelp.c 4 Jun 2006 15:56:54 -0000 1.6
@@ -1,7 +1,7 @@
/* fshelp.c -- Filesystem helper functions */
/*
* GRUB -- GRand Unified Bootloader
- * Copyright (C) 2004, 2005 Free Software Foundation, Inc.
+ * Copyright (C) 2004,2005,2006 Free Software Foundation, Inc.
*
* GRUB is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -222,11 +222,11 @@
blocks have a size of LOG2BLOCKSIZE (in log2). */
grub_ssize_t
grub_fshelp_read_file (grub_disk_t disk, grub_fshelp_node_t node,
- void (*read_hook) (unsigned long sector,
+ void (*read_hook) (grub_disk_addr_t sector,
unsigned offset, unsigned length),
- int pos, unsigned int len, char *buf,
+ int pos, grub_size_t len, char *buf,
int (*get_block) (grub_fshelp_node_t node, int block),
- unsigned int filesize, int log2blocksize)
+ grub_off_t filesize, int log2blocksize)
{
int i;
int blockcnt;
Index: fs/hfs.c
===================================================================
RCS file: /cvsroot/grub/grub2/fs/hfs.c,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -b -r1.6 -r1.7
--- fs/hfs.c 26 Apr 2006 21:58:35 -0000 1.6
+++ fs/hfs.c 4 Jun 2006 15:56:54 -0000 1.7
@@ -229,9 +229,9 @@
POS. Return the amount of read bytes in READ. */
static grub_ssize_t
grub_hfs_read_file (struct grub_hfs_data *data,
- void (*read_hook) (unsigned long sector,
+ void (*read_hook) (grub_disk_addr_t sector,
unsigned offset, unsigned length),
- int pos, unsigned int len, char *buf)
+ int pos, grub_size_t len, char *buf)
{
int i;
int blockcnt;
@@ -261,7 +261,7 @@
blockend = (len + pos) % data->blksz;
/* The last portion is exactly EXT2_BLOCK_SIZE (data). */
- if (!blockend)
+ if (! blockend)
blockend = data->blksz;
}
@@ -804,7 +804,7 @@
}
static grub_ssize_t
-grub_hfs_read (grub_file_t file, char *buf, grub_ssize_t len)
+grub_hfs_read (grub_file_t file, char *buf, grub_size_t len)
{
struct grub_hfs_data *data =
(struct grub_hfs_data *) file->data;
Index: fs/hfsplus.c
===================================================================
RCS file: /cvsroot/grub/grub2/fs/hfsplus.c,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -b -r1.7 -r1.8
--- fs/hfsplus.c 28 May 2006 03:20:17 -0000 1.7
+++ fs/hfsplus.c 4 Jun 2006 15:56:54 -0000 1.8
@@ -357,9 +357,9 @@
POS. Return the amount of read bytes in READ. */
static grub_ssize_t
grub_hfsplus_read_file (grub_fshelp_node_t node,
- void (*read_hook) (unsigned long sector,
+ void (*read_hook) (grub_disk_addr_t sector,
unsigned offset, unsigned length),
- int pos, unsigned int len, char *buf)
+ int pos, grub_size_t len, char *buf)
{
return grub_fshelp_read_file (node->data->disk, node, read_hook,
pos, len, buf, grub_hfsplus_read_block,
@@ -865,7 +865,7 @@
/* Read LEN bytes data from FILE into BUF. */
static grub_ssize_t
-grub_hfsplus_read (grub_file_t file, char *buf, grub_ssize_t len)
+grub_hfsplus_read (grub_file_t file, char *buf, grub_size_t len)
{
struct grub_hfsplus_data *data =
(struct grub_hfsplus_data *) file->data;
Index: fs/iso9660.c
===================================================================
RCS file: /cvsroot/grub/grub2/fs/iso9660.c,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -b -r1.2 -r1.3
--- fs/iso9660.c 13 Nov 2005 15:47:09 -0000 1.2
+++ fs/iso9660.c 4 Jun 2006 15:56:54 -0000 1.3
@@ -2,7 +2,7 @@
SUSP, Rock Ridge. */
/*
* GRUB -- GRand Unified Bootloader
- * Copyright (C) 2004, 2005 Free Software Foundation, Inc.
+ * Copyright (C) 2004,2005,2006 Free Software Foundation, Inc.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -169,11 +169,11 @@
((char *) entry + entry->len))
{
/* The last entry. */
- if (!grub_strncmp (entry->sig, "ST", 2))
+ if (grub_strncmp ((char *) entry->sig, "ST", 2) == 0)
break;
/* Additional entries are stored elsewhere. */
- if (!grub_strncmp (entry->sig, "CE", 2))
+ if (grub_strncmp ((char *) entry->sig, "CE", 2) == 0)
{
struct grub_iso9660_susp_ce *ce;
@@ -215,7 +215,7 @@
{
/* The "ER" entry is used to detect extensions. The
`IEEE_P1285' extension means Rock ridge. */
- if (!grub_strncmp (susp_entry->sig, "ER", 2))
+ if (grub_strncmp ((char *) susp_entry->sig, "ER", 2) == 0)
{
data->rockridge = 1;
return 1;
@@ -224,7 +224,7 @@
}
data = grub_malloc (sizeof (struct grub_iso9660_data));
- if (!data)
+ if (! data)
return 0;
/* Read the superblock. */
@@ -236,7 +236,7 @@
goto fail;
}
- if (grub_strncmp (data->voldesc.voldesc.magic, "CD001", 5))
+ if (grub_strncmp ((char *) data->voldesc.voldesc.magic, "CD001", 5) == 0)
{
grub_error (GRUB_ERR_BAD_FS, "not a iso9660 filesystem");
goto fail;
@@ -282,7 +282,7 @@
entry = (struct grub_iso9660_susp_entry *) sua;
/* Test if the SUSP protocol is used on this filesystem. */
- if (!grub_strncmp (entry->sig, "SP", 2))
+ if (grub_strncmp ((char *) entry->sig, "SP", 2) == 0)
{
/* The 2nd data byte stored how many bytes are skipped everytime
to get to the SUA (System Usage Area). */
@@ -324,17 +324,16 @@
int size = grub_strlen (symlink);
symlink = grub_realloc (symlink, size + len + 1);
- if (!symlink)
+ if (! symlink)
return;
- grub_strncat (symlink, part, len);
- return;
+ grub_strncat (symlink, part, len);
}
/* Read in a symlink. */
grub_err_t susp_iterate_sl (struct grub_iso9660_susp_entry *entry)
{
- if (!grub_strncmp ("SL", entry->sig, 2))
+ if (grub_strncmp ("SL", (char *) entry->sig, 2) == 0)
{
unsigned int pos = 1;
@@ -355,7 +354,7 @@
/* The data on pos + 2 is the actual data, pos + 1
is the length. Both are part of the `Component
Record'. */
- add_part (&entry->data[pos + 2],
+ add_part ((char *) &entry->data[pos + 2],
entry->data[pos + 1]);
if ((entry->data[pos] & 1))
addslash = 1;
@@ -432,7 +431,7 @@
grub_err_t susp_iterate_dir (struct grub_iso9660_susp_entry *entry)
{
/* The filename in the rock ridge entry. */
- if (!grub_strncmp ("NM", entry->sig, 2))
+ if (grub_strncmp ("NM", (char *) entry->sig, 2) == 0)
{
/* The flags are stored at the data position 0, here the
filename type is stored. */
@@ -457,12 +456,12 @@
filename[0] = '\0';
}
filename_alloc = 1;
- grub_strncpy (filename, &entry->data[1], size);
- filename [size] = '\0';
+ grub_strncpy (filename, (char *) &entry->data[1], size);
+ filename[size] = '\0';
}
}
/* The mode information (st_mode). */
- else if (!grub_strncmp (entry->sig, "PX", 2))
+ else if (grub_strncmp ((char *) entry->sig, "PX", 2) == 0)
{
/* At position 0 of the PX record the st_mode information is
stored. */
@@ -704,7 +703,7 @@
static grub_ssize_t
-grub_iso9660_read (grub_file_t file, char *buf, grub_ssize_t len)
+grub_iso9660_read (grub_file_t file, char *buf, grub_size_t len)
{
struct grub_iso9660_data *data =
(struct grub_iso9660_data *) file->data;
@@ -742,7 +741,7 @@
if (data)
{
- *label = grub_strndup (data->voldesc.volname, 32);
+ *label = grub_strndup ((char *) data->voldesc.volname, 32);
grub_free (data);
}
else
Index: fs/jfs.c
===================================================================
RCS file: /cvsroot/grub/grub2/fs/jfs.c,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -b -r1.4 -r1.5
--- fs/jfs.c 26 Apr 2006 21:58:35 -0000 1.4
+++ fs/jfs.c 4 Jun 2006 15:56:54 -0000 1.5
@@ -1,7 +1,7 @@
/* jfs.c - JFS. */
/*
* GRUB -- GRand Unified Bootloader
- * Copyright (C) 2004, 2005 Free Software Foundation, Inc.
+ * Copyright (C) 2004,2005,2006 Free Software Foundation, Inc.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -540,9 +540,9 @@
POS. Return the amount of read bytes in READ. */
static grub_ssize_t
grub_jfs_read_file (struct grub_jfs_data *data,
- void (*read_hook) (unsigned long sector,
+ void (*read_hook) (grub_disk_addr_t sector,
unsigned offset, unsigned length),
- int pos, unsigned int len, char *buf)
+ int pos, grub_size_t len, char *buf)
{
int i;
int blockcnt;
@@ -822,7 +822,7 @@
static grub_ssize_t
-grub_jfs_read (grub_file_t file, char *buf, grub_ssize_t len)
+grub_jfs_read (grub_file_t file, char *buf, grub_size_t len)
{
struct grub_jfs_data *data =
(struct grub_jfs_data *) file->data;
Index: fs/minix.c
===================================================================
RCS file: /cvsroot/grub/grub2/fs/minix.c,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -b -r1.4 -r1.5
--- fs/minix.c 13 Nov 2005 15:47:09 -0000 1.4
+++ fs/minix.c 4 Jun 2006 15:56:54 -0000 1.5
@@ -1,7 +1,7 @@
/* minix.c - The minix filesystem, version 1 and 2. */
/*
* GRUB -- GRand Unified Bootloader
- * Copyright (C) 2004, 2005 Free Software Foundation, Inc.
+ * Copyright (C) 2004,2005,2006 Free Software Foundation, Inc.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -187,9 +187,9 @@
POS. Return the amount of read bytes in READ. */
static grub_ssize_t
grub_minix_read_file (struct grub_minix_data *data,
- void (*read_hook) (unsigned long sector,
+ void (*read_hook) (grub_disk_addr_t sector,
unsigned offset, unsigned length),
- int pos, unsigned int len, char *buf)
+ int pos, grub_disk_addr_t len, char *buf)
{
struct grub_minix_sblock *sblock = &data->sblock;
int i;
@@ -560,7 +560,7 @@
static grub_ssize_t
-grub_minix_read (grub_file_t file, char *buf, grub_ssize_t len)
+grub_minix_read (grub_file_t file, char *buf, grub_size_t len)
{
struct grub_minix_data *data =
(struct grub_minix_data *) file->data;
Index: fs/sfs.c
===================================================================
RCS file: /cvsroot/grub/grub2/fs/sfs.c,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -b -r1.4 -r1.5
--- fs/sfs.c 26 Apr 2006 21:58:35 -0000 1.4
+++ fs/sfs.c 4 Jun 2006 15:56:54 -0000 1.5
@@ -1,7 +1,7 @@
/* sfs.c - Amiga Smart FileSystem. */
/*
* GRUB -- GRand Unified Bootloader
- * Copyright (C) 2005 Free Software Foundation, Inc.
+ * Copyright (C) 2005,2006 Free Software Foundation, Inc.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -259,9 +259,9 @@
POS. Return the amount of read bytes in READ. */
static grub_ssize_t
grub_sfs_read_file (grub_fshelp_node_t node,
- void (*read_hook) (unsigned long sector,
+ void (*read_hook) (grub_disk_addr_t sector,
unsigned offset, unsigned length),
- int pos, unsigned int len, char *buf)
+ int pos, grub_size_t len, char *buf)
{
return grub_fshelp_read_file (node->data->disk, node, read_hook,
pos, len, buf, grub_sfs_read_block,
@@ -512,7 +512,7 @@
/* Read LEN bytes data from FILE into BUF. */
static grub_ssize_t
-grub_sfs_read (grub_file_t file, char *buf, grub_ssize_t len)
+grub_sfs_read (grub_file_t file, char *buf, grub_size_t len)
{
struct grub_sfs_data *data = (struct grub_sfs_data *) file->data;
Index: fs/ufs.c
===================================================================
RCS file: /cvsroot/grub/grub2/fs/ufs.c,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -b -r1.5 -r1.6
--- fs/ufs.c 26 Apr 2006 21:58:35 -0000 1.5
+++ fs/ufs.c 4 Jun 2006 15:56:54 -0000 1.6
@@ -241,9 +241,9 @@
POS. Return the amount of read bytes in READ. */
static grub_ssize_t
grub_ufs_read_file (struct grub_ufs_data *data,
- void (*read_hook) (unsigned long sector,
+ void (*read_hook) (grub_disk_addr_t sector,
unsigned offset, unsigned length),
- int pos, unsigned int len, char *buf)
+ int pos, grub_size_t len, char *buf)
{
struct grub_ufs_sblock *sblock = &data->sblock;
int i;
@@ -631,7 +631,7 @@
static grub_ssize_t
-grub_ufs_read (grub_file_t file, char *buf, grub_ssize_t len)
+grub_ufs_read (grub_file_t file, char *buf, grub_size_t len)
{
struct grub_ufs_data *data =
(struct grub_ufs_data *) file->data;
Index: fs/xfs.c
===================================================================
RCS file: /cvsroot/grub/grub2/fs/xfs.c,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -b -r1.7 -r1.8
--- fs/xfs.c 26 Apr 2006 21:58:35 -0000 1.7
+++ fs/xfs.c 4 Jun 2006 15:56:54 -0000 1.8
@@ -1,7 +1,7 @@
/* xfs.c - XFS. */
/*
* GRUB -- GRand Unified Bootloader
- * Copyright (C) 2005 Free Software Foundation, Inc.
+ * Copyright (C) 2005,2006 Free Software Foundation, Inc.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -237,9 +237,9 @@
POS. Return the amount of read bytes in READ. */
static grub_ssize_t
grub_xfs_read_file (grub_fshelp_node_t node,
- void (*read_hook) (unsigned long sector,
+ void (*read_hook) (grub_disk_addr_t sector,
unsigned offset, unsigned length),
- int pos, unsigned int len, char *buf)
+ int pos, grub_size_t len, char *buf)
{
return grub_fshelp_read_file (node->data->disk, node, read_hook,
pos, len, buf, grub_xfs_read_block,
@@ -628,7 +628,7 @@
static grub_ssize_t
-grub_xfs_read (grub_file_t file, char *buf, grub_ssize_t len)
+grub_xfs_read (grub_file_t file, char *buf, grub_size_t len)
{
struct grub_xfs_data *data =
(struct grub_xfs_data *) file->data;
Index: include/grub/disk.h
===================================================================
RCS file: /cvsroot/grub/grub2/include/grub/disk.h,v
retrieving revision 1.9
retrieving revision 1.10
diff -u -b -r1.9 -r1.10
--- include/grub/disk.h 23 Apr 2006 13:37:36 -0000 1.9
+++ include/grub/disk.h 4 Jun 2006 15:56:54 -0000 1.10
@@ -56,12 +56,12 @@
void (*close) (struct grub_disk *disk);
/* Read SIZE sectors from the sector SECTOR of the disk DISK into BUF. */
- grub_err_t (*read) (struct grub_disk *disk, unsigned long sector,
- unsigned long size, char *buf);
+ grub_err_t (*read) (struct grub_disk *disk, grub_disk_addr_t sector,
+ grub_size_t size, char *buf);
/* Write SIZE sectors from BUF into the sector SECTOR of the disk DISK. */
- grub_err_t (*write) (struct grub_disk *disk, unsigned long sector,
- unsigned long size, const char *buf);
+ grub_err_t (*write) (struct grub_disk *disk, grub_disk_addr_t sector,
+ grub_size_t size, const char *buf);
/* The next disk device. */
struct grub_disk_dev *next;
@@ -80,7 +80,7 @@
grub_disk_dev_t dev;
/* The total number of sectors. */
- unsigned long total_sectors;
+ grub_uint64_t total_sectors;
/* If partitions can be stored. */
int has_partitions;
@@ -91,8 +91,10 @@
/* The partition information. This is machine-specific. */
struct grub_partition *partition;
- /* Called when a sector was read. */
- void (*read_hook) (unsigned long sector, unsigned offset, unsigned length);
+ /* Called when a sector was read. OFFSET is between 0 and
+ the sector size minus 1, and LENGTH is between 0 and the sector size. */
+ void (*read_hook) (grub_disk_addr_t sector,
+ unsigned offset, unsigned length);
/* Device-specific data. */
void *data;
@@ -120,14 +122,14 @@
grub_disk_t EXPORT_FUNC(grub_disk_open) (const char *name);
void EXPORT_FUNC(grub_disk_close) (grub_disk_t disk);
grub_err_t EXPORT_FUNC(grub_disk_read) (grub_disk_t disk,
- unsigned long sector,
- unsigned long offset,
- unsigned long size,
+ grub_disk_addr_t sector,
+ grub_off_t offset,
+ grub_size_t size,
char *buf);
grub_err_t EXPORT_FUNC(grub_disk_write) (grub_disk_t disk,
- unsigned long sector,
- unsigned long offset,
- unsigned long size,
+ grub_disk_addr_t sector,
+ grub_off_t offset,
+ grub_size_t size,
const char *buf);
Index: include/grub/file.h
===================================================================
RCS file: /cvsroot/grub/grub2/include/grub/file.h,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -b -r1.3 -r1.4
--- include/grub/file.h 4 Apr 2004 13:46:00 -0000 1.3
+++ include/grub/file.h 4 Jun 2006 15:56:54 -0000 1.4
@@ -35,16 +35,17 @@
grub_fs_t fs;
/* The current offset. */
- grub_ssize_t offset;
+ grub_off_t offset;
/* The file size. */
- grub_ssize_t size;
+ grub_off_t size;
/* Filesystem-specific data. */
void *data;
/* This is called when a sector is read. Used only for a disk device. */
- void (*read_hook) (unsigned long sector, unsigned offset, unsigned length);
+ void (*read_hook) (grub_disk_addr_t sector,
+ unsigned offset, unsigned length);
};
typedef struct grub_file *grub_file_t;
@@ -53,18 +54,17 @@
grub_file_t EXPORT_FUNC(grub_file_open) (const char *name);
grub_ssize_t EXPORT_FUNC(grub_file_read) (grub_file_t file, char *buf,
- grub_ssize_t len);
-grub_ssize_t EXPORT_FUNC(grub_file_seek) (grub_file_t file,
- grub_ssize_t offset);
+ grub_size_t len);
+grub_off_t EXPORT_FUNC(grub_file_seek) (grub_file_t file, grub_off_t offset);
grub_err_t EXPORT_FUNC(grub_file_close) (grub_file_t file);
-static inline grub_ssize_t
+static inline grub_off_t
grub_file_size (const grub_file_t file)
{
return file->size;
}
-static inline grub_ssize_t
+static inline grub_off_t
grub_file_tell (const grub_file_t file)
{
return file->offset;
Index: include/grub/fs.h
===================================================================
RCS file: /cvsroot/grub/grub2/include/grub/fs.h,v
retrieving revision 1.14
retrieving revision 1.15
diff -u -b -r1.14 -r1.15
--- include/grub/fs.h 9 Oct 2005 13:03:53 -0000 1.14
+++ include/grub/fs.h 4 Jun 2006 15:56:54 -0000 1.15
@@ -42,7 +42,7 @@
grub_err_t (*open) (struct grub_file *file, const char *name);
/* Read LEN bytes data from FILE into BUF. */
- grub_ssize_t (*read) (struct grub_file *file, char *buf, grub_ssize_t len);
+ grub_ssize_t (*read) (struct grub_file *file, char *buf, grub_size_t len);
/* Close the file FILE. */
grub_err_t (*close) (struct grub_file *file);
Index: include/grub/fshelp.h
===================================================================
RCS file: /cvsroot/grub/grub2/include/grub/fshelp.h,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -b -r1.2 -r1.3
--- include/grub/fshelp.h 25 Dec 2005 15:59:50 -0000 1.2
+++ include/grub/fshelp.h 4 Jun 2006 15:56:54 -0000 1.3
@@ -1,7 +1,7 @@
/* fshelp.h -- Filesystem helper functions */
/*
* GRUB -- GRand Unified Bootloader
- * Copyright (C) 2004, 2005 Free Software Foundation, Inc.
+ * Copyright (C) 2004,2005,2006 Free Software Foundation, Inc.
*
* GRUB is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -64,13 +64,13 @@
blocks have a size of LOG2BLOCKSIZE (in log2). */
grub_ssize_t
EXPORT_FUNC(grub_fshelp_read_file) (grub_disk_t disk, grub_fshelp_node_t node,
- void (*read_hook) (unsigned long sector,
+ void (*read_hook) (grub_disk_addr_t sector,
unsigned offset,
unsigned length),
- int pos, unsigned int len, char *buf,
+ int pos, grub_size_t len, char *buf,
int (*get_block) (grub_fshelp_node_t node,
int block),
- unsigned int filesize, int log2blocksize);
+ grub_off_t filesize, int log2blocksize);
unsigned int
EXPORT_FUNC(grub_fshelp_log2blksize) (unsigned int blksize,
Index: include/grub/misc.h
===================================================================
RCS file: /cvsroot/grub/grub2/include/grub/misc.h,v
retrieving revision 1.19
retrieving revision 1.20
diff -u -b -r1.19 -r1.20
--- include/grub/misc.h 23 Apr 2006 13:37:36 -0000 1.19
+++ include/grub/misc.h 4 Jun 2006 15:56:54 -0000 1.20
@@ -56,6 +56,7 @@
int EXPORT_FUNC(grub_isdigit) (int c);
int EXPORT_FUNC(grub_tolower) (int c);
unsigned long EXPORT_FUNC(grub_strtoul) (const char *str, char **end, int
base);
+unsigned long long EXPORT_FUNC(grub_strtoull) (const char *str, char **end,
int base);
char *EXPORT_FUNC(grub_strdup) (const char *s);
char *EXPORT_FUNC(grub_strndup) (const char *s, grub_size_t n);
void *EXPORT_FUNC(grub_memset) (void *s, int c, grub_size_t n);
@@ -76,6 +77,8 @@
grub_ssize_t EXPORT_FUNC(grub_utf8_to_ucs4) (grub_uint32_t *dest,
const grub_uint8_t *src,
grub_size_t size);
+grub_uint64_t EXPORT_FUNC(grub_divmod64) (grub_uint64_t n,
+ grub_uint32_t d, grub_uint32_t *r);
/* Inline functions. */
static inline unsigned int
Index: include/grub/partition.h
===================================================================
RCS file: /cvsroot/grub/grub2/include/grub/partition.h,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -b -r1.5 -r1.6
--- include/grub/partition.h 20 Aug 2005 07:49:01 -0000 1.5
+++ include/grub/partition.h 4 Jun 2006 15:56:54 -0000 1.6
@@ -1,6 +1,6 @@
/*
* GRUB -- GRand Unified Bootloader
- * Copyright (C) 1999,2000,2001,2002,2004 Free Software Foundation, Inc.
+ * Copyright (C) 1999,2000,2001,2002,2004,2006 Free Software Foundation, Inc.
*
* GRUB is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -34,7 +34,8 @@
/* Call HOOK with each partition, until HOOK returns non-zero. */
grub_err_t (*iterate) (struct grub_disk *disk,
- int (*hook) (struct grub_disk *disk, const
grub_partition_t partition));
+ int (*hook) (struct grub_disk *disk,
+ const grub_partition_t partition));
/* Return the partition named STR on the disk DISK. */
grub_partition_t (*probe) (struct grub_disk *disk,
@@ -52,13 +53,13 @@
struct grub_partition
{
/* The start sector. */
- unsigned long start;
+ grub_disk_addr_t start;
/* The length in sector units. */
- unsigned long len;
+ grub_uint64_t len;
/* The offset of the partition table. */
- unsigned long offset;
+ grub_disk_addr_t offset;
/* The index of this partition in the partition table. */
int index;
@@ -94,13 +95,13 @@
void grub_sun_partition_map_fini (void);
#endif
-static inline unsigned long
+static inline grub_disk_addr_t
grub_partition_get_start (const grub_partition_t p)
{
return p->start;
}
-static inline unsigned long
+static inline grub_uint64_t
grub_partition_get_len (const grub_partition_t p)
{
return p->len;
Index: include/grub/types.h
===================================================================
RCS file: /cvsroot/grub/grub2/include/grub/types.h,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -b -r1.8 -r1.9
--- include/grub/types.h 28 May 2006 23:01:43 -0000 1.8
+++ include/grub/types.h 4 Jun 2006 15:56:54 -0000 1.9
@@ -83,18 +83,19 @@
#if GRUB_CPU_SIZEOF_VOID_P == 8
typedef grub_uint64_t grub_addr_t;
-typedef grub_uint64_t grub_off_t;
typedef grub_uint64_t grub_size_t;
typedef grub_int64_t grub_ssize_t;
#else
typedef grub_uint32_t grub_addr_t;
-typedef grub_uint32_t grub_off_t;
typedef grub_uint32_t grub_size_t;
typedef grub_int32_t grub_ssize_t;
#endif
-/* FIXME: Will be grub_uint64_t */
-typedef unsigned long grub_disk_addr_t;
+/* The type for representing a file offset. */
+typedef grub_uint64_t grub_off_t;
+
+/* The type for representing a disk block address. */
+typedef grub_uint64_t grub_disk_addr_t;
/* Byte-orders. */
#define grub_swap_bytes16(x) \
Index: include/grub/i386/pc/boot.h
===================================================================
RCS file: /cvsroot/grub/grub2/include/grub/i386/pc/boot.h,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -b -r1.6 -r1.7
--- include/grub/i386/pc/boot.h 25 Dec 2005 19:40:31 -0000 1.6
+++ include/grub/i386/pc/boot.h 4 Jun 2006 15:56:54 -0000 1.7
@@ -1,6 +1,6 @@
/*
* GRUB -- GRand Unified Bootloader
- * Copyright (C) 1999,2000,2002,2005 Free Software Foundation, Inc.
+ * Copyright (C) 1999,2000,2002,2005,2006 Free Software Foundation, Inc.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -33,22 +33,19 @@
#define GRUB_BOOT_MACHINE_VER_MAJ 0x3e
/* The offset of BOOT_DRIVE. */
-#define GRUB_BOOT_MACHINE_BOOT_DRIVE 0x40
-
-/* The offset of FORCE_LBA. */
-#define GRUB_BOOT_MACHINE_FORCE_LBA 0x41
+#define GRUB_BOOT_MACHINE_BOOT_DRIVE 0x4c
/* The offset of KERNEL_ADDRESS. */
-#define GRUB_BOOT_MACHINE_KERNEL_ADDRESS 0x42
+#define GRUB_BOOT_MACHINE_KERNEL_ADDRESS 0x40
/* The offset of KERNEL_SECTOR. */
#define GRUB_BOOT_MACHINE_KERNEL_SECTOR 0x44
/* The offset of KERNEL_SEGMENT. */
-#define GRUB_BOOT_MACHINE_KERNEL_SEGMENT 0x48
+#define GRUB_BOOT_MACHINE_KERNEL_SEGMENT 0x42
/* The offset of BOOT_DRIVE_CHECK. */
-#define GRUB_BOOT_MACHINE_DRIVE_CHECK 0x4b
+#define GRUB_BOOT_MACHINE_DRIVE_CHECK 0x4e
/* The offset of a magic number used by Windows NT. */
#define GRUB_BOOT_MACHINE_WINDOWS_NT_MAGIC 0x1b8
@@ -77,6 +74,6 @@
#define GRUB_BOOT_MACHINE_KERNEL_ADDR (GRUB_BOOT_MACHINE_KERNEL_SEG << 4)
/* The size of a block list used in the kernel startup code. */
-#define GRUB_BOOT_MACHINE_LIST_SIZE 8
+#define GRUB_BOOT_MACHINE_LIST_SIZE 12
#endif /* ! BOOT_MACHINE_HEADER */
Index: io/gzio.c
===================================================================
RCS file: /cvsroot/grub/grub2/io/gzio.c,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -b -r1.3 -r1.4
--- io/gzio.c 19 Oct 2005 23:16:03 -0000 1.3
+++ io/gzio.c 4 Jun 2006 15:56:54 -0000 1.4
@@ -1,7 +1,7 @@
/* gzio.c - decompression support for gzip */
/*
* GRUB -- GRand Unified Bootloader
- * Copyright (C) 1999,2005 Free Software Foundation, Inc.
+ * Copyright (C) 1999,2005,2006 Free Software Foundation, Inc.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -60,7 +60,7 @@
/* The underlyding file object. */
grub_file_t file;
/* The offset at which the data starts in the underlyding file. */
- grub_ssize_t data_offset;
+ grub_off_t data_offset;
/* The type of current block. */
int block_type;
/* The length of current block. */
@@ -93,7 +93,7 @@
/* The lookup bits for the distance code table. */
int bd;
/* The original offset value. */
- grub_ssize_t saved_offset;
+ grub_off_t saved_offset;
};
typedef struct grub_gzio *grub_gzio_t;
@@ -176,7 +176,7 @@
* (other than a real error with the disk) then we don't think it
* is a compressed file, and simply mark it as such.
*/
- if (grub_file_read (gzio->file, buf, 10) != 10
+ if (grub_file_read (gzio->file, (char *) buf, 10) != 10
|| ((*((grub_uint16_t *) buf) != GZIP_MAGIC)
&& (*((grub_uint16_t *) buf) != OLD_GZIP_MAGIC)))
{
@@ -192,7 +192,7 @@
if (buf[2] != DEFLATED
|| (buf[3] & UNSUPPORTED_FLAGS)
|| ((buf[3] & EXTRA_FIELD)
- && (grub_file_read (gzio->file, buf, 2) != 2
+ && (grub_file_read (gzio->file, (char *) buf, 2) != 2
|| eat_field (gzio->file,
grub_le_to_cpu16 (*((grub_uint16_t *) buf)))))
|| ((buf[3] & ORIG_NAME) && eat_field (gzio->file, -1))
@@ -206,12 +206,14 @@
grub_file_seek (gzio->file, grub_file_size (gzio->file) - 8);
- if (grub_file_read (gzio->file, buf, 8) != 8)
+ if (grub_file_read (gzio->file, (char *) buf, 8) != 8)
{
grub_error (GRUB_ERR_BAD_FILE_TYPE, "unsupported gzip format");
return 0;
}
+ /* FIXME: this does not handle files whose original size is over 4GB.
+ But how can we know the real original size? */
file->size = grub_le_to_cpu32 (*((grub_uint32_t *) (buf + 4)));
initialize_tables (file);
@@ -362,11 +364,11 @@
{
grub_gzio_t gzio = file->data;
- if (grub_file_tell (gzio->file) == gzio->data_offset
+ if (grub_file_tell (gzio->file) == (grub_off_t) gzio->data_offset
|| gzio->inbuf_d == INBUFSIZ)
{
gzio->inbuf_d = 0;
- grub_file_read (gzio->file, gzio->inbuf, INBUFSIZ);
+ grub_file_read (gzio->file, (char *) gzio->inbuf, INBUFSIZ);
}
return gzio->inbuf[gzio->inbuf_d++];
@@ -1166,11 +1168,11 @@
}
static grub_ssize_t
-grub_gzio_read (grub_file_t file, char *buf, grub_ssize_t len)
+grub_gzio_read (grub_file_t file, char *buf, grub_size_t len)
{
grub_ssize_t ret = 0;
grub_gzio_t gzio = file->data;
- grub_ssize_t offset;
+ grub_off_t offset;
/* Do we reset decompression to the beginning of the file? */
if (gzio->saved_offset > file->offset + WSIZE)
@@ -1186,7 +1188,7 @@
while (len > 0 && grub_errno == GRUB_ERR_NONE)
{
- register grub_ssize_t size;
+ register grub_size_t size;
register char *srcaddr;
while (offset >= gzio->saved_offset)
Index: kern/disk.c
===================================================================
RCS file: /cvsroot/grub/grub2/kern/disk.c,v
retrieving revision 1.12
retrieving revision 1.13
diff -u -b -r1.12 -r1.13
--- kern/disk.c 18 Aug 2005 03:14:39 -0000 1.12
+++ kern/disk.c 4 Jun 2006 15:56:54 -0000 1.13
@@ -37,7 +37,7 @@
{
unsigned long dev_id;
unsigned long disk_id;
- unsigned long sector;
+ grub_disk_addr_t sector;
char *data;
int lock;
};
@@ -58,16 +58,16 @@
static unsigned
grub_disk_cache_get_index (unsigned long dev_id, unsigned long disk_id,
- unsigned long sector)
+ grub_disk_addr_t sector)
{
return ((dev_id * 524287UL + disk_id * 2606459UL
- + (sector >> GRUB_DISK_CACHE_BITS))
+ + ((unsigned) (sector >> GRUB_DISK_CACHE_BITS)))
% GRUB_DISK_CACHE_NUM);
}
static void
grub_disk_cache_invalidate (unsigned long dev_id, unsigned long disk_id,
- unsigned long sector)
+ grub_disk_addr_t sector)
{
unsigned index;
struct grub_disk_cache *cache;
@@ -105,7 +105,7 @@
static char *
grub_disk_cache_fetch (unsigned long dev_id, unsigned long disk_id,
- unsigned long sector)
+ grub_disk_addr_t sector)
{
struct grub_disk_cache *cache;
unsigned index;
@@ -132,7 +132,7 @@
static void
grub_disk_cache_unlock (unsigned long dev_id, unsigned long disk_id,
- unsigned long sector)
+ grub_disk_addr_t sector)
{
struct grub_disk_cache *cache;
unsigned index;
@@ -147,7 +147,7 @@
static grub_err_t
grub_disk_cache_store (unsigned long dev_id, unsigned long disk_id,
- unsigned long sector, const char *data)
+ grub_disk_addr_t sector, const char *data)
{
unsigned index;
struct grub_disk_cache *cache;
@@ -306,15 +306,16 @@
}
static grub_err_t
-grub_disk_check_range (grub_disk_t disk, unsigned long *sector,
- unsigned long *offset, grub_ssize_t size)
+grub_disk_check_range (grub_disk_t disk, grub_disk_addr_t *sector,
+ grub_off_t *offset, grub_size_t size)
{
*sector += *offset >> GRUB_DISK_SECTOR_BITS;
*offset &= GRUB_DISK_SECTOR_SIZE - 1;
if (disk->partition)
{
- unsigned long start, len;
+ grub_disk_addr_t start;
+ grub_uint64_t len;
start = grub_partition_get_start (disk->partition);
len = grub_partition_get_len (disk->partition);
@@ -337,15 +338,18 @@
/* Read data from the disk. */
grub_err_t
-grub_disk_read (grub_disk_t disk, unsigned long sector,
- unsigned long offset, unsigned long size, char *buf)
+grub_disk_read (grub_disk_t disk, grub_disk_addr_t sector,
+ grub_off_t offset, grub_size_t size, char *buf)
{
char *tmp_buf;
+ unsigned real_offset;
/* First of all, check if the region is within the disk. */
if (grub_disk_check_range (disk, §or, &offset, size) != GRUB_ERR_NONE)
return grub_errno;
+ real_offset = offset;
+
/* Allocate a temporary buffer. */
tmp_buf = grub_malloc (GRUB_DISK_SECTOR_SIZE << GRUB_DISK_CACHE_BITS);
if (! tmp_buf)
@@ -355,14 +359,15 @@
while (size)
{
char *data;
- unsigned long start_sector;
- unsigned long len;
- unsigned long pos;
+ grub_disk_addr_t start_sector;
+ grub_size_t len;
+ grub_size_t pos;
/* For reading bulk data. */
start_sector = sector & ~(GRUB_DISK_CACHE_SIZE - 1);
pos = (sector - start_sector) << GRUB_DISK_SECTOR_BITS;
- len = (GRUB_DISK_SECTOR_SIZE << GRUB_DISK_CACHE_BITS) - pos - offset;
+ len = ((GRUB_DISK_SECTOR_SIZE << GRUB_DISK_CACHE_BITS)
+ - pos - real_offset);
if (len > size)
len = size;
@@ -371,7 +376,7 @@
if (data)
{
/* Just copy it! */
- grub_memcpy (buf, data + pos + offset, len);
+ grub_memcpy (buf, data + pos + real_offset, len);
grub_disk_cache_unlock (disk->dev->id, disk->id, start_sector);
}
else
@@ -396,19 +401,19 @@
if ((disk->dev->read) (disk, sector, num, tmp_buf))
goto finish;
- grub_memcpy (buf, tmp_buf + offset, size);
+ grub_memcpy (buf, tmp_buf + real_offset, size);
/* Call the read hook, if any. */
if (disk->read_hook)
while (size)
{
- (disk->read_hook) (sector, offset,
+ (disk->read_hook) (sector, real_offset,
((size > GRUB_DISK_SECTOR_SIZE)
? GRUB_DISK_SECTOR_SIZE
: size));
sector++;
- size -= GRUB_DISK_SECTOR_SIZE - offset;
- offset = 0;
+ size -= GRUB_DISK_SECTOR_SIZE - real_offset;
+ real_offset = 0;
}
/* This must be the end. */
@@ -416,7 +421,7 @@
}
/* Copy it and store it in the disk cache. */
- grub_memcpy (buf, tmp_buf + pos + offset, len);
+ grub_memcpy (buf, tmp_buf + pos + real_offset, len);
grub_disk_cache_store (disk->dev->id, disk->id,
start_sector, tmp_buf);
}
@@ -424,29 +429,29 @@
/* Call the read hook, if any. */
if (disk->read_hook)
{
- unsigned long s = sector;
- unsigned long l = len;
+ grub_disk_addr_t s = sector;
+ grub_size_t l = len;
while (l)
{
- (disk->read_hook) (s, offset,
+ (disk->read_hook) (s, real_offset,
((l > GRUB_DISK_SECTOR_SIZE)
? GRUB_DISK_SECTOR_SIZE
: l));
- if (l < GRUB_DISK_SECTOR_SIZE - offset)
+ if (l < GRUB_DISK_SECTOR_SIZE - real_offset)
break;
s++;
- l -= GRUB_DISK_SECTOR_SIZE - offset;
- offset = 0;
+ l -= GRUB_DISK_SECTOR_SIZE - real_offset;
+ real_offset = 0;
}
}
sector = start_sector + GRUB_DISK_CACHE_SIZE;
buf += len;
size -= len;
- offset = 0;
+ real_offset = 0;
}
finish:
@@ -457,28 +462,32 @@
}
grub_err_t
-grub_disk_write (grub_disk_t disk, unsigned long sector,
- unsigned long offset, unsigned long size, const char *buf)
+grub_disk_write (grub_disk_t disk, grub_disk_addr_t sector,
+ grub_off_t offset, grub_size_t size, const char *buf)
{
+ unsigned real_offset;
+
if (grub_disk_check_range (disk, §or, &offset, size) != GRUB_ERR_NONE)
return -1;
+ real_offset = offset;
+
while (size)
{
- if (offset != 0 || (size < GRUB_DISK_SECTOR_SIZE && size != 0))
+ if (real_offset != 0 || (size < GRUB_DISK_SECTOR_SIZE && size != 0))
{
char tmp_buf[GRUB_DISK_SECTOR_SIZE];
- unsigned long len;
+ grub_size_t len;
if (grub_disk_read (disk, sector, 0, GRUB_DISK_SECTOR_SIZE, tmp_buf)
!= GRUB_ERR_NONE)
goto finish;
- len = GRUB_DISK_SECTOR_SIZE - offset;
+ len = GRUB_DISK_SECTOR_SIZE - real_offset;
if (len > size)
len = size;
- grub_memcpy (tmp_buf + offset, buf, len);
+ grub_memcpy (tmp_buf + real_offset, buf, len);
grub_disk_cache_invalidate (disk->dev->id, disk->id, sector);
@@ -488,12 +497,12 @@
sector++;
buf += len;
size -= len;
- offset = 0;
+ real_offset = 0;
}
else
{
- unsigned long len;
- unsigned long n;
+ grub_size_t len;
+ grub_size_t n;
len = size & ~(GRUB_DISK_SECTOR_SIZE - 1);
n = size >> GRUB_DISK_SECTOR_BITS;
Index: kern/file.c
===================================================================
RCS file: /cvsroot/grub/grub2/kern/file.c,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -b -r1.5 -r1.6
--- kern/file.c 15 Oct 2005 17:28:36 -0000 1.5
+++ kern/file.c 4 Jun 2006 15:56:54 -0000 1.6
@@ -1,7 +1,7 @@
/* file.c - file I/O functions */
/*
* GRUB -- GRand Unified Bootloader
- * Copyright (C) 2002 Free Software Foundation, Inc.
+ * Copyright (C) 2002,2006 Free Software Foundation, Inc.
*
* GRUB is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -112,13 +112,17 @@
}
grub_ssize_t
-grub_file_read (grub_file_t file, char *buf, grub_ssize_t len)
+grub_file_read (grub_file_t file, char *buf, grub_size_t len)
{
grub_ssize_t res;
if (len == 0 || len > file->size - file->offset)
len = file->size - file->offset;
+ /* Prevent an overflow. */
+ if ((grub_ssize_t) len < 0)
+ len >>= 1;
+
if (len == 0)
return 0;
@@ -141,12 +145,12 @@
return grub_errno;
}
-grub_ssize_t
-grub_file_seek (grub_file_t file, grub_ssize_t offset)
+grub_off_t
+grub_file_seek (grub_file_t file, grub_off_t offset)
{
- grub_ssize_t old;
+ grub_off_t old;
- if (offset < 0 || offset > file->size)
+ if (offset > file->size)
{
grub_error (GRUB_ERR_OUT_OF_RANGE,
"attempt to seek outside of the file");
Index: kern/fs.c
===================================================================
RCS file: /cvsroot/grub/grub2/kern/fs.c,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -b -r1.4 -r1.5
--- kern/fs.c 3 Jul 2005 18:06:56 -0000 1.4
+++ kern/fs.c 4 Jun 2006 15:56:54 -0000 1.5
@@ -132,7 +132,7 @@
struct grub_fs_block
{
- unsigned long offset;
+ grub_disk_addr_t offset;
unsigned long length;
};
@@ -150,6 +150,8 @@
{
num++;
p = grub_strchr (p, ',');
+ if (p)
+ p++;
}
while (p);
@@ -164,7 +166,7 @@
{
if (*p != '+')
{
- blocks[i].offset = grub_strtoul (p, &p, 0);
+ blocks[i].offset = grub_strtoull (p, &p, 0);
if (grub_errno != GRUB_ERR_NONE || *p != '+')
{
grub_error (GRUB_ERR_BAD_FILENAME,
@@ -207,11 +209,11 @@
}
static grub_ssize_t
-grub_fs_blocklist_read (grub_file_t file, char *buf, grub_ssize_t len)
+grub_fs_blocklist_read (grub_file_t file, char *buf, grub_size_t len)
{
struct grub_fs_block *p;
- unsigned long sector;
- unsigned long offset;
+ grub_disk_addr_t sector;
+ grub_off_t offset;
grub_ssize_t ret = 0;
if (len > file->size - file->offset)
@@ -223,7 +225,7 @@
{
if (sector < p->length)
{
- grub_ssize_t size;
+ grub_size_t size;
size = len;
if (((size + offset + GRUB_DISK_SECTOR_SIZE - 1)
Index: kern/misc.c
===================================================================
RCS file: /cvsroot/grub/grub2/kern/misc.c,v
retrieving revision 1.30
retrieving revision 1.31
diff -u -b -r1.30 -r1.31
--- kern/misc.c 25 Apr 2006 23:47:48 -0000 1.30
+++ kern/misc.c 4 Jun 2006 15:56:54 -0000 1.31
@@ -338,10 +338,26 @@
return c;
}
+
unsigned long
grub_strtoul (const char *str, char **end, int base)
{
- unsigned long num = 0;
+ unsigned long long num;
+
+ num = grub_strtoull (str, end, base);
+ if (num > ~0UL)
+ {
+ grub_error (GRUB_ERR_OUT_OF_RANGE, "overflow is detected");
+ return ~0UL;
+ }
+
+ return (unsigned long) num;
+}
+
+unsigned long long
+grub_strtoull (const char *str, char **end, int base)
+{
+ unsigned long long num = 0;
int found = 0;
/* Skip white spaces. */
@@ -381,10 +397,11 @@
found = 1;
- if (num > (~0UL - digit) / base)
+ /* NUM * BASE + DIGIT > ~0ULL */
+ if (num > grub_divmod64 (~0ULL - digit, base, 0))
{
grub_error (GRUB_ERR_OUT_OF_RANGE, "overflow is detected");
- return 0;
+ return ~0ULL;
}
num = num * base + digit;
@@ -501,6 +518,50 @@
return p;
}
+/* Divide N by D, return the quotient, and store the remainder in *R. */
+grub_uint64_t
+grub_divmod64 (grub_uint64_t n, grub_uint32_t d, grub_uint32_t *r)
+{
+ /* This algorithm is typically implemented by hardware. The idea
+ is to get the highest bit in N, 64 times, by keeping
+ upper(N * 2^i) = upper((Q * 10 + M) * 2^i), where upper
+ represents the high 64 bits in 128-bits space. */
+ unsigned bits = 64;
+ unsigned long long q = 0;
+ unsigned m = 0;
+
+ /* Skip the slow computation, if 32-bit arithmetics are possible. */
+ if (n < 0xffffffff)
+ {
+ if (r)
+ *r = ((grub_uint32_t) n) % d;
+
+ return ((grub_uint32_t) n) / d;
+ }
+
+ while (bits--)
+ {
+ m <<= 1;
+
+ if (n & (1ULL << 63))
+ m |= 1;
+
+ q <<= 1;
+ n <<= 1;
+
+ if (m >= d)
+ {
+ q |= 1;
+ m -= d;
+ }
+ }
+
+ if (r)
+ *r = m;
+
+ return q;
+}
+
/* Convert a long long value to a string. This function avoids 64-bit
modular arithmetic or divisions. */
static char *
@@ -528,33 +589,10 @@
/* BASE == 10 */
do
{
- /* This algorithm is typically implemented by hardware. The idea
- is to get the highest bit in N, 64 times, by keeping
- upper(N * 2^i) = upper((Q * 10 + M) * 2^i), where upper
- represents the high 64 bits in 128-bits space. */
- unsigned bits = sizeof (unsigned long long) * 8;
- unsigned long long q = 0;
- unsigned m = 0;
-
- while (bits--)
- {
- m <<= 1;
-
- if ((long long ) n < 0)
- m |= 1;
-
- q <<= 1;
- n <<= 1;
-
- if (m >= 10)
- {
- q |= 1;
- m -= 10;
- }
- }
+ unsigned m;
+ n = grub_divmod64 (n, 10, &m);
*p++ = m + '0';
- n = q;
}
while (n);
Index: loader/i386/pc/multiboot.c
===================================================================
RCS file: /cvsroot/grub/grub2/loader/i386/pc/multiboot.c,v
retrieving revision 1.10
retrieving revision 1.11
diff -u -b -r1.10 -r1.11
--- loader/i386/pc/multiboot.c 30 Apr 2006 21:09:37 -0000 1.10
+++ loader/i386/pc/multiboot.c 4 Jun 2006 15:56:54 -0000 1.11
@@ -127,7 +127,8 @@
return grub_error (GRUB_ERR_BAD_OS,
"segment doesn't fit in memory reserved for the
OS");
- if (grub_file_seek (file, phdr->p_offset) == -1)
+ if (grub_file_seek (file, (grub_off_t) phdr->p_offset)
+ == (grub_off_t) -1)
return grub_error (GRUB_ERR_BAD_OS,
"invalid offset in program header");
@@ -201,7 +202,8 @@
return grub_error (GRUB_ERR_BAD_OS,
"segment doesn't fit in memory reserved for the
OS");
- if (grub_file_seek (file, phdr->p_offset) == -1)
+ if (grub_file_seek (file, (grub_off_t) phdr->p_offset)
+ == (grub_off_t) -1)
return grub_error (GRUB_ERR_BAD_OS,
"invalid offset in program header");
Index: normal/lexer.c
===================================================================
RCS file: /cvsroot/grub/grub2/normal/lexer.c,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -b -r1.5 -r1.6
--- normal/lexer.c 20 May 2006 11:10:22 -0000 1.5
+++ normal/lexer.c 4 Jun 2006 15:56:55 -0000 1.6
@@ -357,7 +357,8 @@
}
void
-grub_script_yyerror (struct grub_parser_param *lex, char const *err)
+grub_script_yyerror (struct grub_parser_param *lex __attribute__ ((unused)),
+ char const *err)
{
grub_printf ("%s\n", err);
}
Index: normal/parser.y
===================================================================
RCS file: /cvsroot/grub/grub2/normal/parser.y,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -b -r1.5 -r1.6
--- normal/parser.y 20 May 2006 11:10:22 -0000 1.5
+++ normal/parser.y 4 Jun 2006 15:56:55 -0000 1.6
@@ -24,7 +24,7 @@
#define YYFREE grub_free
#define YYMALLOC grub_malloc
-
+#define YYLTYPE_IS_TRIVIAL 0
%}
Index: normal/script.c
===================================================================
RCS file: /cvsroot/grub/grub2/normal/script.c,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -b -r1.6 -r1.7
--- normal/script.c 28 May 2006 21:58:35 -0000 1.6
+++ normal/script.c 4 Jun 2006 15:56:55 -0000 1.7
@@ -292,7 +292,6 @@
grub_script_parse (char *script, grub_err_t (*getline) (char **))
{
struct grub_script *parsed;
- struct grub_script_mem *memfree;
struct grub_script_mem *membackup;
struct grub_lexer_param *lexstate;
struct grub_parser_param *parsestate;
Index: partmap/amiga.c
===================================================================
RCS file: /cvsroot/grub/grub2/partmap/amiga.c,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -b -r1.4 -r1.5
--- partmap/amiga.c 13 Nov 2005 15:47:09 -0000 1.4
+++ partmap/amiga.c 4 Jun 2006 15:56:55 -0000 1.5
@@ -1,7 +1,7 @@
/* amiga.c - Read amiga partition tables (RDB). */
/*
* GRUB -- GRand Unified Bootloader
- * Copyright (C) 2002, 2004, 2005 Free Software Foundation, Inc.
+ * Copyright (C) 2002,2004,2005,2006 Free Software Foundation, Inc.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -98,7 +98,7 @@
sizeof (rdsk), (char *) &rdsk))
return grub_errno;
- if (!grub_strcmp (rdsk.magic, "RDSK"))
+ if (grub_strcmp ((char *) rdsk.magic, "RDSK") == 0)
{
/* Found the first PART block. */
next = grub_be_to_cpu32 (rdsk.partitionlst);
Index: partmap/gpt.c
===================================================================
RCS file: /cvsroot/grub/grub2/partmap/gpt.c,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -b -r1.2 -r1.3
--- partmap/gpt.c 25 Apr 2006 20:08:31 -0000 1.2
+++ partmap/gpt.c 4 Jun 2006 15:56:55 -0000 1.3
@@ -1,7 +1,7 @@
/* gpt.c - Read GUID Partition Tables (GPT). */
/*
* GRUB -- GRand Unified Bootloader
- * Copyright (C) 2002, 2005 Free Software Foundation, Inc.
+ * Copyright (C) 2002,2005,2006 Free Software Foundation, Inc.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -126,7 +126,7 @@
part.index = partno;
part.partmap = &grub_gpt_partition_map;
- grub_dprintf ("gpt", "GPT entry %d: start=%ld, length=%ld\n",
+ grub_dprintf ("gpt", "GPT entry %d: start=%lld, length=%lld\n",
partno, part.start, part.len);
if (hook (disk, &part))
Index: partmap/pc.c
===================================================================
RCS file: /cvsroot/grub/grub2/partmap/pc.c,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -b -r1.7 -r1.8
--- partmap/pc.c 3 Dec 2005 17:54:55 -0000 1.7
+++ partmap/pc.c 4 Jun 2006 15:56:55 -0000 1.8
@@ -1,7 +1,7 @@
/* pc.c - Read PC style partition tables. */
/*
* GRUB -- GRand Unified Bootloader
- * Copyright (C) 2002,2004,2005 Free Software Foundation, Inc.
+ * Copyright (C) 2002,2004,2005,2006 Free Software Foundation, Inc.
*
* GRUB is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -137,7 +137,7 @@
pcdata.bsd_type = -1;
grub_dprintf ("partition",
- "partition %d: flag 0x%x, type 0x%x, start 0x%lx, len
0x%lx\n",
+ "partition %d: flag 0x%x, type 0x%x, start 0x%llx, len
0x%llx\n",
p.index, e->flag, pcdata.dos_type, p.start, p.len);
/* If this is a GPT partition, this MBR is just a dummy. */
Index: util/i386/pc/biosdisk.c
===================================================================
RCS file: /cvsroot/grub/grub2/util/i386/pc/biosdisk.c,v
retrieving revision 1.11
retrieving revision 1.12
diff -u -b -r1.11 -r1.12
--- util/i386/pc/biosdisk.c 18 Aug 2005 03:14:39 -0000 1.11
+++ util/i386/pc/biosdisk.c 4 Jun 2006 15:56:55 -0000 1.12
@@ -1,7 +1,7 @@
/* biosdisk.c - emulate biosdisk */
/*
* GRUB -- GRand Unified Bootloader
- * Copyright (C) 1999,2000,2001,2002,2003,2004 Free Software Foundation, Inc.
+ * Copyright (C) 1999,2000,2001,2002,2003,2004,2006 Free Software
Foundation, Inc.
*
* GRUB is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -285,7 +285,7 @@
#endif /* __linux__ */
static int
-open_device (const grub_disk_t disk, unsigned long sector, int flags)
+open_device (const grub_disk_t disk, grub_disk_addr_t sector, int flags)
{
int fd;
@@ -421,8 +421,8 @@
}
static grub_err_t
-grub_util_biosdisk_read (grub_disk_t disk, unsigned long sector,
- unsigned long size, char *buf)
+grub_util_biosdisk_read (grub_disk_t disk, grub_disk_addr_t sector,
+ grub_size_t size, char *buf)
{
int fd;
@@ -458,8 +458,8 @@
}
static grub_err_t
-grub_util_biosdisk_write (grub_disk_t disk, unsigned long sector,
- unsigned long size, const char *buf)
+grub_util_biosdisk_write (grub_disk_t disk, grub_disk_addr_t sector,
+ grub_size_t size, const char *buf)
{
int fd;
Index: util/i386/pc/grub-setup.c
===================================================================
RCS file: /cvsroot/grub/grub2/util/i386/pc/grub-setup.c,v
retrieving revision 1.17
retrieving revision 1.18
diff -u -b -r1.17 -r1.18
--- util/i386/pc/grub-setup.c 23 Apr 2006 13:37:36 -0000 1.17
+++ util/i386/pc/grub-setup.c 4 Jun 2006 15:56:55 -0000 1.18
@@ -60,7 +60,7 @@
/* This is the blocklist used in the diskboot image. */
struct boot_blocklist
{
- grub_uint32_t start;
+ grub_uint64_t start;
grub_uint16_t len;
grub_uint16_t segment;
} __attribute__ ((packed));
@@ -99,14 +99,14 @@
grub_uint16_t core_sectors;
grub_device_t root_dev, dest_dev;
grub_uint8_t *boot_drive;
- grub_uint32_t *kernel_sector;
+ grub_disk_addr_t *kernel_sector;
grub_uint16_t *boot_drive_check;
struct boot_blocklist *first_block, *block;
grub_int32_t *install_dos_part, *install_bsd_part;
char *install_prefix;
char *tmp_img;
int i;
- unsigned long first_sector;
+ grub_disk_addr_t first_sector;
grub_uint16_t current_segment
= GRUB_BOOT_MACHINE_KERNEL_SEG + (GRUB_DISK_SECTOR_SIZE >> 4);
grub_uint16_t last_length = GRUB_DISK_SECTOR_SIZE;
@@ -114,9 +114,9 @@
FILE *fp;
unsigned long first_start = ~0UL;
- auto void save_first_sector (unsigned long sector, unsigned offset,
+ auto void save_first_sector (grub_disk_addr_t sector, unsigned offset,
unsigned length);
- auto void save_blocklists (unsigned long sector, unsigned offset,
+ auto void save_blocklists (grub_disk_addr_t sector, unsigned offset,
unsigned length);
auto int find_first_partition_start (grub_disk_t disk,
@@ -135,10 +135,10 @@
return 0;
}
- void save_first_sector (unsigned long sector, unsigned offset,
+ void save_first_sector (grub_disk_addr_t sector, unsigned offset,
unsigned length)
{
- grub_util_info ("the fist sector is <%lu,%u,%u>",
+ grub_util_info ("the first sector is <%llu,%u,%u>",
sector, offset, length);
if (offset != 0 || length != GRUB_DISK_SECTOR_SIZE)
@@ -147,23 +147,24 @@
first_sector = sector;
}
- void save_blocklists (unsigned long sector, unsigned offset, unsigned length)
+ void save_blocklists (grub_disk_addr_t sector, unsigned offset,
+ unsigned length)
{
struct boot_blocklist *prev = block + 1;
- grub_util_info ("saving <%lu,%u,%u> with the segment 0x%x",
+ grub_util_info ("saving <%llu,%u,%u> with the segment 0x%x",
sector, offset, length, (unsigned) current_segment);
if (offset != 0 || last_length != GRUB_DISK_SECTOR_SIZE)
grub_util_error ("Non-sector-aligned data is found in the core file");
if (block != first_block
- && (grub_le_to_cpu32 (prev->start)
+ && (grub_le_to_cpu64 (prev->start)
+ grub_le_to_cpu16 (prev->len)) == sector)
prev->len = grub_cpu_to_le16 (grub_le_to_cpu16 (prev->len) + 1);
else
{
- block->start = grub_cpu_to_le32 (sector);
+ block->start = grub_cpu_to_le64 (sector);
block->len = grub_cpu_to_le16 (1);
block->segment = grub_cpu_to_le16 (current_segment);
@@ -187,7 +188,7 @@
/* Set the addresses of BOOT_DRIVE, KERNEL_SECTOR and BOOT_DRIVE_CHECK. */
boot_drive = (grub_uint8_t *) (boot_img + GRUB_BOOT_MACHINE_BOOT_DRIVE);
- kernel_sector = (grub_uint32_t *) (boot_img
+ kernel_sector = (grub_disk_addr_t *) (boot_img
+ GRUB_BOOT_MACHINE_KERNEL_SECTOR);
boot_drive_check = (grub_uint16_t *) (boot_img
+ GRUB_BOOT_MACHINE_DRIVE_CHECK);
@@ -266,7 +267,7 @@
grub_util_info ("will embed the core image into after the MBR");
/* The first blocklist contains the whole sectors. */
- first_block->start = grub_cpu_to_le32 (2);
+ first_block->start = grub_cpu_to_le64 (2);
first_block->len = grub_cpu_to_le16 (core_sectors - 1);
first_block->segment
= grub_cpu_to_le16 (GRUB_BOOT_MACHINE_KERNEL_SEG
@@ -305,7 +306,7 @@
/* The boot image and the core image are on the same drive,
so there is no need to specify the boot drive explicitly. */
*boot_drive = 0xff;
- *kernel_sector = grub_cpu_to_le32 (1);
+ *kernel_sector = grub_cpu_to_le64 (1);
/* Write the boot image onto the disk. */
if (grub_disk_write (dest_dev->disk, 0, 0, GRUB_DISK_SECTOR_SIZE,
@@ -339,7 +340,7 @@
file = grub_file_open (core_path);
if (file)
{
- if (grub_file_size (file) != (grub_ssize_t) core_size)
+ if (grub_file_size (file) != core_size)
grub_util_info ("succeeded in opening the core image but the size
is different (%d != %d)",
(int) grub_file_size (file), (int) core_size);
else if (grub_file_read (file, tmp_img, core_size)
@@ -424,7 +425,7 @@
free (core_path);
free (tmp_img);
- *kernel_sector = grub_cpu_to_le32 (first_sector);
+ *kernel_sector = grub_cpu_to_le64 (first_sector);
/* If the destination device is different from the root device,
it is necessary to embed the boot drive explicitly. */
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- grub2 ChangeLog boot/i386/pc/boot.S boot/i386/p...,
Yoshinori K. Okuji <=