From 37f617c025812c98bd581e3b7cf00effa6e2ad36 Mon Sep 17 00:00:00 2001 From: Vladimir Serbinenko Date: Sun, 22 Dec 2013 18:14:00 +0100 Subject: [PATCH] * grub-core/loader/arm/linux.c: Pass arguments through on ATAG platforms. --- ChangeLog | 5 +++++ grub-core/loader/arm/linux.c | 27 +++++++++++++++++++++------ 2 files changed, 26 insertions(+), 6 deletions(-) diff --git a/ChangeLog b/ChangeLog index 759d546bf..a3d9fe5e8 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2013-12-22 Vladimir Serbinenko + + * grub-core/loader/arm/linux.c: Pass arguments through on ATAG + platforms. + 2013-12-22 Lars Wendler * util/grub-mkconfig.in: Skip non-executable files. diff --git a/grub-core/loader/arm/linux.c b/grub-core/loader/arm/linux.c index 1fc1d3a40..ee1c02b25 100644 --- a/grub-core/loader/arm/linux.c +++ b/grub-core/loader/arm/linux.c @@ -74,6 +74,8 @@ linux_prepare_atag (void) grub_uint32_t *tmp_atag, *from, *to; grub_size_t tmp_size; grub_size_t arg_size = grub_strlen (linux_args); + char *cmdline_orig = NULL; + grub_size_t cmdline_orig_len = 0; /* some place for cmdline, initrd and terminator. */ tmp_size = get_atag_size (atag_orig) + 20 + (arg_size) / 4; @@ -88,7 +90,13 @@ linux_prepare_atag (void) case 0x54410004: case 0x54410005: case 0x54420005: - case 0x54420009: + break; + case 0x54410009: + if (*(char *) (from + 2)) + { + cmdline_orig = (char *) (from + 2); + cmdline_orig_len = grub_strlen (cmdline_orig) + 1; + } break; default: grub_memcpy (to, from, sizeof (grub_uint32_t) * from[0]); @@ -96,15 +104,22 @@ linux_prepare_atag (void) break; } + grub_dprintf ("linux", "linux inherited args: '%s'\n", + cmdline_orig ? : ""); grub_dprintf ("linux", "linux_args: '%s'\n", linux_args); /* Generate and set command line */ - to[0] = 3 + arg_size / 4; + to[0] = 3 + (arg_size + cmdline_orig_len) / 4; to[1] = 0x54410009; - grub_memcpy (to + 2, linux_args, arg_size); - grub_memset ((char *) to + 8 + arg_size, 0, - 4 - (arg_size & 3)); - to += 3 + arg_size / 4; + if (cmdline_orig) + { + grub_memcpy ((char *) to + 8, cmdline_orig, cmdline_orig_len - 1); + *((char *) to + 8 + cmdline_orig_len - 1) = ' '; + } + grub_memcpy ((char *) to + 8 + cmdline_orig_len, linux_args, arg_size); + grub_memset ((char *) to + 8 + cmdline_orig_len + arg_size, 0, + 4 - ((arg_size + cmdline_orig_len) & 3)); + to += to[0]; if (initrd_start && initrd_end) {