]> git.ipfire.org Git - thirdparty/grub.git/commitdiff
* grub-core/kern/arm/efi/init.c: Rewrite timer fucntion.
authorVladimir 'phcoder' Serbinenko <phcoder@gmail.com>
Mon, 7 Oct 2013 17:23:14 +0000 (19:23 +0200)
committerVladimir 'phcoder' Serbinenko <phcoder@gmail.com>
Mon, 7 Oct 2013 17:23:14 +0000 (19:23 +0200)
ChangeLog
grub-core/kern/arm/efi/init.c

index 883f0802cb03fd3051d2453d5d8179a6e150d357..89ccd168988a62ff79780278d17b45f49e03d8e6 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+2013-10-07  Vladimir Serbinenko  <phcoder@gmail.com>
+
+       * grub-core/kern/arm/efi/init.c: Rewrite timer fucntion.
+
 2013-10-04  Samuel Thibault  <samuel.thibault@ens-lyon.org>
 
        * util/grub.d/10_hurd.in: Use `version_find_latest` to sort gnumach
index 3a2b74dcc50cbf223db11f8061f776a5d2c23d35..bcb73518dcd9a49b5f0a35f279a0c4668e2809b3 100644 (file)
 #include <grub/time.h>
 #include <grub/efi/efi.h>
 
-/*
- * A bit ugly, but functional - and should be completely portable.
- */
+static grub_uint64_t tmr;
+static grub_efi_event_t tmr_evt;
+
 static grub_uint64_t
-grub_efi_get_time_ms(void)
+grub_efi_get_time_ms (void)
 {
-  grub_efi_time_t now;
-  grub_uint64_t retval;
-  grub_efi_status_t status;
-
-  status = efi_call_2 (grub_efi_system_table->runtime_services->get_time,
-                      &now, NULL);
-  if (status != GRUB_EFI_SUCCESS)
-    {
-      grub_printf("No time!\n");
-      return 0;
-    }
-  retval = now.year * 365 * 24 * 60 * 60 * 1000;
-  retval += now.month * 30 * 24 * 60 * 60 * 1000;
-  retval += now.day * 24 * 60 * 60 * 1000;
-  retval += now.hour * 60 * 60 * 1000;
-  retval += now.minute * 60 * 1000;
-  retval += now.second * 1000;
-  retval += now.nanosecond / 1000;
-  grub_dprintf("timer", "timestamp: 0x%llx\n", retval);
+  return tmr;
+}
 
-  return retval;
+static void 
+increment_timer (grub_efi_event_t event __attribute__ ((unused)),
+                void *context __attribute__ ((unused)))
+{
+  tmr++;
 }
 
 void
 grub_machine_init (void)
 {
+  grub_efi_boot_services_t *b;
+
   grub_efi_init ();
+
+  b = grub_efi_system_table->boot_services;
+
+  efi_call_5 (b->create_event, GRUB_EFI_EVT_TIMER | GRUB_EFI_EVT_NOTIFY_SIGNAL,
+             GRUB_EFI_TPL_CALLBACK, increment_timer, NULL, &tmr_evt);
+  efi_call_3 (b->set_timer, tmr_evt, GRUB_EFI_TIMER_PERIODIC, 10000);
+
   grub_install_get_time_ms (grub_efi_get_time_ms);
 }
 
 void
 grub_machine_fini (void)
 {
+  grub_efi_boot_services_t *b;
+
+  b = grub_efi_system_table->boot_services;
+
+  efi_call_3 (b->set_timer, tmr_evt, GRUB_EFI_TIMER_PERIODIC, 0);
+  efi_call_1 (b->close_event, tmr_evt);
+
   grub_efi_fini ();
 }