2007-10-15 Robert Millan
* 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 .
*/
-#ifndef KERNEL_TIME_HEADER
-#define KERNEL_TIME_HEADER 1
+#ifndef KERNEL_MACHINE_TIME_HEADER
+#define KERNEL_MACHINE_TIME_HEADER 1
#include
@@ -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 .
+ */
+
+#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 .
*/
-#ifndef KERNEL_TIME_HEADER
-#define KERNEL_TIME_HEADER 1
+#ifndef KERNEL_MACHINE_TIME_HEADER
+#define KERNEL_MACHINE_TIME_HEADER 1
#include
@@ -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 .
+ */
+
+#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 .
*/
-#ifndef KERNEL_TIME_HEADER
-#define KERNEL_TIME_HEADER 1
+#ifndef KERNEL_MACHINE_TIME_HEADER
+#define KERNEL_MACHINE_TIME_HEADER 1
#include
@@ -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 .
+ */
+
+#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 .
+ */
+
+#ifndef KERNEL_TIME_HEADER
+#define KERNEL_TIME_HEADER 1
+
+#include
+#include
+#include
+
+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
#include
#include
+#include
+
+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
#include
#include
+#include
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
#include
#include
+#include
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
#include
#include
+#include
#include
-#include
#include
#include
#include
@@ -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
#include
#include
+#include
#include
-#include
#include
#include
#include
@@ -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)
{