From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with archive (Exim 4.43) id 1Itoem-0000Yz-29 for mharc-grub-devel@gnu.org; Sun, 18 Nov 2007 13:14:08 -0500 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1Itoel-0000Y0-4j for grub-devel@gnu.org; Sun, 18 Nov 2007 13:14:07 -0500 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1Itoej-0000W3-Sa for grub-devel@gnu.org; Sun, 18 Nov 2007 13:14:06 -0500 Received: from [199.232.76.173] (helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1Itoej-0000Vl-Mx for grub-devel@gnu.org; Sun, 18 Nov 2007 13:14:05 -0500 Received: from bigbox.boeglin.org ([88.191.20.48]) by monty-python.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1Itoej-0001JG-3r for grub-devel@gnu.org; Sun, 18 Nov 2007 13:14:05 -0500 Received: by bigbox.boeglin.org (Postfix, from userid 1000) id 407329407B; Sun, 18 Nov 2007 19:14:03 +0100 (CET) Date: Sun, 18 Nov 2007 19:14:03 +0100 From: Alexandre Boeglin To: The development of GRUB 2 Message-ID: <20071118181403.GA11941@boeglin.org> References: <20071103230631.GA2875@boeglin.org> <87hcjuhzo8.fsf@xs4all.nl> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="fdj2RfSjLxBAspz7" Content-Disposition: inline In-Reply-To: <87hcjuhzo8.fsf@xs4all.nl> User-Agent: Mutt/1.5.16 (2007-06-11) Content-Transfer-Encoding: 7bit X-detected-kernel: by monty-python.gnu.org: Linux 2.6 (newer, 2) Subject: Re: grub2 efi patches X-BeenThere: grub-devel@gnu.org X-Mailman-Version: 2.1.5 Precedence: list Reply-To: The development of GRUB 2 List-Id: The development of GRUB 2 List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 18 Nov 2007 18:14:07 -0000 --fdj2RfSjLxBAspz7 Content-Type: text/plain; charset=iso-8859-1 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable Hello, Sorry for not replying earlier, I'm currently busy trying to figure out h= ow to access the Compatibility Support Module, and possibly enable lecagy boot. Le Sat, Nov 10, 2007 at 04:45:43PM +0100, Marco Gerards a =E9crit : > Alexandre Boeglin writes: > > grub2_efi_grub_prefix.patch uses the grub_prefix variable to set the = prefix > > environment variable, instead of the directory in which grub.efi is. = This > > allows to have grub.efi and the modules in different folders, and the= old > > behaviour should be preserved, if the grub_prefix is an empty string, >=20 > How about passing it as an argument to GRUB 2? I assume EFI can do > this? This is what we do on open firmware, IIRC. Well, this should also work if grub is the main bootloader of your machin= e, but I think it would be a bit harder in the case you have grub on a EFI bootable CD or USB stick (or that would depend on the primary bootloader = in this case). But actually, I don't know this part very well ... I also still have to clean the chainloader options patch, but here is the changelog for the others: 2007-11-18 Alexandre Boeglin * normal/arg.c (grub_arg_parse): If one of the args is "--", add remainin= g N args, instead of "--" N times. * commands/i386/efi/halt.c: New file. * commands/i386/efi/reboot.c: New file. * conf/i386-efi.rmk (grub_emu_SOURCES): Replace i386/pc/halt.c and reboot= .c by i386/efi/halt.c and reboot.c. (grub_install_SOURCES): Add halt.mod and reboot.mod. (halt_mod_SOURCES): New variable. (halt_mod_CFLAGS): Likewise. (halt_mod_LDFLAGS): Likewise. (reboot_mod_SOURCES): Likewise. (reboot_mod_CFLAGS): Likewise. (reboot_mod_LDFLAGS): Likewise. * include/grub/efi/efi.h (grub_reboot): New function declaration. (grub_halt): Likewise. * kern/efi/efi.c (grub_reboot): New function. (grub_halt): Likewise. And I just received the copyright assignment papers yesterday. I will pos= t them on monday. Regards, Alex --fdj2RfSjLxBAspz7 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="grub2_arg_doubledash.patch" Index: normal/arg.c =================================================================== RCS file: /sources/grub/grub2/normal/arg.c,v retrieving revision 1.7 diff -u -p -r1.7 arg.c --- normal/arg.c 21 Jul 2007 23:32:28 -0000 1.7 +++ normal/arg.c 18 Nov 2007 15:12:05 -0000 @@ -313,7 +313,7 @@ grub_arg_parse (grub_command_t cmd, int if (grub_strlen (arg) == 2) { for (curarg++; curarg < argc; curarg++) - if (add_arg (arg) != 0) + if (add_arg (argv[curarg]) != 0) goto fail; break; } --fdj2RfSjLxBAspz7 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="grub2_efi_halt_reboot.patch" 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) { --fdj2RfSjLxBAspz7--