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
Grub-devel@gnu.org
http://lists.gnu.org/mailman/listinfo/grub-devel

Reply via email to