Petitboot: Carry build-time fixes from upstream

Some upstream fixes are still not available as a release after 1.10.4,
add them as build-time patches.

In support of that, force gettext and autoreconf on petitboot.mk since
we're touching Makefile.am files (so that we can build fine)

Summary of changes for post 1.10.4 patches:

Jeremy Kerr (15):
      discover/grub2: 'search' set-variable defaults to root
      discover/grub2: Use getopt for `search` argument parsing
      discover/grub2: test for (ignored) --no-floppy argument
      discover/grub2: Add support for UUID and label for 'search' command
      discover/grub2: expose a struct for grub2 file references
      discover/grub2: Add parsing code for grub2 file specifiers
      discover/grub2: add support for grub2-style path specifiers in resources
      discover/grub2: Allow (device)/path references in general script usage
      discover/grub2: Add a reference from script to parser
      discover/grub2: expose internal parse function
      discover/grub2: make statements_execute non-static
      discover/grub2: implement 'source' command
      test/parser: Add test for recent RHCOS grub2 config
      test/parser: Add RHEL8 grub config test
      lib/pb-protocol: fix ordering of system info length calculation

Maxim Polyakov (3):
      discover/platform-powerpc: add missing mbox block selector
      discover/platform-powerpc: limit mailbox response size
      discover/platform-powerpc: return the actual mailbox size

Signed-off-by: Klaus Heinrich Kiwi <klaus@linux.vnet.ibm.com>
diff --git a/openpower/package/petitboot/0015-discover-grub2-implement-source-command.patch b/openpower/package/petitboot/0015-discover-grub2-implement-source-command.patch
new file mode 100644
index 0000000..e9f55ed
--- /dev/null
+++ b/openpower/package/petitboot/0015-discover-grub2-implement-source-command.patch
@@ -0,0 +1,352 @@
+From 772139fd8f8d8b290a5c0a320d88a896b628624b Mon Sep 17 00:00:00 2001
+From: Jeremy Kerr <jk@ozlabs.org>
+Date: Thu, 14 Nov 2019 15:06:26 +0800
+Subject: [PATCH 15/18] discover/grub2: implement 'source' command
+
+This change add support for the grub2 'source' command, executing a
+referenced script in the current parse context.
+
+We impose a limit of 10 (concurrent) source commands, to prevent
+infinite recursion.
+
+Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
+(cherry picked from commit 967cfa7e5c1bfb4d2cf78bb3de3dc6d36b78c440)
+Signed-off-by: Klaus Heinrich Kiwi <klaus@linux.vnet.ibm.com>
+---
+ discover/grub2/builtins.c                     | 51 +++++++++++++++-
+ discover/grub2/grub2.h                        |  1 +
+ test/parser/Makefile.am                       |  4 ++
+ test/parser/test-grub2-source-functions.c     | 46 +++++++++++++++
+ .../test-grub2-source-recursion-infinite.c    | 43 ++++++++++++++
+ test/parser/test-grub2-source-recursion.c     | 58 +++++++++++++++++++
+ test/parser/test-grub2-source.c               | 54 +++++++++++++++++
+ 7 files changed, 256 insertions(+), 1 deletion(-)
+ create mode 100644 test/parser/test-grub2-source-functions.c
+ create mode 100644 test/parser/test-grub2-source-recursion-infinite.c
+ create mode 100644 test/parser/test-grub2-source-recursion.c
+ create mode 100644 test/parser/test-grub2-source.c
+
+diff --git a/discover/grub2/builtins.c b/discover/grub2/builtins.c
+index c726216..ab1407a 100644
+--- a/discover/grub2/builtins.c
++++ b/discover/grub2/builtins.c
+@@ -401,6 +401,51 @@ static int builtin_test(struct grub2_script *script,
+ 	return rc ? 0 : 1;
+ }
+ 
++static int builtin_source(struct grub2_script *script,
++		void *data __attribute__((unused)),
++		int argc, char *argv[])
++{
++	struct grub2_statements *statements;
++	struct discover_device *dev;
++	const char *filename;
++	char *path, *buf;
++	int rc, len;
++
++	if (argc != 2)
++		return false;
++
++	/* limit script recursion */
++	if (script->include_depth >= 10)
++		return false;
++
++	rc = parse_to_device_path(script, argv[1], &dev, &path);
++	if (rc)
++		return false;
++
++	rc = parser_request_file(script->ctx, dev, path, &buf, &len);
++	if (rc)
++		return false;
++
++	/* save current script state */
++	statements = script->statements;
++	filename = script->filename;
++	script->include_depth++;
++
++	rc = grub2_parser_parse(script->parser, argv[1], buf, len);
++
++	if (!rc)
++		statements_execute(script, script->statements);
++
++	talloc_free(script->statements);
++
++	/* restore state */
++	script->statements = statements;
++	script->filename = filename;
++	script->include_depth--;
++
++	return !rc;
++}
++
+ static int builtin_true(struct grub2_script *script __attribute__((unused)),
+ 		void *data __attribute__((unused)),
+ 		int argc __attribute__((unused)),
+@@ -491,7 +536,11 @@ static struct {
+ 	{
+ 		.name = "blscfg",
+ 		.fn = builtin_blscfg,
+-	}
++	},
++	{
++		.name = "source",
++		.fn = builtin_source,
++	},
+ };
+ 
+ static const char *nops[] = {
+diff --git a/discover/grub2/grub2.h b/discover/grub2/grub2.h
+index deaf976..75f6aa0 100644
+--- a/discover/grub2/grub2.h
++++ b/discover/grub2/grub2.h
+@@ -100,6 +100,7 @@ struct grub2_script {
+ 	const char			*filename;
+ 	unsigned int			n_options;
+ 	struct list			options;
++	int				include_depth;
+ };
+ 
+ struct grub2_parser {
+diff --git a/test/parser/Makefile.am b/test/parser/Makefile.am
+index c8e059b..5f1a93b 100644
+--- a/test/parser/Makefile.am
++++ b/test/parser/Makefile.am
+@@ -46,6 +46,10 @@ parser_TESTS = \
+ 	test/parser/test-grub2-lexer-error \
+ 	test/parser/test-grub2-parser-error \
+ 	test/parser/test-grub2-test-file-ops \
++	test/parser/test-grub2-source \
++	test/parser/test-grub2-source-functions \
++	test/parser/test-grub2-source-recursion \
++	test/parser/test-grub2-source-recursion-infinite \
+ 	test/parser/test-grub2-single-yocto \
+ 	test/parser/test-grub2-blscfg-default-filename \
+ 	test/parser/test-grub2-blscfg-default-index \
+diff --git a/test/parser/test-grub2-source-functions.c b/test/parser/test-grub2-source-functions.c
+new file mode 100644
+index 0000000..a9da934
+--- /dev/null
++++ b/test/parser/test-grub2-source-functions.c
+@@ -0,0 +1,46 @@
++
++/* check that we can source other scripts, and functions can be defined
++ * and called across sourced scripts */
++
++#include "parser-test.h"
++
++#if 0 /* PARSER_EMBEDDED_CONFIG */
++
++function f1 {
++	menuentry "f1$1" { linux $2 }
++}
++
++source /grub/2.cfg
++
++f2 a /vmlinux
++
++#endif
++
++void run_test(struct parser_test *test)
++{
++	struct discover_boot_option *opt;
++	struct discover_context *ctx;
++	struct discover_device *dev;
++
++	ctx = test->ctx;
++	dev = ctx->device;
++
++	test_read_conf_embedded(test, "/grub/grub.cfg");
++
++	test_add_file_string(test, dev,
++			"/grub/2.cfg",
++			"function f2 { menuentry \"f2$1\" { linux $2 } }\n"
++			"f1 a /vmlinux\n");
++
++	test_run_parser(test, "grub2");
++
++	check_boot_option_count(ctx, 2);
++
++	opt = get_boot_option(ctx, 0);
++	check_name(opt, "f1a");
++	check_resolved_local_resource(opt->boot_image, dev, "/vmlinux");
++
++	opt = get_boot_option(ctx, 1);
++	check_name(opt, "f2a");
++	check_resolved_local_resource(opt->boot_image, dev, "/vmlinux");
++}
+diff --git a/test/parser/test-grub2-source-recursion-infinite.c b/test/parser/test-grub2-source-recursion-infinite.c
+new file mode 100644
+index 0000000..fbcc5a3
+--- /dev/null
++++ b/test/parser/test-grub2-source-recursion-infinite.c
+@@ -0,0 +1,43 @@
++
++/* check that have a maximum source recursion limit */
++
++#include "parser-test.h"
++
++#if 0 /* PARSER_EMBEDDED_CONFIG */
++
++name=a$name
++
++menuentry $name {
++	linux /a
++}
++
++source /grub/grub.cfg
++
++#endif
++
++void run_test(struct parser_test *test)
++{
++	struct discover_boot_option *opt;
++	struct discover_context *ctx;
++	struct discover_device *dev;
++
++	ctx = test->ctx;
++	dev = ctx->device;
++
++	test_read_conf_embedded(test, "/grub/grub.cfg");
++
++	test_run_parser(test, "grub2");
++
++	/* we error out after 10 levels, but we should still have
++	 * parse results up to that point
++	 */
++	check_boot_option_count(ctx, 11);
++
++	opt = get_boot_option(ctx, 0);
++	check_name(opt, "a");
++	check_resolved_local_resource(opt->boot_image, dev, "/a");
++
++	opt = get_boot_option(ctx,10);
++	check_name(opt, "aaaaaaaaaaa");
++	check_resolved_local_resource(opt->boot_image, dev, "/a");
++}
+diff --git a/test/parser/test-grub2-source-recursion.c b/test/parser/test-grub2-source-recursion.c
+new file mode 100644
+index 0000000..21b6bd2
+--- /dev/null
++++ b/test/parser/test-grub2-source-recursion.c
+@@ -0,0 +1,58 @@
++/* check that we can source other files recursively */
++
++#include "parser-test.h"
++
++#if 0 /* PARSER_EMBEDDED_CONFIG */
++
++menuentry a {
++	linux /a
++}
++
++source /grub/2.cfg
++
++menuentry c {
++	linux /c
++}
++
++#endif
++
++void run_test(struct parser_test *test)
++{
++	struct discover_boot_option *opt;
++	struct discover_context *ctx;
++	struct discover_device *dev;
++
++	ctx = test->ctx;
++	dev = ctx->device;
++
++	test_read_conf_embedded(test, "/grub/grub.cfg");
++
++	/* four levels of config files, the last defining a boot option */
++	test_add_file_string(test, dev,
++			"/grub/2.cfg",
++			"source /grub/3.cfg\n");
++
++	test_add_file_string(test, dev,
++			"/grub/3.cfg",
++			"source /grub/4.cfg\n");
++
++	test_add_file_string(test, dev,
++			"/grub/4.cfg",
++			"menuentry b { linux /b }\n");
++
++	test_run_parser(test, "grub2");
++
++	check_boot_option_count(ctx, 3);
++
++	opt = get_boot_option(ctx, 0);
++	check_name(opt, "a");
++	check_resolved_local_resource(opt->boot_image, dev, "/a");
++
++	opt = get_boot_option(ctx, 1);
++	check_name(opt, "b");
++	check_resolved_local_resource(opt->boot_image, dev, "/b");
++
++	opt = get_boot_option(ctx, 2);
++	check_name(opt, "c");
++	check_resolved_local_resource(opt->boot_image, dev, "/c");
++}
+diff --git a/test/parser/test-grub2-source.c b/test/parser/test-grub2-source.c
+new file mode 100644
+index 0000000..a14bef7
+--- /dev/null
++++ b/test/parser/test-grub2-source.c
+@@ -0,0 +1,54 @@
++
++/* check that we can source other scripts, and variables get passed
++ * in to and out of sourced scripts */
++
++#include "parser-test.h"
++
++#if 0 /* PARSER_EMBEDDED_CONFIG */
++
++menuentry a {
++	linux /a
++}
++
++# var: outer -> inner -> outer
++v=b
++
++source /grub/2.cfg
++
++menuentry $v {
++	linux /c
++}
++
++#endif
++
++void run_test(struct parser_test *test)
++{
++	struct discover_boot_option *opt;
++	struct discover_context *ctx;
++	struct discover_device *dev;
++
++	ctx = test->ctx;
++	dev = ctx->device;
++
++	test_read_conf_embedded(test, "/grub/grub.cfg");
++
++	test_add_file_string(test, dev,
++			"/grub/2.cfg",
++			"menuentry $v { linux /b }\nv=c\n");
++
++	test_run_parser(test, "grub2");
++
++	check_boot_option_count(ctx, 3);
++
++	opt = get_boot_option(ctx, 0);
++	check_name(opt, "a");
++	check_resolved_local_resource(opt->boot_image, dev, "/a");
++
++	opt = get_boot_option(ctx, 1);
++	check_name(opt, "b");
++	check_resolved_local_resource(opt->boot_image, dev, "/b");
++
++	opt = get_boot_option(ctx, 2);
++	check_name(opt, "c");
++	check_resolved_local_resource(opt->boot_image, dev, "/c");
++}
+-- 
+2.17.1
+