grub-devel
[Top][All Lists]
Advanced

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

Re: PATCH: added GRUB command to get and set (U)EFI firmware variables


From: SevenBits
Subject: Re: PATCH: added GRUB command to get and set (U)EFI firmware variables
Date: Wed, 27 Nov 2013 13:44:41 -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 07:22 PM, Vladimir 'φ-coder/phcoder' Serbinenko wrote:
> On 25.11.2013 23:28, SevenBits wrote:
>> 
>> 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.
>> 
> I'd include a command to list variables (interactively). We would
> pretty quickly collect most common UUIDs this way.

So, I've got a command written to print out the system's firmware
variables. Trouble is I'm not sure what the best way would be to print
or otherwise display the UUIDs gathered so that we can collect them.

Seeing as how I have an Apple computer as my only (U)EFI-enabled
machine I won't have a large sample set to use anyway... unless of
course you'd want to take the patch before it's feature complete so it
could get the rounds and gather common UUIDs.

Perhaps someone who has been with GRUB for awhile could advise me on
what the best course of action is in situations like this.

>>> 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
>> 
>> 
>> 
>> 
>> _______________________________________________ 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/

iQEcBAEBAgAGBQJSlj2ZAAoJEFbRvtGxmFPEwKMH/2ZaeqmlH+0QPaWj0cGMyAuV
45z4GLWjFyUnXxFPMnk2aZzSo4WDJJapfJQOazB4rXmu/CpqtnyGNuCRFZitCs70
lw64HpKkAbBhVdQmMY1o0O2uC74WRP7XuGoYai7vMaHAA3VBqMlk2EHfB1FBgHae
LQf8NMyvzjvBFHmMf79axn4zZKXQJ7bBjqDP2eO7OuEjp/SKMXxOd55S9O+hzw7d
uy3HKAayWLYC9F/66Wm4oj8hScXc14Si8vW+pwUic9nmTPSXo6gMyDbjPwZYuXaQ
8zNA1ZjikyNY3Nc22MsmqXr0sHPws9xenUdJDXhWcIk9l/LHXKBRBbycMd9RcvY=
=W2Lz
-----END PGP SIGNATURE-----



reply via email to

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