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
+