]> git.ipfire.org Git - thirdparty/grub.git/commitdiff
* grub-core/loader/arm/linux.c: Pass arguments through on ATAG
authorVladimir Serbinenko <phcoder@gmail.com>
Sun, 22 Dec 2013 17:14:00 +0000 (18:14 +0100)
committerVladimir Serbinenko <phcoder@gmail.com>
Sun, 22 Dec 2013 17:14:00 +0000 (18:14 +0100)
platforms.

ChangeLog
grub-core/loader/arm/linux.c

index 759d546bf47db4219309f2cb90d7a63287dfaa53..a3d9fe5e890513f6d26ada62c71e574b12257832 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2013-12-22  Vladimir Serbinenko  <phcoder@gmail.com>
+
+       * grub-core/loader/arm/linux.c: Pass arguments through on ATAG
+       platforms.
+
 2013-12-22  Lars Wendler <polynomial-c@gentoo.org>
 
        * util/grub-mkconfig.in: Skip non-executable files.
index 1fc1d3a407adcf4006dc28ce1d5a631d74c686ec..ee1c02b25cf26ea490bd935b71adc6ae305ceb01 100644 (file)
@@ -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)
     {