* [PATCH] fix GRUB_TICKS_PER_SECOND in include/grub/efi/time.h @ 2008-02-17 11:52 Alexandre Boeglin 2008-02-17 12:15 ` Alexandre Boeglin 2008-02-21 21:08 ` Yoshinori K. Okuji 0 siblings, 2 replies; 10+ messages in thread From: Alexandre Boeglin @ 2008-02-17 11:52 UTC (permalink / raw) To: grub-devel [-- Attachment #1: Type: text/plain, Size: 139 bytes --] Hi, This small patch fixes grub_get_rtc on EFI architecture. If I understood correctly, one minute is 60000 milliseconds, not 3600. Alex [-- Attachment #2: grub2_efitime.patch --] [-- Type: text/x-diff, Size: 1523 bytes --] Index: ChangeLog =================================================================== RCS file: /sources/grub/grub2/ChangeLog,v retrieving revision 1.591 diff -u -p -r1.591 ChangeLog --- ChangeLog 17 Feb 2008 10:32:02 -0000 1.591 +++ ChangeLog 17 Feb 2008 11:47:50 -0000 @@ -1,3 +1,8 @@ +2008-02-17 Alexandre Boeglin <alex@boeglin.org> + + * include/grub/efi/time.h (GRUB_TICKS_PER_SECOND): One minute is 60 * 1000 + milliseconds. + 2008-02-17 Robert Millan <rmh@aybabtu.com> * util/i386/pc/grub-setup.c (setup): In find_first_partition_start(), 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 17 Feb 2008 11:47:50 -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 @@ -22,7 +22,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 ((1UL << 31) / 60 / 1000 * 2) /* Return the real time in ticks. */ grub_uint32_t EXPORT_FUNC (grub_get_rtc) (void); ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH] fix GRUB_TICKS_PER_SECOND in include/grub/efi/time.h 2008-02-17 11:52 [PATCH] fix GRUB_TICKS_PER_SECOND in include/grub/efi/time.h Alexandre Boeglin @ 2008-02-17 12:15 ` Alexandre Boeglin 2008-02-17 14:55 ` Alexandre Boeglin 2008-02-21 21:08 ` Yoshinori K. Okuji 1 sibling, 1 reply; 10+ messages in thread From: Alexandre Boeglin @ 2008-02-17 12:15 UTC (permalink / raw) To: grub-devel Le dim 17 fév 2008 à 12:52:40 +0100, Alexandre Boeglin a écrit : > This small patch fixes grub_get_rtc on EFI architecture. Ah, actually, it seems it's not good enough, as it still hangs on minute leaps... Alex ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH] fix GRUB_TICKS_PER_SECOND in include/grub/efi/time.h 2008-02-17 12:15 ` Alexandre Boeglin @ 2008-02-17 14:55 ` Alexandre Boeglin 2008-02-21 18:53 ` Alexandre Boeglin 0 siblings, 1 reply; 10+ messages in thread From: Alexandre Boeglin @ 2008-02-17 14:55 UTC (permalink / raw) To: grub-devel [-- Attachment #1: Type: text/plain, Size: 249 bytes --] 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 [-- Attachment #2: grub2_efitime.patch --] [-- Type: text/x-diff, Size: 2562 bytes --] 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 ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH] fix GRUB_TICKS_PER_SECOND in include/grub/efi/time.h 2008-02-17 14:55 ` Alexandre Boeglin @ 2008-02-21 18:53 ` Alexandre Boeglin 2008-02-21 21:16 ` Yoshinori K. Okuji 0 siblings, 1 reply; 10+ messages in thread From: Alexandre Boeglin @ 2008-02-21 18:53 UTC (permalink / raw) To: grub-devel [-- Attachment #1: Type: text/plain, Size: 684 bytes --] Le dim 17 fév 2008 à 15:55:14 +0100, Alexandre Boeglin a écrit : > This one seems to work (returning unix time), but I don't know if it's > acceptable. Hi, here is the candidate for inclusion, including Changelog. It has a resolution of 1 second, which is OK I think, as afaik grub_get_rtc is only used to display timeout counters. And my machine, for example, does not even report more precise information (the struct returned by the EFI call has a nanosecond member, but it's content is always 0) ... And for more precise time related operations, EFI offers a stall() call, which takes a number of microseconds as a parameters, IIRC. Any objection ? Alex [-- Attachment #2: grub2_efitime.patch --] [-- Type: text/x-diff, Size: 3214 bytes --] 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 <alex@boeglin.org> + + * 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 <proski@gnu.org> * 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 <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 -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 ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH] fix GRUB_TICKS_PER_SECOND in include/grub/efi/time.h 2008-02-21 18:53 ` Alexandre Boeglin @ 2008-02-21 21:16 ` Yoshinori K. Okuji 0 siblings, 0 replies; 10+ messages in thread From: Yoshinori K. Okuji @ 2008-02-21 21:16 UTC (permalink / raw) To: The development of GRUB 2 On Thursday 21 February 2008 19:53, Alexandre Boeglin wrote: > It has a resolution of 1 second, which is OK I think, as afaik grub_get_rtc > is only used to display timeout counters. I don't think it is so good. In the future, we will have more active use of the timer (e.g. animation). > And my machine, for example, does not even report more precise information > (the struct returned by the EFI call has a nanosecond member, but it's > content is always 0) ... I suggest that you should look at SetTimer. According to the spec, you can trigger an event periodically in the units of 10 nanoseconds. So this might be used to count a timer, if the precision is not too bad. Otherwise, although this is very much hardware-dependent, you could use RDTSC. With the Stall call, you should be able to measure the clocks per second (or millisecond or whatever). Once you find the number of clocks per unit time, RDTSC gives you a very precise timer. Okuji ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH] fix GRUB_TICKS_PER_SECOND in include/grub/efi/time.h 2008-02-17 11:52 [PATCH] fix GRUB_TICKS_PER_SECOND in include/grub/efi/time.h Alexandre Boeglin 2008-02-17 12:15 ` Alexandre Boeglin @ 2008-02-21 21:08 ` Yoshinori K. Okuji 2008-02-22 7:49 ` Alexandre Boeglin 1 sibling, 1 reply; 10+ messages in thread From: Yoshinori K. Okuji @ 2008-02-21 21:08 UTC (permalink / raw) To: The development of GRUB 2 On Sunday 17 February 2008 12:52, Alexandre Boeglin wrote: > This small patch fixes grub_get_rtc on EFI architecture. If I understood > correctly, one minute is 60000 milliseconds, not 3600. Nope. What's wrong here is the comment but not the code. It should read "This is destined to overflow when one hour passes by." Okuji ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH] fix GRUB_TICKS_PER_SECOND in include/grub/efi/time.h 2008-02-21 21:08 ` Yoshinori K. Okuji @ 2008-02-22 7:49 ` Alexandre Boeglin 2008-02-22 8:24 ` Yoshinori K. Okuji 0 siblings, 1 reply; 10+ messages in thread From: Alexandre Boeglin @ 2008-02-22 7:49 UTC (permalink / raw) To: The development of GRUB 2 Le jeu 21 fév 2008 à 22:08:55 +0100, Yoshinori K. Okuji a écrit : > On Sunday 17 February 2008 12:52, Alexandre Boeglin wrote: > > This small patch fixes grub_get_rtc on EFI architecture. If I understood > > correctly, one minute is 60000 milliseconds, not 3600. > > Nope. What's wrong here is the comment but not the code. It should read "This > is destined to overflow when one hour passes by." Then, I think the problem is the same, as the current grub_get_rtc returns a number of milliseconds. So, shouldn'it be 60 * 60 * 1000 ? Alex ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH] fix GRUB_TICKS_PER_SECOND in include/grub/efi/time.h 2008-02-22 7:49 ` Alexandre Boeglin @ 2008-02-22 8:24 ` Yoshinori K. Okuji 2008-02-29 12:52 ` Alexandre Boeglin 0 siblings, 1 reply; 10+ messages in thread From: Yoshinori K. Okuji @ 2008-02-22 8:24 UTC (permalink / raw) To: The development of GRUB 2 On Friday 22 February 2008 08:49, Alexandre Boeglin wrote: > Le jeu 21 fév 2008 à 22:08:55 +0100, Yoshinori K. Okuji a écrit : > > On Sunday 17 February 2008 12:52, Alexandre Boeglin wrote: > > > This small patch fixes grub_get_rtc on EFI architecture. If I > > > understood correctly, one minute is 60000 milliseconds, not 3600. > > > > Nope. What's wrong here is the comment but not the code. It should read > > "This is destined to overflow when one hour passes by." > > Then, I think the problem is the same, as the current grub_get_rtc returns > a number of milliseconds. So, shouldn'it be 60 * 60 * 1000 ? No. Why do you think it returns milliseconds? Okuji ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH] fix GRUB_TICKS_PER_SECOND in include/grub/efi/time.h 2008-02-22 8:24 ` Yoshinori K. Okuji @ 2008-02-29 12:52 ` Alexandre Boeglin 2008-03-01 17:30 ` Yoshinori K. Okuji 0 siblings, 1 reply; 10+ messages in thread From: Alexandre Boeglin @ 2008-02-29 12:52 UTC (permalink / raw) To: The development of GRUB 2 Le ven 22 fév 2008 à 09:24:23 +0100, Yoshinori K. Okuji a écrit : > > Then, I think the problem is the same, as the current grub_get_rtc returns > > a number of milliseconds. So, shouldn'it be 60 * 60 * 1000 ? > > No. Why do you think it returns milliseconds? Ah, it does not exactly "return" milliseconds, sorry. But currently it seems GRUB_TICKS_PER_SECOND "overflows" a value in milliseconds, so I think it should use milliseconds and not seconds as its "base". Alex ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH] fix GRUB_TICKS_PER_SECOND in include/grub/efi/time.h 2008-02-29 12:52 ` Alexandre Boeglin @ 2008-03-01 17:30 ` Yoshinori K. Okuji 0 siblings, 0 replies; 10+ messages in thread From: Yoshinori K. Okuji @ 2008-03-01 17:30 UTC (permalink / raw) To: The development of GRUB 2 On Friday 29 February 2008 13:52, Alexandre Boeglin wrote: > Le ven 22 fév 2008 à 09:24:23 +0100, Yoshinori K. Okuji a écrit : > > > Then, I think the problem is the same, as the current grub_get_rtc > > > returns a number of milliseconds. So, shouldn'it be 60 * 60 * 1000 ? > > > > No. Why do you think it returns milliseconds? > > Ah, it does not exactly "return" milliseconds, sorry. But currently it > seems GRUB_TICKS_PER_SECOND "overflows" a value in milliseconds, so I think > it should use milliseconds and not seconds as its "base". I am sorry, but I don't understand. What problem do you really see? Okuji ^ permalink raw reply [flat|nested] 10+ messages in thread
end of thread, other threads:[~2008-03-01 17:30 UTC | newest] Thread overview: 10+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2008-02-17 11:52 [PATCH] fix GRUB_TICKS_PER_SECOND in include/grub/efi/time.h Alexandre Boeglin 2008-02-17 12:15 ` Alexandre Boeglin 2008-02-17 14:55 ` Alexandre Boeglin 2008-02-21 18:53 ` Alexandre Boeglin 2008-02-21 21:16 ` Yoshinori K. Okuji 2008-02-21 21:08 ` Yoshinori K. Okuji 2008-02-22 7:49 ` Alexandre Boeglin 2008-02-22 8:24 ` Yoshinori K. Okuji 2008-02-29 12:52 ` Alexandre Boeglin 2008-03-01 17:30 ` Yoshinori K. Okuji
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.