Index: ChangeLog
===================================================================
RCS file: /sources/grub/grub2/ChangeLog,v
retrieving revision 1.596
diff -u -p -r1.596 ChangeLog
--- ChangeLog 19 Feb 2008 19:52:41 -0000 1.596
+++ ChangeLog 21 Feb 2008 18:43:57 -0000
@@ -1,3 +1,10 @@
+2008-02-21 Alexandre Boeglin
+
+ * kern/efi/efi.c (grub_get_rtc): New implementation that returns POSIX time.
+
+ * include/grub/efi/time.h (GRUB_TICKS_PER_SECOND): POSIX time has a
+ resolution of 1 second.
+
2008-02-19 Pavel Roskin
* kern/rescue.c (grub_enter_rescue_mode): Improve initial
Index: include/grub/efi/time.h
===================================================================
RCS file: /sources/grub/grub2/include/grub/efi/time.h,v
retrieving revision 1.2
diff -u -p -r1.2 time.h
--- include/grub/efi/time.h 21 Jul 2007 23:32:23 -0000 1.2
+++ include/grub/efi/time.h 21 Feb 2008 18:43:57 -0000
@@ -1,6 +1,6 @@
/*
* GRUB -- GRand Unified Bootloader
- * Copyright (C) 2006,2007 Free Software Foundation, Inc.
+ * Copyright (C) 2006,2007,2008 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
@@ -21,8 +21,7 @@
#include
-/* This is destined to overflow when one minute passes by. */
-#define GRUB_TICKS_PER_SECOND ((1UL << 31) / 60 / 60 * 2)
+#define GRUB_TICKS_PER_SECOND 1
/* Return the real time in ticks. */
grub_uint32_t EXPORT_FUNC (grub_get_rtc) (void);
Index: kern/efi/efi.c
===================================================================
RCS file: /sources/grub/grub2/kern/efi/efi.c,v
retrieving revision 1.10
diff -u -p -r1.10 efi.c
--- kern/efi/efi.c 12 Feb 2008 23:47:07 -0000 1.10
+++ kern/efi/efi.c 21 Feb 2008 18:43:57 -0000
@@ -194,15 +194,46 @@ grub_get_rtc (void)
{
grub_efi_time_t time;
grub_efi_runtime_services_t *r;
+ grub_uint32_t rtc_time;
+ grub_uint16_t cur_year;
r = grub_efi_system_table->runtime_services;
if (r->get_time (&time, 0) != GRUB_EFI_SUCCESS)
/* What is possible in this case? */
return 0;
- return (((time.minute * 60 + time.second) * 1000
- + time.nanosecond / 1000000)
- * GRUB_TICKS_PER_SECOND / 1000);
+ rtc_time = 0;
+ for (cur_year = time.year - 1; cur_year >= 1970; cur_year--)
+ {
+ if (!(cur_year % 400) || ((cur_year % 100) && !(cur_year % 4)))
+ rtc_time += 366;
+ else
+ rtc_time += 365;
+ }
+ /* Months have 30 days by default. */
+ rtc_time += (time.month - 1) * 30;
+ /* February has fewer days. */
+ if (time.month > 2)
+ {
+ if (!(time.year % 400) || ((time.year % 100) && !(time.year % 4)))
+ rtc_time -= 1;
+ else
+ rtc_time -= 2;
+ }
+ /* Odd months have 31 days. */
+ rtc_time += time.month / 2;
+ /* August also has 31 days. */
+ if (time.month == 9 || time.month == 11)
+ rtc_time += 1;
+ rtc_time += (time.day - 1);
+ rtc_time *= 24;
+ rtc_time += time.hour;
+ rtc_time *= 60;
+ rtc_time += time.minute;
+ rtc_time *= 60;
+ rtc_time += time.second;
+
+ return rtc_time;
}
/* Search the mods section from the PE32/PE32+ image. This code uses