grub-devel
[Top][All Lists]
Advanced

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

[PATCH] Enable grub_cpu_idle for i386 to halt the CPU


From: David Fries
Subject: [PATCH] Enable grub_cpu_idle for i386 to halt the CPU
Date: Mon, 11 Aug 2008 22:07:08 -0500
User-agent: Mutt/1.5.4i

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.

-- 
David Fries <address@hidden>
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
===================================================================
--- 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 <address@hidden>
+
+       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.
+
 2008-08-09  Christian Franke  <address@hidden>
 
        * 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);
        }
 
       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);
+}




reply via email to

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