[OpenWrt-Devel] [PATCH v2] mvebu: fix broken console on WRT32X (venom)

Michael Gray michael.gray at lantisproject.com
Fri Jun 1 03:25:00 EDT 2018


On Fri, Jun 1, 2018 at 4:37 PM, John Crispin <john at phrozen.org> wrote:
>
>
>
> On 29/05/18 11:43, michael.gray at lantisproject.com wrote:
>>
>> From: Michael Gray <michael.gray at lantisproject.com>
>>
>> The console bootarg is being corrupted on boot, causing various issues
>> including broken sysupgrade.
>> Utilising the bootargs mangle patch from other targets, hardcode the console
>> arguments and fetch the rootfs from the bootloader.
>>
>> Kernel command line: console=ttyS0,115200 root=/dev/mtdblock8
>>
>> Bootloader command line (ignored): console= root=/dev/mtdblock8
>>
>> Please cherry pick to 18.06 too
>>
>> Signed-off-by: Michael Gray <michael.gray at lantisproject.com>
>
>
> Hi,
> did you verify if this break other boards ? also there are a lot of code style errors like missing orthographic spacing, c++ style comments and so on. can you link the original patch please ?
>     John
>
Hi John,
I was able to personally test WRT1900ACv1, WRT3200ACM and WRT32X
(board in patch). Another forum user was able to test WRT1200AC and
confirm ok.
I was not able to test anything other than Cortexa9.

Original patch:
https://git.openwrt.org/?p=openwrt/openwrt.git;a=blob;f=target/linux/ipq806x/patches-4.14/0067-generic-Mangle-bootloader-s-kernel-arguments.patch;h=c7123eac52c8fa87e5d24f48e6ccb4e51402ec5b;hb=HEAD

Michael
>
>
>> ---
>>
>> changes since v1:
>> - Modified patch 006 to be mvebu specific. Now passes the bootloader cmdline
>> on if no append-rootblock stanza is found
>> ---
>>   target/linux/mvebu/config-4.14                |   1 +
>>   .../arm/boot/dts/armada-385-linksys-venom.dts |   6 +
>>   ...Mangle-bootloader-s-kernel-arguments.patch | 201 ++++++++++++++++++
>>   3 files changed, 208 insertions(+)
>>   create mode 100644 target/linux/mvebu/patches-4.14/006-mvebu-Mangle-bootloader-s-kernel-arguments.patch
>>
>> diff --git a/target/linux/mvebu/config-4.14 b/target/linux/mvebu/config-4.14
>> index a48a3c8c5e..694ecdfb82 100644
>> --- a/target/linux/mvebu/config-4.14
>> +++ b/target/linux/mvebu/config-4.14
>> @@ -42,6 +42,7 @@ CONFIG_ARM_APPENDED_DTB=y
>>   CONFIG_ARM_ATAG_DTB_COMPAT=y
>>   # CONFIG_ARM_ATAG_DTB_COMPAT_CMDLINE_EXTEND is not set
>>   CONFIG_ARM_ATAG_DTB_COMPAT_CMDLINE_FROM_BOOTLOADER=y
>> +CONFIG_ARM_ATAG_DTB_COMPAT_CMDLINE_MANGLE=y
>>   CONFIG_ARM_CPU_SUSPEND=y
>>   CONFIG_ARM_CRYPTO=y
>>   CONFIG_ARM_ERRATA_720789=y
>> diff --git a/target/linux/mvebu/files-4.14/arch/arm/boot/dts/armada-385-linksys-venom.dts b/target/linux/mvebu/files-4.14/arch/arm/boot/dts/armada-385-linksys-venom.dts
>> index ea44c8f0d2..00a4ee9f39 100644
>> --- a/target/linux/mvebu/files-4.14/arch/arm/boot/dts/armada-385-linksys-venom.dts
>> +++ b/target/linux/mvebu/files-4.14/arch/arm/boot/dts/armada-385-linksys-venom.dts
>> @@ -46,7 +46,13 @@
>>         model = "Linksys WRT32X";
>>         compatible = "linksys,venom", "linksys,armada385", "marvell,armada385",
>>                      "marvell,armada380";
>> +
>> +       chosen {
>> +               bootargs = "console=ttyS0,115200";
>> +               stdout-path = "serial0:115200n8";
>> +               append-rootblock = "root=/dev/mtdblock";
>>         };
>> +};
>>         &expander0 {
>>                         wan_amber at 0 {
>> diff --git a/target/linux/mvebu/patches-4.14/006-mvebu-Mangle-bootloader-s-kernel-arguments.patch b/target/linux/mvebu/patches-4.14/006-mvebu-Mangle-bootloader-s-kernel-arguments.patch
>> new file mode 100644
>> index 0000000000..53275607e0
>> --- /dev/null
>> +++ b/target/linux/mvebu/patches-4.14/006-mvebu-Mangle-bootloader-s-kernel-arguments.patch
>> @@ -0,0 +1,201 @@
>> +From 71270226b14733a4b1f2cde58ea9265caa50b38d Mon Sep 17 00:00:00 2001
>> +From: Adrian Panella <ianchi74 at outlook.com>
>> +Date: Thu, 9 Mar 2017 09:37:17 +0100
>> +Subject: [PATCH 67/69] generic: Mangle bootloader's kernel arguments
>> +
>> +The command-line arguments provided by the boot loader will be
>> +appended to a new device tree property: bootloader-args.
>> +If there is a property "append-rootblock" in DT under /chosen
>> +and a root= option in bootloaders command line it will be parsed
>> +and added to DT bootargs with the form: <append-rootblock>XX.
>> +Only command line ATAG will be processed, the rest of the ATAGs
>> +sent by bootloader will be ignored.
>> +This is usefull in dual boot systems, to get the current root partition
>> +without afecting the rest of the system.
>> +
>> +Signed-off-by: Adrian Panella <ianchi74 at outlook.com>
>> +
>> +This patch has been modified to be mvebu specific. The original patch
>> +did not pass the bootloader cmdline on if no append-rootblock stanza
>> +was found, resulting in blank cmdline and failure to boot.
>> +
>> +Signed-off-by: Michael Gray <michael.gray at lantisproject.com>
>> +---
>> + arch/arm/Kconfig                        | 11 +++++
>> + arch/arm/boot/compressed/atags_to_fdt.c | 72 ++++++++++++++++++++++++++++++++-
>> + init/main.c                             | 16 ++++++++
>> + 3 files changed, 98 insertions(+), 1 deletion(-)
>> +
>> +--- a/arch/arm/Kconfig
>> ++++ b/arch/arm/Kconfig
>> +@@ -1948,6 +1948,17 @@ config ARM_ATAG_DTB_COMPAT_CMDLINE_EXTEN
>> +         The command-line arguments provided by the boot loader will be
>> +         appended to the the device tree bootargs property.
>> +
>> ++config ARM_ATAG_DTB_COMPAT_CMDLINE_MANGLE
>> ++      bool "Append rootblock parsing bootloader's kernel arguments"
>> ++      help
>> ++        The command-line arguments provided by the boot loader will be
>> ++        appended to a new device tree property: bootloader-args.
>> ++        If there is a property "append-rootblock" in DT under /chosen
>> ++        and a root= option in bootloaders command line it will be parsed
>> ++        and added to DT bootargs with the form: <append-rootblock>XX.
>> ++        Only command line ATAG will be processed, the rest of the ATAGs
>> ++        sent by bootloader will be ignored.
>> ++
>> + endchoice
>> +
>> + config CMDLINE
>> +--- a/arch/arm/boot/compressed/atags_to_fdt.c
>> ++++ b/arch/arm/boot/compressed/atags_to_fdt.c
>> +@@ -3,6 +3,8 @@
>> +
>> + #if defined(CONFIG_ARM_ATAG_DTB_COMPAT_CMDLINE_EXTEND)
>> + #define do_extend_cmdline 1
>> ++#elif defined(CONFIG_ARM_ATAG_DTB_COMPAT_CMDLINE_MANGLE)
>> ++#define do_extend_cmdline 1
>> + #else
>> + #define do_extend_cmdline 0
>> + #endif
>> +@@ -66,6 +68,65 @@ static uint32_t get_cell_size(const void
>> +       return cell_size;
>> + }
>> +
>> ++#if defined(CONFIG_ARM_ATAG_DTB_COMPAT_CMDLINE_MANGLE)
>> ++
>> ++static char *append_rootblock(char *dest, const char *str, int len, void *fdt)
>> ++{
>> ++      char *ptr, *end;
>> ++      char *root="root=";
>> ++      int i, l;
>> ++      const char *rootblock;
>> ++
>> ++      //ARM doesn't have __HAVE_ARCH_STRSTR, so search manually
>> ++      ptr = str - 1;
>> ++
>> ++      do {
>> ++              //first find an 'r' at the begining or after a space
>> ++              do {
>> ++                      ptr++;
>> ++                      ptr = strchr(ptr, 'r');
>> ++                      if(!ptr) return dest;
>> ++
>> ++              } while (ptr != str && *(ptr-1) != ' ');
>> ++
>> ++              //then check for the rest
>> ++              for(i = 1; i <= 4; i++)
>> ++                      if(*(ptr+i) != *(root+i)) break;
>> ++
>> ++      } while (i != 5);
>> ++
>> ++      end = strchr(ptr, ' ');
>> ++      end = end ? (end - 1) : (strchr(ptr, 0) - 1);
>> ++
>> ++      //find partition number (assumes format root=/dev/mtdXX | /dev/mtdblockXX | yy:XX )
>> ++      for( i = 0; end >= ptr && *end >= '0' && *end <= '9'; end--, i++);
>> ++      ptr = end + 1;
>> ++
>> ++      /* if append-rootblock property is set use it to append to command line */
>> ++      rootblock = getprop(fdt, "/chosen", "append-rootblock", &l);
>> ++      if(rootblock != NULL) {
>> ++              if(*dest != ' ') {
>> ++                      *dest = ' ';
>> ++                      dest++;
>> ++                      len++;
>> ++              }
>> ++              if (len + l + i <= COMMAND_LINE_SIZE) {
>> ++                      memcpy(dest, rootblock, l);
>> ++                      dest += l - 1;
>> ++                      memcpy(dest, ptr, i);
>> ++                      dest += i;
>> ++              }
>> ++      } else {
>> ++              len = strlen(str);
>> ++              if (len + 1 < COMMAND_LINE_SIZE) {
>> ++                      memcpy(dest, str, len);
>> ++                      dest += len;
>> ++              }
>> ++      }
>> ++      return dest;
>> ++}
>> ++#endif
>> ++
>> + static void merge_fdt_bootargs(void *fdt, const char *fdt_cmdline)
>> + {
>> +       char cmdline[COMMAND_LINE_SIZE];
>> +@@ -85,12 +140,21 @@ static void merge_fdt_bootargs(void *fdt
>> +
>> +       /* and append the ATAG_CMDLINE */
>> +       if (fdt_cmdline) {
>> ++
>> ++#if defined(CONFIG_ARM_ATAG_DTB_COMPAT_CMDLINE_MANGLE)
>> ++              //save original bootloader args
>> ++              //and append ubi.mtd with root partition number to current cmdline
>> ++              setprop_string(fdt, "/chosen", "bootloader-args", fdt_cmdline);
>> ++              ptr = append_rootblock(ptr, fdt_cmdline, len, fdt);
>> ++
>> ++#else
>> +               len = strlen(fdt_cmdline);
>> +               if (ptr - cmdline + len + 2 < COMMAND_LINE_SIZE) {
>> +                       *ptr++ = ' ';
>> +                       memcpy(ptr, fdt_cmdline, len);
>> +                       ptr += len;
>> +               }
>> ++#endif
>> +       }
>> +       *ptr = '\0';
>> +
>> +@@ -147,7 +211,9 @@ int atags_to_fdt(void *atag_list, void *
>> +                       else
>> +                               setprop_string(fdt, "/chosen", "bootargs",
>> +                                              atag->u.cmdline.cmdline);
>> +-              } else if (atag->hdr.tag == ATAG_MEM) {
>> ++              }
>> ++#ifndef CONFIG_ARM_ATAG_DTB_COMPAT_CMDLINE_MANGLE
>> ++              else if (atag->hdr.tag == ATAG_MEM) {
>> +                       if (memcount >= sizeof(mem_reg_property)/4)
>> +                               continue;
>> +                       if (!atag->u.mem.size)
>> +@@ -186,6 +252,10 @@ int atags_to_fdt(void *atag_list, void *
>> +               setprop(fdt, "/memory", "reg", mem_reg_property,
>> +                       4 * memcount * memsize);
>> +       }
>> ++#else
>> ++
>> ++      }
>> ++#endif
>> +
>> +       return fdt_pack(fdt);
>> + }
>> +--- a/init/main.c
>> ++++ b/init/main.c
>> +@@ -89,6 +89,10 @@
>> + #include <asm/sections.h>
>> + #include <asm/cacheflush.h>
>> +
>> ++#if defined(CONFIG_ARM_ATAG_DTB_COMPAT_CMDLINE_MANGLE)
>> ++#include <linux/of.h>
>> ++#endif
>> ++
>> + static int kernel_init(void *);
>> +
>> + extern void init_IRQ(void);
>> +@@ -540,6 +544,18 @@ asmlinkage __visible void __init start_k
>> +       page_alloc_init();
>> +
>> +       pr_notice("Kernel command line: %s\n", boot_command_line);
>> ++
>> ++#if defined(CONFIG_ARM_ATAG_DTB_COMPAT_CMDLINE_MANGLE)
>> ++      //Show bootloader's original command line for reference
>> ++      if(of_chosen) {
>> ++              const char *prop = of_get_property(of_chosen, "bootloader-args", NULL);
>> ++              if(prop)
>> ++                      pr_notice("Bootloader command line (ignored): %s\n", prop);
>> ++              else
>> ++                      pr_notice("Bootloader command line not present\n");
>> ++      }
>> ++#endif
>> ++
>> +       parse_early_param();
>> +       after_dashes = parse_args("Booting kernel",
>> +                                 static_command_line, __start___param,
>
>



-- 
Regards,

Michael

_______________________________________________
openwrt-devel mailing list
openwrt-devel at lists.openwrt.org
https://lists.openwrt.org/listinfo/openwrt-devel



More information about the openwrt-devel mailing list