grub-devel
[Top][All Lists]
Advanced

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

Re: [PATCH] Implement grub_sleep() and grub_ticksleep()


From: Robert Millan
Subject: Re: [PATCH] Implement grub_sleep() and grub_ticksleep()
Date: Mon, 22 Oct 2007 22:02:36 +0200
User-agent: Mutt/1.5.13 (2006-08-11)

Committed.

On Sun, Oct 21, 2007 at 02:54:24PM +0200, Robert Millan wrote:
> 
> I noticed that one also needs to update time.h headers in conf/*.rmk to
> make the build system happy about symbol dependencies.  See new patch.
> 
> -- 
> 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-21  Robert Millan  <address@hidden>
> 
>       * 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.
> 
>       * include/grub/misc.h (grub_div_roundup): New function.
> 
>       * kern/misc.c: Include `<grub/time.h>'.
>       (grub_millisleep_generic): New function.
> 
>       * conf/i386-efi.rmk (kernel_mod_HEADERS): Remove `i386/efi/time.h'.
>       Add `time.h'.
>       * conf/i386-pc.rmk (kernel_img_HEADERS): Remove `machine/time.h'.
>       Add `time.h'.
>       * conf/powerpc-ieee1275.rmk (kernel_elf_HEADERS): Remove
>       `machine/time.h'.  Add `time.h'.
>       * conf/sparc64-ieee1275.rmk (kernel_elf_HEADERS): Likewise.
> 
> diff -Nurp grub2/conf/i386-efi.rmk grub2.time/conf/i386-efi.rmk
> --- grub2/conf/i386-efi.rmk   2007-10-02 23:34:33.000000000 +0200
> +++ grub2.time/conf/i386-efi.rmk      2007-10-21 14:48:27.000000000 +0200
> @@ -88,8 +88,8 @@ kernel_mod_SOURCES = kern/i386/efi/start
>       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 \
> -     partition.h pc_partition.h rescue.h symbol.h term.h types.h \
> -     i386/efi/time.h efi/efi.h efi/time.h efi/disk.h
> +     partition.h pc_partition.h rescue.h symbol.h term.h time.h types.h \
> +     efi/efi.h efi/time.h efi/disk.h
>  kernel_mod_CFLAGS = $(COMMON_CFLAGS)
>  kernel_mod_ASFLAGS = $(COMMON_ASFLAGS)
>  kernel_mod_LDFLAGS = $(COMMON_LDFLAGS)
> diff -Nurp grub2/conf/i386-pc.rmk grub2.time/conf/i386-pc.rmk
> --- grub2/conf/i386-pc.rmk    2007-10-01 17:50:34.000000000 +0200
> +++ grub2.time/conf/i386-pc.rmk       2007-10-21 14:48:04.000000000 +0200
> @@ -32,10 +32,9 @@ kernel_img_SOURCES = kern/i386/pc/startu
>       symlist.c
>  kernel_img_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 types.h \
> +     partition.h pc_partition.h rescue.h symbol.h term.h time.h types.h \
>       machine/biosdisk.h machine/boot.h machine/console.h machine/init.h \
> -     machine/memory.h machine/loader.h machine/time.h machine/vga.h \
> -     machine/vbe.h
> +     machine/memory.h machine/loader.h machine/vga.h machine/vbe.h
>  kernel_img_CFLAGS = $(COMMON_CFLAGS)
>  kernel_img_ASFLAGS = $(COMMON_ASFLAGS)
>  kernel_img_LDFLAGS = -nostdlib -Wl,-N,-Ttext,8200 $(COMMON_CFLAGS)
> diff -Nurp grub2/conf/powerpc-ieee1275.rmk 
> grub2.time/conf/powerpc-ieee1275.rmk
> --- grub2/conf/powerpc-ieee1275.rmk   2007-10-12 12:22:27.000000000 +0200
> +++ grub2.time/conf/powerpc-ieee1275.rmk      2007-10-21 14:48:44.000000000 
> +0200
> @@ -12,8 +12,8 @@ DEFSYMFILES += kernel_syms.lst
>  
>  kernel_elf_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 misc.h mm.h net.h parser.h rescue.h \
> -     symbol.h term.h types.h powerpc/libgcc.h loader.h partition.h \
> -     pc_partition.h ieee1275/ieee1275.h machine/time.h machine/kernel.h
> +     symbol.h term.h time.h types.h powerpc/libgcc.h loader.h partition.h \
> +     pc_partition.h ieee1275/ieee1275.h machine/kernel.h
>  
>  kernel_elf_symlist.c: $(addprefix include/grub/,$(kernel_elf_HEADERS)) 
> config.h gensymlist.sh
>       /bin/sh gensymlist.sh $(filter %.h,$^) > $@ || (rm -f $@; exit 1)
> diff -Nurp grub2/conf/sparc64-ieee1275.rmk 
> grub2.time/conf/sparc64-ieee1275.rmk
> --- grub2/conf/sparc64-ieee1275.rmk   2007-07-02 22:38:01.000000000 +0200
> +++ grub2.time/conf/sparc64-ieee1275.rmk      2007-10-21 14:48:57.000000000 
> +0200
> @@ -12,8 +12,8 @@ DEFSYMFILES += kernel_syms.lst
>  
>  kernel_elf_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 misc.h mm.h net.h parser.h rescue.h \
> -     symbol.h term.h types.h sparc64/libgcc.h loader.h partition.h \
> -     pc_partition.h ieee1275/ieee1275.h machine/time.h machine/kernel.h
> +     symbol.h term.h time.h types.h sparc64/libgcc.h loader.h partition.h \
> +     pc_partition.h ieee1275/ieee1275.h machine/kernel.h
>  
>  kernel_elf_symlist.c: $(addprefix include/grub/,$(kernel_elf_HEADERS)) 
> config.h gensymlist.sh
>       /bin/sh gensymlist.sh $(filter %.h,$^) > $@ || (rm -f $@; exit 1)
> diff -Nurp grub2/include/grub/i386/pc/time.h 
> grub2.time/include/grub/i386/pc/time.h
> --- grub2/include/grub/i386/pc/time.h 2007-07-22 01:32:24.000000000 +0200
> +++ grub2.time/include/grub/i386/pc/time.h    2007-10-21 14:47:03.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.time/include/grub/i386/time.h
> --- grub2/include/grub/i386/time.h    1970-01-01 01:00:00.000000000 +0100
> +++ grub2.time/include/grub/i386/time.h       2007-10-21 14:47:03.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/misc.h grub2.time/include/grub/misc.h
> --- grub2/include/grub/misc.h 2007-07-22 01:32:22.000000000 +0200
> +++ grub2.time/include/grub/misc.h    2007-10-21 14:47:03.000000000 +0200
> @@ -83,6 +83,7 @@ grub_uint64_t EXPORT_FUNC(grub_divmod64)
>                                         grub_uint32_t d, grub_uint32_t *r);
>  
>  /* Inline functions.  */
> +
>  static inline unsigned int
>  grub_abs (int x)
>  {
> @@ -92,4 +93,11 @@ grub_abs (int x)
>      return (unsigned int) x;
>  }
>  
> +/* Rounded-up division */
> +static inline unsigned int
> +grub_div_roundup (unsigned int x, unsigned int y)
> +{
> +  return (x + (y - 1) / y);
> +}
> +
>  #endif /* ! GRUB_MISC_HEADER */
> diff -Nurp grub2/include/grub/powerpc/ieee1275/time.h 
> grub2.time/include/grub/powerpc/ieee1275/time.h
> --- grub2/include/grub/powerpc/ieee1275/time.h        2007-07-22 
> 01:32:24.000000000 +0200
> +++ grub2.time/include/grub/powerpc/ieee1275/time.h   2007-10-21 
> 14:47:03.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.time/include/grub/powerpc/time.h
> --- grub2/include/grub/powerpc/time.h 1970-01-01 01:00:00.000000000 +0100
> +++ grub2.time/include/grub/powerpc/time.h    2007-10-21 14:47:03.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.time/include/grub/sparc64/ieee1275/time.h
> --- grub2/include/grub/sparc64/ieee1275/time.h        2007-07-22 
> 01:32:25.000000000 +0200
> +++ grub2.time/include/grub/sparc64/ieee1275/time.h   2007-10-21 
> 14:47:03.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.time/include/grub/sparc64/time.h
> --- grub2/include/grub/sparc64/time.h 1970-01-01 01:00:00.000000000 +0100
> +++ grub2.time/include/grub/sparc64/time.h    2007-10-21 14:47:03.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.time/include/grub/time.h
> --- grub2/include/grub/time.h 1970-01-01 01:00:00.000000000 +0100
> +++ grub2.time/include/grub/time.h    2007-10-21 14:47:03.000000000 +0200
> @@ -0,0 +1,35 @@
> +/*
> + *  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);
> +}
> +
> +#endif /* ! KERNEL_TIME_HEADER */
> diff -Nurp grub2/kern/i386/efi/init.c grub2.time/kern/i386/efi/init.c
> --- grub2/kern/i386/efi/init.c        2007-07-22 01:32:27.000000000 +0200
> +++ grub2.time/kern/i386/efi/init.c   2007-10-21 14:47:03.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.time/kern/i386/pc/init.c
> --- grub2/kern/i386/pc/init.c 2007-09-07 23:55:26.000000000 +0200
> +++ grub2.time/kern/i386/pc/init.c    2007-10-21 14:47:03.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.time/kern/misc.c
> --- grub2/kern/misc.c 2007-08-02 22:42:19.000000000 +0200
> +++ grub2.time/kern/misc.c    2007-10-21 14:47:03.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,17 @@ grub_utf8_to_ucs4 (grub_uint32_t *dest, 
>    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)
> diff -Nurp grub2/kern/powerpc/ieee1275/init.c 
> grub2.time/kern/powerpc/ieee1275/init.c
> --- grub2/kern/powerpc/ieee1275/init.c        2007-10-12 12:22:27.000000000 
> +0200
> +++ grub2.time/kern/powerpc/ieee1275/init.c   2007-10-21 14:47:03.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.time/kern/sparc64/ieee1275/init.c
> --- grub2/kern/sparc64/ieee1275/init.c        2007-07-22 01:32:28.000000000 
> +0200
> +++ grub2.time/kern/sparc64/ieee1275/init.c   2007-10-21 14:47:03.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
> address@hidden
> http://lists.gnu.org/mailman/listinfo/grub-devel


-- 
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 /.)




reply via email to

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