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