|
From: | SevenBits |
Subject: | Re: PATCH: added GRUB command to get and set (U)EFI firmware variables |
Date: | Mon, 25 Nov 2013 17:28:47 -0500 |
User-agent: | Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.1.1 |
-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 On 11/25/2013 05:07 PM, Vladimir '?-coder/phcoder' Serbinenko wrote: > On 25.11.2013 23:03, SevenBits wrote: >> >> Thanks for your quick reply. >> >> I just have a couple of questions. How do you prefer I allow the user to >> specify the vendor UUID? By typing it in via the keyboard? And secondly, >> by saying it needs "readable aliases for known types" do you mean that >> there should be a function to set an integer, one to set a boolean, etc? >> > I meant for UUIDs. E.g. one alias "efi" for shared space, "apple" for > apple and so on. So other than a generic variable UUID and Apple, are there others that you think might be necessary? I can try and put in some common ones but manufacturers may not disclose what their specific UUIDs are. > > But type of variable is also an issue and there should be at least > following available: > hex - transform all in hex > utf16 - decode utf16 into utf8 > Probably more, didn't really look into issue I see, okay, I'll add some in. > >> Regarding the patch format, I'll tidy that up and send a proper one. >> >> -- SevenBits >> >> On 11/25/2013 04:41 PM, Vladimir 'phcoder' Serbinenko wrote: >>> please resend as proper and not as reverse patch. Anotjer issie that can be >>> seen from description alone is that you don't allow to specify vendor >> uuid. >>> it would be needed and slso it needs readable aliases for known types >>> On Nov 25, 2013 10:35 PM, "SevenBits" <address@hidden> wrote: >> >>>> Hello everyone, >>>> >>>> This patch adds two GRUB two commands to allow the user to get and set >>>> the values of (U)EFI firmware variables. When dealing with (U)EFI >>>> firmware with GRUB I decided this would be a useful tool to have for >>>> both developers and end-users. >>>> >>>> The first command, setefivariable, takes two parameters: the name of the >>>> variable to set and its value. The second, getefivariable, also takes >>>> two parameters: the name of the variable to retrieve and the name of the >>>> GRUB environment variable in which you want to store the result. This >>>> can then be checked using GRUB's built in 'if' statement and scripting >>>> capability to allow unique booting capabilities based on whether, for >>>> example, secure boot is enabled or the (U)EFI firmware is in setup mode. >>>> >>>> Have a look and let me know what you think! The patch follows. >>>> >>>> -- SevenBits >>>> >>>> diff --git a/grub/grub-core/Makefile.core.def >>>> b/grub-orig/grub-core/Makefile.core.def >>>> index 177d6d6..5cd84b1 100644 >>>> --- a/grub/grub-core/Makefile.core.def >>>> +++ b/grub-orig/grub-core/Makefile.core.def >>>> @@ -1004,13 +1004,6 @@ module = { >>>> }; >>>> >>>> module = { >>>> - name = setvariable; >>>> - common = commands/efi/setvariable.c; >>>> - enable = i386_efi; >>>> - enable = x86_64_efi; >>>> -}; >>>> - >>>> -module = { >>>> name = pcidump; >>>> common = commands/pcidump.c; >>>> enable = pci; >>>> diff --git a/grub/grub-core/commands/efi/setvariable.c >>>> b/grub/grub-core/commands/efi/setvariable.c >>>> deleted file mode 100644 >>>> index b0d0967..0000000 >>>> --- a/grub/grub-core/commands/efi/setvariable.c >>>> +++ /dev/null >>>> @@ -1,96 +0,0 @@ >>>> -/* setvariable.c - get and set efi firmware variables */ >>>> -/* >>>> - * GRUB -- GRand Unified Bootloader >>>> - * Copyright (C) 2013 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/>. >>>> - */ >>>> - >>>> -#include <grub/env.h> >>>> -#include <grub/dl.h> >>>> -#include <grub/misc.h> >>>> -#include <grub/file.h> >>>> -#include <grub/efi/efi.h> >>>> -#include <grub/pci.h> >>>> -#include <grub/command.h> >>>> -#include <grub/i18n.h> >>>> - >>>> -GRUB_MOD_LICENSE ("GPLv3+"); >>>> - >>>> -static grub_err_t >>>> -grub_cmd_setefivariable (grub_command_t cmd __attribute__ ((unused)), >>>> - int argc, char *argv[]) >>>> -{ >>>> - grub_efi_guid_t global = GRUB_EFI_GLOBAL_VARIABLE_GUID; >>>> - if (argc == 0) >>>> - return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("efi variable name >>>> expected")); >>>> - else if (argc == 1) >>>> - return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("efi variable name >>>> value expected")); >>>> - >>>> - grub_err_t status; >>>> - grub_size_t arg_size = (grub_strlen(argv[1]) + 1) * sizeof(char); >>>> - >>>> - status = grub_efi_set_variable (argv[0], &global, argv[1], >> arg_size); >>>> - if (status != GRUB_ERR_NONE) >>>> - { >>>> - grub_printf ("couldn't set efi variable"); >>>> - return status; >>>> - } >>>> - return 0; >>>> -} >>>> - >>>> -static grub_err_t >>>> -grub_cmd_getefivariable (grub_command_t cmd __attribute__ ((unused)), >>>> - int argc, char *argv[]) >>>> -{ >>>> - grub_efi_guid_t global = GRUB_EFI_GLOBAL_VARIABLE_GUID; >>>> - if (argc == 0) >>>> - return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("efi variable name >>>> expected")); >>>> - else if (argc == 1) >>>> - return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("efi variable name >>>> value expected")); >>>> - >>>> - grub_size_t var_size; >>>> - grub_err_t status; >>>> - char *value = (char*)grub_efi_get_variable (argv[0], &global, >>>> &var_size); >>>> - status = grub_env_set (argv[1], value); >>>> - if (status != GRUB_ERR_NONE) >>>> - { >>>> - grub_printf ("couldn't set environment variable"); >>>> - return status; >>>> - } >>>> - return 0; >>>> -} >>>> - >>>> -static grub_command_t cmd_setefivariable, cmd_getefivariable; >>>> - >>>> -GRUB_MOD_INIT(loadbios) >>>> -{ >>>> - cmd_setefivariable = grub_register_command ("setefivariable", >>>> grub_cmd_setefivariable, >>>> - N_("NAME VALUE"), >>>> - N_("Set an EFI firmware variable " >>>> - "which can be stored and retrieved " >>>> - "from between sessions.")); >>>> - >>>> - cmd_getefivariable = grub_register_command ("getefivariable", >>>> grub_cmd_getefivariable, >>>> - N_("NAME ENV_VARIABLE"), >>>> - N_("Gets an EFI firmware variable " >>>> - "and stores it as a GRUB environment " >>>> - "variable named ENV_VARIABLE.")); >>>> -} >>>> - >>>> -GRUB_MOD_FINI(loadbios) >>>> -{ >>>> - grub_unregister_command (cmd_setefivariable); >>>> - grub_unregister_command (cmd_getefivariable); >>>> -} >>>> >>>> _______________________________________________ >>>> Grub-devel mailing list >>>> address@hidden >>>> https://lists.gnu.org/mailman/listinfo/grub-devel >>>> >> >> >> >>> _______________________________________________ >>> Grub-devel mailing list >>> address@hidden >>> https://lists.gnu.org/mailman/listinfo/grub-devel >> >> >> >> >> _______________________________________________ >> Grub-devel mailing list >> address@hidden >> https://lists.gnu.org/mailman/listinfo/grub-devel >> > > > > > _______________________________________________ > Grub-devel mailing list > address@hidden > https://lists.gnu.org/mailman/listinfo/grub-devel -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.12 (GNU/Linux) Comment: Using GnuPG with Thunderbird - http://www.enigmail.net/ iQEcBAEBAgAGBQJSk88fAAoJEFbRvtGxmFPEo6sH+QH8Ui0uRIkjAPrpiYtq6WNS T4tsxK8n4wv5dtROlWZTJpuLhtynKP1m4LjSguO8XTMtRhgqFiyfcA1cJOQ/5XbP qEK1MoRivAme/Ia88l+AlGqSXqBTu5zmG+TfuMrVl/DFXKIwes6S5/mxeXftV+B7 gMq1LAZJ2oGiy1lSRdS37Tzg0VChVJJvFHIEu5AUAisLvOLKB054M82T3vmxQD6s N3z2RTxho98JxqjF+4tGMtbAI0mebD+v9ik2H3vs4Tsd+86Ie1/nSWPGJ0mdfN96 812p4xCBPx3vFkcfo1cReqNIl2aDVY+F55vWoh1Nc2fKHh1PW7/RB9Bo+FWbb48= =fQuY -----END PGP SIGNATURE----- |
[Prev in Thread] | Current Thread | [Next in Thread] |