commit-grub
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[1774] 2008-08-05 Colin D Bennett <address@hidden>


From: Marco Gerards
Subject: [1774] 2008-08-05 Colin D Bennett <address@hidden>
Date: Tue, 05 Aug 2008 11:54:38 +0000

Revision: 1774
          http://svn.sv.gnu.org/viewvc/?view=rev&root=grub&revision=1774
Author:   marco_g
Date:     2008-08-05 11:54:37 +0000 (Tue, 05 Aug 2008)

Log Message:
-----------
2008-08-05  Colin D Bennett  <address@hidden>
 
        High resolution timer support.  Implemented for x86 CPUs using TSC.
        Extracted generic grub_millisleep() so it's linked in only as needed.
        This requires a Pentium compatible CPU; if the RDTSC instruction is
        not supported, then it falls back on the generic grub_get_time_ms()
        implementation that uses the machine's RTC.

        * conf/i386-pc.rmk (kernel_img_SOURCES): Add `kern/time.c',
        `kern/i386/tsc.c', `kern/generic/rtc_get_time_ms.c' and
        `kern/generic/millisleep.c'.

        * conf/i386-efi.rmk (kernel_mod_SOURCES): Add `kern/i386/tsc.c',
        `kern/generic/rtc_get_time_ms.c' and `kern/generic/millisleep.c'.

        * conf/x86_64-efi.rml (kernel_mod_SOURCES): Add
        `kern/generic/millisleep.c' and `kern/generic/rtc_get_time_ms.c'.

        * conf/sparc64-ieee1275.rmk (kernel_elf_SOURCES): Likewise.

        * conf/powerpc-ieee1275.rmk (kernel_elf_SOURCES): Add
        `kern/generic/millisleep.c'.

        * conf/i386-ieee1275.rmk (kernel_elf_SOURCES): Likewise.

        * conf/i386-coreboot.rmk (kernel_elf_SOURCES): Add `kern/time.c'.

        * kern/generic/rtc_get_time_ms.c: New file.

        * kern/generic/millisleep.c: New file.
        
        * kern/misc.c: Don't include
        <kern/time.h> anymore.
        (grub_millisleep_generic): Removed.

        * commands/sleep.c (grub_interruptible_millisleep): Uses
        grub_get_time_ms() instead of grub_get_rtc().

        * include/grub/i386/tsc.h (grub_get_tsc): New file.  New inline
        function.
        (grub_cpu_is_cpuid_supported): New inline function.
        (grub_cpu_is_tsc_supported): New inline function.
        (grub_tsc_init): New function prototype.
        (grub_tsc_get_time_ms): New function prototype.

        * kern/i386/tsc.c (grub_get_time_ms): New file.

        * include/grub/time.h: Include <grub/types.h.
        (grub_millisleep_generic): Removed.
        (grub_get_time_ms): New prototype.
        (grub_install_get_time_ms): New prototype.
        (grub_rtc_get_time_ms): New prototype.

        * kern/time.c (grub_get_time_ms): New function.
        (grub_install_get_time_ms): New function.

        * kern/i386/efi/init.c: Include <grub/cpu/tsc.h>.  Don't include
        <grub/time.h> anymore.
        (grub_millisleep): Removed.
        (grub_machine_init): Call grub_tsc_init.

        * kern/i386/linuxbios/init.c (grub_machine_init): Install the RTC
        get_time_ms() implementation.

        * kern/sparc64/ieee1275/init.c (grub_millisleep): Removed.
        (ieee1275_get_time_ms): New function.
        (grub_machine_init): Install get_time_ms() implementation.

        * kern/i386/pc/init.c: Include <grub/cpu/tsc.h>.
        (grub_machine_init): Call grub_tsc_init().
        (grub_millisleep): Removed.
 
        * kern/ieee1275/init.c (grub_millisleep): Removed.
        (grub_machine_init): Install ieee1275_get_time_ms()
        implementation.
        (ieee1275_get_time_ms): New function.
        (grub_get_rtc): Now calls ieee1275_get_time_ms(), which does the
        real work.

Modified Paths:
--------------
    trunk/grub2/ChangeLog
    trunk/grub2/commands/sleep.c
    trunk/grub2/conf/i386-coreboot.rmk
    trunk/grub2/conf/i386-efi.rmk
    trunk/grub2/conf/i386-ieee1275.rmk
    trunk/grub2/conf/i386-pc.rmk
    trunk/grub2/conf/powerpc-ieee1275.rmk
    trunk/grub2/conf/sparc64-ieee1275.rmk
    trunk/grub2/conf/x86_64-efi.rmk
    trunk/grub2/include/grub/time.h
    trunk/grub2/kern/i386/efi/init.c
    trunk/grub2/kern/i386/linuxbios/init.c
    trunk/grub2/kern/i386/pc/init.c
    trunk/grub2/kern/ieee1275/init.c
    trunk/grub2/kern/misc.c
    trunk/grub2/kern/sparc64/ieee1275/init.c

Modified: trunk/grub2/ChangeLog
===================================================================
--- trunk/grub2/ChangeLog       2008-08-05 09:41:10 UTC (rev 1773)
+++ trunk/grub2/ChangeLog       2008-08-05 11:54:37 UTC (rev 1774)
@@ -1,3 +1,82 @@
+2008-08-05  Colin D Bennett  <address@hidden>
+ 
+       High resolution timer support.  Implemented for x86 CPUs using TSC.
+       Extracted generic grub_millisleep() so it's linked in only as needed.
+       This requires a Pentium compatible CPU; if the RDTSC instruction is
+       not supported, then it falls back on the generic grub_get_time_ms()
+       implementation that uses the machine's RTC.
+
+       * conf/i386-pc.rmk (kernel_img_SOURCES): Add `kern/time.c',
+       `kern/i386/tsc.c', `kern/generic/rtc_get_time_ms.c' and
+       `kern/generic/millisleep.c'.
+
+       * conf/i386-efi.rmk (kernel_mod_SOURCES): Add `kern/i386/tsc.c',
+       `kern/generic/rtc_get_time_ms.c' and `kern/generic/millisleep.c'.
+
+       * conf/x86_64-efi.rml (kernel_mod_SOURCES): Add
+       `kern/generic/millisleep.c' and `kern/generic/rtc_get_time_ms.c'.
+
+       * conf/sparc64-ieee1275.rmk (kernel_elf_SOURCES): Likewise.
+
+       * conf/powerpc-ieee1275.rmk (kernel_elf_SOURCES): Add
+       `kern/generic/millisleep.c'.
+
+       * conf/i386-ieee1275.rmk (kernel_elf_SOURCES): Likewise.
+
+       * conf/i386-coreboot.rmk (kernel_elf_SOURCES): Add `kern/time.c'.
+
+       * kern/generic/rtc_get_time_ms.c: New file.
+
+       * kern/generic/millisleep.c: New file.
+       
+       * kern/misc.c: Don't include
+       <kern/time.h> anymore.
+       (grub_millisleep_generic): Removed.
+
+       * commands/sleep.c (grub_interruptible_millisleep): Uses
+       grub_get_time_ms() instead of grub_get_rtc().
+
+       * include/grub/i386/tsc.h (grub_get_tsc): New file.  New inline
+       function.
+       (grub_cpu_is_cpuid_supported): New inline function.
+       (grub_cpu_is_tsc_supported): New inline function.
+       (grub_tsc_init): New function prototype.
+       (grub_tsc_get_time_ms): New function prototype.
+
+       * kern/i386/tsc.c (grub_get_time_ms): New file.
+
+       * include/grub/time.h: Include <grub/types.h.
+       (grub_millisleep_generic): Removed.
+       (grub_get_time_ms): New prototype.
+       (grub_install_get_time_ms): New prototype.
+       (grub_rtc_get_time_ms): New prototype.
+
+       * kern/time.c (grub_get_time_ms): New function.
+       (grub_install_get_time_ms): New function.
+
+       * kern/i386/efi/init.c: Include <grub/cpu/tsc.h>.  Don't include
+       <grub/time.h> anymore.
+       (grub_millisleep): Removed.
+       (grub_machine_init): Call grub_tsc_init.
+
+       * kern/i386/linuxbios/init.c (grub_machine_init): Install the RTC
+       get_time_ms() implementation.
+
+       * kern/sparc64/ieee1275/init.c (grub_millisleep): Removed.
+       (ieee1275_get_time_ms): New function.
+       (grub_machine_init): Install get_time_ms() implementation.
+
+       * kern/i386/pc/init.c: Include <grub/cpu/tsc.h>.
+       (grub_machine_init): Call grub_tsc_init().
+       (grub_millisleep): Removed.
+ 
+       * kern/ieee1275/init.c (grub_millisleep): Removed.
+       (grub_machine_init): Install ieee1275_get_time_ms()
+       implementation.
+       (ieee1275_get_time_ms): New function.
+       (grub_get_rtc): Now calls ieee1275_get_time_ms(), which does the
+       real work.
+
 2008-08-05  Marco Gerards  <address@hidden>
 
        * disk/ata.c: Include <grub/pci.h>.

Modified: trunk/grub2/commands/sleep.c
===================================================================
--- trunk/grub2/commands/sleep.c        2008-08-05 09:41:10 UTC (rev 1773)
+++ trunk/grub2/commands/sleep.c        2008-08-05 11:54:37 UTC (rev 1774)
@@ -43,15 +43,15 @@
   grub_printf ("%d    ", n);
 }
 
-/* Based on grub_millisleep() from kern/misc.c.  */
+/* Based on grub_millisleep() from kern/generic/millisleep.c.  */
 static int
 grub_interruptible_millisleep (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_uint64_t start;
+
+  start = grub_get_time_ms ();
+
+  while (grub_get_time_ms () - start < ms)
     if (grub_checkkey () >= 0 &&
        GRUB_TERM_ASCII_CHAR (grub_getkey ()) == GRUB_TERM_ESC)
       return 1;

Modified: trunk/grub2/conf/i386-coreboot.rmk
===================================================================
--- trunk/grub2/conf/i386-coreboot.rmk  2008-08-05 09:41:10 UTC (rev 1773)
+++ trunk/grub2/conf/i386-coreboot.rmk  2008-08-05 11:54:37 UTC (rev 1774)
@@ -16,6 +16,7 @@
        kern/main.c kern/device.c \
        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/time.c \
        kern/i386/dl.c kern/parser.c kern/partition.c \
        kern/env.c \
        term/i386/pc/console.c \

Modified: trunk/grub2/conf/i386-efi.rmk
===================================================================
--- trunk/grub2/conf/i386-efi.rmk       2008-08-05 09:41:10 UTC (rev 1773)
+++ trunk/grub2/conf/i386-efi.rmk       2008-08-05 11:54:37 UTC (rev 1774)
@@ -84,7 +84,10 @@
        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/rtc_get_time_ms.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: trunk/grub2/conf/i386-ieee1275.rmk
===================================================================
--- trunk/grub2/conf/i386-ieee1275.rmk  2008-08-05 09:41:10 UTC (rev 1773)
+++ trunk/grub2/conf/i386-ieee1275.rmk  2008-08-05 11:54:37 UTC (rev 1774)
@@ -19,6 +19,7 @@
        kern/misc.c kern/mm.c kern/loader.c kern/rescue.c kern/term.c \
        kern/i386/dl.c kern/parser.c kern/partition.c \
        kern/env.c \
+       kern/generic/millisleep.c \
        kern/ieee1275/ieee1275.c \
        term/ieee1275/ofconsole.c term/i386/pc/at_keyboard.c \
        disk/ieee1275/ofdisk.c \

Modified: trunk/grub2/conf/i386-pc.rmk
===================================================================
--- trunk/grub2/conf/i386-pc.rmk        2008-08-05 09:41:10 UTC (rev 1773)
+++ trunk/grub2/conf/i386-pc.rmk        2008-08-05 11:54:37 UTC (rev 1774)
@@ -42,7 +42,11 @@
 kernel_img_SOURCES = kern/i386/pc/startup.S kern/main.c kern/device.c \
        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/time.c \
        kern/i386/dl.c kern/i386/pc/init.c kern/parser.c kern/partition.c \
+       kern/i386/tsc.c \
+       kern/generic/rtc_get_time_ms.c \
+       kern/generic/millisleep.c \
        kern/env.c \
        term/i386/pc/console.c \
        symlist.c

Modified: trunk/grub2/conf/powerpc-ieee1275.rmk
===================================================================
--- trunk/grub2/conf/powerpc-ieee1275.rmk       2008-08-05 09:41:10 UTC (rev 
1773)
+++ trunk/grub2/conf/powerpc-ieee1275.rmk       2008-08-05 11:54:37 UTC (rev 
1774)
@@ -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: trunk/grub2/conf/sparc64-ieee1275.rmk
===================================================================
--- trunk/grub2/conf/sparc64-ieee1275.rmk       2008-08-05 09:41:10 UTC (rev 
1773)
+++ trunk/grub2/conf/sparc64-ieee1275.rmk       2008-08-05 11:54:37 UTC (rev 
1774)
@@ -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)

Modified: trunk/grub2/conf/x86_64-efi.rmk
===================================================================
--- trunk/grub2/conf/x86_64-efi.rmk     2008-08-05 09:41:10 UTC (rev 1773)
+++ trunk/grub2/conf/x86_64-efi.rmk     2008-08-05 11:54:37 UTC (rev 1774)
@@ -87,6 +87,7 @@
        kern/misc.c kern/mm.c kern/loader.c kern/rescue.c kern/term.c \
        kern/x86_64/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 \
+       kern/generic/millisleep.c kern/generic/rtc_get_time_ms.c \
        term/efi/console.c disk/efi/efidisk.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 \

Modified: trunk/grub2/include/grub/time.h
===================================================================
--- trunk/grub2/include/grub/time.h     2008-08-05 09:41:10 UTC (rev 1773)
+++ trunk/grub2/include/grub/time.h     2008-08-05 11:54:37 UTC (rev 1774)
@@ -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,17 +19,22 @@
 #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);
 
+grub_uint64_t grub_rtc_get_time_ms (void);
+
 static __inline void
 grub_sleep (grub_uint32_t s)
 {
   grub_millisleep (1000 * s);
 }
 
+void grub_install_get_time_ms (grub_uint64_t (*get_time_ms_func) (void));
+
 #endif /* ! KERNEL_TIME_HEADER */

Modified: trunk/grub2/kern/i386/efi/init.c
===================================================================
--- trunk/grub2/kern/i386/efi/init.c    2008-08-05 09:41:10 UTC (rev 1773)
+++ trunk/grub2/kern/i386/efi/init.c    2008-08-05 11:54:37 UTC (rev 1774)
@@ -25,18 +25,13 @@
 #include <grub/cache.h>
 #include <grub/kernel.h>
 #include <grub/efi/efi.h>
-#include <grub/time.h>
+#include <grub/cpu/tsc.h>
 
 void
-grub_millisleep (grub_uint32_t ms)
-{
-  grub_millisleep_generic (ms);
-}
-
-void
 grub_machine_init (void)
 {
   grub_efi_init ();
+  grub_tsc_init ();
 }
 
 void

Modified: trunk/grub2/kern/i386/linuxbios/init.c
===================================================================
--- trunk/grub2/kern/i386/linuxbios/init.c      2008-08-05 09:41:10 UTC (rev 
1773)
+++ trunk/grub2/kern/i386/linuxbios/init.c      2008-08-05 11:54:37 UTC (rev 
1774)
@@ -143,6 +143,8 @@
 
   /* This variable indicates size, not offset.  */
   grub_upper_mem -= GRUB_MEMORY_MACHINE_UPPER_START;
+
+  grub_install_get_time_ms (grub_rtc_get_time_ms);
 }
 
 void

Modified: trunk/grub2/kern/i386/pc/init.c
===================================================================
--- trunk/grub2/kern/i386/pc/init.c     2008-08-05 09:41:10 UTC (rev 1773)
+++ trunk/grub2/kern/i386/pc/init.c     2008-08-05 11:54:37 UTC (rev 1774)
@@ -30,6 +30,7 @@
 #include <grub/env.h>
 #include <grub/cache.h>
 #include <grub/time.h>
+#include <grub/cpu/tsc.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)))
@@ -231,6 +226,8 @@
   
   if (! grub_os_area_addr)
     grub_fatal ("no upper memory");
+
+  grub_tsc_init ();
 }
 
 void

Modified: trunk/grub2/kern/ieee1275/init.c
===================================================================
--- trunk/grub2/kern/ieee1275/init.c    2008-08-05 09:41:10 UTC (rev 1773)
+++ trunk/grub2/kern/ieee1275/init.c    2008-08-05 11:54:37 UTC (rev 1774)
@@ -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 ();
@@ -209,6 +203,8 @@
 
 #endif
 
+static grub_uint64_t ieee1275_get_time_ms (void);
+
 void
 grub_machine_init (void)
 {
@@ -258,6 +254,8 @@
            }
        }
     }
+
+  grub_install_get_time_ms (ieee1275_get_time_ms);
 }
 
 void
@@ -267,8 +265,8 @@
   grub_console_fini ();
 }
 
-grub_uint32_t
-grub_get_rtc (void)
+static grub_uint64_t
+ieee1275_get_time_ms (void)
 {
   grub_uint32_t msecs = 0;
 
@@ -277,6 +275,12 @@
   return msecs;
 }
 
+grub_uint32_t
+grub_get_rtc (void)
+{
+  return ieee1275_get_time_ms ();
+}
+
 grub_addr_t
 grub_arch_modules_addr (void)
 {

Modified: trunk/grub2/kern/misc.c
===================================================================
--- trunk/grub2/kern/misc.c     2008-08-05 09:41:10 UTC (rev 1773)
+++ trunk/grub2/kern/misc.c     2008-08-05 11:54:37 UTC (rev 1774)
@@ -23,7 +23,6 @@
 #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)
@@ -1018,17 +1017,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: trunk/grub2/kern/sparc64/ieee1275/init.c
===================================================================
--- trunk/grub2/kern/sparc64/ieee1275/init.c    2008-08-05 09:41:10 UTC (rev 
1773)
+++ trunk/grub2/kern/sparc64/ieee1275/init.c    2008-08-05 11:54:37 UTC (rev 
1774)
@@ -66,12 +66,6 @@
   /* Never reached.  */
 }
 
-void
-grub_millisleep (grub_uint32_t ms)
-{
-  grub_millisleep_generic (ms);
-}
-
 int
 grub_ieee1275_test_flag (enum grub_ieee1275_flag flag)
 {
@@ -145,6 +139,8 @@
   grub_free (prefix);
 }
 
+grub_uint64_t ieee1275_get_time_ms (void);
+
 void
 grub_machine_init (void)
 {
@@ -201,6 +197,7 @@
        }
     }
 
+  grub_install_get_time_ms (ieee1275_get_time_ms);
 }
 
 void
@@ -216,6 +213,12 @@
   grub_ieee1275_enter ();
 }
 
+grub_uint64_t
+ieee1275_get_time_ms (void)
+{
+  return grub_get_rtc ();
+}
+
 grub_uint32_t
 grub_get_rtc (void)
 {






reply via email to

[Prev in Thread] Current Thread [Next in Thread]