[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [RFC] High resolution time support using x86 TSC
From: |
Marco Gerards |
Subject: |
Re: [RFC] High resolution time support using x86 TSC |
Date: |
Thu, 03 Jul 2008 20:52:53 +0200 |
User-agent: |
Gnus/5.110006 (No Gnus v0.6) Emacs/21.4 (gnu/linux) |
Hi Colin,
Colin D Bennett <address@hidden> writes:
> I have implemented high resolution time support (through the
> new grub_get_time_ms() function) using the RDTSC instruction available
> on Pentium and higher x86 CPUs. The TSC value is simply a 64-bit block
> cycle counter that is zeroed at bootup, so grub_main() calls
> grub_time_init(), which is defined by each platform. If a platform
> links to kern/i386/tsc.c, then the grub_time_init() function from tsc.c
> is used, which calibrates the TSC rate and absolute zero reference using
> the RTC.
This is great!
> I also extracted the grub_millisleep_generic() function into
> kern/generic/millisleep.c and renamed it to grub_millisleep() so that
> platforms linking to it don't need to define a grub_millisleep() just
> to call grub_millisleep_generic() anymore. Simply linking in
> kern/generic/millisleep.c will use the generic implementation.
Ok.
> I have only tested this patch on the i386-pc platform, so if anyone
> tests it on another platform and finds problems, please let me know and
> I can try to fix it.
Did someone else test it? I can't...
> === modified file 'ChangeLog'
> --- ChangeLog 2008-06-21 14:21:03 +0000
> +++ ChangeLog 2008-06-23 14:40:22 +0000
> @@ -1,3 +1,87 @@
> +2008-06-22 Colin D Bennett <address@hidden>
> +
> + High resolution timer support. Implemented for i386 CPU using TSC.
> + Extracted generic grub_millisleep() so it's linked in only as needed.
What if TSC is not available?
> + * conf/i386-efi.rmk: Added TSC high resolution time module, link with
> + generic grub_millisleep() function.
> +
> + * conf/i386-pc.rmk: Likewise.
> +
> + * conf/sparc64-ieee1275.rmk: Add kern/generic/millisleep.c and
> + kern/generic/get_time_ms.c to kernel, to use generic time functions.
> +
> + * conf/powerpc-ieee1275.rmk: Add kern/generic/millisleep.c to kernel,
> + to use generic grub_millisleep() function.
> +
> + * kern/generic/get_time_ms.c (grub_get_time_ms): New file. Platform
> + independent implementation of grub_get_time_ms() using the RTC that
> + can be linked into a platform's kernel when it does not implement its
> + own specialized grub_get_time_ms() function.
> +
> + * kern/generic/millisleep.c (grub_millisleep): New file. Extracted
> + from grub_millisleep_generic() in kern/misc.c and renamed. Now it is
> + not included in the kernel when a platform defines a specialized
> + grub_millisleep() implementation.
> +
> + * include/grub/i386/tsc.h (grub_get_tsc): New file. Inline function
> + grub_get_tsc() uses x86 RDTSC instruction (available on Pentium+ CPUs)
> + to read the counter value for the TSC.
> +
> + * kern/i386/tsc.c (grub_get_time_ms): x86 TSC support providing a high
> + resolution clock.
> + (grub_tsc_calibrate): Static function to calibrate the TSC using RTC.
> + (grub_time_init): Implemented to call the static grub_tsc_calibrate()
> + function to calibrate the TSC.
> +
> + * include/grub/kernel.h (grub_time_init): Add declaration for the
> + grub_time_init() platform specific time initialization function. This
> + function should be implemented by all platforms. If kern/i386/tsc.c
> + is linked in, it will provide grub_time_init().
> +
> + * include/grub/time.h (grub_get_time_ms): Added grub_get_time_ms()
> + function to return the current time in millseconds since the epoch.
> + This supports higher resolution time than grub_get_rtc() on some
> + platforms such as i386-pc, where the RTC has only about 1/18 s
> + precision but a higher precision timer such as the TSC is available.
> +
> + * kern/i386/efi/init.c (grub_millisleep): Don't define
> + grub_millisleep() -- it just called grub_millisleep_generic() but now
> + we just need to link with kern/generic/millisleep.c to use the generic
> + implementation.
> +
> + * kern/i386/pc/init.c (grub_millisleep): Likewise.
> +
> + * kern/ieee1275/init.c (grub_millisleep): Don't define
> + grub_millisleep() -- it just called grub_millisleep_generic() but now
> + we just need to link with kern/generic/millisleep.c to use the generic
> + implementation.
No need to mention how it has to be linked. I just assume you made
this change already?
> + (grub_get_time_ms): Implement this required function. Simply uses the
> + prior implementation of grub_get_rtc().
> + (grub_get_rtc): Now calls grub_get_time_ms(), which does the real
> + work.
> + (grub_time_init): Define this empty but required function. No further
> + initialization necessary.
> +
> + * kern/sparc64/ieee1275/init.c (grub_millisleep): Don't define
> + grub_millisleep(), just link with kern/generic/millisleep.c.
> + (grub_time_init): Define this required function. Does nothing since
> + the generic RTC-based functions are used.
No need to mention what a function does. Only describe the changes
you make. Other information should go into the file itself as
comments, if it is important enough. Here it is only noise...
> + * kern/i386/linuxbios/init.c (grub_get_time_ms):
> + Define grub_get_time_ms() to always return 0. This should be fixed
> + when RTC functionality is implemented.
> + (grub_time_init): Define this required function as a no-op. Inserted
> + a comment to remind us delete this function when proper time support
> + is added to i386-linuxbios.
> +
> + * kern/main.c (grub_main): Call grub_time_init() right after
> + grub_machine_init().
I think this should go into grub_machine_init? Why didn't you just
add it there?
> + * kern/misc.c (grub_millisleep_generic): Moved to
> + kern/generic/millisleep.c so that it is only included in the kernel
> + image when a platform does not define a specialized version.
Please scroll down for more comments.
> 2008-06-21 Javier MartÃn <address@hidden>
>
> * util/i386/pc/grub-setup.c (setup): Remove literal "core.img" in a
>
> === modified file 'conf/i386-efi.rmk'
> --- conf/i386-efi.rmk 2008-06-19 05:14:16 +0000
> +++ conf/i386-efi.rmk 2008-06-23 02:29:15 +0000
> @@ -84,7 +84,9 @@
> kern/misc.c kern/mm.c kern/loader.c kern/rescue.c kern/term.c \
> kern/i386/dl.c kern/i386/efi/init.c kern/parser.c kern/partition.c \
> kern/env.c symlist.c kern/efi/efi.c kern/efi/init.c kern/efi/mm.c \
> - term/efi/console.c disk/efi/efidisk.c
> + term/efi/console.c disk/efi/efidisk.c \
> + kern/i386/tsc.c \
> + kern/generic/millisleep.c
> kernel_mod_HEADERS = arg.h boot.h cache.h device.h disk.h dl.h elf.h
> elfload.h \
> env.h err.h file.h fs.h kernel.h loader.h misc.h mm.h net.h parser.h \
> partition.h pc_partition.h rescue.h symbol.h term.h time.h types.h \
>
> === modified file 'conf/i386-pc.rmk'
> --- conf/i386-pc.rmk 2008-06-19 05:14:16 +0000
> +++ conf/i386-pc.rmk 2008-06-23 02:29:15 +0000
> @@ -43,6 +43,8 @@
> kern/disk.c kern/dl.c kern/file.c kern/fs.c kern/err.c \
> kern/misc.c kern/mm.c kern/loader.c kern/rescue.c kern/term.c \
> kern/i386/dl.c kern/i386/pc/init.c kern/parser.c kern/partition.c \
> + kern/i386/tsc.c \
> + kern/generic/millisleep.c \
> kern/env.c \
> term/i386/pc/console.c \
> symlist.c
>
> === modified file 'conf/powerpc-ieee1275.rmk'
> --- conf/powerpc-ieee1275.rmk 2008-06-19 05:14:16 +0000
> +++ conf/powerpc-ieee1275.rmk 2008-06-23 14:33:56 +0000
> @@ -85,6 +85,7 @@
> kern/ieee1275/init.c term/ieee1275/ofconsole.c \
> kern/ieee1275/openfw.c disk/ieee1275/ofdisk.c \
> kern/parser.c kern/partition.c kern/env.c kern/powerpc/dl.c \
> + kern/generic/millisleep.c \
> symlist.c kern/powerpc/cache.S
> kernel_elf_HEADERS = grub/powerpc/ieee1275/ieee1275.h
> kernel_elf_CFLAGS = $(COMMON_CFLAGS)
>
> === modified file 'conf/sparc64-ieee1275.rmk'
> --- conf/sparc64-ieee1275.rmk 2008-06-19 01:04:59 +0000
> +++ conf/sparc64-ieee1275.rmk 2008-06-23 14:33:56 +0000
> @@ -73,6 +73,7 @@
> kern/rescue.c kern/term.c term/ieee1275/ofconsole.c \
> kern/sparc64/ieee1275/openfw.c disk/ieee1275/ofdisk.c \
> kern/partition.c kern/env.c kern/sparc64/dl.c symlist.c \
> + kern/generic/millisleep.c kern/generic/get_time_ms.c \
> kern/sparc64/cache.S kern/parser.c
> kernel_elf_HEADERS = grub/sparc64/ieee1275/ieee1275.h
> kernel_elf_CFLAGS = $(COMMON_CFLAGS)
>
> === added file 'include/grub/i386/tsc.h'
> --- include/grub/i386/tsc.h 1970-01-01 00:00:00 +0000
> +++ include/grub/i386/tsc.h 2008-06-17 20:14:24 +0000
> @@ -0,0 +1,41 @@
> +/*
> + * GRUB -- GRand Unified Bootloader
> + * Copyright (C) 2008 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_TSC_HEADER
> +#define KERNEL_CPU_TSC_HEADER 1
> +
> +#include <grub/types.h>
> +
> +/* Read the TSC value, which increments with each CPU clock cycle. */
> +static __inline grub_uint64_t
> +grub_get_tsc (void)
> +{
> + grub_uint32_t lo, hi;
> +
> + /* The CPUID instruction is a 'serializing' instruction, and
> + * avoids out-of-order execution of the RDTSC instruction. */
> + __asm__ __volatile__ ("xorl %%eax, %%eax\n\t"
> + "cpuid":::"%rax", "%rbx", "%rcx", "%rdx");
> + /* Read TSC value. We cannot use "=A", since this would use
> + * %rax on x86_64. */
> + __asm__ __volatile__ ("rdtsc":"=a" (lo), "=d" (hi));
> +
> + return (((grub_uint64_t) hi) << 32) | lo;
> +}
> +
> +#endif /* ! KERNEL_CPU_TSC_HEADER */
>
> === modified file 'include/grub/kernel.h'
> --- include/grub/kernel.h 2008-01-21 00:04:04 +0000
> +++ include/grub/kernel.h 2008-06-17 15:04:05 +0000
> @@ -58,6 +58,9 @@
> /* The machine-specific prefix initialization. */
> void grub_machine_set_prefix (void);
>
> +/* The machine-specific time source initialization. */
> +void grub_time_init (void);
> +
> /* Register all the exported symbols. This is automatically generated. */
> void grub_register_exported_symbols (void);
>
>
> === modified file 'include/grub/time.h'
> --- include/grub/time.h 2007-10-22 20:02:16 +0000
> +++ include/grub/time.h 2008-06-17 20:14:24 +0000
> @@ -1,6 +1,6 @@
> /*
> * GRUB -- GRand Unified Bootloader
> - * Copyright (C) 2007 Free Software Foundation, Inc.
> + * Copyright (C) 2007, 2008 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
> @@ -19,12 +19,13 @@
> #ifndef KERNEL_TIME_HEADER
> #define KERNEL_TIME_HEADER 1
>
> +#include <grub/types.h>
> #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);
> +grub_uint64_t EXPORT_FUNC(grub_get_time_ms) (void);
>
> static __inline void
> grub_sleep (grub_uint32_t s)
>
> === added directory 'kern/generic'
> === added file 'kern/generic/get_time_ms.c'
> --- kern/generic/get_time_ms.c 1970-01-01 00:00:00 +0000
> +++ kern/generic/get_time_ms.c 2008-06-17 15:04:05 +0000
> @@ -0,0 +1,37 @@
> +/* get_time_ms.c - generic time implementation -- using platform RTC.
> + * The generic implementation of these functions can be used for
> architectures
> + * or platforms that do not have a more specialized implementation. */
> +/*
> + * GRUB -- GRand Unified Bootloader
> + * Copyright (C) 2008 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/>.
> + */
> +
> +#include <grub/time.h>
> +#include <grub/misc.h>
> +
> +/* Calculate the time in milliseconds since the epoch based on the RTC. */
> +grub_uint64_t
> +grub_get_time_ms (void)
> +{
> + /* By dimensional analysis:
> + *
> + * 1000 ms N rtc ticks 1 s
> + * ------- * ----------- * ----------- = 1000*N/T ms
> + * 1 s 1 T rtc ticks
> + */
> + grub_uint64_t ticks_ms_per_sec = ((grub_uint64_t) 1000) * grub_get_rtc ();
> + return grub_divmod64 (ticks_ms_per_sec, GRUB_TICKS_PER_SECOND, 0);
> +}
>
> === added file 'kern/generic/millisleep.c'
> --- kern/generic/millisleep.c 1970-01-01 00:00:00 +0000
> +++ kern/generic/millisleep.c 2008-06-23 14:33:56 +0000
> @@ -0,0 +1,39 @@
> +/* millisleep.c - generic millisleep function.
> + * The generic implementation of these functions can be used for
> architectures
> + * or platforms that do not have a more specialized implementation. */
> +/*
> + * GRUB -- GRand Unified Bootloader
> + * Copyright (C) 1999,2000,2001,2002,2003,2004,2005,2006,2007,2008 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/>.
> + */
> +
> +#include <grub/misc.h>
> +#include <grub/time.h>
> +
> +void
> +grub_millisleep (grub_uint32_t ms)
> +{
> + /* Note: Perhaps this function should use grub_get_time_ms() instead of
> + * grub_get_rtc()so it can take advantage of high resolution timing
> + * on platforms where it is provided. */
> +
> + grub_uint32_t end_at;
> +
> + end_at =
> + grub_get_rtc () + grub_div_roundup (ms * GRUB_TICKS_PER_SECOND, 1000);
> +
> + while (grub_get_rtc () < end_at)
> + grub_cpu_idle ();
> +}
>
> === modified file 'kern/i386/efi/init.c'
> --- kern/i386/efi/init.c 2007-10-22 19:59:33 +0000
> +++ kern/i386/efi/init.c 2008-06-17 15:04:05 +0000
> @@ -25,13 +25,6 @@
> #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)
>
> === modified file 'kern/i386/linuxbios/init.c'
> --- kern/i386/linuxbios/init.c 2008-02-13 20:04:37 +0000
> +++ kern/i386/linuxbios/init.c 2008-06-23 14:33:56 +0000
> @@ -33,6 +33,7 @@
> #include <grub/time.h>
> #include <grub/symbol.h>
> #include <grub/cpu/io.h>
> +#include <grub/cpu/time.h>
>
> #define GRUB_FLOPPY_REG_DIGITAL_OUTPUT 0x3f2
>
> @@ -52,6 +53,23 @@
> return grub_time_tics;
> }
>
> +grub_uint64_t
> +grub_get_time_ms (void)
> +{
> + /* FIXME: Delete this function and link to `kern/i386/tsc.c' once RTC
> + * is implemented. See also comment below in grub_time_init(). */
> + return 0;
> +}
Please do not use comments with *'s on each line.
> +void
> +grub_time_init (void)
> +{
> + /* FIXME: Delete this function and link with `kern/i386/tsc.c' once RTC
> + * is implemented. Until then, this dummy function simply defines
> + * grub_time_init(), which is called by grub_main() in `kern/main.c'.
> + * Without RTC, TSC calibration will hang waiting for an RTC edge. */
> +}
> +
Same here. Can you explain what is going on here?
> /* Stop the floppy drive from spinning, so that other software is
> jumped to with a known state. */
> void
>
> === modified file 'kern/i386/pc/init.c'
> --- kern/i386/pc/init.c 2008-06-15 18:21:16 +0000
> +++ kern/i386/pc/init.c 2008-06-17 16:28:36 +0000
> @@ -30,6 +30,7 @@
> #include <grub/env.h>
> #include <grub/cache.h>
> #include <grub/time.h>
> +#include <grub/cpu/time.h>
>
> struct mem_region
> {
> @@ -46,12 +47,6 @@
> 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)))
>
> === added file 'kern/i386/tsc.c'
> --- kern/i386/tsc.c 1970-01-01 00:00:00 +0000
> +++ kern/i386/tsc.c 2008-06-17 15:04:05 +0000
> @@ -0,0 +1,99 @@
> +/* kern/i386/tsc.c - x86 TSC time source implementation
> + * Requires Pentium or better x86 CPU that supports the RDTSC instruction.
> + * This module uses the RTC (via grub_get_rtc()) to calibrate the TSC to
> + * real time.
> + *
> + * 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/>.
> + */
> +
> +#include <grub/types.h>
> +#include <grub/time.h>
> +#include <grub/misc.h>
> +#include <grub/i386/tsc.h>
> +
> +/* Reference for TSC=0. This defines the time since the epoch in
> + * milliseconds that TSC=0 refers to. */
> +static grub_uint64_t tsc_boot_time = 0;
Please do not use a * on each line for comments. No need to set this
to zero explicitly.
> +/* TSC rate. TSC ticks per millisecond.
> + * Begin with default (incorrect) value of assuming a 1 GHz machine.
> + * grub_tsc_calibrate() must be called to set this properly. */
> +static grub_uint64_t tsc_ticks_per_ms = 1000000;
Same as above.
The value is not correct. Why can't we just set it to 0?
> +/* Declared in <grub/time.h>. */
> +grub_uint64_t
> +grub_get_time_ms (void)
> +{
> + return tsc_boot_time + grub_divmod64 (grub_get_tsc (), tsc_ticks_per_ms,
> 0);
> +}
> +
> +
> +/* How many RTC ticks to use for calibration loop. (>= 1) */
> +#define CALIBRATION_TICKS 2
> +
> +/* Called by the machine-specific time initialization function
> + * grub_time_init() below. */
> +static void
> +grub_tsc_calibrate (void)
> +{
> + /* First calbrate the TSC rate (relative, not absolute time). */
> + grub_uint64_t start_tsc;
> + grub_uint64_t end_tsc;
> + grub_uint32_t initial_tick;
> + grub_uint32_t start_tick;
> + grub_uint32_t end_tick;
> +
> + /* Wait for the start of the next tick;
> + we'll base out timing off this edge. */
> + initial_tick = grub_get_rtc ();
> + do
> + {
> + start_tick = grub_get_rtc ();
> + }
> + while (start_tick == initial_tick);
> + start_tsc = grub_get_tsc ();
> +
> + /* Wait for the start of the next tick. This will
> + be the end of the 1-tick period. */
> + do
> + {
> + end_tick = grub_get_rtc ();
> + }
> + while (end_tick - start_tick < CALIBRATION_TICKS);
> + end_tsc = grub_get_tsc ();
> +
> + tsc_ticks_per_ms =
> + grub_divmod64 (grub_divmod64
> + (end_tsc - start_tsc, end_tick - start_tick, 0)
> + * GRUB_TICKS_PER_SECOND, 1000, 0);
> +
> + /* Reference the TSC zero (boot time) to the epoch to
> + * get an absolute real time reference. */
> + grub_uint64_t ms_since_boot = grub_divmod64 (end_tsc, tsc_ticks_per_ms, 0);
> + grub_uint64_t mstime_now = grub_divmod64 ((grub_uint64_t) 1000 * end_tick,
> + GRUB_TICKS_PER_SECOND,
> + 0);
> + tsc_boot_time = mstime_now - ms_since_boot;
> +}
> +
> +/* Implement the machine-specific time initialization function. */
> +void
> +grub_time_init (void)
> +{
> + grub_tsc_calibrate ();
> +}
>
> === modified file 'kern/ieee1275/init.c'
> --- kern/ieee1275/init.c 2008-04-25 19:41:48 +0000
> +++ kern/ieee1275/init.c 2008-06-17 15:04:05 +0000
> @@ -47,12 +47,6 @@
> extern char _end[];
>
> void
> -grub_millisleep (grub_uint32_t ms)
> -{
> - grub_millisleep_generic (ms);
> -}
> -
> -void
> grub_exit (void)
> {
> grub_ieee1275_exit ();
> @@ -257,8 +251,13 @@
> grub_console_fini ();
> }
>
> -grub_uint32_t
> -grub_get_rtc (void)
> +void
> +grub_time_init (void)
> +{
> +}
> +
> +grub_uint64_t
> +grub_get_time_ms (void)
> {
> grub_uint32_t msecs = 0;
>
> @@ -267,6 +266,12 @@
> return msecs;
> }
>
> +grub_uint32_t
> +grub_get_rtc (void)
> +{
> + return grub_get_time_ms ();
> +}
> +
> grub_addr_t
> grub_arch_modules_addr (void)
> {
>
> === modified file 'kern/main.c'
> --- kern/main.c 2008-06-19 20:08:57 +0000
> +++ kern/main.c 2008-06-23 02:29:15 +0000
> @@ -112,6 +112,7 @@
> {
> /* First of all, initialize the machine. */
> grub_machine_init ();
> + grub_time_init ();
>
> /* Hello. */
> grub_setcolorstate (GRUB_TERM_COLOR_HIGHLIGHT);
>
> === modified file 'kern/misc.c'
> --- kern/misc.c 2008-06-16 00:42:48 +0000
> +++ kern/misc.c 2008-06-17 16:28:36 +0000
> @@ -1018,17 +1018,6 @@
> return p - dest;
> }
>
> -void
> -grub_millisleep_generic (grub_uint32_t ms)
> -{
> - grub_uint32_t end_at;
> -
> - end_at = grub_get_rtc () + grub_div_roundup (ms * GRUB_TICKS_PER_SECOND,
> 1000);
> -
> - while (grub_get_rtc () < end_at)
> - grub_cpu_idle ();
> -}
> -
> /* Abort GRUB. This function does not return. */
> void
> grub_abort (void)
>
> === modified file 'kern/sparc64/ieee1275/init.c'
> --- kern/sparc64/ieee1275/init.c 2007-10-22 19:59:33 +0000
> +++ kern/sparc64/ieee1275/init.c 2008-06-23 14:33:56 +0000
> @@ -66,10 +66,10 @@
> /* Never reached. */
> }
>
> +/* Define the required grub_time_init() function. */
> void
> -grub_millisleep (grub_uint32_t ms)
> +grub_time_init (void)
> {
> - grub_millisleep_generic (ms);
> }
>
> int
>
> _______________________________________________
> Grub-devel mailing list
> address@hidden
> http://lists.gnu.org/mailman/listinfo/grub-devel
- Re: [RFC] High resolution time support using x86 TSC,
Marco Gerards <=