diff --git a/.vs/grub.vcxproj b/.vs/grub.vcxproj index cc18d34..e0542b6 100644 --- a/.vs/grub.vcxproj +++ b/.vs/grub.vcxproj @@ -40,6 +40,7 @@ + diff --git a/EfiFsPkg/Affs.inf b/EfiFsPkg/Affs.inf index 32f1c7d..ec44226 100644 --- a/EfiFsPkg/Affs.inf +++ b/EfiFsPkg/Affs.inf @@ -29,6 +29,9 @@ ../grub/grub-core/fs/fshelp.c ../grub/grub-core/fs/affs.c +[Sources.IA32] + ../grub/grub-core/lib/division.c + [Packages] EfiFsPkg/EfiFsPkg.dec MdePkg/MdePkg.dec diff --git a/EfiFsPkg/Afs.inf b/EfiFsPkg/Afs.inf index af99c10..ea5a342 100644 --- a/EfiFsPkg/Afs.inf +++ b/EfiFsPkg/Afs.inf @@ -29,6 +29,9 @@ ../grub/grub-core/fs/fshelp.c ../grub/grub-core/fs/afs.c +[Sources.IA32] + ../grub/grub-core/lib/division.c + [Packages] EfiFsPkg/EfiFsPkg.dec MdePkg/MdePkg.dec diff --git a/EfiFsPkg/Bfs.inf b/EfiFsPkg/Bfs.inf index 5c8c46f..40e6219 100644 --- a/EfiFsPkg/Bfs.inf +++ b/EfiFsPkg/Bfs.inf @@ -29,6 +29,9 @@ ../grub/grub-core/fs/fshelp.c ../grub/grub-core/fs/bfs.c +[Sources.IA32] + ../grub/grub-core/lib/division.c + [Packages] EfiFsPkg/EfiFsPkg.dec MdePkg/MdePkg.dec diff --git a/EfiFsPkg/Btrfs.inf b/EfiFsPkg/Btrfs.inf index e8ebb1a..46532bc 100644 --- a/EfiFsPkg/Btrfs.inf +++ b/EfiFsPkg/Btrfs.inf @@ -41,6 +41,9 @@ ../grub/grub-core/lib/zstd/zstd_common.c ../grub/grub-core/lib/zstd/zstd_decompress.c +[Sources.IA32] + ../grub/grub-core/lib/division.c + [Packages] EfiFsPkg/EfiFsPkg.dec MdePkg/MdePkg.dec diff --git a/EfiFsPkg/Cbfs.inf b/EfiFsPkg/Cbfs.inf index 304bfcd..eeeaa56 100644 --- a/EfiFsPkg/Cbfs.inf +++ b/EfiFsPkg/Cbfs.inf @@ -31,6 +31,9 @@ ../grub/grub-core/fs/fshelp.c ../grub/grub-core/fs/cbfs.c +[Sources.IA32] + ../grub/grub-core/lib/division.c + [Packages] EfiFsPkg/EfiFsPkg.dec MdePkg/MdePkg.dec diff --git a/EfiFsPkg/Cpio.inf b/EfiFsPkg/Cpio.inf index 969952d..bda4f83 100644 --- a/EfiFsPkg/Cpio.inf +++ b/EfiFsPkg/Cpio.inf @@ -30,6 +30,9 @@ ../grub/grub-core/fs/fshelp.c ../grub/grub-core/fs/cpio.c +[Sources.IA32] + ../grub/grub-core/lib/division.c + [Packages] EfiFsPkg/EfiFsPkg.dec MdePkg/MdePkg.dec diff --git a/EfiFsPkg/CpioBe.inf b/EfiFsPkg/CpioBe.inf index aeb6c7a..b7fa1d6 100644 --- a/EfiFsPkg/CpioBe.inf +++ b/EfiFsPkg/CpioBe.inf @@ -30,6 +30,9 @@ ../grub/grub-core/fs/fshelp.c ../grub/grub-core/fs/cpio_be.c +[Sources.IA32] + ../grub/grub-core/lib/division.c + [Packages] EfiFsPkg/EfiFsPkg.dec MdePkg/MdePkg.dec diff --git a/EfiFsPkg/EroFs.inf b/EfiFsPkg/EroFs.inf index 10b3589..1671027 100644 --- a/EfiFsPkg/EroFs.inf +++ b/EfiFsPkg/EroFs.inf @@ -29,6 +29,9 @@ ../grub/grub-core/fs/fshelp.c ../grub/grub-core/fs/erofs.c +[Sources.IA32] + ../grub/grub-core/lib/division.c + [Packages] EfiFsPkg/EfiFsPkg.dec MdePkg/MdePkg.dec diff --git a/EfiFsPkg/ExFat.inf b/EfiFsPkg/ExFat.inf index c0b0afa..fffe271 100644 --- a/EfiFsPkg/ExFat.inf +++ b/EfiFsPkg/ExFat.inf @@ -29,6 +29,9 @@ ../grub/grub-core/fs/fshelp.c ../grub/grub-core/fs/exfat.c +[Sources.IA32] + ../grub/grub-core/lib/division.c + [Packages] EfiFsPkg/EfiFsPkg.dec MdePkg/MdePkg.dec diff --git a/EfiFsPkg/Ext2.inf b/EfiFsPkg/Ext2.inf index 758f30c..dce3c68 100644 --- a/EfiFsPkg/Ext2.inf +++ b/EfiFsPkg/Ext2.inf @@ -29,6 +29,9 @@ ../grub/grub-core/fs/fshelp.c ../grub/grub-core/fs/ext2.c +[Sources.IA32] + ../grub/grub-core/lib/division.c + [Packages] EfiFsPkg/EfiFsPkg.dec MdePkg/MdePkg.dec diff --git a/EfiFsPkg/F2fs.inf b/EfiFsPkg/F2fs.inf index da602b3..75c0ba1 100644 --- a/EfiFsPkg/F2fs.inf +++ b/EfiFsPkg/F2fs.inf @@ -29,6 +29,9 @@ ../grub/grub-core/fs/fshelp.c ../grub/grub-core/fs/f2fs.c +[Sources.IA32] + ../grub/grub-core/lib/division.c + [Packages] EfiFsPkg/EfiFsPkg.dec MdePkg/MdePkg.dec diff --git a/EfiFsPkg/Fat.inf b/EfiFsPkg/Fat.inf index af06ead..a97d370 100644 --- a/EfiFsPkg/Fat.inf +++ b/EfiFsPkg/Fat.inf @@ -29,6 +29,9 @@ ../grub/grub-core/fs/fshelp.c ../grub/grub-core/fs/fat.c +[Sources.IA32] + ../grub/grub-core/lib/division.c + [Packages] EfiFsPkg/EfiFsPkg.dec MdePkg/MdePkg.dec diff --git a/EfiFsPkg/Hfs.inf b/EfiFsPkg/Hfs.inf index 4293047..cccb364 100644 --- a/EfiFsPkg/Hfs.inf +++ b/EfiFsPkg/Hfs.inf @@ -29,6 +29,9 @@ ../grub/grub-core/fs/fshelp.c ../grub/grub-core/fs/hfs.c +[Sources.IA32] + ../grub/grub-core/lib/division.c + [Packages] EfiFsPkg/EfiFsPkg.dec MdePkg/MdePkg.dec diff --git a/EfiFsPkg/HfsPlus.inf b/EfiFsPkg/HfsPlus.inf index c53e0db..d762939 100644 --- a/EfiFsPkg/HfsPlus.inf +++ b/EfiFsPkg/HfsPlus.inf @@ -31,6 +31,9 @@ ../grub/grub-core/fs/hfsplus.c ../grub/grub-core/fs/hfspluscomp.c +[Sources.IA32] + ../grub/grub-core/lib/division.c + [Packages] EfiFsPkg/EfiFsPkg.dec MdePkg/MdePkg.dec diff --git a/EfiFsPkg/Iso9660.inf b/EfiFsPkg/Iso9660.inf index f42fa56..2a59016 100644 --- a/EfiFsPkg/Iso9660.inf +++ b/EfiFsPkg/Iso9660.inf @@ -29,6 +29,9 @@ ../grub/grub-core/fs/fshelp.c ../grub/grub-core/fs/iso9660.c +[Sources.IA32] + ../grub/grub-core/lib/division.c + [Packages] EfiFsPkg/EfiFsPkg.dec MdePkg/MdePkg.dec diff --git a/EfiFsPkg/Jfs.inf b/EfiFsPkg/Jfs.inf index 3e25364..f86dfd9 100644 --- a/EfiFsPkg/Jfs.inf +++ b/EfiFsPkg/Jfs.inf @@ -29,6 +29,9 @@ ../grub/grub-core/fs/fshelp.c ../grub/grub-core/fs/jfs.c +[Sources.IA32] + ../grub/grub-core/lib/division.c + [Packages] EfiFsPkg/EfiFsPkg.dec MdePkg/MdePkg.dec diff --git a/EfiFsPkg/Minix.inf b/EfiFsPkg/Minix.inf index 5883b63..bd98857 100644 --- a/EfiFsPkg/Minix.inf +++ b/EfiFsPkg/Minix.inf @@ -30,6 +30,9 @@ ../grub/grub-core/fs/fshelp.c ../grub/grub-core/fs/minix.c +[Sources.IA32] + ../grub/grub-core/lib/division.c + [Packages] EfiFsPkg/EfiFsPkg.dec MdePkg/MdePkg.dec diff --git a/EfiFsPkg/Minix2.inf b/EfiFsPkg/Minix2.inf index 74d29e4..abe776d 100644 --- a/EfiFsPkg/Minix2.inf +++ b/EfiFsPkg/Minix2.inf @@ -30,6 +30,9 @@ ../grub/grub-core/fs/fshelp.c ../grub/grub-core/fs/minix2.c +[Sources.IA32] + ../grub/grub-core/lib/division.c + [Packages] EfiFsPkg/EfiFsPkg.dec MdePkg/MdePkg.dec diff --git a/EfiFsPkg/Minix2Be.inf b/EfiFsPkg/Minix2Be.inf index eae0078..a09b6df 100644 --- a/EfiFsPkg/Minix2Be.inf +++ b/EfiFsPkg/Minix2Be.inf @@ -30,6 +30,9 @@ ../grub/grub-core/fs/fshelp.c ../grub/grub-core/fs/minix2_be.c +[Sources.IA32] + ../grub/grub-core/lib/division.c + [Packages] EfiFsPkg/EfiFsPkg.dec MdePkg/MdePkg.dec diff --git a/EfiFsPkg/Minix3.inf b/EfiFsPkg/Minix3.inf index 01914c2..98ac6ce 100644 --- a/EfiFsPkg/Minix3.inf +++ b/EfiFsPkg/Minix3.inf @@ -30,6 +30,9 @@ ../grub/grub-core/fs/fshelp.c ../grub/grub-core/fs/minix3.c +[Sources.IA32] + ../grub/grub-core/lib/division.c + [Packages] EfiFsPkg/EfiFsPkg.dec MdePkg/MdePkg.dec diff --git a/EfiFsPkg/Minix3Be.inf b/EfiFsPkg/Minix3Be.inf index ea7b8ff..cb3d4bc 100644 --- a/EfiFsPkg/Minix3Be.inf +++ b/EfiFsPkg/Minix3Be.inf @@ -30,6 +30,9 @@ ../grub/grub-core/fs/fshelp.c ../grub/grub-core/fs/minix3_be.c +[Sources.IA32] + ../grub/grub-core/lib/division.c + [Packages] EfiFsPkg/EfiFsPkg.dec MdePkg/MdePkg.dec diff --git a/EfiFsPkg/MinixBe.inf b/EfiFsPkg/MinixBe.inf index 94ba002..a9b4b6a 100644 --- a/EfiFsPkg/MinixBe.inf +++ b/EfiFsPkg/MinixBe.inf @@ -30,6 +30,9 @@ ../grub/grub-core/fs/fshelp.c ../grub/grub-core/fs/minix_be.c +[Sources.IA32] + ../grub/grub-core/lib/division.c + [Packages] EfiFsPkg/EfiFsPkg.dec MdePkg/MdePkg.dec diff --git a/EfiFsPkg/NewC.inf b/EfiFsPkg/NewC.inf index 0799005..26f4602 100644 --- a/EfiFsPkg/NewC.inf +++ b/EfiFsPkg/NewC.inf @@ -30,6 +30,9 @@ ../grub/grub-core/fs/fshelp.c ../grub/grub-core/fs/newc.c +[Sources.IA32] + ../grub/grub-core/lib/division.c + [Packages] EfiFsPkg/EfiFsPkg.dec MdePkg/MdePkg.dec diff --git a/EfiFsPkg/NilFs2.inf b/EfiFsPkg/NilFs2.inf index 12bd365..00e093b 100644 --- a/EfiFsPkg/NilFs2.inf +++ b/EfiFsPkg/NilFs2.inf @@ -29,6 +29,9 @@ ../grub/grub-core/fs/fshelp.c ../grub/grub-core/fs/nilfs2.c +[Sources.IA32] + ../grub/grub-core/lib/division.c + [Packages] EfiFsPkg/EfiFsPkg.dec MdePkg/MdePkg.dec diff --git a/EfiFsPkg/Ntfs.inf b/EfiFsPkg/Ntfs.inf index ecae0aa..7951d24 100644 --- a/EfiFsPkg/Ntfs.inf +++ b/EfiFsPkg/Ntfs.inf @@ -30,6 +30,9 @@ ../grub/grub-core/fs/ntfs.c ../grub/grub-core/fs/ntfscomp.c +[Sources.IA32] + ../grub/grub-core/lib/division.c + [Packages] EfiFsPkg/EfiFsPkg.dec MdePkg/MdePkg.dec diff --git a/EfiFsPkg/Odc.inf b/EfiFsPkg/Odc.inf index f0c4ac7..08ac288 100644 --- a/EfiFsPkg/Odc.inf +++ b/EfiFsPkg/Odc.inf @@ -30,6 +30,9 @@ ../grub/grub-core/fs/fshelp.c ../grub/grub-core/fs/odc.c +[Sources.IA32] + ../grub/grub-core/lib/division.c + [Packages] EfiFsPkg/EfiFsPkg.dec MdePkg/MdePkg.dec diff --git a/EfiFsPkg/ProcFs.inf b/EfiFsPkg/ProcFs.inf index 5f0e546..b42e959 100644 --- a/EfiFsPkg/ProcFs.inf +++ b/EfiFsPkg/ProcFs.inf @@ -30,6 +30,9 @@ ../grub/grub-core/fs/fshelp.c ../grub/grub-core/fs/proc.c +[Sources.IA32] + ../grub/grub-core/lib/division.c + [Packages] EfiFsPkg/EfiFsPkg.dec MdePkg/MdePkg.dec diff --git a/EfiFsPkg/ReiserFs.inf b/EfiFsPkg/ReiserFs.inf index a5f0b2d..0e1af31 100644 --- a/EfiFsPkg/ReiserFs.inf +++ b/EfiFsPkg/ReiserFs.inf @@ -29,6 +29,9 @@ ../grub/grub-core/fs/fshelp.c ../grub/grub-core/fs/reiserfs.c +[Sources.IA32] + ../grub/grub-core/lib/division.c + [Packages] EfiFsPkg/EfiFsPkg.dec MdePkg/MdePkg.dec diff --git a/EfiFsPkg/RomFs.inf b/EfiFsPkg/RomFs.inf index 5d66241..57b01ef 100644 --- a/EfiFsPkg/RomFs.inf +++ b/EfiFsPkg/RomFs.inf @@ -29,6 +29,9 @@ ../grub/grub-core/fs/fshelp.c ../grub/grub-core/fs/romfs.c +[Sources.IA32] + ../grub/grub-core/lib/division.c + [Packages] EfiFsPkg/EfiFsPkg.dec MdePkg/MdePkg.dec diff --git a/EfiFsPkg/Sfs.inf b/EfiFsPkg/Sfs.inf index 0841a5d..5e8596f 100644 --- a/EfiFsPkg/Sfs.inf +++ b/EfiFsPkg/Sfs.inf @@ -29,6 +29,9 @@ ../grub/grub-core/fs/fshelp.c ../grub/grub-core/fs/sfs.c +[Sources.IA32] + ../grub/grub-core/lib/division.c + [Packages] EfiFsPkg/EfiFsPkg.dec MdePkg/MdePkg.dec diff --git a/EfiFsPkg/SquashFs.inf b/EfiFsPkg/SquashFs.inf index 1df914c..0adec97 100644 --- a/EfiFsPkg/SquashFs.inf +++ b/EfiFsPkg/SquashFs.inf @@ -39,6 +39,9 @@ ../grub/grub-core/fs/squash4.c ../grub/grub-core/lib/posix_wrap/string.h +[Sources.IA32] + ../grub/grub-core/lib/division.c + [Packages] EfiFsPkg/EfiFsPkg.dec MdePkg/MdePkg.dec diff --git a/EfiFsPkg/Tar.inf b/EfiFsPkg/Tar.inf index 7a40f05..a592861 100644 --- a/EfiFsPkg/Tar.inf +++ b/EfiFsPkg/Tar.inf @@ -30,6 +30,9 @@ ../grub/grub-core/fs/fshelp.c ../grub/grub-core/fs/tar.c +[Sources.IA32] + ../grub/grub-core/lib/division.c + [Packages] EfiFsPkg/EfiFsPkg.dec MdePkg/MdePkg.dec diff --git a/EfiFsPkg/Udf.inf b/EfiFsPkg/Udf.inf index 8ad462e..202410b 100644 --- a/EfiFsPkg/Udf.inf +++ b/EfiFsPkg/Udf.inf @@ -29,6 +29,9 @@ ../grub/grub-core/fs/fshelp.c ../grub/grub-core/fs/udf.c +[Sources.IA32] + ../grub/grub-core/lib/division.c + [Packages] EfiFsPkg/EfiFsPkg.dec MdePkg/MdePkg.dec diff --git a/EfiFsPkg/Ufs.inf b/EfiFsPkg/Ufs.inf index 3e92a38..4e31128 100644 --- a/EfiFsPkg/Ufs.inf +++ b/EfiFsPkg/Ufs.inf @@ -29,6 +29,9 @@ ../grub/grub-core/fs/fshelp.c ../grub/grub-core/fs/ufs.c +[Sources.IA32] + ../grub/grub-core/lib/division.c + [Packages] EfiFsPkg/EfiFsPkg.dec MdePkg/MdePkg.dec diff --git a/EfiFsPkg/Ufs2.inf b/EfiFsPkg/Ufs2.inf index 1c68aea..1a32ec2 100644 --- a/EfiFsPkg/Ufs2.inf +++ b/EfiFsPkg/Ufs2.inf @@ -29,6 +29,9 @@ ../grub/grub-core/fs/fshelp.c ../grub/grub-core/fs/ufs2.c +[Sources.IA32] + ../grub/grub-core/lib/division.c + [Packages] EfiFsPkg/EfiFsPkg.dec MdePkg/MdePkg.dec diff --git a/EfiFsPkg/UfsBe.inf b/EfiFsPkg/UfsBe.inf index 53836a7..8a2ef38 100644 --- a/EfiFsPkg/UfsBe.inf +++ b/EfiFsPkg/UfsBe.inf @@ -29,6 +29,9 @@ ../grub/grub-core/fs/fshelp.c ../grub/grub-core/fs/ufs_be.c +[Sources.IA32] + ../grub/grub-core/lib/division.c + [Packages] EfiFsPkg/EfiFsPkg.dec MdePkg/MdePkg.dec diff --git a/EfiFsPkg/Xfs.inf b/EfiFsPkg/Xfs.inf index 399659c..a2abde6 100644 --- a/EfiFsPkg/Xfs.inf +++ b/EfiFsPkg/Xfs.inf @@ -29,6 +29,9 @@ ../grub/grub-core/fs/fshelp.c ../grub/grub-core/fs/xfs.c +[Sources.IA32] + ../grub/grub-core/lib/division.c + [Packages] EfiFsPkg/EfiFsPkg.dec MdePkg/MdePkg.dec diff --git a/EfiFsPkg/Zfs.inf b/EfiFsPkg/Zfs.inf index ea48c5c..14b1268 100644 --- a/EfiFsPkg/Zfs.inf +++ b/EfiFsPkg/Zfs.inf @@ -43,6 +43,9 @@ ../grub/grub-core/lib/zstd/zstd_decompress.c +[Sources.IA32] + ../grub/grub-core/lib/division.c + [Packages] EfiFsPkg/EfiFsPkg.dec MdePkg/MdePkg.dec diff --git a/Make.common b/Make.common index 93a18bd..70ec21a 100644 --- a/Make.common +++ b/Make.common @@ -161,7 +161,8 @@ ifdef DRIVERNAME LIBS += -lgrub -lefi OBJS = utf8.o path.o missing.o logging.o grub_file.o this.o file.o driver.o \ - $(GRUB_DIR)/grub-core/fs/fshelp.o $(GRUB_DIR)/grub-core/$(FSDIR)/$(DRIVERNAME).o + $(GRUB_DIR)/grub-core/fs/fshelp.o $(GRUB_DIR)/grub-core/$(FSDIR)/$(DRIVERNAME).o \ + $(GRUB_DIR)/grub-core/lib/division.o DRIVER = $(DRIVERNAME)_$(ARCH) endif ifdef EXTRAOBJS @@ -221,4 +222,5 @@ clean.common: clean.driver: rm -f $(GRUB_DIR)/grub-core/fs/*.o $(GRUB_DIR)/grub-core/fs/*.d $(GRUB_DIR)/grub-core/io/*.o $(GRUB_DIR)/grub-core/io/*.d \ + $(GRUB_DIR)/grub-core/lib/*.o \ $(GRUB_DIR)/grub-core/fs/zfs/*.o $(GRUB_DIR)/grub-core/fs/zfs/*.d $(SRC_DIR)/*.o $(SRC_DIR)/*.d $(SRC_DIR)/*.so $(SRC_DIR)/*.efi diff --git a/src/driver.h b/src/driver.h index 93f323f..47faf02 100644 --- a/src/driver.h +++ b/src/driver.h @@ -161,7 +161,7 @@ typedef struct _EFI_GRUB_FILE { EFI_FILE EfiFile; BOOLEAN IsDir; INT64 DirIndex; - INT32 Mtime; + INT64 Mtime; CHAR8 *path; CHAR8 *basename; INTN RefCount; @@ -191,7 +191,7 @@ typedef struct _GRUB_DIRHOOK_INFO { UINT32 MtimeSet:1; UINT32 CaseInsensitive:1; UINT32 InodeSet:1; - INT32 Mtime; + INT64 Mtime; UINT64 Inode; } GRUB_DIRHOOK_INFO; @@ -217,7 +217,7 @@ extern CHAR16 *GrubGetUuid(EFI_FS *This); extern BOOLEAN GrubFSProbe(EFI_FS *This); extern EFI_STATUS GrubDeviceInit(EFI_FS *This); extern EFI_STATUS GrubDeviceExit(EFI_FS *This); -extern VOID GrubTimeToEfiTime(const INT32 t, EFI_TIME *tp); +extern VOID GrubTimeToEfiTime(const INT64 t, EFI_TIME *tp); extern VOID CopyPathRelative(CHAR8 *dest, CHAR8 *src, INTN len); extern EFI_STATUS GrubOpen(EFI_GRUB_FILE *File); extern EFI_STATUS GrubDir(EFI_GRUB_FILE *File, const CHAR8 *path, diff --git a/src/file.c b/src/file.c index fcb79fc..41866c1 100644 --- a/src/file.c +++ b/src/file.c @@ -298,7 +298,6 @@ DirHook(const CHAR8 *name, const GRUB_DIRHOOK_INFO *DirInfo, VOID *Data) return (INT32) Status; } - // Oh, and of course GRUB uses a 32 bit signed mtime value (seriously, wtf guys?!?) if (DirInfo->MtimeSet) GrubTimeToEfiTime(DirInfo->Mtime, &Time); CopyMem(&Info->CreateTime, &Time, sizeof(Time)); diff --git a/src/grub.c b/src/grub.c index a7feaa4..812d0c5 100644 --- a/src/grub.c +++ b/src/grub.c @@ -240,6 +240,28 @@ GrubErrToEFIStatus(grub_err_t err) } } +STATIC inline INT64 DivS64x64(INT64 num, INT64 denom, INT64 *rem) +{ +#if defined(i386) || defined(__i386__) || defined(__i386) || defined(_M_IX86) + return grub_divmod64s(num, denom, rem); +#else + INT64 quot = num / denom; + *rem = num % denom; + return quot; +#endif +} + +STATIC inline INT64 ModS64x64(INT64 num, INT64 denom) +{ +#if defined(i386) || defined(__i386__) || defined(__i386) || defined(_M_IX86) + grub_int64_t rem; + grub_divmod64s(num, denom, &rem); + return rem; +#else + return num % denom; +#endif +} + /* The following is adapted from glibc's (offtime.c, etc.) */ @@ -254,22 +276,30 @@ static const unsigned short int __mon_yday[2][13] = { /* Nonzero if YEAR is a leap year (every 4 years, except every 100th isn't, and every 400th is). */ #define __isleap(year) \ - ((year) % 4 == 0 && ((year) % 100 != 0 || (year) % 400 == 0)) + (ModS64x64(year, 4) == 0 && (ModS64x64(year, 100) != 0 || ModS64x64(year, 400) == 0)) #define SECS_PER_HOUR (60 * 60) #define SECS_PER_DAY (SECS_PER_HOUR * 24) +#if defined(i386) || defined(__i386__) || defined(__i386) || defined(_M_IX86) +STATIC inline INT64 DIV(INT64 a, INT64 b) +{ + INT64 rem; + CONST INT64 quot = DivS64x64(a, b, &rem); + return quot - (rem < 0); +} +#else #define DIV(a, b) ((a) / (b) - ((a) % (b) < 0)) +#endif #define LEAPS_THRU_END_OF(y) (DIV (y, 4) - DIV (y, 100) + DIV (y, 400)) /* Compute an EFI_TIME representation of a GRUB's mtime_t */ VOID -GrubTimeToEfiTime(const INT32 t, EFI_TIME *tp) +GrubTimeToEfiTime(const INT64 t, EFI_TIME *tp) { - INT32 days, rem, y; + INT64 days, rem, y; const unsigned short int *ip; - days = t / SECS_PER_DAY; - rem = t % SECS_PER_DAY; + days = DivS64x64(t, SECS_PER_DAY, &rem); while (rem < 0) { rem += SECS_PER_DAY; --days; @@ -278,15 +308,14 @@ GrubTimeToEfiTime(const INT32 t, EFI_TIME *tp) rem -= SECS_PER_DAY; ++days; } - tp->Hour = (UINT8) (rem / SECS_PER_HOUR); - rem %= SECS_PER_HOUR; - tp->Minute = (UINT8) (rem / 60); - tp->Second = (UINT8) (rem % 60); + tp->Hour = (UINT8) DivS64x64(rem, SECS_PER_HOUR, &rem); + tp->Minute = (UINT8) DivS64x64(rem, 60, &rem); + tp->Second = (UINT8) rem; y = 1970; while (days < 0 || days >= (__isleap (y) ? 366 : 365)) { /* Guess a corrected year, assuming 365 days per year. */ - INT32 yg = y + days / 365 - (days % 365 < 0); + CONST INT64 yg = y + DIV(days, 365); /* Adjust DAYS and Y to match the guessed year. */ days -= ((yg - y) * 365