* PATCH: added GRUB command to get and set (U)EFI firmware variables
@ 2013-11-25 21:34 SevenBits
2013-11-25 21:41 ` Vladimir 'phcoder' Serbinenko
0 siblings, 1 reply; 10+ messages in thread
From: SevenBits @ 2013-11-25 21:34 UTC (permalink / raw)
To: grub-devel
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);
-}
^ permalink raw reply related [flat|nested] 10+ messages in thread
* Re: PATCH: added GRUB command to get and set (U)EFI firmware variables
2013-11-25 21:34 PATCH: added GRUB command to get and set (U)EFI firmware variables SevenBits
@ 2013-11-25 21:41 ` Vladimir 'phcoder' Serbinenko
2013-11-25 22:03 ` SevenBits
0 siblings, 1 reply; 10+ messages in thread
From: Vladimir 'phcoder' Serbinenko @ 2013-11-25 21:41 UTC (permalink / raw)
To: The development of GNU GRUB
[-- Attachment #1: Type: text/plain, Size: 5615 bytes --]
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" <sevenbitstech@gmail.com> 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
> Grub-devel@gnu.org
> https://lists.gnu.org/mailman/listinfo/grub-devel
>
[-- Attachment #2: Type: text/html, Size: 6760 bytes --]
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: PATCH: added GRUB command to get and set (U)EFI firmware variables
2013-11-25 21:41 ` Vladimir 'phcoder' Serbinenko
@ 2013-11-25 22:03 ` SevenBits
2013-11-25 22:07 ` Vladimir 'φ-coder/phcoder' Serbinenko
0 siblings, 1 reply; 10+ messages in thread
From: SevenBits @ 2013-11-25 22:03 UTC (permalink / raw)
To: The development of GNU GRUB
[-- Attachment #1: Type: text/plain, Size: 7006 bytes --]
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
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?
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" <sevenbitstech@gmail.com> 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
>> Grub-devel@gnu.org
>> https://lists.gnu.org/mailman/listinfo/grub-devel
>>
>
>
>
> _______________________________________________
> Grub-devel mailing list
> Grub-devel@gnu.org
> 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/
iQEcBAEBAgAGBQJSk8knAAoJEFbRvtGxmFPETq0H/jbN5WRHRImN93zuXaAhLBqf
cwyRPAJFdyIIGGRrqqRS/KMITDO2eVSsiEwbCQxPAfqGFhFq64hOYJxTlJRBNoUf
bM4g34e26x0rH338EFFnFe/8KZSV9dMf/dByKCh1yXLa9F74CYC211tAuwCcG1lr
cm+k71B7wvBn9szPgrXkcvqDbnAJ2arDgabzkqUGIPYpdMYdeCHVzM5uFMAaqLPA
VPAdZSfhbvZgaA41XIsSx6YjMf2PQPNqDKg/Vn3BuzxpD+OnuxVCdwGkX5+rdnCr
ejG+pJLqYK2qymcJEkMW1mnYyMOjV5Layp+3P69BBUf+Xc53Z9Du8cDM2Inz4oA=
=voXE
-----END PGP SIGNATURE-----
[-- Attachment #2: Type: text/html, Size: 12718 bytes --]
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: PATCH: added GRUB command to get and set (U)EFI firmware variables
2013-11-25 22:03 ` SevenBits
@ 2013-11-25 22:07 ` Vladimir 'φ-coder/phcoder' Serbinenko
2013-11-25 22:28 ` SevenBits
0 siblings, 1 reply; 10+ messages in thread
From: Vladimir 'φ-coder/phcoder' Serbinenko @ 2013-11-25 22:07 UTC (permalink / raw)
To: The development of GNU GRUB
[-- Attachment #1: Type: text/plain, Size: 7278 bytes --]
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.
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
> 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" <sevenbitstech@gmail.com> 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
>>> Grub-devel@gnu.org
>>> https://lists.gnu.org/mailman/listinfo/grub-devel
>>>
>
>
>
>> _______________________________________________
>> Grub-devel mailing list
>> Grub-devel@gnu.org
>> https://lists.gnu.org/mailman/listinfo/grub-devel
>
>
>
>
> _______________________________________________
> Grub-devel mailing list
> Grub-devel@gnu.org
> https://lists.gnu.org/mailman/listinfo/grub-devel
>
[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 291 bytes --]
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: PATCH: added GRUB command to get and set (U)EFI firmware variables
2013-11-25 22:07 ` Vladimir 'φ-coder/phcoder' Serbinenko
@ 2013-11-25 22:28 ` SevenBits
2013-11-26 0:22 ` Vladimir 'φ-coder/phcoder' Serbinenko
0 siblings, 1 reply; 10+ messages in thread
From: SevenBits @ 2013-11-25 22:28 UTC (permalink / raw)
To: The development of GNU GRUB
[-- Attachment #1: Type: text/plain, Size: 8339 bytes --]
-----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" <sevenbitstech@gmail.com> 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
>>>> Grub-devel@gnu.org
>>>> https://lists.gnu.org/mailman/listinfo/grub-devel
>>>>
>>
>>
>>
>>> _______________________________________________
>>> Grub-devel mailing list
>>> Grub-devel@gnu.org
>>> https://lists.gnu.org/mailman/listinfo/grub-devel
>>
>>
>>
>>
>> _______________________________________________
>> Grub-devel mailing list
>> Grub-devel@gnu.org
>> https://lists.gnu.org/mailman/listinfo/grub-devel
>>
>
>
>
>
> _______________________________________________
> Grub-devel mailing list
> Grub-devel@gnu.org
> 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-----
[-- Attachment #2: Type: text/html, Size: 16105 bytes --]
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: PATCH: added GRUB command to get and set (U)EFI firmware variables
2013-11-25 22:28 ` SevenBits
@ 2013-11-26 0:22 ` Vladimir 'φ-coder/phcoder' Serbinenko
2013-11-27 18:44 ` SevenBits
0 siblings, 1 reply; 10+ messages in thread
From: Vladimir 'φ-coder/phcoder' Serbinenko @ 2013-11-26 0:22 UTC (permalink / raw)
To: grub-devel
[-- Attachment #1: Type: text/plain, Size: 8531 bytes --]
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.
>> 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" <sevenbitstech@gmail.com> 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
>>>>> Grub-devel@gnu.org
>>>>> https://lists.gnu.org/mailman/listinfo/grub-devel
>>>>>
>>>
>>>
>>>
>>>> _______________________________________________
>>>> Grub-devel mailing list
>>>> Grub-devel@gnu.org
>>>> https://lists.gnu.org/mailman/listinfo/grub-devel
>>>
>>>
>>>
>>>
>>> _______________________________________________
>>> Grub-devel mailing list
>>> Grub-devel@gnu.org
>>> https://lists.gnu.org/mailman/listinfo/grub-devel
>>>
>
>
>
>
>> _______________________________________________
>> Grub-devel mailing list
>> Grub-devel@gnu.org
>> https://lists.gnu.org/mailman/listinfo/grub-devel
>
>
>
>
> _______________________________________________
> Grub-devel mailing list
> Grub-devel@gnu.org
> https://lists.gnu.org/mailman/listinfo/grub-devel
>
[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 291 bytes --]
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: PATCH: added GRUB command to get and set (U)EFI firmware variables
2013-11-26 0:22 ` Vladimir 'φ-coder/phcoder' Serbinenko
@ 2013-11-27 18:44 ` SevenBits
2013-11-27 18:57 ` Andrey Borzenkov
0 siblings, 1 reply; 10+ messages in thread
From: SevenBits @ 2013-11-27 18:44 UTC (permalink / raw)
To: The development of GNU GRUB
-----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"
>>>>> <sevenbitstech@gmail.com> 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 Grub-devel@gnu.org
>>>>>> https://lists.gnu.org/mailman/listinfo/grub-devel
>>>>>>
>>>>
>>>>
>>>>
>>>>> _______________________________________________ Grub-devel
>>>>> mailing list Grub-devel@gnu.org
>>>>> https://lists.gnu.org/mailman/listinfo/grub-devel
>>>>
>>>>
>>>>
>>>>
>>>> _______________________________________________ Grub-devel
>>>> mailing list Grub-devel@gnu.org
>>>> https://lists.gnu.org/mailman/listinfo/grub-devel
>>>>
>>
>>
>>
>>
>>> _______________________________________________ Grub-devel
>>> mailing list Grub-devel@gnu.org
>>> https://lists.gnu.org/mailman/listinfo/grub-devel
>>
>>
>>
>>
>> _______________________________________________ Grub-devel
>> mailing list Grub-devel@gnu.org
>> https://lists.gnu.org/mailman/listinfo/grub-devel
>>
>
>
>
>
> _______________________________________________ Grub-devel mailing
> list Grub-devel@gnu.org
> 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-----
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: PATCH: added GRUB command to get and set (U)EFI firmware variables
2013-11-27 18:44 ` SevenBits
@ 2013-11-27 18:57 ` Andrey Borzenkov
2013-11-27 20:14 ` Vladimir 'φ-coder/phcoder' Serbinenko
0 siblings, 1 reply; 10+ messages in thread
From: Andrey Borzenkov @ 2013-11-27 18:57 UTC (permalink / raw)
To: grub-devel
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
В Wed, 27 Nov 2013 13:44:41 -0500
SevenBits <sevenbitstech@gmail.com> пишет:
> -----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.
>
I think it is rather premature at this point. What is needed first is
sane framework for handling EFI variables, which means - handling GUID,
options (during set or as filter in listing variables) and conversion of
arbitrary binary data from/to external printable representation.
>
> >>> 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.
> >>
Yes, please. Adding aliases for GUID can always come later and is not
really that important.
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v2.0.19 (GNU/Linux)
iEYEARECAAYFAlKWQLAACgkQR6LMutpd94yMZgCg0vV8YWsgWPSDK+Zco9nZVfqI
EbAAoKCo88yPOpD0IlDn/EiXZ1hnT7RY
=XUV+
-----END PGP SIGNATURE-----
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: PATCH: added GRUB command to get and set (U)EFI firmware variables
2013-11-27 18:57 ` Andrey Borzenkov
@ 2013-11-27 20:14 ` Vladimir 'φ-coder/phcoder' Serbinenko
2013-11-28 15:33 ` SevenBits
0 siblings, 1 reply; 10+ messages in thread
From: Vladimir 'φ-coder/phcoder' Serbinenko @ 2013-11-27 20:14 UTC (permalink / raw)
To: The development of GNU GRUB
[-- Attachment #1: Type: text/plain, Size: 2536 bytes --]
On 27.11.2013 19:57, Andrey Borzenkov wrote:
> В Wed, 27 Nov 2013 13:44:41 -0500
> SevenBits <sevenbitstech@gmail.com> пишет:
>
>> -----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.
>
>
> I think it is rather premature at this point.
Agreed. I wasn't clear enough that I meant that in the first
implementation we need to put just few UUIDs we already know about as
aliases and expand them with the time.
> What is needed first is
> sane framework for handling EFI variables, which means - handling GUID,
> options (during set or as filter in listing variables) and conversion of
> arbitrary binary data from/to external printable representation.
>
>
>>>>> 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.
>>>>
>
>
> Yes, please. Adding aliases for GUID can always come later and is not
> really that important.
> _______________________________________________
> Grub-devel mailing list
> Grub-devel@gnu.org
> https://lists.gnu.org/mailman/listinfo/grub-devel
>
[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 291 bytes --]
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: PATCH: added GRUB command to get and set (U)EFI firmware variables
2013-11-27 20:14 ` Vladimir 'φ-coder/phcoder' Serbinenko
@ 2013-11-28 15:33 ` SevenBits
0 siblings, 0 replies; 10+ messages in thread
From: SevenBits @ 2013-11-28 15:33 UTC (permalink / raw)
To: The development of GNU GRUB
[-- Attachment #1: Type: text/plain, Size: 3127 bytes --]
On Wednesday, November 27, 2013, Vladimir 'φ-coder/phcoder' Serbinenko
wrote:
> On 27.11.2013 19:57, Andrey Borzenkov wrote:
> > В Wed, 27 Nov 2013 13:44:41 -0500
> > SevenBits <sevenbitstech@gmail.com <javascript:;>> пишет:
> >
> >> -----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.
> >
> >
> > I think it is rather premature at this point.
> Agreed. I wasn't clear enough that I meant that in the first
> implementation we need to put just few UUIDs we already know about as
> aliases and expand them with the time.
Okay, sounds okay to me. I'll be occupied because of the holidays here in
the United States but I can get on it as soon as I can.
> > What is needed first is
> > sane framework for handling EFI variables, which means - handling GUID,
> > options (during set or as filter in listing variables) and conversion of
> > arbitrary binary data from/to external printable representation.
I think I get what you mean. I'll focus on this area then.
> >
> >
> >>>>> 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.
> >>>>
> >
> >
> > Yes, please. Adding aliases for GUID can always come later and is not
> > really that important.
Alright. Any specific ideas of where I should put the code? In with the
other UEFI handling stuff or in the code for the module I'm writing?
> > _______________________________________________
> > Grub-devel mailing list
> > Grub-devel@gnu.org <javascript:;>
> > https://lists.gnu.org/mailman/listinfo/grub-devel
> >
>
>
>
[-- Attachment #2: Type: text/html, Size: 4659 bytes --]
^ permalink raw reply [flat|nested] 10+ messages in thread
end of thread, other threads:[~2013-11-28 15:33 UTC | newest]
Thread overview: 10+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2013-11-25 21:34 PATCH: added GRUB command to get and set (U)EFI firmware variables SevenBits
2013-11-25 21:41 ` Vladimir 'phcoder' Serbinenko
2013-11-25 22:03 ` SevenBits
2013-11-25 22:07 ` Vladimir 'φ-coder/phcoder' Serbinenko
2013-11-25 22:28 ` SevenBits
2013-11-26 0:22 ` Vladimir 'φ-coder/phcoder' Serbinenko
2013-11-27 18:44 ` SevenBits
2013-11-27 18:57 ` Andrey Borzenkov
2013-11-27 20:14 ` Vladimir 'φ-coder/phcoder' Serbinenko
2013-11-28 15:33 ` SevenBits
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).