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