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