From: Marco Gerards <mgerards@xs4all.nl>
To: The development of GRUB 2 <grub-devel@gnu.org>
Subject: Re: [PATCH] Enable grub_cpu_idle for i386 to halt the CPU
Date: Wed, 13 Aug 2008 11:34:22 +0200 [thread overview]
Message-ID: <87tzdpb6n5.fsf@xs4all.nl> (raw)
In-Reply-To: <20080812030708.GB16592@spacedout.fries.net> (David Fries's message of "Mon, 11 Aug 2008 22:07:08 -0500")
David Fries <david@fries.net> writes:
> Enable grub_cpu_idle for i386 to halt the CPU and modify the menu code
> to make use of it. This will save power when booting.
> Or maybe I should say it will keep the CPU from running so hot when
> the timer is counting down.
>
> It isn't safe to call halt in protected mode as interrupts are
> disabled. I assume it is becaus the interrupts handlers aren't setup
> to work in protected mode. But interrupts are enabled in real mode,
> and the timer is running, so the only two things of interest in the
> menu countdown is time has elapsed or a key is pressed, which both
> produce interrupts and are checked. I assume any other call to
> grub_cpu_idle will have an interrupt or the timer to wake it up.
>
> As grub_cpu_idle is exported instead of inline, some of the utility
> programs failed to compile because the symbol wasn't defined. I
> created util/user-stub.c for common stub functions instead of adding
> it to multiple utility program source files.
Why didn't you use util/misc.c?
> --
> David Fries <david@fries.net>
> http://fries.net/~david/ (PGP encryption key available)
>
>
> Index: conf/common.rmk
> ===================================================================
> --- conf/common.rmk (revision 1798)
> +++ conf/common.rmk (working copy)
> @@ -5,6 +5,7 @@
> util/grub-probe.c_DEPENDENCIES = grub_probe_init.h
> grub_probe_SOURCES = util/grub-probe.c \
> util/biosdisk.c util/misc.c util/getroot.c \
> + util/user-stub.c \
> kern/device.c kern/disk.c kern/err.c kern/misc.c \
> kern/parser.c kern/partition.c kern/file.c \
> \
> @@ -96,7 +97,9 @@
>
> # for grub-editenv
> bin_UTILITIES += grub-editenv
> -grub_editenv_SOURCES = util/grub-editenv.c lib/envblk.c util/misc.c kern/misc.c kern/err.c
> +grub_editenv_SOURCES = util/grub-editenv.c lib/envblk.c util/misc.c \
> + util/user-stub.c \
> + kern/misc.c kern/err.c
> CLEANFILES += grub-editenv
>
> # for grub-pe2elf
> Index: conf/i386-pc.rmk
> ===================================================================
> --- conf/i386-pc.rmk (revision 1798)
> +++ conf/i386-pc.rmk (working copy)
> @@ -91,7 +91,8 @@
> # For grub-setup.
> util/i386/pc/grub-setup.c_DEPENDENCIES = grub_setup_init.h
> grub_setup_SOURCES = util/i386/pc/grub-setup.c util/biosdisk.c \
> - util/misc.c util/getroot.c kern/device.c kern/disk.c \
> + util/misc.c util/getroot.c util/user-stub.c \
> + kern/device.c kern/disk.c \
> kern/err.c kern/misc.c kern/parser.c kern/partition.c \
> kern/file.c kern/fs.c kern/env.c fs/fshelp.c \
> \
> Index: conf/common.mk
Please do not add .mk changes in a patch, it is a generated file :-)
> ===================================================================
> --- conf/common.mk (revision 1798)
> +++ conf/common.mk (working copy)
> @@ -6,6 +6,7 @@
> util/grub-probe.c_DEPENDENCIES = grub_probe_init.h
> grub_probe_SOURCES = util/grub-probe.c \
> util/biosdisk.c util/misc.c util/getroot.c \
> + util/user-stub.c \
> kern/device.c kern/disk.c kern/err.c kern/misc.c \
> kern/parser.c kern/partition.c kern/file.c \
> \
> @@ -17,11 +18,11 @@
> partmap/pc.c partmap/apple.c partmap/gpt.c \
> kern/fs.c kern/env.c fs/fshelp.c \
> disk/lvm.c disk/raid.c grub_probe_init.c
> -CLEANFILES += grub-probe$(EXEEXT) grub_probe-util_grub_probe.o grub_probe-util_biosdisk.o grub_probe-util_misc.o grub_probe-util_getroot.o grub_probe-kern_device.o grub_probe-kern_disk.o grub_probe-kern_err.o grub_probe-kern_misc.o grub_probe-kern_parser.o grub_probe-kern_partition.o grub_probe-kern_file.o grub_probe-fs_affs.o grub_probe-fs_cpio.o grub_probe-fs_ext2.o grub_probe-fs_fat.o grub_probe-fs_hfs.o grub_probe-fs_hfsplus.o grub_probe-fs_iso9660.o grub_probe-fs_udf.o grub_probe-fs_jfs.o grub_probe-fs_minix.o grub_probe-fs_ntfs.o grub_probe-fs_ntfscomp.o grub_probe-fs_reiserfs.o grub_probe-fs_sfs.o grub_probe-fs_ufs.o grub_probe-fs_xfs.o grub_probe-fs_afs.o grub_probe-partmap_pc.o grub_probe-partmap_apple.o grub_probe-partmap_gpt.o grub_probe-kern_fs.o grub_probe-kern_env.o grub_probe-fs_fshelp.o grub_probe-disk_lvm.o grub_probe-disk_raid.o grub_probe-grub_probe_init.o
> -MOSTLYCLEANFILES += grub_probe-util_grub_probe.d grub_probe-util_biosdisk.d grub_probe-util_misc.d grub_probe-util_getroot.d grub_probe-kern_device.d grub_probe-kern_disk.d grub_probe-kern_err.d grub_probe-kern_misc.d grub_probe-kern_parser.d grub_probe-kern_partition.d grub_probe-kern_file.d grub_probe-fs_affs.d grub_probe-fs_cpio.d grub_probe-fs_ext2.d grub_probe-fs_fat.d grub_probe-fs_hfs.d grub_probe-fs_hfsplus.d grub_probe-fs_iso9660.d grub_probe-fs_udf.d grub_probe-fs_jfs.d grub_probe-fs_minix.d grub_probe-fs_ntfs.d grub_probe-fs_ntfscomp.d grub_probe-fs_reiserfs.d grub_probe-fs_sfs.d grub_probe-fs_ufs.d grub_probe-fs_xfs.d grub_probe-fs_afs.d grub_probe-partmap_pc.d grub_probe-partmap_apple.d grub_probe-partmap_gpt.d grub_probe-kern_fs.d grub_probe-kern_env.d grub_probe-fs_fshelp.d grub_probe-disk_lvm.d grub_probe-disk_raid.d grub_probe-grub_probe_init.d
> +CLEANFILES += grub-probe$(EXEEXT) grub_probe-util_grub_probe.o grub_probe-util_biosdisk.o grub_probe-util_misc.o grub_probe-util_getroot.o grub_probe-util_user_stub.o grub_probe-kern_device.o grub_probe-kern_disk.o grub_probe-kern_err.o grub_probe-kern_misc.o grub_probe-kern_parser.o grub_probe-kern_partition.o grub_probe-kern_file.o grub_probe-fs_affs.o grub_probe-fs_cpio.o grub_probe-fs_ext2.o grub_probe-fs_fat.o grub_probe-fs_hfs.o grub_probe-fs_hfsplus.o grub_probe-fs_iso9660.o grub_probe-fs_udf.o grub_probe-fs_jfs.o grub_probe-fs_minix.o grub_probe-fs_ntfs.o grub_probe-fs_ntfscomp.o grub_probe-fs_reiserfs.o grub_probe-fs_sfs.o grub_probe-fs_ufs.o grub_probe-fs_xfs.o grub_probe-fs_afs.o grub_probe-partmap_pc.o grub_probe-partmap_apple.o grub_probe-partmap_gpt.o grub_probe-kern_fs.o grub_probe-kern_env.o grub_probe-fs_fshelp.o grub_probe-disk_lvm.o grub_probe-disk_raid.o grub_probe-grub_probe_init.o
> +MOSTLYCLEANFILES += grub_probe-util_grub_probe.d grub_probe-util_biosdisk.d grub_probe-util_misc.d grub_probe-util_getroot.d grub_probe-util_user_stub.d grub_probe-kern_device.d grub_probe-kern_disk.d grub_probe-kern_err.d grub_probe-kern_misc.d grub_probe-kern_parser.d grub_probe-kern_partition.d grub_probe-kern_file.d grub_probe-fs_affs.d grub_probe-fs_cpio.d grub_probe-fs_ext2.d grub_probe-fs_fat.d grub_probe-fs_hfs.d grub_probe-fs_hfsplus.d grub_probe-fs_iso9660.d grub_probe-fs_udf.d grub_probe-fs_jfs.d grub_probe-fs_minix.d grub_probe-fs_ntfs.d grub_probe-fs_ntfscomp.d grub_probe-fs_reiserfs.d grub_probe-fs_sfs.d grub_probe-fs_ufs.d grub_probe-fs_xfs.d grub_probe-fs_afs.d grub_probe-partmap_pc.d grub_probe-partmap_apple.d grub_probe-partmap_gpt.d grub_probe-kern_fs.d grub_probe-kern_env.d grub_probe-fs_fshelp.d grub_probe-disk_lvm.d grub_probe-disk_raid.d grub_probe-grub_probe_init.d
>
> -grub-probe: $(grub_probe_DEPENDENCIES) grub_probe-util_grub_probe.o grub_probe-util_biosdisk.o grub_probe-util_misc.o grub_probe-util_getroot.o grub_probe-kern_device.o grub_probe-kern_disk.o grub_probe-kern_err.o grub_probe-kern_misc.o grub_probe-kern_parser.o grub_probe-kern_partition.o grub_probe-kern_file.o grub_probe-fs_affs.o grub_probe-fs_cpio.o grub_probe-fs_ext2.o grub_probe-fs_fat.o grub_probe-fs_hfs.o grub_probe-fs_hfsplus.o grub_probe-fs_iso9660.o grub_probe-fs_udf.o grub_probe-fs_jfs.o grub_probe-fs_minix.o grub_probe-fs_ntfs.o grub_probe-fs_ntfscomp.o grub_probe-fs_reiserfs.o grub_probe-fs_sfs.o grub_probe-fs_ufs.o grub_probe-fs_xfs.o grub_probe-fs_afs.o grub_probe-partmap_pc.o grub_probe-partmap_apple.o grub_probe-partmap_gpt.o grub_probe-kern_fs.o grub_probe-kern_env.o grub_probe-fs_fshelp.o grub_probe-disk_lvm.o grub_probe-disk_raid.o grub_probe-grub_probe_init.o
> - $(CC) -o $@ grub_probe-util_grub_probe.o grub_probe-util_biosdisk.o grub_probe-util_misc.o grub_probe-util_getroot.o grub_probe-kern_device.o grub_probe-kern_disk.o grub_probe-kern_err.o grub_probe-kern_misc.o grub_probe-kern_parser.o grub_probe-kern_partition.o grub_probe-kern_file.o grub_probe-fs_affs.o grub_probe-fs_cpio.o grub_probe-fs_ext2.o grub_probe-fs_fat.o grub_probe-fs_hfs.o grub_probe-fs_hfsplus.o grub_probe-fs_iso9660.o grub_probe-fs_udf.o grub_probe-fs_jfs.o grub_probe-fs_minix.o grub_probe-fs_ntfs.o grub_probe-fs_ntfscomp.o grub_probe-fs_reiserfs.o grub_probe-fs_sfs.o grub_probe-fs_ufs.o grub_probe-fs_xfs.o grub_probe-fs_afs.o grub_probe-partmap_pc.o grub_probe-partmap_apple.o grub_probe-partmap_gpt.o grub_probe-kern_fs.o grub_probe-kern_env.o grub_probe-fs_fshelp.o grub_probe-disk_lvm.o grub_probe-disk_raid.o grub_probe-grub_probe_init.o $(LDFLAGS) $(grub_probe_LDFLAGS)
> +grub-probe: $(grub_probe_DEPENDENCIES) grub_probe-util_grub_probe.o grub_probe-util_biosdisk.o grub_probe-util_misc.o grub_probe-util_getroot.o grub_probe-util_user_stub.o grub_probe-kern_device.o grub_probe-kern_disk.o grub_probe-kern_err.o grub_probe-kern_misc.o grub_probe-kern_parser.o grub_probe-kern_partition.o grub_probe-kern_file.o grub_probe-fs_affs.o grub_probe-fs_cpio.o grub_probe-fs_ext2.o grub_probe-fs_fat.o grub_probe-fs_hfs.o grub_probe-fs_hfsplus.o grub_probe-fs_iso9660.o grub_probe-fs_udf.o grub_probe-fs_jfs.o grub_probe-fs_minix.o grub_probe-fs_ntfs.o grub_probe-fs_ntfscomp.o grub_probe-fs_reiserfs.o grub_probe-fs_sfs.o grub_probe-fs_ufs.o grub_probe-fs_xfs.o grub_probe-fs_afs.o grub_probe-partmap_pc.o grub_probe-partmap_apple.o grub_probe-partmap_gpt.o grub_probe-kern_fs.o grub_probe-kern_env.o grub_probe-fs_fshelp.o grub_probe-disk_lvm.o grub_probe-disk_raid.o grub_probe-grub_probe_init.o
> + $(CC) -o $@ grub_probe-util_grub_probe.o grub_probe-util_biosdisk.o grub_probe-util_misc.o grub_probe-util_getroot.o grub_probe-util_user_stub.o grub_probe-kern_device.o grub_probe-kern_disk.o grub_probe-kern_err.o grub_probe-kern_misc.o grub_probe-kern_parser.o grub_probe-kern_partition.o grub_probe-kern_file.o grub_probe-fs_affs.o grub_probe-fs_cpio.o grub_probe-fs_ext2.o grub_probe-fs_fat.o grub_probe-fs_hfs.o grub_probe-fs_hfsplus.o grub_probe-fs_iso9660.o grub_probe-fs_udf.o grub_probe-fs_jfs.o grub_probe-fs_minix.o grub_probe-fs_ntfs.o grub_probe-fs_ntfscomp.o grub_probe-fs_reiserfs.o grub_probe-fs_sfs.o grub_probe-fs_ufs.o grub_probe-fs_xfs.o grub_probe-fs_afs.o grub_probe-partmap_pc.o grub_probe-partmap_apple.o grub_probe-partmap_gpt.o grub_probe-kern_fs.o grub_probe-kern_env.o grub_probe-fs_fshelp.o grub_probe-disk_lvm.o grub_probe-disk_raid.o grub_probe-grub_probe_init.o $(LDFLAGS) $(grub_probe_LDFLAGS)
>
> grub_probe-util_grub_probe.o: util/grub-probe.c $(util/grub-probe.c_DEPENDENCIES)
> $(CC) -Iutil -I$(srcdir)/util $(CPPFLAGS) $(CFLAGS) -DGRUB_UTIL=1 $(grub_probe_CFLAGS) -MD -c -o $@ $<
> @@ -39,6 +40,10 @@
> $(CC) -Iutil -I$(srcdir)/util $(CPPFLAGS) $(CFLAGS) -DGRUB_UTIL=1 $(grub_probe_CFLAGS) -MD -c -o $@ $<
> -include grub_probe-util_getroot.d
>
> +grub_probe-util_user_stub.o: util/user-stub.c $(util/user-stub.c_DEPENDENCIES)
> + $(CC) -Iutil -I$(srcdir)/util $(CPPFLAGS) $(CFLAGS) -DGRUB_UTIL=1 $(grub_probe_CFLAGS) -MD -c -o $@ $<
> +-include grub_probe-util_user_stub.d
> +
> grub_probe-kern_device.o: kern/device.c $(kern/device.c_DEPENDENCIES)
> $(CC) -Ikern -I$(srcdir)/kern $(CPPFLAGS) $(CFLAGS) -DGRUB_UTIL=1 $(grub_probe_CFLAGS) -MD -c -o $@ $<
> -include grub_probe-kern_device.d
> @@ -429,12 +434,14 @@
>
> # for grub-editenv
> bin_UTILITIES += grub-editenv
> -grub_editenv_SOURCES = util/grub-editenv.c lib/envblk.c util/misc.c kern/misc.c kern/err.c
> -CLEANFILES += grub-editenv$(EXEEXT) grub_editenv-util_grub_editenv.o grub_editenv-lib_envblk.o grub_editenv-util_misc.o grub_editenv-kern_misc.o grub_editenv-kern_err.o
> -MOSTLYCLEANFILES += grub_editenv-util_grub_editenv.d grub_editenv-lib_envblk.d grub_editenv-util_misc.d grub_editenv-kern_misc.d grub_editenv-kern_err.d
> +grub_editenv_SOURCES = util/grub-editenv.c lib/envblk.c util/misc.c \
> + util/user-stub.c \
> + kern/misc.c kern/err.c
> +CLEANFILES += grub-editenv$(EXEEXT) grub_editenv-util_grub_editenv.o grub_editenv-lib_envblk.o grub_editenv-util_misc.o grub_editenv-util_user_stub.o grub_editenv-kern_misc.o grub_editenv-kern_err.o
> +MOSTLYCLEANFILES += grub_editenv-util_grub_editenv.d grub_editenv-lib_envblk.d grub_editenv-util_misc.d grub_editenv-util_user_stub.d grub_editenv-kern_misc.d grub_editenv-kern_err.d
>
> -grub-editenv: $(grub_editenv_DEPENDENCIES) grub_editenv-util_grub_editenv.o grub_editenv-lib_envblk.o grub_editenv-util_misc.o grub_editenv-kern_misc.o grub_editenv-kern_err.o
> - $(CC) -o $@ grub_editenv-util_grub_editenv.o grub_editenv-lib_envblk.o grub_editenv-util_misc.o grub_editenv-kern_misc.o grub_editenv-kern_err.o $(LDFLAGS) $(grub_editenv_LDFLAGS)
> +grub-editenv: $(grub_editenv_DEPENDENCIES) grub_editenv-util_grub_editenv.o grub_editenv-lib_envblk.o grub_editenv-util_misc.o grub_editenv-util_user_stub.o grub_editenv-kern_misc.o grub_editenv-kern_err.o
> + $(CC) -o $@ grub_editenv-util_grub_editenv.o grub_editenv-lib_envblk.o grub_editenv-util_misc.o grub_editenv-util_user_stub.o grub_editenv-kern_misc.o grub_editenv-kern_err.o $(LDFLAGS) $(grub_editenv_LDFLAGS)
>
> grub_editenv-util_grub_editenv.o: util/grub-editenv.c $(util/grub-editenv.c_DEPENDENCIES)
> $(CC) -Iutil -I$(srcdir)/util $(CPPFLAGS) $(CFLAGS) -DGRUB_UTIL=1 $(grub_editenv_CFLAGS) -MD -c -o $@ $<
> @@ -448,6 +455,10 @@
> $(CC) -Iutil -I$(srcdir)/util $(CPPFLAGS) $(CFLAGS) -DGRUB_UTIL=1 $(grub_editenv_CFLAGS) -MD -c -o $@ $<
> -include grub_editenv-util_misc.d
>
> +grub_editenv-util_user_stub.o: util/user-stub.c $(util/user-stub.c_DEPENDENCIES)
> + $(CC) -Iutil -I$(srcdir)/util $(CPPFLAGS) $(CFLAGS) -DGRUB_UTIL=1 $(grub_editenv_CFLAGS) -MD -c -o $@ $<
> +-include grub_editenv-util_user_stub.d
> +
> grub_editenv-kern_misc.o: kern/misc.c $(kern/misc.c_DEPENDENCIES)
> $(CC) -Ikern -I$(srcdir)/kern $(CPPFLAGS) $(CFLAGS) -DGRUB_UTIL=1 $(grub_editenv_CFLAGS) -MD -c -o $@ $<
> -include grub_editenv-kern_misc.d
> Index: conf/i386-pc.mk
> ===================================================================
> --- conf/i386-pc.mk (revision 1798)
> +++ conf/i386-pc.mk (working copy)
> @@ -310,7 +310,8 @@
> # For grub-setup.
> util/i386/pc/grub-setup.c_DEPENDENCIES = grub_setup_init.h
> grub_setup_SOURCES = util/i386/pc/grub-setup.c util/biosdisk.c \
> - util/misc.c util/getroot.c kern/device.c kern/disk.c \
> + util/misc.c util/getroot.c util/user-stub.c \
> + kern/device.c kern/disk.c \
> kern/err.c kern/misc.c kern/parser.c kern/partition.c \
> kern/file.c kern/fs.c kern/env.c fs/fshelp.c \
> \
> @@ -324,11 +325,11 @@
> disk/raid.c disk/lvm.c \
> util/raid.c util/lvm.c \
> grub_setup_init.c
> -CLEANFILES += grub-setup$(EXEEXT) grub_setup-util_i386_pc_grub_setup.o grub_setup-util_biosdisk.o grub_setup-util_misc.o grub_setup-util_getroot.o grub_setup-kern_device.o grub_setup-kern_disk.o grub_setup-kern_err.o grub_setup-kern_misc.o grub_setup-kern_parser.o grub_setup-kern_partition.o grub_setup-kern_file.o grub_setup-kern_fs.o grub_setup-kern_env.o grub_setup-fs_fshelp.o grub_setup-fs_affs.o grub_setup-fs_cpio.o grub_setup-fs_ext2.o grub_setup-fs_fat.o grub_setup-fs_hfs.o grub_setup-fs_hfsplus.o grub_setup-fs_iso9660.o grub_setup-fs_udf.o grub_setup-fs_jfs.o grub_setup-fs_minix.o grub_setup-fs_ntfs.o grub_setup-fs_ntfscomp.o grub_setup-fs_reiserfs.o grub_setup-fs_sfs.o grub_setup-fs_ufs.o grub_setup-fs_xfs.o grub_setup-fs_afs.o grub_setup-partmap_pc.o grub_setup-partmap_gpt.o grub_setup-disk_raid.o grub_setup-disk_lvm.o grub_setup-util_raid.o grub_setup-util_lvm.o grub_setup-grub_setup_init.o
> -MOSTLYCLEANFILES += grub_setup-util_i386_pc_grub_setup.d grub_setup-util_biosdisk.d grub_setup-util_misc.d grub_setup-util_getroot.d grub_setup-kern_device.d grub_setup-kern_disk.d grub_setup-kern_err.d grub_setup-kern_misc.d grub_setup-kern_parser.d grub_setup-kern_partition.d grub_setup-kern_file.d grub_setup-kern_fs.d grub_setup-kern_env.d grub_setup-fs_fshelp.d grub_setup-fs_affs.d grub_setup-fs_cpio.d grub_setup-fs_ext2.d grub_setup-fs_fat.d grub_setup-fs_hfs.d grub_setup-fs_hfsplus.d grub_setup-fs_iso9660.d grub_setup-fs_udf.d grub_setup-fs_jfs.d grub_setup-fs_minix.d grub_setup-fs_ntfs.d grub_setup-fs_ntfscomp.d grub_setup-fs_reiserfs.d grub_setup-fs_sfs.d grub_setup-fs_ufs.d grub_setup-fs_xfs.d grub_setup-fs_afs.d grub_setup-partmap_pc.d grub_setup-partmap_gpt.d grub_setup-disk_raid.d grub_setup-disk_lvm.d grub_setup-util_raid.d grub_setup-util_lvm.d grub_setup-grub_setup_init.d
> +CLEANFILES += grub-setup$(EXEEXT) grub_setup-util_i386_pc_grub_setup.o grub_setup-util_biosdisk.o grub_setup-util_misc.o grub_setup-util_getroot.o grub_setup-util_user_stub.o grub_setup-kern_device.o grub_setup-kern_disk.o grub_setup-kern_err.o grub_setup-kern_misc.o grub_setup-kern_parser.o grub_setup-kern_partition.o grub_setup-kern_file.o grub_setup-kern_fs.o grub_setup-kern_env.o grub_setup-fs_fshelp.o grub_setup-fs_affs.o grub_setup-fs_cpio.o grub_setup-fs_ext2.o grub_setup-fs_fat.o grub_setup-fs_hfs.o grub_setup-fs_hfsplus.o grub_setup-fs_iso9660.o grub_setup-fs_udf.o grub_setup-fs_jfs.o grub_setup-fs_minix.o grub_setup-fs_ntfs.o grub_setup-fs_ntfscomp.o grub_setup-fs_reiserfs.o grub_setup-fs_sfs.o grub_setup-fs_ufs.o grub_setup-fs_xfs.o grub_setup-fs_afs.o grub_setup-partmap_pc.o grub_setup-partmap_gpt.o grub_setup-disk_raid.o grub_setup-disk_lvm.o grub_setup-util_raid.o grub_setup-util_lvm.o grub_setup-grub_setup_init.o
> +MOSTLYCLEANFILES += grub_setup-util_i386_pc_grub_setup.d grub_setup-util_biosdisk.d grub_setup-util_misc.d grub_setup-util_getroot.d grub_setup-util_user_stub.d grub_setup-kern_device.d grub_setup-kern_disk.d grub_setup-kern_err.d grub_setup-kern_misc.d grub_setup-kern_parser.d grub_setup-kern_partition.d grub_setup-kern_file.d grub_setup-kern_fs.d grub_setup-kern_env.d grub_setup-fs_fshelp.d grub_setup-fs_affs.d grub_setup-fs_cpio.d grub_setup-fs_ext2.d grub_setup-fs_fat.d grub_setup-fs_hfs.d grub_setup-fs_hfsplus.d grub_setup-fs_iso9660.d grub_setup-fs_udf.d grub_setup-fs_jfs.d grub_setup-fs_minix.d grub_setup-fs_ntfs.d grub_setup-fs_ntfscomp.d grub_setup-fs_reiserfs.d grub_setup-fs_sfs.d grub_setup-fs_ufs.d grub_setup-fs_xfs.d grub_setup-fs_afs.d grub_setup-partmap_pc.d grub_setup-partmap_gpt.d grub_setup-disk_raid.d grub_setup-disk_lvm.d grub_setup-util_raid.d grub_setup-util_lvm.d grub_setup-grub_setup_init.d
>
> -grub-setup: $(grub_setup_DEPENDENCIES) grub_setup-util_i386_pc_grub_setup.o grub_setup-util_biosdisk.o grub_setup-util_misc.o grub_setup-util_getroot.o grub_setup-kern_device.o grub_setup-kern_disk.o grub_setup-kern_err.o grub_setup-kern_misc.o grub_setup-kern_parser.o grub_setup-kern_partition.o grub_setup-kern_file.o grub_setup-kern_fs.o grub_setup-kern_env.o grub_setup-fs_fshelp.o grub_setup-fs_affs.o grub_setup-fs_cpio.o grub_setup-fs_ext2.o grub_setup-fs_fat.o grub_setup-fs_hfs.o grub_setup-fs_hfsplus.o grub_setup-fs_iso9660.o grub_setup-fs_udf.o grub_setup-fs_jfs.o grub_setup-fs_minix.o grub_setup-fs_ntfs.o grub_setup-fs_ntfscomp.o grub_setup-fs_reiserfs.o grub_setup-fs_sfs.o grub_setup-fs_ufs.o grub_setup-fs_xfs.o grub_setup-fs_afs.o grub_setup-partmap_pc.o grub_setup-partmap_gpt.o grub_setup-disk_raid.o grub_setup-disk_lvm.o grub_setup-util_raid.o grub_setup-util_lvm.o grub_setup-grub_setup_init.o
> - $(CC) -o $@ grub_setup-util_i386_pc_grub_setup.o grub_setup-util_biosdisk.o grub_setup-util_misc.o grub_setup-util_getroot.o grub_setup-kern_device.o grub_setup-kern_disk.o grub_setup-kern_err.o grub_setup-kern_misc.o grub_setup-kern_parser.o grub_setup-kern_partition.o grub_setup-kern_file.o grub_setup-kern_fs.o grub_setup-kern_env.o grub_setup-fs_fshelp.o grub_setup-fs_affs.o grub_setup-fs_cpio.o grub_setup-fs_ext2.o grub_setup-fs_fat.o grub_setup-fs_hfs.o grub_setup-fs_hfsplus.o grub_setup-fs_iso9660.o grub_setup-fs_udf.o grub_setup-fs_jfs.o grub_setup-fs_minix.o grub_setup-fs_ntfs.o grub_setup-fs_ntfscomp.o grub_setup-fs_reiserfs.o grub_setup-fs_sfs.o grub_setup-fs_ufs.o grub_setup-fs_xfs.o grub_setup-fs_afs.o grub_setup-partmap_pc.o grub_setup-partmap_gpt.o grub_setup-disk_raid.o grub_setup-disk_lvm.o grub_setup-util_raid.o grub_setup-util_lvm.o grub_setup-grub_setup_init.o $(LDFLAGS) $(grub_setup_LDFLAGS)
> +grub-setup: $(grub_setup_DEPENDENCIES) grub_setup-util_i386_pc_grub_setup.o grub_setup-util_biosdisk.o grub_setup-util_misc.o grub_setup-util_getroot.o grub_setup-util_user_stub.o grub_setup-kern_device.o grub_setup-kern_disk.o grub_setup-kern_err.o grub_setup-kern_misc.o grub_setup-kern_parser.o grub_setup-kern_partition.o grub_setup-kern_file.o grub_setup-kern_fs.o grub_setup-kern_env.o grub_setup-fs_fshelp.o grub_setup-fs_affs.o grub_setup-fs_cpio.o grub_setup-fs_ext2.o grub_setup-fs_fat.o grub_setup-fs_hfs.o grub_setup-fs_hfsplus.o grub_setup-fs_iso9660.o grub_setup-fs_udf.o grub_setup-fs_jfs.o grub_setup-fs_minix.o grub_setup-fs_ntfs.o grub_setup-fs_ntfscomp.o grub_setup-fs_reiserfs.o grub_setup-fs_sfs.o grub_setup-fs_ufs.o grub_setup-fs_xfs.o grub_setup-fs_afs.o grub_setup-partmap_pc.o grub_setup-partmap_gpt.o grub_setup-disk_raid.o grub_setup-disk_lvm.o grub_setup-util_raid.o grub_setup-util_lvm.o grub_setup-grub_setup_init.o
> + $(CC) -o $@ grub_setup-util_i386_pc_grub_setup.o grub_setup-util_biosdisk.o grub_setup-util_misc.o grub_setup-util_getroot.o grub_setup-util_user_stub.o grub_setup-kern_device.o grub_setup-kern_disk.o grub_setup-kern_err.o grub_setup-kern_misc.o grub_setup-kern_parser.o grub_setup-kern_partition.o grub_setup-kern_file.o grub_setup-kern_fs.o grub_setup-kern_env.o grub_setup-fs_fshelp.o grub_setup-fs_affs.o grub_setup-fs_cpio.o grub_setup-fs_ext2.o grub_setup-fs_fat.o grub_setup-fs_hfs.o grub_setup-fs_hfsplus.o grub_setup-fs_iso9660.o grub_setup-fs_udf.o grub_setup-fs_jfs.o grub_setup-fs_minix.o grub_setup-fs_ntfs.o grub_setup-fs_ntfscomp.o grub_setup-fs_reiserfs.o grub_setup-fs_sfs.o grub_setup-fs_ufs.o grub_setup-fs_xfs.o grub_setup-fs_afs.o grub_setup-partmap_pc.o grub_setup-partmap_gpt.o grub_setup-disk_raid.o grub_setup-disk_lvm.o grub_setup-util_raid.o grub_setup-util_lvm.o grub_setup-grub_setup_init.o $(LDFLAGS) $(grub_setup_LDFLAGS)
>
> grub_setup-util_i386_pc_grub_setup.o: util/i386/pc/grub-setup.c $(util/i386/pc/grub-setup.c_DEPENDENCIES)
> $(CC) -Iutil/i386/pc -I$(srcdir)/util/i386/pc $(CPPFLAGS) $(CFLAGS) -DGRUB_UTIL=1 $(grub_setup_CFLAGS) -MD -c -o $@ $<
> @@ -346,6 +347,10 @@
> $(CC) -Iutil -I$(srcdir)/util $(CPPFLAGS) $(CFLAGS) -DGRUB_UTIL=1 $(grub_setup_CFLAGS) -MD -c -o $@ $<
> -include grub_setup-util_getroot.d
>
> +grub_setup-util_user_stub.o: util/user-stub.c $(util/user-stub.c_DEPENDENCIES)
> + $(CC) -Iutil -I$(srcdir)/util $(CPPFLAGS) $(CFLAGS) -DGRUB_UTIL=1 $(grub_setup_CFLAGS) -MD -c -o $@ $<
> +-include grub_setup-util_user_stub.d
> +
> grub_setup-kern_device.o: kern/device.c $(kern/device.c_DEPENDENCIES)
> $(CC) -Ikern -I$(srcdir)/kern $(CPPFLAGS) $(CFLAGS) -DGRUB_UTIL=1 $(grub_setup_CFLAGS) -MD -c -o $@ $<
> -include grub_setup-kern_device.d
> Index: kern/i386/pc/startup.S
> ===================================================================
> --- kern/i386/pc/startup.S (revision 1798)
> +++ kern/i386/pc/startup.S (working copy)
> @@ -1502,8 +1502,28 @@
> popl %ebx
> popl %ebp
> ret
> -
> +
> +
> /*
> + * void grub_cpu_idle (void)
> + * Change to real mode to enable interrupts and hlt until the next interrupt.
> + */
> +FUNCTION(grub_cpu_idle)
> + pushl %ebp
> +
> + call prot_to_real /* enter real mode */
> + .code16
> +
> + hlt
> +
> + DATA32 call real_to_prot
> + .code32
> +
> + popl %ebp
> + ret
> +
> +
> +/*
> * grub_getrtsecs()
> * if a seconds value can be read, read it and return it (BCD),
> * otherwise return 0xFF
> Index: NEWS
> ===================================================================
> --- NEWS (revision 1798)
> +++ NEWS (working copy)
> @@ -1,5 +1,8 @@
> New in 1.97 - :
>
> +* Enable grub_cpu_idle for i386 to halt the CPU and modify the menu code
> + to make use of it. This will save power when booting.
> +
> * When booting from PXE, PXE can be used to load files.
>
> * High resolution timer support.
> Index: include/grub/i386/time.h
> ===================================================================
> --- include/grub/i386/time.h (revision 1798)
> +++ include/grub/i386/time.h (working copy)
> @@ -19,11 +19,9 @@
> #ifndef KERNEL_CPU_TIME_HEADER
> #define KERNEL_CPU_TIME_HEADER 1
>
> -static __inline void
> -grub_cpu_idle (void)
> -{
> - /* FIXME: this can't work until we handle interrupts. */
> -/* __asm__ __volatile__ ("hlt"); */
> -}
> +/* Call into assembly to change to real mode and enable interrupts so it
> + can halt until the next interrupt is received. */
> +void
> +EXPORT_FUNC(grub_cpu_idle) (void);
>
> #endif /* ! KERNEL_CPU_TIME_HEADER */
> Index: ChangeLog
> ===================================================================
> --- ChangeLog (revision 1798)
> +++ ChangeLog (working copy)
> @@ -1,3 +1,18 @@
> +2008-08-10 David Fries <David@Fries.net>
> +
> + Enable hlt in grub_cpu_idle so it can be idle when called.
> + * kern/i386/pc/startup.S: grub_cpu_idle, halt with interrupts
> + * include/grub/i386/time.h: export function grub_cpu_idle.
> + * normal/menu.c: Sleep in halt (if supported), until a second elapsed
> + or a key is pressed.
> + * util/user-stub.c: New file. The utilities link against part of the
> + kernel. This new file is intended to be a dumping place for functions
> + that are requierd by parts of the kernel included, but not found in
> + those places.
> + * conf/common.rmk: Make use of user-stub.c in grub_probe and
> + grub-editenv.
> + * conf/i386-pc.rmk: Make use of user-stub.c in grub-setup.
Our changelogs describe changes, not the effects. Please keep
descriptions very short. I would like to refer you to:
http://www.gnu.org/prep/standards/html_node/Change-Logs.html
Furthermore, you can look at the current changelog to see how it
works.
> 2008-08-09 Christian Franke <franke@computer.org>
>
> * Makefile.in: Add `target_os' and `enable_grub_pe2elf'.
> Index: normal/menu.c
> ===================================================================
> --- normal/menu.c (revision 1798)
> +++ normal/menu.c (working copy)
> @@ -24,6 +24,7 @@
> #include <grub/time.h>
> #include <grub/env.h>
> #include <grub/script.h>
> +#include <grub/cpu/time.h>
>
> static grub_uint8_t grub_color_menu_normal;
> static grub_uint8_t grub_color_menu_highlight;
> @@ -381,6 +382,12 @@
> saved_time = current_time;
> print_timeout (timeout, offset, 1);
> }
> + /* Sleep until a second has passed or a key is pressed. */
> + do
> + {
> + grub_cpu_idle ();
> + }while (grub_get_rtc () - saved_time < GRUB_TICKS_PER_SECOND &&
> + grub_checkkey () == -1);
This doesn't match our coding style. I would write something like:
while (grub_get_rtc () - saved_time < GRUB_TICKS_PER_SECOND
&& grub_checkkey () == -1)
grub_cpu_idle ();
(it's easier to format a while, I think)
> }
>
> if (timeout == 0)
> Index: DISTLIST
> ===================================================================
> --- DISTLIST (revision 1798)
> +++ DISTLIST (working copy)
> @@ -358,6 +358,7 @@
> util/raid.c
> util/resolve.c
> util/unifont2pff.rb
> +util/user-stub.c
> util/update-grub.in
> util/update-grub_lib.in
> video/bitmap.c
> Index: util/user-stub.c
> ===================================================================
> --- util/user-stub.c (revision 0)
> +++ util/user-stub.c (revision 0)
> @@ -0,0 +1,32 @@
> +/*
> + * 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/>.
> + */
> +
> +/* Provide user space stubs for the utility programs to compile against.
> + They are not included in the pieces of the kernel linked in to the
> + utility programs, but are unresolved symbols for the parts that are. */
> +
> +#include <config.h>
> +#include <stdio.h>
> +#include <time.h>
> +
> +void
> +grub_cpu_idle ()
> +{
> + struct timespec req={0,1};
> + nanosleep (&req, NULL);
> +}
>
>
> _______________________________________________
> Grub-devel mailing list
> Grub-devel@gnu.org
> http://lists.gnu.org/mailman/listinfo/grub-devel
prev parent reply other threads:[~2008-08-13 9:30 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-08-12 3:07 [PATCH] Enable grub_cpu_idle for i386 to halt the CPU David Fries
2008-08-12 9:10 ` Robert Millan
2008-08-12 10:47 ` Robert Millan
2008-08-16 3:11 ` David Fries
2008-08-16 12:33 ` Robert Millan
2008-08-16 14:44 ` David Fries
2008-08-17 15:04 ` Robert Millan
2008-08-13 9:34 ` Marco Gerards [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=87tzdpb6n5.fsf@xs4all.nl \
--to=mgerards@xs4all.nl \
--cc=grub-devel@gnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.