Re: [PATCH] Add fwconfig command

2017-01-25 Thread Andrei Borzenkov
24.01.2017 02:43, Matthew Garrett пишет:
> Add a command to read values from the qemu fwcfg store. This allows data
> to be passed from the qemu command line to grub.
> 
> Example use:
> 
> echo '(hd0,1)' >rootdev
> qemu -fw_cfg opt/rootdev,file=rootdev
> 
> fwconfig opt/rootdev root

The name sounds way too generic. Unless we have plans to unify such
interface on multiple platforms, I would expect something like fw_cfg
(to match QEMU documentation) or even qemu_fw_cfg to make it pretty obvious.

> ---
>  docs/grub.texi|   6 +++
>  grub-core/Makefile.core.def   |   6 +++
>  grub-core/commands/fwconfig.c | 121 
> ++
>  3 files changed, 133 insertions(+)
>  create mode 100644 grub-core/commands/fwconfig.c
> 
> diff --git a/docs/grub.texi b/docs/grub.texi
> index 4469638..4f8a378 100644
> --- a/docs/grub.texi
> +++ b/docs/grub.texi
> @@ -3818,6 +3818,7 @@ you forget a command, you can run the command 
> @command{help}
>  * eval::Evaluate agruments as GRUB commands
>  * export::  Export an environment variable
>  * false::   Do nothing, unsuccessfully
> +* fwconfig::Retrieves a value from the qemu fwcfg store
>  * getenv::  Retrieve an EFI firmware variable
>  * gettext:: Translate a string
>  * gptsync:: Fill an MBR based on GPT entries
> @@ -4259,6 +4260,11 @@ Do nothing, unsuccessfully.  This is mainly useful in 
> control constructs
>  such as @code{if} and @code{while} (@pxref{Shell-like scripting}).
>  @end deffn
>  
> +@node fwconfig
> +@subsection fwconig
> +@deffn Command fwconfig fwpath envvar
> +Retrieves @var{fwpath} from the qemu fwcfg store and stores it in 
> @var{envvar}
> +

Your patch adds "-v" option that is not documented here

>  @node getenv
>  @subsection getenv
>  
> diff --git a/grub-core/Makefile.core.def b/grub-core/Makefile.core.def
> index db77a7f..f6b6f38 100644
> --- a/grub-core/Makefile.core.def
> +++ b/grub-core/Makefile.core.def
> @@ -2362,3 +2362,9 @@ module = {
>common = loader/i386/xen_file64.c;
>extra_dist = loader/i386/xen_fileXX.c;
>  };
> +
> +module = {
> +  name = fwconfig;
> +  common = commands/fwconfig.c;
> +  enable = x86;

QEMU supports fw_cfg at least on ARM (according to documentation), but I
guess this can be done later if needed.

> +};
> diff --git a/grub-core/commands/fwconfig.c b/grub-core/commands/fwconfig.c
> new file mode 100644
> index 000..289d167
> --- /dev/null
> +++ b/grub-core/commands/fwconfig.c
> @@ -0,0 +1,121 @@
> +/* fwconfig.c - command to read config from qemu fwconfig  */
> +/*
> + *  GRUB  --  GRand Unified Bootloader
> + *  Copyright (C) 2015  CoreOS, Inc.
> + *

I agree with other comments that at least does not align with copyrights
of other sources.

> + *  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 
> +#include 
> +#include 
> +#include 
> +
> +GRUB_MOD_LICENSE ("GPLv3+");
> +
> +#define SELECTOR 0x510
> +#define DATA 0x511
> +
> +#define SIGNATURE_INDEX 0x00
> +#define DIRECTORY_INDEX 0x19
> +

QEMU also provdes MMIO interface, but again, can be added later. I
wonder if we could use ACPI interface to discover them here?

> +static grub_extcmd_t cmd_read_fwconfig;
> +
> +struct grub_qemu_fwcfgfile {
> +  grub_uint32_t size;
> +  grub_uint16_t select;
> +  grub_uint16_t reserved;
> +  char name[56];
> +};
> +
> +static const struct grub_arg_option options[] =
> +  {
> +{0, 'v', 0, N_("Save read value into variable VARNAME."),
> + N_("VARNAME"), ARG_TYPE_STRING},

This option is not used anywhere. Also long options, please!

> +{0, 0, 0, 0, 0, 0}
> +  };
> +
> +static grub_err_t
> +grub_cmd_fwconfig (grub_extcmd_context_t ctxt, int argc, char **argv)
> +{
> +  grub_uint32_t i, j, value = 0;
> +  struct grub_qemu_fwcfgfile file;
> +  char fwsig[4], signature[4] = { 'Q', 'E', 'M', 'U' };
> +
> +  if (argc != 2)
> +return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("two arguments expected"));
> +

I would really prefer using options over positional parameters to make
it more extensible. One obvious extension would be --list to see
available files and --test to be able to verify in script whether file
exists.

> +  /* Verify that we have meaningful 

Re: [PATCH] Add fwconfig command

2017-01-24 Thread Daniel Kiper
On Mon, Jan 23, 2017 at 04:32:26PM -0800, Matthew Garrett wrote:
> Add a command to read values from the qemu fwcfg store. This allows data
> to be passed from the qemu command line to grub.
>
> Example use:
>
> echo '(hd0,1)' >rootdev
> qemu -fw_cfg opt/rootdev,file=rootdev
>
> fwconfig opt/rootdev root

I think that this should be made clear that fwconfig command should be
executed in GRUB not in shell. At least I understand it in that way.

[...]

> +static grub_err_t
> +grub_cmd_fwconfig (grub_extcmd_context_t ctxt, int argc, char **argv)
> +{
> +  grub_uint32_t i, j, value = 0;
> +  struct grub_qemu_fwcfgfile file;
> +  char fwsig[4], signature[4] = { 'Q', 'E', 'M', 'U' };
> +
> +  if (argc != 2)
> +return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("two arguments expected"));
> +
> +  /* Verify that we have meaningful hardware here */
> +  grub_outw(SIGNATURE_INDEX, SELECTOR);
> +  for (i=0; i +  fwsig[i] = grub_inb(DATA);
> +
> +  if (grub_memcmp(fwsig, signature, sizeof(signature)) != 0)
> +return grub_error (GRUB_ERR_BAD_DEVICE, N_("invalid fwconfig hardware 
> signature: got 0x%x%x%x%x"), fwsig[0], fwsig[1], fwsig[2], fwsig[3]);

Too long line. Could you wrap it?

> +
> +  /* Find out how many file entries we have */
> +  grub_outw(DIRECTORY_INDEX, SELECTOR);
> +  value = grub_inb(DATA) | grub_inb(DATA) << 8 | grub_inb(DATA) << 16 | 
> grub_inb(DATA) << 24;

Ditto.

> +  value = grub_be_to_cpu32(value);
> +  /* Read the file description for each file */
> +  for (i=0; i +{
> +  for (j=0; j + {
> +   ((char *))[j] = grub_inb(DATA);
> + }
> +  /* Check whether it matches what we're looking for, and if so read the 
> file */

Ditto.

> +  if (grub_strncmp(file.name, argv[0], sizeof(file.name)) == 0)
> + {
> +   grub_uint32_t filesize = grub_be_to_cpu32(file.size);
> +   grub_uint16_t location = grub_be_to_cpu16(file.select);
> +   char *data = grub_malloc(filesize+1);
> +
> +   if (!data)
> +   return grub_error (GRUB_ERR_OUT_OF_MEMORY, N_("can't allocate 
> buffer for data"));

Ditto.

> +
> +   grub_outw(location, SELECTOR);
> +   for (j=0; j + {
> +   data[j] = grub_inb(DATA);
> + }
> +
> +   data[filesize] = '\0';
> +
> +   grub_env_set (argv[1], data);
> +
> +   grub_free(data);
> +   return 0;
> + }
> +}
> +
> +  return grub_error (GRUB_ERR_FILE_NOT_FOUND, N_("couldn't find entry %s"), 
> argv[0]);

Ditto.

Additionally, could you be more in line with GRUB2 coding style?
I know that it is not strictly defined but if you look at a few
files you will catch what I mean.

Though in general LGTM but this is not 2.02 material.
I am adding this to my radar for next release.

Daniel

___
Grub-devel mailing list
Grub-devel@gnu.org
https://lists.gnu.org/mailman/listinfo/grub-devel


Re: [PATCH] Add fwconfig command

2017-01-24 Thread Lennart Sorensen
On Tue, Jan 24, 2017 at 07:18:13PM +0100, Thomas Schmitt wrote:
> One should emphasize that the FSF when designing new license versions only
> considers compatibility to older FSF licenses if they bear the "or later"
> clause.
> 
> E.g. it is not possible to combine GPL version 2 software with LGPL version 3
> software if the GPL does not offer the opportunity to get upgraded to GPL
> version 3. That's because LGPL 3 forbids some patent evilness whereas GPL 2
> forbids to add forbiddances.
>   https://www.gnu.org/licenses/license-list.en.html#LGPLv3
> 
> According to Richard Stallman, the design flaw is not in LGPL 3 but in 
> issueing
> GPL 2 without "or later" clause. (Company lawyers may well contradict.)

Yes the nice GPL feature where you can't add anything to it, unless you
are the FSF, then you can.

Some people don't like handing future control to someone else like that.

Most users of the GPL seem OK with it though.

-- 
Len Sorensen

___
Grub-devel mailing list
Grub-devel@gnu.org
https://lists.gnu.org/mailman/listinfo/grub-devel


Re: [PATCH] Add fwconfig command

2017-01-24 Thread Thomas Schmitt
Hi,

Colin Watson wrote:
> https://www.gnu.org/licenses/gpl.html#howto

One should emphasize that the FSF when designing new license versions only
considers compatibility to older FSF licenses if they bear the "or later"
clause.

E.g. it is not possible to combine GPL version 2 software with LGPL version 3
software if the GPL does not offer the opportunity to get upgraded to GPL
version 3. That's because LGPL 3 forbids some patent evilness whereas GPL 2
forbids to add forbiddances.
  https://www.gnu.org/licenses/license-list.en.html#LGPLv3

According to Richard Stallman, the design flaw is not in LGPL 3 but in issueing
GPL 2 without "or later" clause. (Company lawyers may well contradict.)


Have a nice day :)

Thomas


___
Grub-devel mailing list
Grub-devel@gnu.org
https://lists.gnu.org/mailman/listinfo/grub-devel


Re: [PATCH] Add fwconfig command

2017-01-24 Thread Colin Watson
On Tue, Jan 24, 2017 at 11:40:57AM -0500, Konrad Rzeszutek Wilk wrote:
> On Tue, Jan 24, 2017 at 04:36:03PM +, Colin Watson wrote:
> > This language indicates that it's at the option of the person
> > redistributing or modifying it whether they do so under the terms of
> > version 3 or of some later version.  Matthew is not required to pick
> > one.
> 
> I mean I am reading this and it sounds like that
> too but then this is an legal aggreement and those seem to
> operate on some weird rules.
> 
> Does FSF have an unqualified answer to this?

The text Matthew uses is straight from
https://www.gnu.org/licenses/gpl.html#howto, which seems pretty
unqualified to me.

-- 
Colin Watson   [cjwat...@ubuntu.com]

___
Grub-devel mailing list
Grub-devel@gnu.org
https://lists.gnu.org/mailman/listinfo/grub-devel


Re: [PATCH] Add fwconfig command

2017-01-24 Thread Konrad Rzeszutek Wilk
On Tue, Jan 24, 2017 at 04:36:03PM +, Colin Watson wrote:
> On Tue, Jan 24, 2017 at 09:52:35AM -0500, Konrad Rzeszutek Wilk wrote:
> > On Mon, Jan 23, 2017 at 03:43:32PM -0800, Matthew Garrett wrote:
> > > + *  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.
> > 
> > So what is your option here (see the 'at your option'). 
> 
> This language indicates that it's at the option of the person
> redistributing or modifying it whether they do so under the terms of
> version 3 or of some later version.  Matthew is not required to pick
> one.

I mean I am reading this and it sounds like that
too but then this is an legal aggreement and those seem to
operate on some weird rules.

Does FSF have an unqualified answer to this?

> 
> Also:
> 
>   $ git grep 'at your 
> option' | wc -l
>   1412

Which could mean that nobody reads that stuff and just copies
and pastes.

___
Grub-devel mailing list
Grub-devel@gnu.org
https://lists.gnu.org/mailman/listinfo/grub-devel


Re: [PATCH] Add fwconfig command

2017-01-24 Thread Colin Watson
On Tue, Jan 24, 2017 at 09:52:35AM -0500, Konrad Rzeszutek Wilk wrote:
> On Mon, Jan 23, 2017 at 03:43:32PM -0800, Matthew Garrett wrote:
> > + *  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.
> 
> So what is your option here (see the 'at your option'). 

This language indicates that it's at the option of the person
redistributing or modifying it whether they do so under the terms of
version 3 or of some later version.  Matthew is not required to pick
one.

Also:

  $ git grep 'at your 
option' | wc -l
  1412

-- 
Colin Watson   [cjwat...@ubuntu.com]

___
Grub-devel mailing list
Grub-devel@gnu.org
https://lists.gnu.org/mailman/listinfo/grub-devel


Re: [PATCH] Add fwconfig command

2017-01-24 Thread Konrad Rzeszutek Wilk
On Mon, Jan 23, 2017 at 03:43:32PM -0800, Matthew Garrett wrote:
> Add a command to read values from the qemu fwcfg store. This allows data
> to be passed from the qemu command line to grub.
> 
> Example use:
> 
> echo '(hd0,1)' >rootdev
> qemu -fw_cfg opt/rootdev,file=rootdev
> 
> fwconfig opt/rootdev root
> ---
>  docs/grub.texi|   6 +++
>  grub-core/Makefile.core.def   |   6 +++
>  grub-core/commands/fwconfig.c | 121 
> ++
>  3 files changed, 133 insertions(+)
>  create mode 100644 grub-core/commands/fwconfig.c
> 
> diff --git a/docs/grub.texi b/docs/grub.texi
> index 4469638..4f8a378 100644
> --- a/docs/grub.texi
> +++ b/docs/grub.texi
> @@ -3818,6 +3818,7 @@ you forget a command, you can run the command 
> @command{help}
>  * eval::Evaluate agruments as GRUB commands
>  * export::  Export an environment variable
>  * false::   Do nothing, unsuccessfully
> +* fwconfig::Retrieves a value from the qemu fwcfg store
>  * getenv::  Retrieve an EFI firmware variable
>  * gettext:: Translate a string
>  * gptsync:: Fill an MBR based on GPT entries
> @@ -4259,6 +4260,11 @@ Do nothing, unsuccessfully.  This is mainly useful in 
> control constructs
>  such as @code{if} and @code{while} (@pxref{Shell-like scripting}).
>  @end deffn
>  
> +@node fwconfig
> +@subsection fwconig
> +@deffn Command fwconfig fwpath envvar
> +Retrieves @var{fwpath} from the qemu fwcfg store and stores it in 
> @var{envvar}
> +
>  @node getenv
>  @subsection getenv
>  
> diff --git a/grub-core/Makefile.core.def b/grub-core/Makefile.core.def
> index db77a7f..f6b6f38 100644
> --- a/grub-core/Makefile.core.def
> +++ b/grub-core/Makefile.core.def
> @@ -2362,3 +2362,9 @@ module = {
>common = loader/i386/xen_file64.c;
>extra_dist = loader/i386/xen_fileXX.c;
>  };
> +
> +module = {
> +  name = fwconfig;
> +  common = commands/fwconfig.c;
> +  enable = x86;
> +};
> diff --git a/grub-core/commands/fwconfig.c b/grub-core/commands/fwconfig.c
> new file mode 100644
> index 000..289d167
> --- /dev/null
> +++ b/grub-core/commands/fwconfig.c
> @@ -0,0 +1,121 @@
> +/* fwconfig.c - command to read config from qemu fwconfig  */
> +/*
> + *  GRUB  --  GRand Unified Bootloader
> + *  Copyright (C) 2015  CoreOS, Inc.


Hmm, 

See https://www.gnu.org/licenses/why-assign.html


> + *
> + *  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.

So what is your option here (see the 'at your option'). 

> + *
> + *  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 .
> + */

___
Grub-devel mailing list
Grub-devel@gnu.org
https://lists.gnu.org/mailman/listinfo/grub-devel


[PATCH] Add fwconfig command

2017-01-24 Thread Matthew Garrett
Add a command to read values from the qemu fwcfg store. This allows data
to be passed from the qemu command line to grub.

Example use:

echo '(hd0,1)' >rootdev
qemu -fw_cfg opt/rootdev,file=rootdev

fwconfig opt/rootdev root
---
 docs/grub.texi|   6 +++
 grub-core/Makefile.core.def   |   6 +++
 grub-core/commands/fwconfig.c | 121 ++
 3 files changed, 133 insertions(+)
 create mode 100644 grub-core/commands/fwconfig.c

diff --git a/docs/grub.texi b/docs/grub.texi
index 4469638..4f8a378 100644
--- a/docs/grub.texi
+++ b/docs/grub.texi
@@ -3818,6 +3818,7 @@ you forget a command, you can run the command 
@command{help}
 * eval::Evaluate agruments as GRUB commands
 * export::  Export an environment variable
 * false::   Do nothing, unsuccessfully
+* fwconfig::Retrieves a value from the qemu fwcfg store
 * getenv::  Retrieve an EFI firmware variable
 * gettext:: Translate a string
 * gptsync:: Fill an MBR based on GPT entries
@@ -4259,6 +4260,11 @@ Do nothing, unsuccessfully.  This is mainly useful in 
control constructs
 such as @code{if} and @code{while} (@pxref{Shell-like scripting}).
 @end deffn
 
+@node fwconfig
+@subsection fwconig
+@deffn Command fwconfig fwpath envvar
+Retrieves @var{fwpath} from the qemu fwcfg store and stores it in @var{envvar}
+
 @node getenv
 @subsection getenv
 
diff --git a/grub-core/Makefile.core.def b/grub-core/Makefile.core.def
index db77a7f..f6b6f38 100644
--- a/grub-core/Makefile.core.def
+++ b/grub-core/Makefile.core.def
@@ -2362,3 +2362,9 @@ module = {
   common = loader/i386/xen_file64.c;
   extra_dist = loader/i386/xen_fileXX.c;
 };
+
+module = {
+  name = fwconfig;
+  common = commands/fwconfig.c;
+  enable = x86;
+};
diff --git a/grub-core/commands/fwconfig.c b/grub-core/commands/fwconfig.c
new file mode 100644
index 000..289d167
--- /dev/null
+++ b/grub-core/commands/fwconfig.c
@@ -0,0 +1,121 @@
+/* fwconfig.c - command to read config from qemu fwconfig  */
+/*
+ *  GRUB  --  GRand Unified Bootloader
+ *  Copyright (C) 2015  CoreOS, 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 
+#include 
+#include 
+#include 
+
+GRUB_MOD_LICENSE ("GPLv3+");
+
+#define SELECTOR 0x510
+#define DATA 0x511
+
+#define SIGNATURE_INDEX 0x00
+#define DIRECTORY_INDEX 0x19
+
+static grub_extcmd_t cmd_read_fwconfig;
+
+struct grub_qemu_fwcfgfile {
+  grub_uint32_t size;
+  grub_uint16_t select;
+  grub_uint16_t reserved;
+  char name[56];
+};
+
+static const struct grub_arg_option options[] =
+  {
+{0, 'v', 0, N_("Save read value into variable VARNAME."),
+ N_("VARNAME"), ARG_TYPE_STRING},
+{0, 0, 0, 0, 0, 0}
+  };
+
+static grub_err_t
+grub_cmd_fwconfig (grub_extcmd_context_t ctxt, int argc, char **argv)
+{
+  grub_uint32_t i, j, value = 0;
+  struct grub_qemu_fwcfgfile file;
+  char fwsig[4], signature[4] = { 'Q', 'E', 'M', 'U' };
+
+  if (argc != 2)
+return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("two arguments expected"));
+
+  /* Verify that we have meaningful hardware here */
+  grub_outw(SIGNATURE_INDEX, SELECTOR);
+  for (i=0; i

[PATCH] Add fwconfig command

2017-01-23 Thread Matthew Garrett
Add a command to read values from the qemu fwcfg store. This allows data
to be passed from the qemu command line to grub.

Example use:

echo '(hd0,1)' >rootdev
qemu -fw_cfg opt/rootdev,file=rootdev

fwconfig opt/rootdev root
---
 docs/grub.texi|   6 +++
 grub-core/Makefile.core.def   |   6 +++
 grub-core/commands/fwconfig.c | 121 ++
 3 files changed, 133 insertions(+)
 create mode 100644 grub-core/commands/fwconfig.c

diff --git a/docs/grub.texi b/docs/grub.texi
index 4469638..4f8a378 100644
--- a/docs/grub.texi
+++ b/docs/grub.texi
@@ -3818,6 +3818,7 @@ you forget a command, you can run the command 
@command{help}
 * eval::Evaluate agruments as GRUB commands
 * export::  Export an environment variable
 * false::   Do nothing, unsuccessfully
+* fwconfig::Retrieves a value from the qemu fwcfg store
 * getenv::  Retrieve an EFI firmware variable
 * gettext:: Translate a string
 * gptsync:: Fill an MBR based on GPT entries
@@ -4259,6 +4260,11 @@ Do nothing, unsuccessfully.  This is mainly useful in 
control constructs
 such as @code{if} and @code{while} (@pxref{Shell-like scripting}).
 @end deffn
 
+@node fwconfig
+@subsection fwconig
+@deffn Command fwconfig fwpath envvar
+Retrieves @var{fwpath} from the qemu fwcfg store and stores it in @var{envvar}
+
 @node getenv
 @subsection getenv
 
diff --git a/grub-core/Makefile.core.def b/grub-core/Makefile.core.def
index db77a7f..f6b6f38 100644
--- a/grub-core/Makefile.core.def
+++ b/grub-core/Makefile.core.def
@@ -2362,3 +2362,9 @@ module = {
   common = loader/i386/xen_file64.c;
   extra_dist = loader/i386/xen_fileXX.c;
 };
+
+module = {
+  name = fwconfig;
+  common = commands/fwconfig.c;
+  enable = x86;
+};
diff --git a/grub-core/commands/fwconfig.c b/grub-core/commands/fwconfig.c
new file mode 100644
index 000..289d167
--- /dev/null
+++ b/grub-core/commands/fwconfig.c
@@ -0,0 +1,121 @@
+/* fwconfig.c - command to read config from qemu fwconfig  */
+/*
+ *  GRUB  --  GRand Unified Bootloader
+ *  Copyright (C) 2015  CoreOS, 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 
+#include 
+#include 
+#include 
+
+GRUB_MOD_LICENSE ("GPLv3+");
+
+#define SELECTOR 0x510
+#define DATA 0x511
+
+#define SIGNATURE_INDEX 0x00
+#define DIRECTORY_INDEX 0x19
+
+static grub_extcmd_t cmd_read_fwconfig;
+
+struct grub_qemu_fwcfgfile {
+  grub_uint32_t size;
+  grub_uint16_t select;
+  grub_uint16_t reserved;
+  char name[56];
+};
+
+static const struct grub_arg_option options[] =
+  {
+{0, 'v', 0, N_("Save read value into variable VARNAME."),
+ N_("VARNAME"), ARG_TYPE_STRING},
+{0, 0, 0, 0, 0, 0}
+  };
+
+static grub_err_t
+grub_cmd_fwconfig (grub_extcmd_context_t ctxt, int argc, char **argv)
+{
+  grub_uint32_t i, j, value = 0;
+  struct grub_qemu_fwcfgfile file;
+  char fwsig[4], signature[4] = { 'Q', 'E', 'M', 'U' };
+
+  if (argc != 2)
+return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("two arguments expected"));
+
+  /* Verify that we have meaningful hardware here */
+  grub_outw(SIGNATURE_INDEX, SELECTOR);
+  for (i=0; i