Le dim 17 fév 2008 à 13:15:54 +0100, Alexandre Boeglin a écrit :
> Ah, actually, it seems it's not good enough, as it still hangs on minute
> leaps...
This one seems to work (returning unix time), but I don't know if it's
acceptable.
Alex
Index: include/grub/efi/time.h
===================================================================
RCS file: /sources/grub/grub2/include/grub/efi/time.h,v
retrieving revision 1.2
diff -u -r1.2 time.h
--- include/grub/efi/time.h 21 Jul 2007 23:32:23 -0000 1.2
+++ include/grub/efi/time.h 17 Feb 2008 14:52:00 -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 <grub/symbol.h>
-/* 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 -r1.10 efi.c
--- kern/efi/efi.c 12 Feb 2008 23:47:07 -0000 1.10
+++ kern/efi/efi.c 17 Feb 2008 14:52:00 -0000
@@ -194,15 +194,46 @@
{
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
_______________________________________________
Grub-devel mailing list
[email protected]
http://lists.gnu.org/mailman/listinfo/grub-devel