Index: commands/i386/efi/halt.c
===================================================================
RCS file: commands/i386/efi/halt.c
diff -N commands/i386/efi/halt.c
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ commands/i386/efi/halt.c 18 Nov 2007 17:49:37 -0000
@@ -0,0 +1,47 @@
+/* halt.c - command to halt the computer. */
+/*
+ * GRUB -- GRand Unified Bootloader
+ * Copyright (C) 2005,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 .
+ */
+
+#include
+#include
+#include
+#include
+
+static grub_err_t
+grub_cmd_halt (struct grub_arg_list *state __attribute__ ((unused)),
+ int argc __attribute__ ((unused)),
+ char **args __attribute__ ((unused)))
+
+{
+ grub_halt ();
+ return 0;
+}
+
+
+
+GRUB_MOD_INIT(halt)
+{
+ (void)mod; /* To stop warning. */
+ grub_register_command ("halt", grub_cmd_halt, GRUB_COMMAND_FLAG_BOTH,
+ "halt", "Halt the computer", 0);
+}
+
+GRUB_MOD_FINI(halt)
+{
+ grub_unregister_command ("halt");
+}
Index: commands/i386/efi/reboot.c
===================================================================
RCS file: commands/i386/efi/reboot.c
diff -N commands/i386/efi/reboot.c
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ commands/i386/efi/reboot.c 18 Nov 2007 17:49:37 -0000
@@ -0,0 +1,47 @@
+/* reboot.c - command to reboot the computer. */
+/*
+ * GRUB -- GRand Unified Bootloader
+ * Copyright (C) 2005,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 .
+ */
+
+#include
+#include
+#include
+#include
+
+static grub_err_t
+grub_cmd_reboot (struct grub_arg_list *state __attribute__ ((unused)),
+ int argc __attribute__ ((unused)),
+ char **args __attribute__ ((unused)))
+
+{
+ grub_reboot ();
+ return 0;
+}
+
+
+
+GRUB_MOD_INIT(reboot)
+{
+ (void)mod; /* To stop warning. */
+ grub_register_command ("reboot", grub_cmd_reboot, GRUB_COMMAND_FLAG_BOTH,
+ "reboot", "Reboot the computer", 0);
+}
+
+GRUB_MOD_FINI(reboot)
+{
+ grub_unregister_command ("reboot");
+}
Index: conf/i386-efi.rmk
===================================================================
RCS file: /sources/grub/grub2/conf/i386-efi.rmk,v
retrieving revision 1.24
diff -u -p -r1.24 i386-efi.rmk
--- conf/i386-efi.rmk 18 Nov 2007 06:41:45 -0000 1.24
+++ conf/i386-efi.rmk 18 Nov 2007 17:49:37 -0000
@@ -45,7 +45,7 @@ grub_emu_SOURCES = commands/boot.c comma
commands/configfile.c commands/help.c \
commands/terminal.c commands/ls.c commands/test.c \
commands/search.c commands/hexdump.c \
- commands/i386/pc/halt.c commands/i386/pc/reboot.c \
+ commands/i386/efi/halt.c commands/i386/efi/reboot.c \
commands/i386/cpuid.c \
disk/loopback.c \
fs/affs.c fs/ext2.c fs/fat.c fs/fshelp.c fs/hfs.c fs/iso9660.c \
@@ -76,7 +76,7 @@ grub_install_SOURCES = util/i386/efi/gru
# Modules.
pkgdata_MODULES = kernel.mod normal.mod _chain.mod chain.mod \
- _linux.mod linux.mod cpuid.mod
+ _linux.mod linux.mod cpuid.mod halt.mod reboot.mod
# For kernel.mod.
kernel_mod_EXPORTS = no
@@ -140,4 +140,14 @@ cpuid_mod_SOURCES = commands/i386/cpuid.
cpuid_mod_CFLAGS = $(COMMON_CFLAGS)
cpuid_mod_LDFLAGS = $(COMMON_LDFLAGS)
+# For halt.mod.
+halt_mod_SOURCES = commands/i386/efi/halt.c
+halt_mod_CFLAGS = $(COMMON_CFLAGS)
+halt_mod_LDFLAGS = $(COMMON_LDFLAGS)
+
+# For reboot.mod.
+reboot_mod_SOURCES = commands/i386/efi/reboot.c
+reboot_mod_CFLAGS = $(COMMON_CFLAGS)
+reboot_mod_LDFLAGS = $(COMMON_LDFLAGS)
+
include $(srcdir)/conf/common.mk
Index: include/grub/efi/efi.h
===================================================================
RCS file: /sources/grub/grub2/include/grub/efi/efi.h,v
retrieving revision 1.8
diff -u -p -r1.8 efi.h
--- include/grub/efi/efi.h 21 Jul 2007 23:32:23 -0000 1.8
+++ include/grub/efi/efi.h 18 Nov 2007 17:49:37 -0000
@@ -54,6 +54,8 @@ char *EXPORT_FUNC(grub_efi_get_filename)
grub_efi_device_path_t *
EXPORT_FUNC(grub_efi_get_device_path) (grub_efi_handle_t handle);
int EXPORT_FUNC(grub_efi_exit_boot_services) (grub_efi_uintn_t map_key);
+void EXPORT_FUNC (grub_reboot) (void);
+void EXPORT_FUNC (grub_halt) (void);
void grub_efi_mm_init (void);
void grub_efi_mm_fini (void);
Index: kern/efi/efi.c
===================================================================
RCS file: /sources/grub/grub2/kern/efi/efi.c,v
retrieving revision 1.9
diff -u -p -r1.9 efi.c
--- kern/efi/efi.c 21 Jul 2007 23:32:26 -0000 1.9
+++ kern/efi/efi.c 18 Nov 2007 17:49:37 -0000
@@ -162,6 +162,22 @@ grub_exit (void)
0, 0);
}
+void
+grub_reboot (void)
+{
+ grub_efi_fini ();
+ grub_efi_system_table->runtime_services->
+ reset_system (GRUB_EFI_RESET_COLD, GRUB_EFI_SUCCESS, 0, NULL);
+}
+
+void
+grub_halt (void)
+{
+ grub_efi_fini ();
+ grub_efi_system_table->runtime_services->
+ reset_system (GRUB_EFI_RESET_SHUTDOWN, GRUB_EFI_SUCCESS, 0, NULL);
+}
+
int
grub_efi_exit_boot_services (grub_efi_uintn_t map_key)
{