On Tue, Oct 16, 2007 at 08:46:16PM +0200, Marco Gerards wrote:
> >
> > That's what grub_ticksleep does.  grub_sleep() counts in seconds because
> > I tried to mimic POSIX which seems to be a trend for grub_* functions.  I
> > think it can be used for menu timeout although I didn't have time to look.
> 
> Right.  Although I do not like setting the time in
> GRUB_TICKS_PER_SECOND for millisecond stuff, etc.  In that case
> everyone has to implement the same functionality.

Moved to grub_millisleep().

> > OTOH, this wouldn't be the first place in grub where __i386__ is tested ;-)
> 
> Oh?  Perhaps that code is wrong?

Actually now that I check it's only in one file.  But the code is right afaict.

> >> > +
> >> > +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 ();
> >> > +}
> >> 
> >> Why do you recreate this for every arch?  This seems portable as long
> >> as you can sleep a bit from time to time.
> >
> > What if a platform provides a sleep-like mechanism, but not a get_rtc-like
> > one?  You can implement sleep around get_rtc easily, but not the other way
> > around.  This is the case for LB (simply because grub_get_rtc is not
> > implemented yet), but it could also happen on platforms that are designed
> > not to provide it or are just buggy.
> 
> Well, I have no objections to this approach.

Ok.  I made it a bit better by implementing grub_millisleep_generic in
kern/misc.c and making each port just use that, having the option to do it
their way if preferred.

> Are you sure init.c is
> the right place?

Mostly.  I've observed that for code that doesn't obviously belong somewhere
else, it tends to be in init.c if it's in C and startup.S if it's in asm (in
i386/pc/startup.S it actually gets to the extreme, since only a small part of
it is used for "startup" as such).

So I think init.c is fine.

-- 
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 /.)
2007-10-15  Robert Millan  <[EMAIL PROTECTED]>

	* include/grub/time.h: New file.
	* include/grub/i386/time.h: Likewise.
	* include/grub/powerpc/time.h: Likewise.
	* include/grub/sparc64/time.h: Likewise.

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

	* kern/i386/efi/init.c: Include `grub/time.h'.
	(grub_millisleep): New function.
	* kern/i386/pc/init.c: Include `grub/time.h'.
	(grub_millisleep): New function.
	* kern/powerpc/ieee1275/init.c: Include `grub/time.h'.
	Remove `grub/machine/time.h' include.
	(grub_millisleep): New function.
	* kern/sparc64/ieee1275/init.c: Include `grub/time.h'.
	Remove `grub/machine/time.h' include.
	(grub_millisleep): New function.

	* kern/misc.c: Include `grub/time.h'.
	(grub_millisleep_generic): New function.

diff -Nurp grub2/include/grub/i386/pc/time.h grub2.sleep/include/grub/i386/pc/time.h
--- grub2/include/grub/i386/pc/time.h	2007-07-22 01:32:24.000000000 +0200
+++ grub2.sleep/include/grub/i386/pc/time.h	2007-10-16 20:58:23.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 -Nurp grub2/include/grub/i386/time.h grub2.sleep/include/grub/i386/time.h
--- grub2/include/grub/i386/time.h	1970-01-01 01:00:00.000000000 +0100
+++ grub2.sleep/include/grub/i386/time.h	2007-10-16 21:00:04.000000000 +0200
@@ -0,0 +1,28 @@
+/*
+ *  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_CPU_TIME_HEADER
+#define KERNEL_CPU_TIME_HEADER	1
+
+static __inline void
+grub_cpu_idle ()
+{
+  __asm__ __volatile__ ("hlt");
+}
+
+#endif /* ! KERNEL_CPU_TIME_HEADER */
diff -Nurp grub2/include/grub/powerpc/ieee1275/time.h grub2.sleep/include/grub/powerpc/ieee1275/time.h
--- grub2/include/grub/powerpc/ieee1275/time.h	2007-07-22 01:32:24.000000000 +0200
+++ grub2.sleep/include/grub/powerpc/ieee1275/time.h	2007-10-16 20:58:23.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 -Nurp grub2/include/grub/powerpc/time.h grub2.sleep/include/grub/powerpc/time.h
--- grub2/include/grub/powerpc/time.h	1970-01-01 01:00:00.000000000 +0100
+++ grub2.sleep/include/grub/powerpc/time.h	2007-10-16 21:00:48.000000000 +0200
@@ -0,0 +1,28 @@
+/*
+ *  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_CPU_TIME_HEADER
+#define KERNEL_CPU_TIME_HEADER	1
+
+static __inline void
+grub_cpu_idle ()
+{
+  /* FIXME: not implemented */
+}
+
+#endif /* ! KERNEL_CPU_TIME_HEADER */
diff -Nurp grub2/include/grub/sparc64/ieee1275/time.h grub2.sleep/include/grub/sparc64/ieee1275/time.h
--- grub2/include/grub/sparc64/ieee1275/time.h	2007-07-22 01:32:25.000000000 +0200
+++ grub2.sleep/include/grub/sparc64/ieee1275/time.h	2007-10-16 20:58:23.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 -Nurp grub2/include/grub/sparc64/time.h grub2.sleep/include/grub/sparc64/time.h
--- grub2/include/grub/sparc64/time.h	1970-01-01 01:00:00.000000000 +0100
+++ grub2.sleep/include/grub/sparc64/time.h	2007-10-16 21:01:08.000000000 +0200
@@ -0,0 +1,28 @@
+/*
+ *  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_CPU_TIME_HEADER
+#define KERNEL_CPU_TIME_HEADER	1
+
+static __inline void
+grub_cpu_idle ()
+{
+  /* FIXME: not implemented */
+}
+
+#endif /* ! KERNEL_CPU_TIME_HEADER */
diff -Nurp grub2/include/grub/time.h grub2.sleep/include/grub/time.h
--- grub2/include/grub/time.h	1970-01-01 01:00:00.000000000 +0100
+++ grub2.sleep/include/grub/time.h	2007-10-16 21:41:05.000000000 +0200
@@ -0,0 +1,38 @@
+/*
+ *  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>
+#include <grub/cpu/time.h>
+
+void EXPORT_FUNC(grub_millisleep) (grub_uint32_t ms);
+void EXPORT_FUNC(grub_millisleep_generic) (grub_uint32_t ms);
+
+static __inline void
+grub_sleep (grub_uint32_t s)
+{
+  grub_millisleep (1000 * s);
+}
+
+/* Duration of a tick in milliseconds, rounded up */
+#define TICK_DURATION_IN_MS ((1000 + GRUB_TICKS_PER_SECOND) / GRUB_TICKS_PER_SECOND)
+
+#endif /* ! KERNEL_TIME_HEADER */
diff -Nurp grub2/kern/i386/efi/init.c grub2.sleep/kern/i386/efi/init.c
--- grub2/kern/i386/efi/init.c	2007-07-22 01:32:27.000000000 +0200
+++ grub2.sleep/kern/i386/efi/init.c	2007-10-16 21:54:31.000000000 +0200
@@ -25,6 +25,13 @@
 #include <grub/cache.h>
 #include <grub/kernel.h>
 #include <grub/efi/efi.h>
+#include <grub/time.h>
+
+void
+grub_millisleep (grub_uint32_t ms)
+{
+  grub_millisleep_generic (ms);
+}
 
 void
 grub_machine_init (void)
diff -Nurp grub2/kern/i386/pc/init.c grub2.sleep/kern/i386/pc/init.c
--- grub2/kern/i386/pc/init.c	2007-09-07 23:55:26.000000000 +0200
+++ grub2.sleep/kern/i386/pc/init.c	2007-10-16 21:54:26.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,12 @@ grub_addr_t grub_os_area_addr;
 grub_size_t grub_os_area_size;
 grub_size_t grub_lower_mem, grub_upper_mem;
 
+void
+grub_millisleep (grub_uint32_t ms)
+{
+  grub_millisleep_generic (ms);
+}
+
 void 
 grub_arch_sync_caches (void *address __attribute__ ((unused)),
 		       grub_size_t len __attribute__ ((unused)))
diff -Nurp grub2/kern/misc.c grub2.sleep/kern/misc.c
--- grub2/kern/misc.c	2007-08-02 22:42:19.000000000 +0200
+++ grub2.sleep/kern/misc.c	2007-10-16 21:50:47.000000000 +0200
@@ -23,6 +23,7 @@
 #include <stdarg.h>
 #include <grub/term.h>
 #include <grub/env.h>
+#include <grub/time.h>
 
 void *
 grub_memmove (void *dest, const void *src, grub_size_t n)
@@ -1041,6 +1042,23 @@ grub_utf8_to_ucs4 (grub_uint32_t *dest, 
   return p - dest;
 }
 
+void
+grub_millisleep_generic (grub_uint32_t ms)
+{
+  grub_uint32_t time;
+  int i;
+
+  for (; ms > 0; ms -= TICK_DURATION_IN_MS)
+    /* wait for the lowest fraction of milliseconds we can (rounded up) */
+    for (i = 0; i < TICK_DURATION_IN_MS; i++)
+      {
+	/* wait for next tick */
+	time = grub_get_rtc ();
+	while (time == grub_get_rtc ())
+	  grub_cpu_idle ();
+      }
+}
+
 /* Abort GRUB. This function does not return.  */
 void
 grub_abort (void)
diff -Nurp grub2/kern/powerpc/ieee1275/init.c grub2.sleep/kern/powerpc/ieee1275/init.c
--- grub2/kern/powerpc/ieee1275/init.c	2007-10-12 12:22:27.000000000 +0200
+++ grub2.sleep/kern/powerpc/ieee1275/init.c	2007-10-16 21:55:07.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,12 @@ extern char _start[];
 extern char _end[];
 
 void
+grub_millisleep (grub_uint32_t ms)
+{
+  grub_millisleep_generic (ms);
+}
+
+void
 grub_exit (void)
 {
   /* Trap to Open Firmware.  */
diff -Nurp grub2/kern/sparc64/ieee1275/init.c grub2.sleep/kern/sparc64/ieee1275/init.c
--- grub2/kern/sparc64/ieee1275/init.c	2007-07-22 01:32:28.000000000 +0200
+++ grub2.sleep/kern/sparc64/ieee1275/init.c	2007-10-16 22:02:33.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>
@@ -66,6 +66,12 @@ _start (uint64_t r0 __attribute__((unuse
   /* Never reached.  */
 }
 
+void
+grub_millisleep (grub_uint32_t ms)
+{
+  grub_millisleep_generic (ms);
+}
+
 int
 grub_ieee1275_test_flag (enum grub_ieee1275_flag flag)
 {
_______________________________________________
Grub-devel mailing list
Grub-devel@gnu.org
http://lists.gnu.org/mailman/listinfo/grub-devel

Reply via email to