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

John Crispin john at phrozen.org
Fri Jun 1 02:37:48 EDT 2018



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


> ---
>
> 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,


_______________________________________________
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