All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] Implement grub_sleep() and grub_ticksleep()
@ 2007-10-15 14:38 Robert Millan
  2007-10-16 14:11 ` Marco Gerards
  0 siblings, 1 reply; 11+ messages in thread
From: Robert Millan @ 2007-10-15 14:38 UTC (permalink / raw)
  To: grub-devel

[-- Attachment #1: Type: text/plain, Size: 202 bytes --]


This patch implements grub_sleep() and grub_ticksleep().

-- 
Robert Millan

<GPLv2> I know my rights; I want my phone call!
<DRM> What use is a phone call, if you are unable to speak?
(as seen on /.)

[-- Attachment #2: ticksleep.diff --]
[-- Type: text/x-diff, Size: 6892 bytes --]

2007-10-15  Robert Millan  <rmh@aybabtu.com>

	* include/grub/time.h: New file.

	* include/grub/i386/pc/time.h (KERNEL_TIME_HEADER): Rename all
	instances to ...
	(KERNEL_MACHINE_TIME_HEADER): ... this.
	* include/grub/powerpc/ieee1275/time.h: Likewise.
	* include/grub/sparc64/ieee1275/time.h: Likewise.

	* kern/i386/efi/init.c: Include `grub/time.h'.
	(grub_ticksleep): New function.
	* kern/i386/pc/init.c: Likewise.
	* kern/powerpc/ieee1275/init.c: Likewise.
	* kern/sparc64/ieee1275/init.c: Likewise.

diff -Nur grub2/include/grub/i386/pc/time.h grub2.ticks/include/grub/i386/pc/time.h
--- grub2/include/grub/i386/pc/time.h	2007-07-22 01:32:24.000000000 +0200
+++ grub2.ticks/include/grub/i386/pc/time.h	2007-10-15 16:23:25.000000000 +0200
@@ -16,8 +16,8 @@
  *  along with GRUB.  If not, see <http://www.gnu.org/licenses/>.
  */
 
-#ifndef KERNEL_TIME_HEADER
-#define KERNEL_TIME_HEADER	1
+#ifndef KERNEL_MACHINE_TIME_HEADER
+#define KERNEL_MACHINE_TIME_HEADER	1
 
 #include <grub/symbol.h>
 
@@ -26,4 +26,4 @@
 /* Return the real time in ticks.  */
 grub_uint32_t EXPORT_FUNC (grub_get_rtc) (void);
 
-#endif /* ! KERNEL_TIME_HEADER */
+#endif /* ! KERNEL_MACHINE_TIME_HEADER */
diff -Nur grub2/include/grub/powerpc/ieee1275/time.h grub2.ticks/include/grub/powerpc/ieee1275/time.h
--- grub2/include/grub/powerpc/ieee1275/time.h	2007-07-22 01:32:24.000000000 +0200
+++ grub2.ticks/include/grub/powerpc/ieee1275/time.h	2007-10-15 16:20:12.000000000 +0200
@@ -16,8 +16,8 @@
  *  along with GRUB.  If not, see <http://www.gnu.org/licenses/>.
  */
 
-#ifndef KERNEL_TIME_HEADER
-#define KERNEL_TIME_HEADER	1
+#ifndef KERNEL_MACHINE_TIME_HEADER
+#define KERNEL_MACHINE_TIME_HEADER	1
 
 #include <grub/symbol.h>
 
@@ -26,4 +26,4 @@
 /* Return the real time in ticks.  */
 grub_uint32_t EXPORT_FUNC (grub_get_rtc) (void);
 
-#endif /* ! KERNEL_TIME_HEADER */
+#endif /* ! KERNEL_MACHINE_TIME_HEADER */
diff -Nur grub2/include/grub/sparc64/ieee1275/time.h grub2.ticks/include/grub/sparc64/ieee1275/time.h
--- grub2/include/grub/sparc64/ieee1275/time.h	2007-07-22 01:32:25.000000000 +0200
+++ grub2.ticks/include/grub/sparc64/ieee1275/time.h	2007-10-15 16:20:12.000000000 +0200
@@ -16,8 +16,8 @@
  *  along with GRUB.  If not, see <http://www.gnu.org/licenses/>.
  */
 
-#ifndef KERNEL_TIME_HEADER
-#define KERNEL_TIME_HEADER	1
+#ifndef KERNEL_MACHINE_TIME_HEADER
+#define KERNEL_MACHINE_TIME_HEADER	1
 
 #include <grub/symbol.h>
 
@@ -26,4 +26,4 @@
 /* Return the real time in ticks.  */
 grub_uint32_t EXPORT_FUNC (grub_get_rtc) (void);
 
-#endif /* ! KERNEL_TIME_HEADER */
+#endif /* ! KERNEL_MACHINE_TIME_HEADER */
diff -Nur grub2/include/grub/time.h grub2.ticks/include/grub/time.h
--- grub2/include/grub/time.h	1970-01-01 01:00:00.000000000 +0100
+++ grub2.ticks/include/grub/time.h	2007-10-15 16:22:44.000000000 +0200
@@ -0,0 +1,42 @@
+/*
+ *  GRUB  --  GRand Unified Bootloader
+ *  Copyright (C) 2007  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
+ *  the Free Software Foundation, either version 3 of the License, or
+ *  (at your option) any later version.
+ *
+ *  GRUB is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with GRUB.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef KERNEL_TIME_HEADER
+#define KERNEL_TIME_HEADER	1
+
+#include <grub/symbol.h>
+#include <grub/machine/time.h>
+
+void EXPORT_FUNC(grub_ticksleep) (grub_uint32_t ticks);
+
+static __inline void
+grub_sleep (grub_uint32_t s)
+{
+  grub_ticksleep (s * GRUB_TICKS_PER_SECOND);
+}
+
+static __inline void
+grub_cpu_idle ()
+{
+#if defined(__i386__)
+  __asm__ __volatile__ ("hlt");
+  /* FIXME: add other CPUs here */
+#endif
+}
+
+#endif /* ! KERNEL_TIME_HEADER */
diff -Nur grub2/kern/i386/efi/init.c grub2.ticks/kern/i386/efi/init.c
--- grub2/kern/i386/efi/init.c	2007-07-22 01:32:27.000000000 +0200
+++ grub2.ticks/kern/i386/efi/init.c	2007-10-15 16:28:06.000000000 +0200
@@ -25,6 +25,16 @@
 #include <grub/cache.h>
 #include <grub/kernel.h>
 #include <grub/efi/efi.h>
+#include <grub/time.h>
+
+void
+grub_ticksleep (grub_uint32_t ticks)
+{
+  grub_uint32_t end_at;
+  end_at = grub_get_rtc () + ticks;
+  while (grub_get_rtc () < end_at)
+    grub_cpu_idle ();
+}
 
 void
 grub_machine_init (void)
diff -Nur grub2/kern/i386/pc/init.c grub2.ticks/kern/i386/pc/init.c
--- grub2/kern/i386/pc/init.c	2007-09-07 23:55:26.000000000 +0200
+++ grub2.ticks/kern/i386/pc/init.c	2007-10-15 16:27:53.000000000 +0200
@@ -30,6 +30,7 @@
 #include <grub/loader.h>
 #include <grub/env.h>
 #include <grub/cache.h>
+#include <grub/time.h>
 
 struct mem_region
 {
@@ -46,6 +47,15 @@
 grub_size_t grub_os_area_size;
 grub_size_t grub_lower_mem, grub_upper_mem;
 
+void
+grub_ticksleep (grub_uint32_t ticks)
+{
+  grub_uint32_t end_at;
+  end_at = grub_get_rtc () + ticks;
+  while (grub_get_rtc () < end_at)
+    grub_cpu_idle ();
+}
+
 void 
 grub_arch_sync_caches (void *address __attribute__ ((unused)),
 		       grub_size_t len __attribute__ ((unused)))
diff -Nur grub2/kern/powerpc/ieee1275/init.c grub2.ticks/kern/powerpc/ieee1275/init.c
--- grub2/kern/powerpc/ieee1275/init.c	2007-10-12 12:22:27.000000000 +0200
+++ grub2.ticks/kern/powerpc/ieee1275/init.c	2007-10-15 16:28:30.000000000 +0200
@@ -27,8 +27,8 @@
 #include <grub/setjmp.h>
 #include <grub/env.h>
 #include <grub/misc.h>
+#include <grub/time.h>
 #include <grub/machine/console.h>
-#include <grub/machine/time.h>
 #include <grub/machine/kernel.h>
 #include <grub/ieee1275/ofdisk.h>
 #include <grub/ieee1275/ieee1275.h>
@@ -47,6 +47,15 @@
 extern char _end[];
 
 void
+grub_ticksleep (grub_uint32_t ticks)
+{
+  grub_uint32_t end_at;
+  end_at = grub_get_rtc () + ticks;
+  while (grub_get_rtc () < end_at)
+    grub_cpu_idle ();
+}
+
+void
 grub_exit (void)
 {
   /* Trap to Open Firmware.  */
diff -Nur grub2/kern/sparc64/ieee1275/init.c grub2.ticks/kern/sparc64/ieee1275/init.c
--- grub2/kern/sparc64/ieee1275/init.c	2007-07-22 01:32:28.000000000 +0200
+++ grub2.ticks/kern/sparc64/ieee1275/init.c	2007-10-15 16:28:44.000000000 +0200
@@ -27,6 +27,7 @@
 #include <grub/setjmp.h>
 #include <grub/env.h>
 #include <grub/misc.h>
+#include <grub/time.h>
 #include <grub/machine/console.h>
 #include <grub/machine/time.h>
 #include <grub/machine/kernel.h>
@@ -66,6 +67,15 @@
   /* Never reached.  */
 }
 
+void
+grub_ticksleep (grub_uint32_t ticks)
+{
+  grub_uint32_t end_at;
+  end_at = grub_get_rtc () + ticks;
+  while (grub_get_rtc () < end_at)
+    grub_cpu_idle ();
+}
+
 int
 grub_ieee1275_test_flag (enum grub_ieee1275_flag flag)
 {

^ permalink raw reply	[flat|nested] 11+ messages in thread

end of thread, other threads:[~2007-10-22 20:02 UTC | newest]

Thread overview: 11+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2007-10-15 14:38 [PATCH] Implement grub_sleep() and grub_ticksleep() Robert Millan
2007-10-16 14:11 ` Marco Gerards
2007-10-16 18:34   ` Robert Millan
2007-10-16 18:46     ` Marco Gerards
2007-10-16 20:06       ` Robert Millan
2007-10-17 10:33         ` Marco Gerards
2007-10-19 12:38           ` Robert Millan
2007-10-21 10:21             ` Marco Gerards
2007-10-21 12:26               ` Robert Millan
2007-10-21 12:54                 ` Robert Millan
2007-10-22 20:02                   ` Robert Millan

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.