Re: [PATCH 5/8] drivers: firmware: efi: libstub: enable generic commandline
On Tue, Dec 12, 2023 at 10:55:33AM +0100, Ard Biesheuvel wrote: > On Fri, 10 Nov 2023 at 02:39, Daniel Walker wrote: > > > > This adds code to handle the generic command line changes. > > The efi code appears that it doesn't benefit as much from this design > > as it could. > > > > For example, if you had a prepend command line with "nokaslr" then > > you might be helpful to re-enable it in the boot loader or dts, > > but there appears to be no way to re-enable kaslr or some of the > > other options. > > > > The efi command line handling is incorrect. x86 and arm have an append > > system however the efi code prepends the command line. > > > > For example, you could have a non-upgradable bios which sends > > > > efi=disable_early_pci_dma > > > > This hypothetically could have been set because early pci dma caused > > issues on early versions of the product. > > > > Then later the early pci dma was made to work and the company desired > > to start using it. To override the bios you could set the CONFIG_CMDLINE > > to, > > > > efi=no_disable_early_pci_dma > > > > then parsing would normally start with the bios command line, then move > > to the CONFIG_CMDLINE and you would end up with early pci dma turned on. > > > > however, current efi code keeps early pci dma off because the bios > > arguments always override the built in. > > > > Per my reading this is different from the main body of x86, arm, and > > arm64. > > > > The generic command line provides both append and prepend, so it > > alleviates this issue if it's used. However not all architectures use > > it. > > > > It would be desirable to allow the efi stub to have it's builtin command > > line to be modified after compile, but I don't see a feasible way to do > > that currently. > > > > Cc: xe-linux-exter...@cisco.com > > Signed-off-by: Daniel Walker > > There are quite some 'might be's and 'hypothetical's in this commit log. > > Is there an actual use case that you are addressing here? Without > that, this looks like unnecessary churn to me, tbh. > > Note that this code executes in the context of platform firmware, > which may be old and buggy so we should be cautious about making > unnecessary changes here. It's been a while since I wrote this patch description, but there is an example I provided in the description. If you intend to enable early pci dma the command line parsing may still disable it because of how the parsing works inside the efi stub. There is an implementation difference between the efi stub and the architectures which results in this problem. This was not an issue I observed in the wild, it was the results of code review of the efi stub. Maybe the greater issue is that the efi stub seems to have connected itself to the kernels command line system. If the kernel changes then EFI stub must also change. Daniel
Re: [PATCH 7/8] of: replace command line handling
On Thu, Nov 16, 2023 at 10:09:36AM -0600, Rob Herring wrote: > On Thu, Nov 09, 2023 at 05:38:11PM -0800, Daniel Walker wrote: > > Rob Herring has complained about this section of code. I removed the > > command line handling code to the cmdline.h header. This hopefully makes > > it easier for Rob to maintain it (at least he doesn't have to look at it > > directly anymore). > > Well, my goal is to eliminate drivers/of/, but no. > > > I would like to add a Kconfig option called > > OF_DEPRECATED_CMDLINE which an architecture would set if it uses this code. > > Which architecture needs this code? Do we wait and see who complains > their platform broke and then go set this option? In the meantime, new > platforms started depending on the new behavior and setting the option > may break them. So we can't have a kconfig option. I think you misunderstood the comments. The objective is, 1) Remove the code in drivers/of/ 2) Remove platform specific command line handling > > This would allow a platform to use the cmdline.h and the added function > > directly and remove the Kconfig option. This change would be in a subsequent > > patch. > > Per platform code handling the cmdline is completely the wrong > direction. Per arch behavior is bad enough. This code unifies the handling into generic code outside drivers/of/ . Daniel
Re: [PATCH 0/8] generic command line v6
On Thu, Nov 09, 2023 at 05:51:42PM -0800, Andrew Morton wrote: > On Thu, 9 Nov 2023 17:38:04 -0800 Daniel Walker wrote: > > > This release is an up-rev of the v5 patches. No additional features have > > been added. Some changes were mode to function names and some changes to > > Kconfig dependencies. Also updated the config conversion for mips. > > > > There are a number of people who have expressed interest in these > > patches either by asking for them to be merge or testing them. If > > people are so inclined please continue to request them to be merge > > or to ask the status of the next release. It's helpful to motivate me to > > release them again and for the maintainers to see the interest > > generated. > > > > These patches have been used by Cisco Systems, Inc. on millions of > > released products to great effect. Hopefully they can be used by the > > entire Linux eco system. > > > > fyi, none of the above is suitable for a [0/N] changelog - it's all > transitory stuff which tells readers nothing much about what the > patchset does. I did not think about it this way. It's because I've submitted this so many times. I guess I assume everyone knows what it is. > And that info is sorely missed. I can see that it's a code cleanup, > but I'm sure Cisco wouldn't expend resources to maintain such a thing. > There's something else here. I think the prior submissions there was no cover letter, maybe I should just achoo that entirely. > In [1/8] I see "Even with mips and powerpc enhancement the needs of > Cisco are not met on these platforms" and "This unified implementation > offers the same functionality needed by Cisco on all platform which we > enable it on". > > Well OK, what are these needs? What functionality changes does this > patchset offer which Cisco finds useful? IOW, what were the > requirements? What's wrong with the old code and how does this > patchset fix/enhance that? The limitation is that you can't append and prepend to the command line at the same time in any of the architectures. Having access to both allows OEMs to deal with broken bootloaders which can't easily be upgraded. Others have responded that they also use these patches for this same reason. In 2/8 and 3/8 I modify the insert-sys-cert tool to allow modification of the command line append and prepend after the build. This allow for an SDK provided with a binary kernel and for the command line append/prepend to still be modified identically to how that's done with certificates. Making all this generic means each platform has a unified set of command line services. Cisco uses x86/arm32/arm64/mips/powerpc , and it's nice to have all the same features across platforms. > > I see the patchset updates nothing under Documentation/. Should it do > so? Could it do so? The only documentation is Kconfig descriptions and commit messages. I suppose it could have something under Documentation/. The only part which could use more documentation are the changes in 2/8 and 3/8. That feature is maybe confusing and has limitations which are maybe not clear. Although the same limitation exist for inserting certificates. > > I don't know what is the expected merge patch for this work. I can > grab them if no other maintainer is in the firing line. merge patch ? Do you mean merge description ? I think your the maintainer in the firing line for this one. Daniel
[PATCH 7/8] of: replace command line handling
Rob Herring has complained about this section of code. I removed the command line handling code to the cmdline.h header. This hopefully makes it easier for Rob to maintain it (at least he doesn't have to look at it directly anymore). I would like to add a Kconfig option called OF_DEPRECATED_CMDLINE which an architecture would set if it uses this code. This would allow a platform to use the cmdline.h and the added function directly and remove the Kconfig option. This change would be in a subsequent patch. This code was boot tested on powerpc 32bit, powerpc 64bit without any generic command line conversion. Cc: xe-linux-exter...@cisco.com Signed-off-by: Daniel Walker --- drivers/of/fdt.c| 22 +++--- include/linux/cmdline.h | 31 +++ 2 files changed, 34 insertions(+), 19 deletions(-) diff --git a/drivers/of/fdt.c b/drivers/of/fdt.c index bf502ba8da95..1fc1b17d04dc 100644 --- a/drivers/of/fdt.c +++ b/drivers/of/fdt.c @@ -26,6 +26,7 @@ #include #include #include +#include #include /* for COMMAND_LINE_SIZE */ #include @@ -1183,27 +1184,10 @@ int __init early_init_dt_scan_chosen(char *cmdline) /* Retrieve command line */ p = of_get_flat_dt_prop(node, "bootargs", ); - if (p != NULL && l > 0) - strscpy(cmdline, p, min(l, COMMAND_LINE_SIZE)); handle_cmdline: - /* -* CONFIG_CMDLINE is meant to be a default in case nothing else -* managed to set the command line, unless CONFIG_CMDLINE_FORCE -* is set in which case we override whatever was found earlier. -*/ -#ifdef CONFIG_CMDLINE -#if defined(CONFIG_CMDLINE_EXTEND) - strlcat(cmdline, " ", COMMAND_LINE_SIZE); - strlcat(cmdline, CONFIG_CMDLINE, COMMAND_LINE_SIZE); -#elif defined(CONFIG_CMDLINE_FORCE) - strscpy(cmdline, CONFIG_CMDLINE, COMMAND_LINE_SIZE); -#else - /* No arguments from boot loader, use kernel's cmdl*/ - if (!((char *)cmdline)[0]) - strscpy(cmdline, CONFIG_CMDLINE, COMMAND_LINE_SIZE); -#endif -#endif /* CONFIG_CMDLINE */ + + of_deprecated_cmdline_update(cmdline, p, l); pr_debug("Command line is: %s\n", (char *)cmdline); diff --git a/include/linux/cmdline.h b/include/linux/cmdline.h index a94758a0f257..c772afb7340f 100644 --- a/include/linux/cmdline.h +++ b/include/linux/cmdline.h @@ -103,4 +103,35 @@ __cmdline_add_builtin( #define cmdline_get_static_builtin(dest) \ (CMDLINE_STATIC_PREPEND CMDLINE_STATIC_APPEND) + +#ifndef CONFIG_GENERIC_CMDLINE +static inline bool of_deprecated_cmdline_update(char *cmdline, const char *dt_bootargs, int length) +{ + if (dt_bootargs != NULL && length > 0) + strlcpy(cmdline, dt_bootargs, min(length, COMMAND_LINE_SIZE)); + /* +* CONFIG_CMDLINE is meant to be a default in case nothing else +* managed to set the command line, unless CONFIG_CMDLINE_FORCE +* is set in which case we override whatever was found earlier. +*/ + +#ifdef CONFIG_CMDLINE +#if defined(CONFIG_CMDLINE_EXTEND) + strlcat(cmdline, " ", COMMAND_LINE_SIZE); + strlcat(cmdline, CONFIG_CMDLINE, COMMAND_LINE_SIZE); +#elif defined(CONFIG_CMDLINE_FORCE) + strscpy(cmdline, CONFIG_CMDLINE, COMMAND_LINE_SIZE); +#else + /* No arguments from boot loader, use kernel's cmdl*/ + if (!((char *)cmdline)[0]) + strscpy(cmdline, CONFIG_CMDLINE, COMMAND_LINE_SIZE); #endif +#endif /* CONFIG_CMDLINE */ + return true; +} +#else +static inline bool of_deprecated_cmdline_update(char *cmdline, const char *dt_bootargs, int length) { return false; } +#endif /* CONFIG_GENERIC_CMDLINE */ + + +#endif /* _LINUX_CMDLINE_H */ -- 2.39.2
[PATCH 6/8] CMDLINE: x86: convert to generic builtin command line
This updates the x86 code to use the CONFIG_GENERIC_CMDLINE option. Cc: xe-linux-exter...@cisco.com Signed-off-by: Ruslan Ruslichenko Signed-off-by: Ruslan Bilovol Signed-off-by: Daniel Walker --- arch/x86/Kconfig| 44 + arch/x86/kernel/setup.c | 18 ++--- 2 files changed, 3 insertions(+), 59 deletions(-) diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig index 66bfabae8814..390ffaa743df 100644 --- a/arch/x86/Kconfig +++ b/arch/x86/Kconfig @@ -145,6 +145,7 @@ config X86 select EDAC_SUPPORT select GENERIC_CLOCKEVENTS_BROADCASTif X86_64 || (X86_32 && X86_LOCAL_APIC) select GENERIC_CLOCKEVENTS_MIN_ADJUST + select GENERIC_CMDLINE select GENERIC_CMOS_UPDATE select GENERIC_CPU_AUTOPROBE select GENERIC_CPU_VULNERABILITIES @@ -2309,49 +2310,6 @@ choice endchoice -config CMDLINE_BOOL - bool "Built-in kernel command line" - help - Allow for specifying boot arguments to the kernel at - build time. On some systems (e.g. embedded ones), it is - necessary or convenient to provide some or all of the - kernel boot arguments with the kernel itself (that is, - to not rely on the boot loader to provide them.) - - To compile command line arguments into the kernel, - set this option to 'Y', then fill in the - boot arguments in CONFIG_CMDLINE. - - Systems with fully functional boot loaders (i.e. non-embedded) - should leave this option set to 'N'. - -config CMDLINE - string "Built-in kernel command string" - depends on CMDLINE_BOOL - default "" - help - Enter arguments here that should be compiled into the kernel - image and used at boot time. If the boot loader provides a - command line at boot time, it is appended to this string to - form the full kernel command line, when the system boots. - - However, you can use the CONFIG_CMDLINE_OVERRIDE option to - change this behavior. - - In most cases, the command line (whether built-in or provided - by the boot loader) should specify the device for the root - file system. - -config CMDLINE_OVERRIDE - bool "Built-in command line overrides boot loader arguments" - depends on CMDLINE_BOOL && CMDLINE != "" - help - Set this option to 'Y' to have the kernel ignore the boot loader - command line, and use ONLY the built-in command line. - - This is used to work around broken boot loaders. This should - be set to 'N' under normal conditions. - config MODIFY_LDT_SYSCALL bool "Enable the LDT (local descriptor table)" if EXPERT default y diff --git a/arch/x86/kernel/setup.c b/arch/x86/kernel/setup.c index b098b1fa2470..bd025c003f32 100644 --- a/arch/x86/kernel/setup.c +++ b/arch/x86/kernel/setup.c @@ -55,6 +55,7 @@ #include #include #include +#include /* * max_low_pfn_mapped: highest directly mapped pfn < 4 GB @@ -162,9 +163,6 @@ unsigned long saved_video_mode; #define RAMDISK_LOAD_FLAG 0x4000 static char __initdata command_line[COMMAND_LINE_SIZE]; -#ifdef CONFIG_CMDLINE_BOOL -static char __initdata builtin_cmdline[COMMAND_LINE_SIZE] = CONFIG_CMDLINE; -#endif #if defined(CONFIG_EDD) || defined(CONFIG_EDD_MODULE) struct edd edd; @@ -959,19 +957,7 @@ void __init setup_arch(char **cmdline_p) bss_resource.start = __pa_symbol(__bss_start); bss_resource.end = __pa_symbol(__bss_stop)-1; -#ifdef CONFIG_CMDLINE_BOOL -#ifdef CONFIG_CMDLINE_OVERRIDE - strscpy(boot_command_line, builtin_cmdline, COMMAND_LINE_SIZE); -#else - if (builtin_cmdline[0]) { - /* append boot loader cmdline to builtin */ - strlcat(builtin_cmdline, " ", COMMAND_LINE_SIZE); - strlcat(builtin_cmdline, boot_command_line, COMMAND_LINE_SIZE); - strscpy(boot_command_line, builtin_cmdline, COMMAND_LINE_SIZE); - } -#endif -#endif - + cmdline_add_builtin(boot_command_line); strscpy(command_line, boot_command_line, COMMAND_LINE_SIZE); *cmdline_p = command_line; -- 2.39.2
[PATCH 4/8] CMDLINE: mips: convert to generic builtin command line
This updates the mips code to use the CONFIG_GENERIC_CMDLINE option. This deletes the option for MIPS_CMDLINE_BUILTIN_EXTEND and replaces the functionality with generic code. Of note, the pic32 has some strange handling of the current built in command line. It was converted to use the static variant which can't be updated after compilation. It should eventually be updated to use to append and prepend symbols. This includes a scripted mass convert of the config files to use the new generic cmdline. There is a bit of a trim effect here. It would seems that some of the config haven't been trimmed in a while. The script used is as follows, if [[ -z "$1" || -z "$2" ]]; then echo "Two arguments are needed." exit 1 fi mkdir $1 cp $2 $1/.config sed -i 's/CONFIG_CMDLINE=/CONFIG_CMDLINE_BOOL=y\nCONFIG_CMDLINE_PREPEND=/g' $1/.config make ARCH=$1 O=$1 olddefconfig make ARCH=$1 O=$1 savedefconfig cp $1/defconfig $2 rm -Rf $1 Cc: xe-linux-exter...@cisco.com Signed-off-by: Ruslan Ruslichenko Signed-off-by: Ruslan Bilovol Signed-off-by: Daniel Walker --- arch/mips/Kconfig | 4 +- arch/mips/Kconfig.debug | 44 --- arch/mips/configs/ar7_defconfig | 12 +- arch/mips/configs/bcm47xx_defconfig | 10 +- arch/mips/configs/bcm63xx_defconfig | 21 ++-- arch/mips/configs/bmips_be_defconfig | 17 ++- arch/mips/configs/bmips_stb_defconfig | 139 -- arch/mips/configs/ci20_defconfig | 8 +- arch/mips/configs/cu1000-neo_defconfig| 19 ++- arch/mips/configs/cu1830-neo_defconfig| 19 ++- arch/mips/configs/generic_defconfig | 15 +-- arch/mips/configs/gpr_defconfig | 33 ++--- arch/mips/configs/loongson3_defconfig | 29 ++--- arch/mips/include/asm/setup.h | 2 + arch/mips/kernel/relocate.c | 17 ++- arch/mips/kernel/setup.c | 36 +- arch/mips/pic32/pic32mzda/early_console.c | 2 +- arch/mips/pic32/pic32mzda/init.c | 3 +- 18 files changed, 144 insertions(+), 286 deletions(-) diff --git a/arch/mips/Kconfig b/arch/mips/Kconfig index bc8421859006..65fd3decc6b1 100644 --- a/arch/mips/Kconfig +++ b/arch/mips/Kconfig @@ -31,6 +31,7 @@ config MIPS select CPU_NO_EFFICIENT_FFS if (TARGET_ISA_REV < 1) select CPU_PM if CPU_IDLE select GENERIC_ATOMIC64 if !64BIT + select GENERIC_CMDLINE select GENERIC_CMOS_UPDATE select GENERIC_CPU_AUTOPROBE select GENERIC_GETTIMEOFDAY @@ -2989,9 +2990,6 @@ choice config MIPS_CMDLINE_FROM_BOOTLOADER bool "Bootloader kernel arguments if available" - config MIPS_CMDLINE_BUILTIN_EXTEND - depends on CMDLINE_BOOL - bool "Extend builtin kernel arguments with bootloader arguments" endchoice endmenu diff --git a/arch/mips/Kconfig.debug b/arch/mips/Kconfig.debug index f4ae7900fcd3..f9da53d4ebd2 100644 --- a/arch/mips/Kconfig.debug +++ b/arch/mips/Kconfig.debug @@ -26,50 +26,6 @@ config EARLY_PRINTK_8250 config USE_GENERIC_EARLY_PRINTK_8250 bool -config CMDLINE_BOOL - bool "Built-in kernel command line" - help - For most systems, it is firmware or second stage bootloader that - by default specifies the kernel command line options. However, - it might be necessary or advantageous to either override the - default kernel command line or add a few extra options to it. - For such cases, this option allows you to hardcode your own - command line options directly into the kernel. For that, you - should choose 'Y' here, and fill in the extra boot arguments - in CONFIG_CMDLINE. - - The built-in options will be concatenated to the default command - line if CMDLINE_OVERRIDE is set to 'N'. Otherwise, the default - command line will be ignored and replaced by the built-in string. - - Most MIPS systems will normally expect 'N' here and rely upon - the command line from the firmware or the second-stage bootloader. - -config CMDLINE - string "Default kernel command string" - depends on CMDLINE_BOOL - help - On some platforms, there is currently no way for the boot loader to - pass arguments to the kernel. For these platforms, and for the cases - when you want to add some extra options to the command line or ignore - the default command line, you can supply some command-line options at - build time by entering them here. In other cases you can specify - kernel args so that you don't have to set them up in board prom - initialization routines. - - For more information, see the CMDLINE_BOOL and CMDLINE_OVERRIDE - options. - -config CMDLINE_OVERRIDE - bool "Built-in command line overrides firmwar
[PATCH 8/8] CMDLINE: arm64: convert to generic builtin command line
This removes arm64 from the device tree handling of the command line arguments. The boot_command_line variable is populated inside the earliest user of the command line, which is in idreg-override.c. The device tree should not be needed to do any further handling of the boot command line options. Cc: xe-linux-exter...@cisco.com Signed-off-by: Daniel Walker --- arch/arm64/Kconfig | 33 + arch/arm64/include/asm/setup.h | 4 arch/arm64/include/uapi/asm/setup.h | 2 ++ arch/arm64/kernel/idreg-override.c | 9 arch/arm64/kernel/pi/kaslr_early.c | 14 ++-- 5 files changed, 19 insertions(+), 43 deletions(-) diff --git a/arch/arm64/Kconfig b/arch/arm64/Kconfig index 78f20e632712..d3b7fd1080d0 100644 --- a/arch/arm64/Kconfig +++ b/arch/arm64/Kconfig @@ -131,6 +131,7 @@ config ARM64 select GENERIC_ALLOCATOR select GENERIC_ARCH_TOPOLOGY select GENERIC_CLOCKEVENTS_BROADCAST + select GENERIC_CMDLINE select GENERIC_CPU_AUTOPROBE select GENERIC_CPU_VULNERABILITIES select GENERIC_EARLY_IOREMAP @@ -2217,38 +2218,6 @@ config ARM64_ACPI_PARKING_PROTOCOL protocol even if the corresponding data is present in the ACPI MADT table. -config CMDLINE - string "Default kernel command string" - default "" - help - Provide a set of default command-line options at build time by - entering them here. As a minimum, you should specify the the - root device (e.g. root=/dev/nfs). - -choice - prompt "Kernel command line type" if CMDLINE != "" - default CMDLINE_FROM_BOOTLOADER - help - Choose how the kernel will handle the provided default kernel - command line string. - -config CMDLINE_FROM_BOOTLOADER - bool "Use bootloader kernel arguments if available" - help - Uses the command-line options passed by the boot loader. If - the boot loader doesn't provide any, the default kernel command - string provided in CMDLINE will be used. - -config CMDLINE_FORCE - bool "Always use the default kernel command string" - help - Always use the default kernel command string, even if the boot - loader passes other arguments to the kernel. - This is useful if you cannot or don't want to change the - command-line options your boot loader passes to the kernel. - -endchoice - config EFI_STUB bool diff --git a/arch/arm64/include/asm/setup.h b/arch/arm64/include/asm/setup.h index f4af547ef54c..5a8037262cbb 100644 --- a/arch/arm64/include/asm/setup.h +++ b/arch/arm64/include/asm/setup.h @@ -3,10 +3,13 @@ #ifndef __ARM64_ASM_SETUP_H #define __ARM64_ASM_SETUP_H +#ifndef __ASSEMBLY__ #include +#endif #include +#ifndef __ASSEMBLY__ void *get_early_fdt_ptr(void); void early_fdt_map(u64 dt_phys); @@ -30,5 +33,6 @@ static inline bool arch_parse_debug_rodata(char *arg) return false; } #define arch_parse_debug_rodata arch_parse_debug_rodata +#endif /* __ASSEMBLY__ */ #endif diff --git a/arch/arm64/include/uapi/asm/setup.h b/arch/arm64/include/uapi/asm/setup.h index 5d703888f351..f5fc5b806369 100644 --- a/arch/arm64/include/uapi/asm/setup.h +++ b/arch/arm64/include/uapi/asm/setup.h @@ -20,7 +20,9 @@ #ifndef __ASM_SETUP_H #define __ASM_SETUP_H +#ifndef __ASSEMBLY__ #include +#endif #define COMMAND_LINE_SIZE 2048 diff --git a/arch/arm64/kernel/idreg-override.c b/arch/arm64/kernel/idreg-override.c index 3addc09f8746..6334a9228909 100644 --- a/arch/arm64/kernel/idreg-override.c +++ b/arch/arm64/kernel/idreg-override.c @@ -9,6 +9,7 @@ #include #include #include +#include #include #include @@ -304,11 +305,11 @@ static __init void parse_cmdline(void) { const u8 *prop = get_bootargs_cmdline(); - if (IS_ENABLED(CONFIG_CMDLINE_FORCE) || !prop) - __parse_cmdline(CONFIG_CMDLINE, true); + strscpy(boot_command_line, prop, COMMAND_LINE_SIZE); + cmdline_add_builtin(boot_command_line); + + __parse_cmdline(boot_command_line, true); - if (!IS_ENABLED(CONFIG_CMDLINE_FORCE) && prop) - __parse_cmdline(prop, true); } /* Keep checkers quiet */ diff --git a/arch/arm64/kernel/pi/kaslr_early.c b/arch/arm64/kernel/pi/kaslr_early.c index 17bff6e399e4..1e00bc01fa7a 100644 --- a/arch/arm64/kernel/pi/kaslr_early.c +++ b/arch/arm64/kernel/pi/kaslr_early.c @@ -11,6 +11,7 @@ #include #include #include +#include #include #include @@ -42,7 +43,7 @@ static bool cmdline_contains_nokaslr(const u8 *cmdline) static bool is_kaslr_disabled_cmdline(void *fdt) { - if (!IS_ENABLED(CONFIG_CMDLINE_FORCE)) { + if (!IS_ENABLED(CONFIG_CMDLINE_OVERRIDE)) { int node; const u8 *prop; @@ -54,16 +55,15 @@ static bool is_kaslr_disabled_cmdline(vo
[PATCH 2/8] scripts: insert-sys-cert: add command line insert capability
This adds changes to the insert-sys-cert tool to allow updating the cmdline_prepend and cmdline_append symbols in addition to adding certificates. Updating the cmdline symbols was tested on a PVH virtual machine with a vmlinux, and with a bzImage which was repackaged on x86. This commit intentionally keeps the tool filename the same to allow the changes to be seen more easily. The next commit will change the name of the tool. Cc: xe-linux-exter...@cisco.com Signed-off-by: Daniel Walker --- scripts/insert-sys-cert.c | 241 +++--- 1 file changed, 170 insertions(+), 71 deletions(-) diff --git a/scripts/insert-sys-cert.c b/scripts/insert-sys-cert.c index 8902836c2342..77d3306cfbfb 100644 --- a/scripts/insert-sys-cert.c +++ b/scripts/insert-sys-cert.c @@ -30,6 +30,9 @@ #define USED_SYM "system_extra_cert_used" #define LSIZE_SYM "system_certificate_list_size" +#define CMDLINE_APPEND "cmdline_append" +#define CMDLINE_PREPEND "cmdline_prepend" + #define info(format, args...) fprintf(stderr, "INFO:" format, ## args) #define warn(format, args...) fprintf(stdout, "WARNING: " format, ## args) #define err(format, args...) fprintf(stderr, "ERROR: " format, ## args) @@ -267,95 +270,46 @@ static void print_sym(Elf_Ehdr *hdr, struct sym *s) static void print_usage(char *e) { - printf("Usage %s [-s ] -b -c \n", e); + printf("Usage %s [-s ] -b [ -c | -p | -a ]-\n", e); } -int main(int argc, char **argv) +static char *cmdline_prepend, *cmdline_append; +static char *system_map_file; +static char *cert_file; +static char *cli_name; + +static int insert_certificate(Elf_Ehdr *hdr) { - char *system_map_file = NULL; - char *vmlinux_file = NULL; - char *cert_file = NULL; - int vmlinux_size; + struct sym cert_sym, lsize_sym, used_sym; + Elf_Shdr *symtab = NULL; + unsigned long *lsize; + FILE *system_map; int cert_size; - Elf_Ehdr *hdr; char *cert; - FILE *system_map; - unsigned long *lsize; int *used; - int opt; - Elf_Shdr *symtab = NULL; - struct sym cert_sym, lsize_sym, used_sym; - - while ((opt = getopt(argc, argv, "b:c:s:")) != -1) { - switch (opt) { - case 's': - system_map_file = optarg; - break; - case 'b': - vmlinux_file = optarg; - break; - case 'c': - cert_file = optarg; - break; - default: - break; - } - } - if (!vmlinux_file || !cert_file) { - print_usage(argv[0]); - exit(EXIT_FAILURE); + if (!cert_file) { + print_usage(cli_name); + return EXIT_FAILURE; } cert = read_file(cert_file, _size); if (!cert) - exit(EXIT_FAILURE); - - hdr = map_file(vmlinux_file, _size); - if (!hdr) - exit(EXIT_FAILURE); - - if (vmlinux_size < sizeof(*hdr)) { - err("Invalid ELF file.\n"); - exit(EXIT_FAILURE); - } - - if ((hdr->e_ident[EI_MAG0] != ELFMAG0) || - (hdr->e_ident[EI_MAG1] != ELFMAG1) || - (hdr->e_ident[EI_MAG2] != ELFMAG2) || - (hdr->e_ident[EI_MAG3] != ELFMAG3)) { - err("Invalid ELF magic.\n"); - exit(EXIT_FAILURE); - } - - if (hdr->e_ident[EI_CLASS] != CURRENT_ELFCLASS) { - err("ELF class mismatch.\n"); - exit(EXIT_FAILURE); - } - - if (hdr->e_ident[EI_DATA] != endianness()) { - err("ELF endian mismatch.\n"); - exit(EXIT_FAILURE); - } - - if (hdr->e_shoff > vmlinux_size) { - err("Could not find section header.\n"); - exit(EXIT_FAILURE); - } + return EXIT_FAILURE; symtab = get_symbol_table(hdr); if (!symtab) { warn("Could not find the symbol table.\n"); if (!system_map_file) { err("Please provide a System.map file.\n"); - print_usage(argv[0]); - exit(EXIT_FAILURE); + print_usage(cli_name); + return EXIT_FAILURE; } system_map = fopen(system_map_file, "r"); if (!system_map) { perror(system_map_file); - exit(EXIT_FAILURE); + return EXIT_FAILURE; } get_symbol_from_map(hdr, system_map, CERT_SYM, _sym); ge
[PATCH 5/8] drivers: firmware: efi: libstub: enable generic commandline
This adds code to handle the generic command line changes. The efi code appears that it doesn't benefit as much from this design as it could. For example, if you had a prepend command line with "nokaslr" then you might be helpful to re-enable it in the boot loader or dts, but there appears to be no way to re-enable kaslr or some of the other options. The efi command line handling is incorrect. x86 and arm have an append system however the efi code prepends the command line. For example, you could have a non-upgradable bios which sends efi=disable_early_pci_dma This hypothetically could have been set because early pci dma caused issues on early versions of the product. Then later the early pci dma was made to work and the company desired to start using it. To override the bios you could set the CONFIG_CMDLINE to, efi=no_disable_early_pci_dma then parsing would normally start with the bios command line, then move to the CONFIG_CMDLINE and you would end up with early pci dma turned on. however, current efi code keeps early pci dma off because the bios arguments always override the built in. Per my reading this is different from the main body of x86, arm, and arm64. The generic command line provides both append and prepend, so it alleviates this issue if it's used. However not all architectures use it. It would be desirable to allow the efi stub to have it's builtin command line to be modified after compile, but I don't see a feasible way to do that currently. Cc: xe-linux-exter...@cisco.com Signed-off-by: Daniel Walker --- .../firmware/efi/libstub/efi-stub-helper.c| 29 +++ drivers/firmware/efi/libstub/efi-stub.c | 9 ++ drivers/firmware/efi/libstub/efistub.h| 1 + drivers/firmware/efi/libstub/x86-stub.c | 14 +++-- 4 files changed, 51 insertions(+), 2 deletions(-) diff --git a/drivers/firmware/efi/libstub/efi-stub-helper.c b/drivers/firmware/efi/libstub/efi-stub-helper.c index bfa30625f5d0..952fa2cdff51 100644 --- a/drivers/firmware/efi/libstub/efi-stub-helper.c +++ b/drivers/firmware/efi/libstub/efi-stub-helper.c @@ -11,6 +11,7 @@ #include #include +#include #include #include @@ -29,6 +30,34 @@ bool __pure __efi_soft_reserve_enabled(void) return !efi_nosoftreserve; } +/** + * efi_handle_cmdline() - handle adding in built-in parts of the command line + * @cmdline: kernel command line + * + * Add in the generic parts of the commandline and start the parsing of the + * command line. + * + * Return: status code + */ +efi_status_t efi_handle_builtin_cmdline(char const *cmdline) +{ + efi_status_t status = EFI_SUCCESS; + + if (sizeof(CMDLINE_STATIC_PREPEND) > 1) + status |= efi_parse_options(CMDLINE_STATIC_PREPEND); + + if (!IS_ENABLED(CONFIG_CMDLINE_OVERRIDE)) + status |= efi_parse_options(cmdline); + + if (sizeof(CMDLINE_STATIC_APPEND) > 1) + status |= efi_parse_options(CMDLINE_STATIC_APPEND); + + if (status != EFI_SUCCESS) + efi_err("Failed to parse options\n"); + + return status; +} + /** * efi_parse_options() - Parse EFI command line options * @cmdline: kernel command line diff --git a/drivers/firmware/efi/libstub/efi-stub.c b/drivers/firmware/efi/libstub/efi-stub.c index f9c1e8a2bd1d..770abe95c0ee 100644 --- a/drivers/firmware/efi/libstub/efi-stub.c +++ b/drivers/firmware/efi/libstub/efi-stub.c @@ -127,6 +127,14 @@ efi_status_t efi_handle_cmdline(efi_loaded_image_t *image, char **cmdline_ptr) return EFI_OUT_OF_RESOURCES; } +#ifdef CONFIG_GENERIC_CMDLINE + status = efi_handle_builtin_cmdline(cmdline); + if (status != EFI_SUCCESS) { + goto fail_free_cmdline; + } +#endif + +#ifdef CONFIG_CMDLINE if (IS_ENABLED(CONFIG_CMDLINE_EXTEND) || IS_ENABLED(CONFIG_CMDLINE_FORCE) || cmdline_size == 0) { @@ -144,6 +152,7 @@ efi_status_t efi_handle_cmdline(efi_loaded_image_t *image, char **cmdline_ptr) goto fail_free_cmdline; } } +#endif *cmdline_ptr = cmdline; return EFI_SUCCESS; diff --git a/drivers/firmware/efi/libstub/efistub.h b/drivers/firmware/efi/libstub/efistub.h index 212687c30d79..1ac6631905c5 100644 --- a/drivers/firmware/efi/libstub/efistub.h +++ b/drivers/firmware/efi/libstub/efistub.h @@ -996,6 +996,7 @@ efi_status_t efi_relocate_kernel(unsigned long *image_addr, unsigned long alignment, unsigned long min_addr); +efi_status_t efi_handle_builtin_cmdline(char const *cmdline); efi_status_t efi_parse_options(char const *cmdline); void efi_parse_option_graphics(char *option); diff --git a/drivers/firmware/efi/libstub/x86-stub.c b/drivers/firmware/efi/libstub/x86-stub.c index 9d5df683f882..273a8a9c8bbb 100644 --- a/drivers/firmware/efi/libstub/x86-stub.c +++ b/driver
[PATCH 3/8] scripts: insert-sys-cert: change name to insert-symbol
Since the tool is used to update the command line and/or to update the certificates, I think it makes sense to changes the name of this tool. Update the name of the tool to better reflect it's new use. Cc: xe-linux-exter...@cisco.com Signed-off-by: Daniel Walker --- scripts/Makefile | 2 +- scripts/{insert-sys-cert.c => insert-symbol.c} | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) rename scripts/{insert-sys-cert.c => insert-symbol.c} (99%) diff --git a/scripts/Makefile b/scripts/Makefile index 576cf64be667..2d7618fa5d6b 100644 --- a/scripts/Makefile +++ b/scripts/Makefile @@ -8,10 +8,10 @@ hostprogs-always-$(BUILD_C_RECORDMCOUNT) += recordmcount hostprogs-always-$(CONFIG_BUILDTIME_TABLE_SORT)+= sorttable hostprogs-always-$(CONFIG_ASN1)+= asn1_compiler hostprogs-always-$(CONFIG_MODULE_SIG_FORMAT) += sign-file -hostprogs-always-$(CONFIG_SYSTEM_EXTRA_CERTIFICATE)+= insert-sys-cert hostprogs-always-$(CONFIG_RUST_KERNEL_DOCTESTS)+= rustdoc_test_builder hostprogs-always-$(CONFIG_RUST_KERNEL_DOCTESTS)+= rustdoc_test_gen always-$(CONFIG_RUST) += target.json +hostprogs-always-$(CONFIG_SYSTEM_EXTRA_CERTIFICATE)+= insert-symbol filechk_rust_target = $< < include/config/auto.conf diff --git a/scripts/insert-sys-cert.c b/scripts/insert-symbol.c similarity index 99% rename from scripts/insert-sys-cert.c rename to scripts/insert-symbol.c index 77d3306cfbfb..6866e3a84974 100644 --- a/scripts/insert-sys-cert.c +++ b/scripts/insert-symbol.c @@ -7,7 +7,7 @@ * This software may be used and distributed according to the terms * of the GNU General Public License, incorporated herein by reference. * - * Usage: insert-sys-cert [-s -b -c + * Usage: insert-symbol [-s -b -c */ #define _GNU_SOURCE -- 2.39.2
[PATCH 1/8] CMDLINE: add generic builtin command line
This code allows architectures to use a generic builtin command line. The state of the builtin command line options across architecture is diverse. MIPS and X86 once has similar systems, then mips added some options to allow extending the command line. Powerpc did something simiar in adding the ability to extend. Even with mips and powerpc enhancement the needs of Cisco are not met on these platforms. The code in this commit unifies the code into a generic header file under the CONFIG_GENERIC_CMDLINE option. When this option is enabled the architecture can call the cmdline_add_builtin() to add the builtin command line. The generic code provides both append and/or prepend options and provides a way to redefine these option after the kernel is compiled. This code also includes test's which are meant to confirm functionality. This unified implementation offers the same functionality needed by Cisco on all platform which we enable it on. Cc: xe-linux-exter...@cisco.com Signed-off-by: Ruslan Bilovol Signed-off-by: Daniel Walker --- include/linux/cmdline.h | 106 ++ init/Kconfig| 79 +++ lib/Kconfig | 4 ++ lib/Makefile| 3 + lib/generic_cmdline.S | 53 +++ lib/test_cmdline1.c | 139 6 files changed, 384 insertions(+) create mode 100644 include/linux/cmdline.h create mode 100644 lib/generic_cmdline.S create mode 100644 lib/test_cmdline1.c diff --git a/include/linux/cmdline.h b/include/linux/cmdline.h new file mode 100644 index ..a94758a0f257 --- /dev/null +++ b/include/linux/cmdline.h @@ -0,0 +1,106 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +#ifndef _LINUX_CMDLINE_H +#define _LINUX_CMDLINE_H +/* + * + * Copyright (C) 2006,2021. Cisco Systems, Inc. + * + * Generic Append/Prepend cmdline support. + */ + + +#include +#include +#include + +#ifdef CONFIG_CMDLINE_BOOL +extern char cmdline_prepend[]; +extern char cmdline_append[]; +extern char cmdline_tmp[]; +#define CMDLINE_PREPEND cmdline_prepend +#define CMDLINE_APPEND cmdline_append +#define CMDLINE_TMP cmdline_tmp +#define CMDLINE_STATIC_PREPEND CONFIG_CMDLINE_PREPEND +#define CMDLINE_STATIC_APPEND CONFIG_CMDLINE_APPEND +#else +#define CMDLINE_PREPEND "" +#define CMDLINE_APPEND "" +#define CMDLINE_TMP "" +#define CMDLINE_STATIC_PREPEND "" +#define CMDLINE_STATIC_APPEND "" +#endif + +#ifndef CMDLINE_STRLCAT +#define CMDLINE_STRLCAT strlcat +#endif + +#ifndef CMDLINE_STRLEN +#define CMDLINE_STRLEN strlen +#endif + +/* + * This function will append or prepend a builtin command line to the command + * line provided by the bootloader. Kconfig options can be used to alter + * the behavior of this builtin command line. + * @dest: The destination of the final appended/prepended string + * @tmp: temporary space used for prepending + * @prepend: string to prepend to @dest + * @append: string to append to @dest + * @length: the maximum length of the strings above. + * @cmdline_strlen: point to a compatible strlen + * @cmdline_strlcat: point to a compatible strlcat + * This function returns true when the builtin command line was copied successfully + * and false when there was not enough room to copy all parts of the command line. + */ +static inline bool +__cmdline_add_builtin( + char *dest, + char *tmp, + char *prepend, + char *append, + unsigned long length, + size_t (*cmdline_strlen)(const char *s), + size_t (*cmdline_strlcat)(char *dest, const char *src, size_t count)) +{ + size_t total_length = 0, tmp_length; + + if (!IS_ENABLED(CONFIG_GENERIC_CMDLINE)) + return true; + + if (!IS_ENABLED(CONFIG_CMDLINE_BOOL)) + return true; + + if (IS_ENABLED(CONFIG_CMDLINE_OVERRIDE)) + dest[0] = '\0'; + else + total_length += cmdline_strlen(dest); + + tmp_length = cmdline_strlen(append); + if (tmp_length > 0) { + cmdline_strlcat(dest, append, length); + total_length += tmp_length; + } + + tmp_length = cmdline_strlen(prepend); + if (tmp_length > 0) { + cmdline_strlcat(tmp, prepend, length); + cmdline_strlcat(tmp, dest, length); + dest[0] = '\0'; + cmdline_strlcat(dest, tmp, length); + total_length += tmp_length; + } + + tmp[0] = '\0'; + + if (total_length > length) + return false; + + return true; +} + +#define cmdline_add_builtin(dest) \ + __cmdline_add_builtin(dest, CMDLINE_TMP, CMDLINE_PREPEND, CMDLINE_APPEND, COMMAND_LINE_SIZE, CMDLINE_STRLEN, CMDLINE_STRLCAT) + +#define cmdline_get_static_builtin(dest) \ + (CMDLINE_STATIC_PREPEND CMDLINE_STATIC_APPEND) +#endif diff --git a/init/Kco
[PATCH 0/8] generic command line v6
This release is an up-rev of the v5 patches. No additional features have been added. Some changes were mode to function names and some changes to Kconfig dependencies. Also updated the config conversion for mips. There are a number of people who have expressed interest in these patches either by asking for them to be merge or testing them. If people are so inclined please continue to request them to be merge or to ask the status of the next release. It's helpful to motivate me to release them again and for the maintainers to see the interest generated. These patches have been used by Cisco Systems, Inc. on millions of released products to great effect. Hopefully they can be used by the entire Linux eco system. My apologies on the length between releases. I will try to release more often. Daniel Walker (8): CMDLINE: add generic builtin command line scripts: insert-sys-cert: add command line insert capability scripts: insert-sys-cert: change name to insert-symbol CMDLINE: mips: convert to generic builtin command line drivers: firmware: efi: libstub: enable generic commandline CMDLINE: x86: convert to generic builtin command line of: replace command line handling CMDLINE: arm64: convert to generic builtin command line arch/arm64/Kconfig| 33 +-- arch/arm64/include/asm/setup.h| 4 + arch/arm64/include/uapi/asm/setup.h | 2 + arch/arm64/kernel/idreg-override.c| 9 +- arch/arm64/kernel/pi/kaslr_early.c| 14 +- arch/mips/Kconfig | 4 +- arch/mips/Kconfig.debug | 44 arch/mips/configs/ar7_defconfig | 12 +- arch/mips/configs/bcm47xx_defconfig | 10 +- arch/mips/configs/bcm63xx_defconfig | 21 +- arch/mips/configs/bmips_be_defconfig | 17 +- arch/mips/configs/bmips_stb_defconfig | 139 -- arch/mips/configs/ci20_defconfig | 8 +- arch/mips/configs/cu1000-neo_defconfig| 19 +- arch/mips/configs/cu1830-neo_defconfig| 19 +- arch/mips/configs/generic_defconfig | 15 +- arch/mips/configs/gpr_defconfig | 33 +-- arch/mips/configs/loongson3_defconfig | 29 +-- arch/mips/include/asm/setup.h | 2 + arch/mips/kernel/relocate.c | 17 +- arch/mips/kernel/setup.c | 36 +-- arch/mips/pic32/pic32mzda/early_console.c | 2 +- arch/mips/pic32/pic32mzda/init.c | 3 +- arch/x86/Kconfig | 44 +--- arch/x86/kernel/setup.c | 18 +- .../firmware/efi/libstub/efi-stub-helper.c| 29 +++ drivers/firmware/efi/libstub/efi-stub.c | 9 + drivers/firmware/efi/libstub/efistub.h| 1 + drivers/firmware/efi/libstub/x86-stub.c | 14 +- drivers/of/fdt.c | 22 +- include/linux/cmdline.h | 137 ++ init/Kconfig | 79 ++ lib/Kconfig | 4 + lib/Makefile | 3 + lib/generic_cmdline.S | 53 lib/test_cmdline1.c | 139 ++ scripts/Makefile | 2 +- .../{insert-sys-cert.c => insert-symbol.c}| 243 -- 38 files changed, 807 insertions(+), 482 deletions(-) create mode 100644 include/linux/cmdline.h create mode 100644 lib/generic_cmdline.S create mode 100644 lib/test_cmdline1.c rename scripts/{insert-sys-cert.c => insert-symbol.c} (72%) -- 2.39.2
Re: [PATCH 1/4] add generic builtin command line
On Wed, Nov 08, 2023 at 11:33:37AM +, Christophe Leroy wrote: > As far as I remember, Daniel's proposal had some weaknesses that were > never addressed. At that time I proposed an alternative series that was > addressing most weaknesses, and my series was considered more mature > that Daniel's one by several maintainers. But I never got enough > feedback on it in order to finalise and merge it. It does something entirely different and doesn't solve the problems .. Certain doesn't solve my problems. Daniel
Re: mm/debug_vm_pgtable.c:860 warning triggered
On Mon, Nov 06, 2023 at 08:39:26AM +0530, Anshuman Khandual wrote: > Hello Daniel, > > This test just ensures that PFN is preserved during pte <--> swap pte > transformations > , and the warning here seems to have been caused by powerpc platform specific > helpers > and/or its pte_t representation. Adding powerpc folks and platform mailing > list here. > > - Anshuman > How is the swap support to work if the pte_t is 64bits but the swp_entry_t is 32bits? I would think there's other platforms which do this. Daniel
Re: [PATCH 1/4] add generic builtin command line
On Tue, Oct 17, 2023 at 04:10:42PM +0530, Pratyush Brahma wrote: > For such a usecase, the CONFIG_CMDLINE_PREPEND seems to be quite useful as > it would help to stitch bootloader > and the desired build variant's configs together. Can you please help to > merge this patch? Yes, your at least the second person that's asked for it, and it's been on my list for some time to release again. I'll try to release it as soon as possible. Daniel
Re: [PATCH 1/4] add generic builtin command line
On Mon, Apr 17, 2023 at 06:18:18PM +0200, Tomas Mudrunka wrote: > This seems quite useful. Can you please merge it? I need to re-send it before it can be merge. I'll try to update it soon. Daniel
Re: [PATCH 0/8] generic command line v4
On Mon, Sep 26, 2022 at 05:52:18PM -0500, Rob Herring wrote: > On Thu, Sep 22, 2022 at 4:15 PM Daniel Gimpelevich > wrote: > > > > On Thu, 2022-09-22 at 14:10 -0700, Daniel Walker wrote: > > > On Thu, Sep 22, 2022 at 05:03:46PM -0400, Sean Anderson wrote: > > [snip] > > > > As recently as last month, someone's patch to add such support was > > > > rejected for this reason [1]. > > > > > > > > --Sean > > > > > > > > [1] > > > > https://lore.kernel.org/linux-arm-kernel/20220812084613.GA3107@willie-the-truck/ > > > > > > > > > I had no idea.. Thanks for pointing that out. I guess I will re-submit in > > > that > > > case. > > > > > > Daniel > > > > This has been happening repeatedly since circa 2014, on multiple > > architectures. It's quite frustrating, really. > > It must not be that important. From the last time, IMO Christophe's > version was much closer to being merged than this series. This is not > how you get things upstream: > > > * Dropped powerpc changes > > Christophe Leroy has reservations about the features for powerpc. I > > don't think his reservations are founded, and these changes should > > fully work on powerpc. However, I dropped these changes so Christophe > > can have more time to get comfortable with the changes. > > Rob I don't submit often enough, that's true. However, I figured maintainers don't want the changes. This is a common occurrence in industry, people may submit once or twice, no traction and they give up. I suppose it's a combination of problems. Christophe's don't have the same features, so they are really totally different but conflicting. Daniel
Re: [PATCH 0/8] generic command line v4
On Thu, Sep 22, 2022 at 02:15:44PM -0700, Daniel Gimpelevich wrote: > On Thu, 2022-09-22 at 14:10 -0700, Daniel Walker wrote: > > On Thu, Sep 22, 2022 at 05:03:46PM -0400, Sean Anderson wrote: > [snip] > > > As recently as last month, someone's patch to add such support was > > > rejected for this reason [1]. > > > > > > --Sean > > > > > > [1] > > > https://lore.kernel.org/linux-arm-kernel/20220812084613.GA3107@willie-the-truck/ > > > > > > I had no idea.. Thanks for pointing that out. I guess I will re-submit in > > that > > case. > > > > Daniel > > This has been happening repeatedly since circa 2014, on multiple > architectures. It's quite frustrating, really. I'm not sure I'm following your comments. What's frustrating exactly ? Daniel
Re: [PATCH 0/8] generic command line v4
On Thu, Sep 22, 2022 at 05:03:46PM -0400, Sean Anderson wrote: > > > > On 9/22/22 4:53 PM, Daniel Walker wrote: > > On Thu, Sep 22, 2022 at 04:45:01PM -0400, Sean Anderson wrote: > >> > >> > >> > >> For an arm64 platform (after rebasing): > >> > >> Tested-by: Sean Anderson > > > > Maybe I'll re-submit it. > > > > Daniel > > > > There's still no way to extend the command line on ARM64, since the > existing method was removed in anticipation that your series would be > added. > > As recently as last month, someone's patch to add such support was > rejected for this reason [1]. > > --Sean > > [1] > https://lore.kernel.org/linux-arm-kernel/20220812084613.GA3107@willie-the-truck/ I had no idea.. Thanks for pointing that out. I guess I will re-submit in that case. Daniel
Re: [PATCH 0/8] generic command line v4
On Thu, Sep 22, 2022 at 04:45:01PM -0400, Sean Anderson wrote: > > > > For an arm64 platform (after rebasing): > > Tested-by: Sean Anderson Maybe I'll re-submit it. Daniel
Re: [PATCH 1/3] lib: early_string: allow early usage of some string functions
On Mon, May 03, 2021 at 11:01:41AM -0700, Daniel Walker wrote: > On Sat, May 01, 2021 at 09:31:47AM +0200, Christophe Leroy wrote: > > > > > In fact, should be like in prom_init today: > > > > > > #ifdef __EARLY_STRING_ENABLED > > > if (dsize >= count) > > > return count; > > > #else > > > BUG_ON(dsize >= count); > > > #endif > > > > Thinking about it once more, this BUG_ON() is overkill and should be > > avoided, see https://www.kernel.org/doc/html/latest/process/deprecated.html > > > > Therefore, something like the following would make it: > > > > if (dsize >= count) { > > WARN_ON(!__is_defined(__EARLY_STRING_ENABLED)); > > > > return count; > > } > > I agree, it's overkill it stop the system for this condition. > > how about I do something more like this for my changes, > > > > if (WARN_ON(dsize >= count && !__is_defined(__EARLY_STRING_ENABLED))) > > return count; I'll have to work on this one.. Daniel
Re: [PATCH 1/3] lib: early_string: allow early usage of some string functions
On Sat, May 01, 2021 at 09:31:47AM +0200, Christophe Leroy wrote: > > > In fact, should be like in prom_init today: > > > > #ifdef __EARLY_STRING_ENABLED > > if (dsize >= count) > > return count; > > #else > > BUG_ON(dsize >= count); > > #endif > > Thinking about it once more, this BUG_ON() is overkill and should be > avoided, see https://www.kernel.org/doc/html/latest/process/deprecated.html > > Therefore, something like the following would make it: > > if (dsize >= count) { > WARN_ON(!__is_defined(__EARLY_STRING_ENABLED)); > > return count; > } I agree, it's overkill it stop the system for this condition. how about I do something more like this for my changes, > if (WARN_ON(dsize >= count && !__is_defined(__EARLY_STRING_ENABLED))) > return count; and for generic kernel, > if (WARN_ON(dsize >= count)) > return count; Daniel
[PATCH 1/3] lib: early_string: allow early usage of some string functions
This systems allows some string functions to be moved into lib/early_string.c and they will be prepended with "early_" and compiled without debugging like KASAN. This is already done on x86 for, "AMD Secure Memory Encryption (SME) support" and on powerpc prom_init.c , and EFI's libstub. The AMD memory feature disabled KASAN for all string functions, and prom_init.c and efi libstub implement their own versions of the functions. This implementation allows sharing of the string functions without removing the debugging features for the whole system. Cc: xe-linux-exter...@cisco.com Signed-off-by: Daniel Walker --- include/linux/string.h | 6 ++ lib/Makefile | 23 +- lib/early_string.c | 172 + lib/string.c | 154 4 files changed, 200 insertions(+), 155 deletions(-) create mode 100644 lib/early_string.c diff --git a/include/linux/string.h b/include/linux/string.h index 9521d8cab18e..c0d45b92ba9e 100644 --- a/include/linux/string.h +++ b/include/linux/string.h @@ -20,6 +20,7 @@ extern void *memdup_user_nul(const void __user *, size_t); */ #include +extern char * early_strcpy(char *,const char *); #ifndef __HAVE_ARCH_STRCPY extern char * strcpy(char *,const char *); #endif @@ -42,12 +43,15 @@ extern char * strcat(char *, const char *); #ifndef __HAVE_ARCH_STRNCAT extern char * strncat(char *, const char *, __kernel_size_t); #endif +extern size_t early_strlcat(char *, const char *, __kernel_size_t); #ifndef __HAVE_ARCH_STRLCAT extern size_t strlcat(char *, const char *, __kernel_size_t); #endif +extern int early_strcmp(const char *,const char *); #ifndef __HAVE_ARCH_STRCMP extern int strcmp(const char *,const char *); #endif +extern int early_strncmp(const char *,const char *,__kernel_size_t); #ifndef __HAVE_ARCH_STRNCMP extern int strncmp(const char *,const char *,__kernel_size_t); #endif @@ -79,12 +83,14 @@ static inline __must_check char *strstrip(char *str) return strim(str); } +extern char * early_strstr(const char *, const char *); #ifndef __HAVE_ARCH_STRSTR extern char * strstr(const char *, const char *); #endif #ifndef __HAVE_ARCH_STRNSTR extern char * strnstr(const char *, const char *, size_t); #endif +extern __kernel_size_t early_strlen(const char *); #ifndef __HAVE_ARCH_STRLEN extern __kernel_size_t strlen(const char *); #endif diff --git a/lib/Makefile b/lib/Makefile index b5307d3eec1a..25cc664f027e 100644 --- a/lib/Makefile +++ b/lib/Makefile @@ -9,6 +9,8 @@ ccflags-remove-$(CONFIG_FUNCTION_TRACER) += $(CC_FLAGS_FTRACE) # flaky coverage that is not a function of syscall inputs. For example, # rbtree can be global and individual rotations don't correlate with inputs. KCOV_INSTRUMENT_string.o := n +KCOV_INSTRUMENT_early_string.o := n +KCOV_INSTRUMENT_early_string.nosan.o := n KCOV_INSTRUMENT_rbtree.o := n KCOV_INSTRUMENT_list_debug.o := n KCOV_INSTRUMENT_debugobjects.o := n @@ -19,6 +21,12 @@ KCOV_INSTRUMENT_fault-inject.o := n # Use -ffreestanding to ensure that the compiler does not try to "optimize" # them into calls to themselves. CFLAGS_string.o := -ffreestanding +CFLAGS_early_string.o := -ffreestanding +CFLAGS_early_string.nosan.o := -ffreestanding -D__EARLY_STRING_ENABLED + +KASAN_SANITIZE_early_string.nosan.o := n + +CFLAGS_early_string.nosan.o += -fno-stack-protector # Early boot use of cmdline, don't instrument it ifdef CONFIG_AMD_MEM_ENCRYPT @@ -27,7 +35,20 @@ KASAN_SANITIZE_string.o := n CFLAGS_string.o += -fno-stack-protector endif -lib-y := ctype.o string.o vsprintf.o cmdline.o \ +$(obj)/early_string.nosan.o: $(src)/early_string.c $(recordmcount_source) $(objtool_dep) FORCE + $(call if_changed_rule,cc_o_c) + $(call cmd,force_checksrc) + $(Q)$(OBJCOPY) \ + --rename-section .text=.init.text \ + --redefine-sym strcmp=early_strcmp \ + --redefine-sym strncmp=early_strncmp \ + --redefine-sym strcpy=early_strcpy \ + --redefine-sym strlcat=early_strlcat \ + --redefine-sym strlen=early_strlen \ + --redefine-sym strstr=early_strstr \ + --redefine-sym memcmp=early_memcmp $@ + +lib-y := ctype.o string.o early_string.o early_string.nosan.o vsprintf.o cmdline.o \ rbtree.o radix-tree.o timerqueue.o xarray.o \ idr.o extable.o sha1.o irq_regs.o argv_split.o \ flex_proportions.o ratelimit.o show_mem.o \ diff --git a/lib/early_string.c b/lib/early_string.c new file mode 100644 index ..21004e82159c --- /dev/null +++ b/lib/early_string.c @@ -0,0 +1,172 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * linux/lib/string.c + * + * Copyright (C) 1991, 1992 Linus Torvalds + */ + +#include +#include +#include + +#ifdef __EARLY_STRING_ENABLED +#undef EXPORT_SYMBOL +#define EXPORT_SYMBOL(x) +#endif + +#include + +#if !defined(
[PATCH 3/3] x86: switch amd mem encrypt to early string functions
This switched x86 early string users to use the early string variants and re-enabled KASAN on general string functions use thru out the rest of the system. Cc: xe-linux-exter...@cisco.com Signed-off-by: Daniel Walker --- arch/x86/mm/mem_encrypt_identity.c | 4 ++-- lib/Makefile | 7 --- 2 files changed, 2 insertions(+), 9 deletions(-) diff --git a/arch/x86/mm/mem_encrypt_identity.c b/arch/x86/mm/mem_encrypt_identity.c index 6c5eb6f3f14f..212fe90cf5e2 100644 --- a/arch/x86/mm/mem_encrypt_identity.c +++ b/arch/x86/mm/mem_encrypt_identity.c @@ -575,9 +575,9 @@ void __init sme_enable(struct boot_params *bp) cmdline_find_option(cmdline_ptr, cmdline_arg, buffer, sizeof(buffer)); - if (!strncmp(buffer, cmdline_on, sizeof(buffer))) + if (!early_strncmp(buffer, cmdline_on, sizeof(buffer))) sme_me_mask = me_mask; - else if (!strncmp(buffer, cmdline_off, sizeof(buffer))) + else if (!early_strncmp(buffer, cmdline_off, sizeof(buffer))) sme_me_mask = 0; else sme_me_mask = active_by_default ? me_mask : 0; diff --git a/lib/Makefile b/lib/Makefile index 25cc664f027e..314db12c0e98 100644 --- a/lib/Makefile +++ b/lib/Makefile @@ -28,13 +28,6 @@ KASAN_SANITIZE_early_string.nosan.o := n CFLAGS_early_string.nosan.o += -fno-stack-protector -# Early boot use of cmdline, don't instrument it -ifdef CONFIG_AMD_MEM_ENCRYPT -KASAN_SANITIZE_string.o := n - -CFLAGS_string.o += -fno-stack-protector -endif - $(obj)/early_string.nosan.o: $(src)/early_string.c $(recordmcount_source) $(objtool_dep) FORCE $(call if_changed_rule,cc_o_c) $(call cmd,force_checksrc) -- 2.25.1
[PATCH 2/3] powerpc: prom_init: switch to early string functions
This converts the prom_init string users to the early string function which don't suffer from KASAN or any other debugging enabled. Cc: xe-linux-exter...@cisco.com Signed-off-by: Daniel Walker --- arch/powerpc/kernel/prom_init.c| 185 ++--- arch/powerpc/kernel/prom_init_check.sh | 9 +- 2 files changed, 51 insertions(+), 143 deletions(-) diff --git a/arch/powerpc/kernel/prom_init.c b/arch/powerpc/kernel/prom_init.c index ccf77b985c8f..4d4343da1280 100644 --- a/arch/powerpc/kernel/prom_init.c +++ b/arch/powerpc/kernel/prom_init.c @@ -225,105 +225,6 @@ static bool __prombss rtas_has_query_cpu_stopped; #define PHANDLE_VALID(p) ((p) != 0 && (p) != PROM_ERROR) #define IHANDLE_VALID(i) ((i) != 0 && (i) != PROM_ERROR) -/* Copied from lib/string.c and lib/kstrtox.c */ - -static int __init prom_strcmp(const char *cs, const char *ct) -{ - unsigned char c1, c2; - - while (1) { - c1 = *cs++; - c2 = *ct++; - if (c1 != c2) - return c1 < c2 ? -1 : 1; - if (!c1) - break; - } - return 0; -} - -static char __init *prom_strcpy(char *dest, const char *src) -{ - char *tmp = dest; - - while ((*dest++ = *src++) != '\0') - /* nothing */; - return tmp; -} - -static int __init prom_strncmp(const char *cs, const char *ct, size_t count) -{ - unsigned char c1, c2; - - while (count) { - c1 = *cs++; - c2 = *ct++; - if (c1 != c2) - return c1 < c2 ? -1 : 1; - if (!c1) - break; - count--; - } - return 0; -} - -static size_t __init prom_strlen(const char *s) -{ - const char *sc; - - for (sc = s; *sc != '\0'; ++sc) - /* nothing */; - return sc - s; -} - -static int __init prom_memcmp(const void *cs, const void *ct, size_t count) -{ - const unsigned char *su1, *su2; - int res = 0; - - for (su1 = cs, su2 = ct; 0 < count; ++su1, ++su2, count--) - if ((res = *su1 - *su2) != 0) - break; - return res; -} - -static char __init *prom_strstr(const char *s1, const char *s2) -{ - size_t l1, l2; - - l2 = prom_strlen(s2); - if (!l2) - return (char *)s1; - l1 = prom_strlen(s1); - while (l1 >= l2) { - l1--; - if (!prom_memcmp(s1, s2, l2)) - return (char *)s1; - s1++; - } - return NULL; -} - -static size_t __init prom_strlcat(char *dest, const char *src, size_t count) -{ - size_t dsize = prom_strlen(dest); - size_t len = prom_strlen(src); - size_t res = dsize + len; - - /* This would be a bug */ - if (dsize >= count) - return count; - - dest += dsize; - count -= dsize; - if (len >= count) - len = count-1; - memcpy(dest, src, len); - dest[len] = 0; - return res; - -} - #ifdef CONFIG_PPC_PSERIES static int __init prom_strtobool(const char *s, bool *res) { @@ -694,7 +595,7 @@ static int __init prom_setprop(phandle node, const char *nodename, add_string(, tohex((u32)(unsigned long) value)); add_string(, tohex(valuelen)); add_string(, tohex(ADDR(pname))); - add_string(, tohex(prom_strlen(pname))); + add_string(, tohex(early_strlen(pname))); add_string(, "property"); *p = 0; return call_prom("interpret", 1, 1, (u32)(unsigned long) cmd); @@ -779,25 +680,25 @@ static void __init early_cmdline_parse(void) l = prom_getprop(prom.chosen, "bootargs", p, COMMAND_LINE_SIZE-1); if (IS_ENABLED(CONFIG_CMDLINE_EXTEND) || l <= 0 || p[0] == '\0') - prom_strlcat(prom_cmd_line, " " CONFIG_CMDLINE, + early_strlcat(prom_cmd_line, " " CONFIG_CMDLINE, sizeof(prom_cmd_line)); prom_printf("command line: %s\n", prom_cmd_line); #ifdef CONFIG_PPC64 - opt = prom_strstr(prom_cmd_line, "iommu="); + opt = early_strstr(prom_cmd_line, "iommu="); if (opt) { prom_printf("iommu opt is: %s\n", opt); opt += 6; while (*opt && *opt == ' ') opt++; - if (!prom_strncmp(opt, "off", 3)) + if (!early_strncmp(opt, "off", 3)) prom_iommu_off = 1; - else if (!prom_strncmp(opt, "force", 5)) + else if (!early_strncmp(opt, "force", 5)) prom_iommu_force_on = 1; } #endif - opt = prom_strstr(prom_cmd_line, "mem="); + opt = e
[PATCH 8/8] CMDLINE: arm64: convert to generic builtin command line
This removes arm64 from the device tree handling of the command line arguments. The boot_command_line variable is populated inside the earliest user of the command line, which is in idreg-override.c. The device tree should not be needed to do any further handling of the boot command line options. Cc: xe-linux-exter...@cisco.com Signed-off-by: Daniel Walker --- arch/arm64/Kconfig | 33 +- arch/arm64/include/asm/setup.h | 2 ++ arch/arm64/kernel/idreg-override.c | 9 3 files changed, 8 insertions(+), 36 deletions(-) diff --git a/arch/arm64/Kconfig b/arch/arm64/Kconfig index e4e1b6550115..9781ba3758b1 100644 --- a/arch/arm64/Kconfig +++ b/arch/arm64/Kconfig @@ -105,6 +105,7 @@ config ARM64 select GENERIC_ALLOCATOR select GENERIC_ARCH_TOPOLOGY select GENERIC_CLOCKEVENTS_BROADCAST + select GENERIC_CMDLINE select GENERIC_CPU_AUTOPROBE select GENERIC_CPU_VULNERABILITIES select GENERIC_EARLY_IOREMAP @@ -1841,38 +1842,6 @@ config ARM64_ACPI_PARKING_PROTOCOL protocol even if the corresponding data is present in the ACPI MADT table. -config CMDLINE - string "Default kernel command string" - default "" - help - Provide a set of default command-line options at build time by - entering them here. As a minimum, you should specify the the - root device (e.g. root=/dev/nfs). - -choice - prompt "Kernel command line type" if CMDLINE != "" - default CMDLINE_FROM_BOOTLOADER - help - Choose how the kernel will handle the provided default kernel - command line string. - -config CMDLINE_FROM_BOOTLOADER - bool "Use bootloader kernel arguments if available" - help - Uses the command-line options passed by the boot loader. If - the boot loader doesn't provide any, the default kernel command - string provided in CMDLINE will be used. - -config CMDLINE_FORCE - bool "Always use the default kernel command string" - help - Always use the default kernel command string, even if the boot - loader passes other arguments to the kernel. - This is useful if you cannot or don't want to change the - command-line options your boot loader passes to the kernel. - -endchoice - config EFI_STUB bool diff --git a/arch/arm64/include/asm/setup.h b/arch/arm64/include/asm/setup.h index d3320618ed14..1f5b6d8f2433 100644 --- a/arch/arm64/include/asm/setup.h +++ b/arch/arm64/include/asm/setup.h @@ -5,7 +5,9 @@ #include +#ifndef __ASSEMBLY__ void *get_early_fdt_ptr(void); void early_fdt_map(u64 dt_phys); +#endif /* __ASSEMBLY__ */ #endif diff --git a/arch/arm64/kernel/idreg-override.c b/arch/arm64/kernel/idreg-override.c index 83f1c4b92095..0a3fcae13043 100644 --- a/arch/arm64/kernel/idreg-override.c +++ b/arch/arm64/kernel/idreg-override.c @@ -9,6 +9,7 @@ #include #include #include +#include #include #include @@ -188,11 +189,11 @@ static __init void parse_cmdline(void) { const u8 *prop = get_bootargs_cmdline(); - if (IS_ENABLED(CONFIG_CMDLINE_FORCE) || !prop) - __parse_cmdline(CONFIG_CMDLINE, true); + strscpy(boot_command_line, prop, COMMAND_LINE_SIZE); + cmdline_add_builtin(boot_command_line); + + __parse_cmdline(boot_command_line, true); - if (!IS_ENABLED(CONFIG_CMDLINE_FORCE) && prop) - __parse_cmdline(prop, true); } /* Keep checkers quiet */ -- 2.25.1
[PATCH 7/8] of: allow sending a NULL value to early_init_dt_scan_chosen
It's possible that an architecture may want to populate boot_command_line before calling the device tree code. Currently, early_init_dt_scan_chosen won't accept a NULL in the data parameter and it returns immediately if you send one. I changed early_init_dt_scan_nodes() to send a NULL into early_init_dt_scan_chosen() , then I made early_init_dt_scan_chosen() to do the initrd checking, and the rng-seed checking and skip all the command line related code. Given lots of changes to the command line, I think it makes sense to allow the initrd code and rng-seed code to be run without forcing the command line handling. I'm also submitting changes to arm64 which populate boot_command_line much early and this device tree code overwrites boot_command_line in that case. This code depends on all architecture to have a NULL boot_command_line at boot up when this function runs, unless it's already populated. This code was boot tested on powerpc 32bit, x86, and arm64. Cc: xe-linux-exter...@cisco.com Signed-off-by: Daniel Walker --- drivers/of/fdt.c | 44 +--- 1 file changed, 25 insertions(+), 19 deletions(-) diff --git a/drivers/of/fdt.c b/drivers/of/fdt.c index adb26aff481d..a1fda952ce60 100644 --- a/drivers/of/fdt.c +++ b/drivers/of/fdt.c @@ -1052,36 +1052,38 @@ int __init early_init_dt_scan_chosen(unsigned long node, const char *uname, pr_debug("search \"chosen\", depth: %d, uname: %s\n", depth, uname); - if (depth != 1 || !data || - (strcmp(uname, "chosen") != 0 && strcmp(uname, "chosen@0") != 0)) + if (depth != 1 || (strcmp(uname, "chosen") != 0 + && strcmp(uname, "chosen@0") != 0)) return 0; early_init_dt_check_for_initrd(node); - /* Retrieve command line */ - p = of_get_flat_dt_prop(node, "bootargs", ); - if (p != NULL && l > 0) - strlcpy(data, p, min(l, COMMAND_LINE_SIZE)); + if (data) { + /* Retrieve command line */ + p = of_get_flat_dt_prop(node, "bootargs", ); + if (p != NULL && l > 0) + strlcpy(data, p, min(l, COMMAND_LINE_SIZE)); - /* -* CONFIG_CMDLINE is meant to be a default in case nothing else -* managed to set the command line, unless CONFIG_CMDLINE_FORCE -* is set in which case we override whatever was found earlier. -*/ + /* +* CONFIG_CMDLINE is meant to be a default in case nothing else +* managed to set the command line, unless CONFIG_CMDLINE_FORCE +* is set in which case we override whatever was found earlier. +*/ #ifdef CONFIG_CMDLINE #if defined(CONFIG_CMDLINE_EXTEND) - strlcat(data, " ", COMMAND_LINE_SIZE); - strlcat(data, CONFIG_CMDLINE, COMMAND_LINE_SIZE); + strlcat(data, " ", COMMAND_LINE_SIZE); + strlcat(data, CONFIG_CMDLINE, COMMAND_LINE_SIZE); #elif defined(CONFIG_CMDLINE_FORCE) - strlcpy(data, CONFIG_CMDLINE, COMMAND_LINE_SIZE); -#else - /* No arguments from boot loader, use kernel's cmdl*/ - if (!((char *)data)[0]) strlcpy(data, CONFIG_CMDLINE, COMMAND_LINE_SIZE); +#else + /* No arguments from boot loader, use kernel's cmdl*/ + if (!((char *)data)[0]) + strlcpy(data, CONFIG_CMDLINE, COMMAND_LINE_SIZE); #endif #endif /* CONFIG_CMDLINE */ - pr_debug("Command line is: %s\n", (char *)data); + pr_debug("Command line is: %s\n", (char *)data); + } rng_seed = of_get_flat_dt_prop(node, "rng-seed", ); if (rng_seed && l > 0) { @@ -1202,7 +1204,11 @@ void __init early_init_dt_scan_nodes(void) int rc = 0; /* Retrieve various information from the /chosen node */ - rc = of_scan_flat_dt(early_init_dt_scan_chosen, boot_command_line); + if (boot_command_line[0]) + rc = of_scan_flat_dt(early_init_dt_scan_chosen, NULL); + else + rc = of_scan_flat_dt(early_init_dt_scan_chosen, + boot_command_line); if (!rc) pr_warn("No chosen node found, continuing without\n"); -- 2.25.1
[PATCH 5/8] drivers: firmware: efi: libstub: enable generic commandline
This adds code to handle the generic command line changes. The efi code appears that it doesn't benefit as much from this design as it could. For example, if you had a prepend command line with "nokaslr" then you might be helpful to re-enable it in the boot loader or dts, but there appears to be no way to re-enable kaslr or some of the other options. The efi command line handling is incorrect. x86 and arm have an append system however the efi code prepends the command line. For example, you could have a non-upgradable bios which sends efi=disable_early_pci_dma This hypothetically could have been set because early pci dma caused issues on early versions of the product. Then later the early pci dma was made to work and the company desired to start using it. To override the bios you could set the CONFIG_CMDLINE to, efi=no_disable_early_pci_dma then parsing would normally start with the bios command line, then move to the CONFIG_CMDLINE and you would end up with early pci dma turned on. however, current efi code keeps early pci dma off because the bios arguments always override the built in. Per my reading this is different from the main body of x86, arm, and arm64. The generic command line provides both append and prepend, so it alleviates this issue if it's used. However not all architectures use it. It would be desirable to allow the efi stub to have it's builtin command line to be modified after compile, but I don't see a feasible way to do that currently. Cc: xe-linux-exter...@cisco.com Signed-off-by: Daniel Walker --- .../firmware/efi/libstub/efi-stub-helper.c| 29 +++ drivers/firmware/efi/libstub/efi-stub.c | 9 ++ drivers/firmware/efi/libstub/efistub.h| 1 + drivers/firmware/efi/libstub/x86-stub.c | 13 +++-- 4 files changed, 50 insertions(+), 2 deletions(-) diff --git a/drivers/firmware/efi/libstub/efi-stub-helper.c b/drivers/firmware/efi/libstub/efi-stub-helper.c index aa8da0a49829..16318f55f187 100644 --- a/drivers/firmware/efi/libstub/efi-stub-helper.c +++ b/drivers/firmware/efi/libstub/efi-stub-helper.c @@ -13,6 +13,7 @@ #include #include #include /* For CONSOLE_LOGLEVEL_* */ +#include #include #include @@ -172,6 +173,34 @@ int efi_printk(const char *fmt, ...) return printed; } +/** + * efi_handle_cmdline() - handle adding in building parts of the command line + * @cmdline: kernel command line + * + * Add in the generic parts of the commandline and start the parsing of the + * command line. + * + * Return: status code + */ +efi_status_t efi_handle_cmdline(char const *cmdline) +{ + efi_status_t status = EFI_SUCCESS; + + if (sizeof(CMDLINE_STATIC_PREPEND) > 1) + status |= efi_parse_options(CMDLINE_STATIC_PREPEND); + + if (!IS_ENABLED(CONFIG_CMDLINE_OVERRIDE)) + status |= efi_parse_options(cmdline); + + if (sizeof(CMDLINE_STATIC_APPEND) > 1) + status |= efi_parse_options(CMDLINE_STATIC_APPEND); + + if (status != EFI_SUCCESS) + efi_err("Failed to parse options\n"); + + return status; +} + /** * efi_parse_options() - Parse EFI command line options * @cmdline: kernel command line diff --git a/drivers/firmware/efi/libstub/efi-stub.c b/drivers/firmware/efi/libstub/efi-stub.c index 26e69788f27a..baa69b24cfdd 100644 --- a/drivers/firmware/efi/libstub/efi-stub.c +++ b/drivers/firmware/efi/libstub/efi-stub.c @@ -172,6 +172,14 @@ efi_status_t __efiapi efi_pe_entry(efi_handle_t handle, goto fail; } +#ifdef CONFIG_GENERIC_CMDLINE + status = efi_handle_cmdline(cmdline_ptr); + if (status != EFI_SUCCESS) { + goto fail_free_cmdline; + } +#endif + +#ifdef CONFIG_CMDLINE if (IS_ENABLED(CONFIG_CMDLINE_EXTEND) || IS_ENABLED(CONFIG_CMDLINE_FORCE) || cmdline_size == 0) { @@ -189,6 +197,7 @@ efi_status_t __efiapi efi_pe_entry(efi_handle_t handle, goto fail_free_cmdline; } } +#endif efi_info("Booting Linux Kernel...\n"); diff --git a/drivers/firmware/efi/libstub/efistub.h b/drivers/firmware/efi/libstub/efistub.h index cde0a2ef507d..07c7f9fdfffc 100644 --- a/drivers/firmware/efi/libstub/efistub.h +++ b/drivers/firmware/efi/libstub/efistub.h @@ -800,6 +800,7 @@ efi_status_t efi_relocate_kernel(unsigned long *image_addr, unsigned long alignment, unsigned long min_addr); +efi_status_t efi_handle_cmdline(char const *cmdline); efi_status_t efi_parse_options(char const *cmdline); void efi_parse_option_graphics(char *option); diff --git a/drivers/firmware/efi/libstub/x86-stub.c b/drivers/firmware/efi/libstub/x86-stub.c index f14c4ff5839f..30ad8fb7122d 100644 --- a/drivers/firmware/efi/libstub/x86-stub.c +++ b/drivers/firmware/efi/libstub/x86-stub.c @@ -673,6 +673,8 @@ unsign
[PATCH 6/8] CMDLINE: x86: convert to generic builtin command line
This updates the x86 code to use the CONFIG_GENERIC_CMDLINE option. Cc: xe-linux-exter...@cisco.com Signed-off-by: Ruslan Ruslichenko Signed-off-by: Ruslan Bilovol Signed-off-by: Daniel Walker --- arch/x86/Kconfig| 44 + arch/x86/kernel/setup.c | 18 ++--- 2 files changed, 3 insertions(+), 59 deletions(-) diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig index 2792879d398e..73ea9589e50d 100644 --- a/arch/x86/Kconfig +++ b/arch/x86/Kconfig @@ -118,6 +118,7 @@ config X86 select EDAC_SUPPORT select GENERIC_CLOCKEVENTS_BROADCASTif X86_64 || (X86_32 && X86_LOCAL_APIC) select GENERIC_CLOCKEVENTS_MIN_ADJUST + select GENERIC_CMDLINE select GENERIC_CMOS_UPDATE select GENERIC_CPU_AUTOPROBE select GENERIC_CPU_VULNERABILITIES @@ -2358,49 +2359,6 @@ choice endchoice -config CMDLINE_BOOL - bool "Built-in kernel command line" - help - Allow for specifying boot arguments to the kernel at - build time. On some systems (e.g. embedded ones), it is - necessary or convenient to provide some or all of the - kernel boot arguments with the kernel itself (that is, - to not rely on the boot loader to provide them.) - - To compile command line arguments into the kernel, - set this option to 'Y', then fill in the - boot arguments in CONFIG_CMDLINE. - - Systems with fully functional boot loaders (i.e. non-embedded) - should leave this option set to 'N'. - -config CMDLINE - string "Built-in kernel command string" - depends on CMDLINE_BOOL - default "" - help - Enter arguments here that should be compiled into the kernel - image and used at boot time. If the boot loader provides a - command line at boot time, it is appended to this string to - form the full kernel command line, when the system boots. - - However, you can use the CONFIG_CMDLINE_OVERRIDE option to - change this behavior. - - In most cases, the command line (whether built-in or provided - by the boot loader) should specify the device for the root - file system. - -config CMDLINE_OVERRIDE - bool "Built-in command line overrides boot loader arguments" - depends on CMDLINE_BOOL && CMDLINE != "" - help - Set this option to 'Y' to have the kernel ignore the boot loader - command line, and use ONLY the built-in command line. - - This is used to work around broken boot loaders. This should - be set to 'N' under normal conditions. - config MODIFY_LDT_SYSCALL bool "Enable the LDT (local descriptor table)" if EXPERT default y diff --git a/arch/x86/kernel/setup.c b/arch/x86/kernel/setup.c index 5ecd69a48393..cd2aa33c44d7 100644 --- a/arch/x86/kernel/setup.c +++ b/arch/x86/kernel/setup.c @@ -47,6 +47,7 @@ #include #include #include +#include /* * max_low_pfn_mapped: highest directly mapped pfn < 4 GB @@ -161,9 +162,6 @@ unsigned long saved_video_mode; #define RAMDISK_LOAD_FLAG 0x4000 static char __initdata command_line[COMMAND_LINE_SIZE]; -#ifdef CONFIG_CMDLINE_BOOL -static char __initdata builtin_cmdline[COMMAND_LINE_SIZE] = CONFIG_CMDLINE; -#endif #if defined(CONFIG_EDD) || defined(CONFIG_EDD_MODULE) struct edd edd; @@ -883,19 +881,7 @@ void __init setup_arch(char **cmdline_p) bss_resource.start = __pa_symbol(__bss_start); bss_resource.end = __pa_symbol(__bss_stop)-1; -#ifdef CONFIG_CMDLINE_BOOL -#ifdef CONFIG_CMDLINE_OVERRIDE - strlcpy(boot_command_line, builtin_cmdline, COMMAND_LINE_SIZE); -#else - if (builtin_cmdline[0]) { - /* append boot loader cmdline to builtin */ - strlcat(builtin_cmdline, " ", COMMAND_LINE_SIZE); - strlcat(builtin_cmdline, boot_command_line, COMMAND_LINE_SIZE); - strlcpy(boot_command_line, builtin_cmdline, COMMAND_LINE_SIZE); - } -#endif -#endif - + cmdline_add_builtin(boot_command_line); strlcpy(command_line, boot_command_line, COMMAND_LINE_SIZE); *cmdline_p = command_line; -- 2.25.1
[PATCH 4/8] CMDLINE: mips: convert to generic builtin command line
This updates the mips code to use the CONFIG_GENERIC_CMDLINE option. This deletes the option for MIPS_CMDLINE_BUILTIN_EXTEND and replaces the functionality with generic code. Of note, the pic32 has some strange handling of the current built in command line. It was converted to use the static variant which can't be updated after compilation. It should eventually be updated to use to append and prepend symbols. This includes a scripted mass convert of the config files to use the new generic cmdline. There is a bit of a trim effect here. It would seems that some of the config haven't been trimmed in a while. The script used is as follows, if [[ -z "$1" || -z "$2" ]]; then echo "Two arguments are needed." exit 1 fi mkdir $1 cp $2 $1/.config sed -i 's/CONFIG_CMDLINE=/CONFIG_CMDLINE_BOOL=y\nCONFIG_CMDLINE_PREPEND=/g' $1/.config make ARCH=$1 O=$1 olddefconfig make ARCH=$1 O=$1 savedefconfig cp $1/defconfig $2 rm -Rf $1 Cc: xe-linux-exter...@cisco.com Signed-off-by: Ruslan Ruslichenko Signed-off-by: Ruslan Bilovol Signed-off-by: Daniel Walker --- arch/mips/Kconfig | 4 +-- arch/mips/Kconfig.debug | 44 --- arch/mips/configs/ar7_defconfig | 9 ++--- arch/mips/configs/bcm47xx_defconfig | 8 ++--- arch/mips/configs/bcm63xx_defconfig | 15 +++- arch/mips/configs/bmips_be_defconfig | 11 +++--- arch/mips/configs/bmips_stb_defconfig | 11 +++--- arch/mips/configs/capcella_defconfig | 11 ++ arch/mips/configs/ci20_defconfig | 10 +++--- arch/mips/configs/cu1000-neo_defconfig| 10 +++--- arch/mips/configs/cu1830-neo_defconfig| 10 +++--- arch/mips/configs/e55_defconfig | 4 +-- arch/mips/configs/generic_defconfig | 6 ++-- arch/mips/configs/gpr_defconfig | 18 ++ arch/mips/configs/loongson3_defconfig | 13 ++- arch/mips/configs/mpc30x_defconfig| 7 ++-- arch/mips/configs/tb0219_defconfig| 7 ++-- arch/mips/configs/tb0226_defconfig| 7 ++-- arch/mips/configs/tb0287_defconfig| 7 ++-- arch/mips/configs/workpad_defconfig | 11 +++--- arch/mips/include/asm/setup.h | 2 ++ arch/mips/kernel/relocate.c | 17 +++-- arch/mips/kernel/setup.c | 36 +++ arch/mips/pic32/pic32mzda/early_console.c | 2 +- arch/mips/pic32/pic32mzda/init.c | 3 +- 25 files changed, 78 insertions(+), 205 deletions(-) diff --git a/arch/mips/Kconfig b/arch/mips/Kconfig index d89efba3d8a4..0e753894d28d 100644 --- a/arch/mips/Kconfig +++ b/arch/mips/Kconfig @@ -24,6 +24,7 @@ config MIPS select CPU_NO_EFFICIENT_FFS if (TARGET_ISA_REV < 1) select CPU_PM if CPU_IDLE select GENERIC_ATOMIC64 if !64BIT + select GENERIC_CMDLINE select GENERIC_CMOS_UPDATE select GENERIC_CPU_AUTOPROBE select GENERIC_GETTIMEOFDAY @@ -3212,9 +3213,6 @@ choice config MIPS_CMDLINE_FROM_BOOTLOADER bool "Bootloader kernel arguments if available" - config MIPS_CMDLINE_BUILTIN_EXTEND - depends on CMDLINE_BOOL - bool "Extend builtin kernel arguments with bootloader arguments" endchoice endmenu diff --git a/arch/mips/Kconfig.debug b/arch/mips/Kconfig.debug index 7a8d94cdd493..b5a099c74eb6 100644 --- a/arch/mips/Kconfig.debug +++ b/arch/mips/Kconfig.debug @@ -30,50 +30,6 @@ config EARLY_PRINTK_8250 config USE_GENERIC_EARLY_PRINTK_8250 bool -config CMDLINE_BOOL - bool "Built-in kernel command line" - help - For most systems, it is firmware or second stage bootloader that - by default specifies the kernel command line options. However, - it might be necessary or advantageous to either override the - default kernel command line or add a few extra options to it. - For such cases, this option allows you to hardcode your own - command line options directly into the kernel. For that, you - should choose 'Y' here, and fill in the extra boot arguments - in CONFIG_CMDLINE. - - The built-in options will be concatenated to the default command - line if CMDLINE_OVERRIDE is set to 'N'. Otherwise, the default - command line will be ignored and replaced by the built-in string. - - Most MIPS systems will normally expect 'N' here and rely upon - the command line from the firmware or the second-stage bootloader. - -config CMDLINE - string "Default kernel command string" - depends on CMDLINE_BOOL - help - On some platforms, there is currently no way for the boot loader to - pass arguments to the kernel. For these platforms, and for the cases - when you want to add some extra options to the command line or ignore - the default comma
[PATCH 3/8] scripts: insert-sys-cert: change name to insert-symbol
Since the tool is used to update the command line and/or to update the certificates, I think it makes sense to changes the name of this tool. Update the name of the tool to better reflect it's new use. Cc: xe-linux-exter...@cisco.com Signed-off-by: Daniel Walker --- scripts/Makefile | 2 +- scripts/{insert-sys-cert.c => insert-symbol.c} | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) rename scripts/{insert-sys-cert.c => insert-symbol.c} (99%) diff --git a/scripts/Makefile b/scripts/Makefile index c36106bce80e..ed6b9f8f91fa 100644 --- a/scripts/Makefile +++ b/scripts/Makefile @@ -13,7 +13,7 @@ hostprogs-always-$(CONFIG_BUILDTIME_TABLE_SORT) += sorttable hostprogs-always-$(CONFIG_ASN1)+= asn1_compiler hostprogs-always-$(CONFIG_MODULE_SIG_FORMAT) += sign-file hostprogs-always-$(CONFIG_SYSTEM_TRUSTED_KEYRING) += extract-cert -hostprogs-always-$(CONFIG_SYSTEM_EXTRA_CERTIFICATE)+= insert-sys-cert +hostprogs-always-$(CONFIG_SYSTEM_EXTRA_CERTIFICATE)+= insert-symbol HOSTCFLAGS_sorttable.o = -I$(srctree)/tools/include HOSTCFLAGS_asn1_compiler.o = -I$(srctree)/include diff --git a/scripts/insert-sys-cert.c b/scripts/insert-symbol.c similarity index 99% rename from scripts/insert-sys-cert.c rename to scripts/insert-symbol.c index 77d3306cfbfb..6866e3a84974 100644 --- a/scripts/insert-sys-cert.c +++ b/scripts/insert-symbol.c @@ -7,7 +7,7 @@ * This software may be used and distributed according to the terms * of the GNU General Public License, incorporated herein by reference. * - * Usage: insert-sys-cert [-s -b -c + * Usage: insert-symbol [-s -b -c */ #define _GNU_SOURCE -- 2.25.1
[PATCH 2/8] scripts: insert-sys-cert: add command line insert capability
This adds changes to the insert-sys-cert tool to allow updating the cmdline_prepend and cmdline_append symbols in addition to adding certificates. Updating the cmdline symbols was tested on a PVH virtual machine with a vmlinux, and with a bzImage which was repackaged on x86. This commit intentionally keeps the tool filename the same to allow the changes to be seen more easily. The next commit will change the name of the tool. Cc: xe-linux-exter...@cisco.com Signed-off-by: Daniel Walker --- scripts/insert-sys-cert.c | 241 +++--- 1 file changed, 170 insertions(+), 71 deletions(-) diff --git a/scripts/insert-sys-cert.c b/scripts/insert-sys-cert.c index 8902836c2342..77d3306cfbfb 100644 --- a/scripts/insert-sys-cert.c +++ b/scripts/insert-sys-cert.c @@ -30,6 +30,9 @@ #define USED_SYM "system_extra_cert_used" #define LSIZE_SYM "system_certificate_list_size" +#define CMDLINE_APPEND "cmdline_append" +#define CMDLINE_PREPEND "cmdline_prepend" + #define info(format, args...) fprintf(stderr, "INFO:" format, ## args) #define warn(format, args...) fprintf(stdout, "WARNING: " format, ## args) #define err(format, args...) fprintf(stderr, "ERROR: " format, ## args) @@ -267,95 +270,46 @@ static void print_sym(Elf_Ehdr *hdr, struct sym *s) static void print_usage(char *e) { - printf("Usage %s [-s ] -b -c \n", e); + printf("Usage %s [-s ] -b [ -c | -p | -a ]-\n", e); } -int main(int argc, char **argv) +static char *cmdline_prepend, *cmdline_append; +static char *system_map_file; +static char *cert_file; +static char *cli_name; + +static int insert_certificate(Elf_Ehdr *hdr) { - char *system_map_file = NULL; - char *vmlinux_file = NULL; - char *cert_file = NULL; - int vmlinux_size; + struct sym cert_sym, lsize_sym, used_sym; + Elf_Shdr *symtab = NULL; + unsigned long *lsize; + FILE *system_map; int cert_size; - Elf_Ehdr *hdr; char *cert; - FILE *system_map; - unsigned long *lsize; int *used; - int opt; - Elf_Shdr *symtab = NULL; - struct sym cert_sym, lsize_sym, used_sym; - - while ((opt = getopt(argc, argv, "b:c:s:")) != -1) { - switch (opt) { - case 's': - system_map_file = optarg; - break; - case 'b': - vmlinux_file = optarg; - break; - case 'c': - cert_file = optarg; - break; - default: - break; - } - } - if (!vmlinux_file || !cert_file) { - print_usage(argv[0]); - exit(EXIT_FAILURE); + if (!cert_file) { + print_usage(cli_name); + return EXIT_FAILURE; } cert = read_file(cert_file, _size); if (!cert) - exit(EXIT_FAILURE); - - hdr = map_file(vmlinux_file, _size); - if (!hdr) - exit(EXIT_FAILURE); - - if (vmlinux_size < sizeof(*hdr)) { - err("Invalid ELF file.\n"); - exit(EXIT_FAILURE); - } - - if ((hdr->e_ident[EI_MAG0] != ELFMAG0) || - (hdr->e_ident[EI_MAG1] != ELFMAG1) || - (hdr->e_ident[EI_MAG2] != ELFMAG2) || - (hdr->e_ident[EI_MAG3] != ELFMAG3)) { - err("Invalid ELF magic.\n"); - exit(EXIT_FAILURE); - } - - if (hdr->e_ident[EI_CLASS] != CURRENT_ELFCLASS) { - err("ELF class mismatch.\n"); - exit(EXIT_FAILURE); - } - - if (hdr->e_ident[EI_DATA] != endianness()) { - err("ELF endian mismatch.\n"); - exit(EXIT_FAILURE); - } - - if (hdr->e_shoff > vmlinux_size) { - err("Could not find section header.\n"); - exit(EXIT_FAILURE); - } + return EXIT_FAILURE; symtab = get_symbol_table(hdr); if (!symtab) { warn("Could not find the symbol table.\n"); if (!system_map_file) { err("Please provide a System.map file.\n"); - print_usage(argv[0]); - exit(EXIT_FAILURE); + print_usage(cli_name); + return EXIT_FAILURE; } system_map = fopen(system_map_file, "r"); if (!system_map) { perror(system_map_file); - exit(EXIT_FAILURE); + return EXIT_FAILURE; } get_symbol_from_map(hdr, system_map, CERT_SYM, _sym); ge
[PATCH 1/8] CMDLINE: add generic builtin command line
This code allows architectures to use a generic builtin command line. The state of the builtin command line options across architecture is diverse. MIPS and X86 once has similar systems, then mips added some options to allow extending the command line. Powerpc did something simiar in adding the ability to extend. Even with mips and powerpc enhancement the needs of Cisco are not met on these platforms. The code in this commit unifies the code into a generic header file under the CONFIG_GENERIC_CMDLINE option. When this option is enabled the architecture can call the cmdline_add_builtin() to add the builtin command line. The generic code provides both append and/or prepend options and provides a way to redefine these option after the kernel is compiled. This code also includes test's which are meant to confirm functionality. This unified implementation offers the same functionality needed by Cisco on all platform which we enable it on. Cc: xe-linux-exter...@cisco.com Signed-off-by: Ruslan Bilovol Signed-off-by: Daniel Walker --- include/linux/cmdline.h | 103 + init/Kconfig| 78 ++ lib/Kconfig | 4 ++ lib/Makefile| 3 + lib/generic_cmdline.S | 53 +++ lib/test_cmdline1.c | 139 6 files changed, 380 insertions(+) create mode 100644 include/linux/cmdline.h create mode 100644 lib/generic_cmdline.S create mode 100644 lib/test_cmdline1.c diff --git a/include/linux/cmdline.h b/include/linux/cmdline.h new file mode 100644 index ..34d9d8d14672 --- /dev/null +++ b/include/linux/cmdline.h @@ -0,0 +1,103 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +#ifndef _LINUX_CMDLINE_H +#define _LINUX_CMDLINE_H +/* + * + * Copyright (C) 2006,2021. Cisco Systems, Inc. + * + * Generic Append/Prepend cmdline support. + */ + + +#include +#include + +#ifdef CONFIG_CMDLINE_BOOL +extern char cmdline_prepend[]; +extern char cmdline_append[]; +extern char cmdline_tmp[]; +#define CMDLINE_PREPEND cmdline_prepend +#define CMDLINE_APPEND cmdline_append +#define CMDLINE_TMP cmdline_tmp +#define CMDLINE_STATIC_PREPEND CONFIG_CMDLINE_PREPEND +#define CMDLINE_STATIC_APPEND CONFIG_CMDLINE_APPEND +#else +#define CMDLINE_PREPEND "" +#define CMDLINE_APPEND "" +#define CMDLINE_TMP "" +#define CMDLINE_STATIC_PREPEND "" +#define CMDLINE_STATIC_APPEND "" +#endif + +#ifndef CMDLINE_STRLCAT +#define CMDLINE_STRLCAT strlcat +#endif + +#ifndef CMDLINE_STRLEN +#define CMDLINE_STRLEN strlen +#endif + +/* + * This function will append or prepend a builtin command line to the command + * line provided by the bootloader. Kconfig options can be used to alter + * the behavior of this builtin command line. + * @dest: The destination of the final appended/prepended string + * @tmp: temporary space used for prepending + * @prepend: string to prepend to @dest + * @append: string to append to @dest + * @length: the maximum length of the strings above. + * @cmdline_strlen: point to a compatible strlen + * @cmdline_strlcat: point to a compatible strlcat + * This function returns true when the builtin command line was copied successfully + * and false when there was not enough room to copy all parts of the command line. + */ +static inline bool +__cmdline_add_builtin( + char *dest, + char *tmp, + char *prepend, + char *append, + unsigned long length, + size_t (*cmdline_strlen)(const char *s), + size_t (*cmdline_strlcat)(char *dest, const char *src, size_t count)) +{ + size_t total_length = 0, tmp_length; + + if (!IS_ENABLED(CONFIG_GENERIC_CMDLINE)) + return true; + + if (!IS_ENABLED(CONFIG_CMDLINE_BOOL)) + return true; + + if (IS_ENABLED(CONFIG_CMDLINE_OVERRIDE)) + dest[0] = '\0'; + else + total_length += cmdline_strlen(dest); + + tmp_length = cmdline_strlen(append); + if (tmp_length > 0) { + cmdline_strlcat(dest, append, length); + total_length += tmp_length; + } + + tmp_length = cmdline_strlen(prepend); + if (tmp_length > 0) { + cmdline_strlcat(tmp, prepend, length); + cmdline_strlcat(tmp, dest, length); + dest[0] = '\0'; + cmdline_strlcat(dest, tmp, length); + total_length += tmp_length; + } + + tmp[0] = '\0'; + + if (total_length > length) + return false; + + return true; +} + +#define cmdline_add_builtin(dest) \ + __cmdline_add_builtin(dest, CMDLINE_TMP, CMDLINE_PREPEND, CMDLINE_APPEND, COMMAND_LINE_SIZE, CMDLINE_STRLEN, CMDLINE_STRLCAT) + +#endif diff --git a/init/Kconfig b/init/Kconfig index 5f5c776ef192..d72eb5a804c6 100644 --- a/init/Kconfig +++ b/init/Kconfig @@ -2034,6 +2034,84 @@
[PATCH 0/8] generic command line v4
v4 release changes * Updated insert-sys-cert tool to change command line symbols after compilation. This tool is used to release binary kernels internally to companies and then later insert certificates for each product by consumers of the binary kernel. Cisco uses this tool for this purpose. Cisco has a similar need for the command line to be modified on a binary released kernels similar to how certificates are setup. * Added global symbols to hold append and prepend values. These changes follow the system certificate code to allow the insert-sys-cert tool to be used. * Added a test case to confirm functionality. Seemed sensible to add this to make sure everything is working. * Dropped powerpc changes Christophe Leroy has reservations about the features for powerpc. I don't think his reservations are founded, and these changes should fully work on powerpc. However, I dropped these changes so Christophe can have more time to get comfortable with the changes. Enjoy! Daniel Walker (8): CMDLINE: add generic builtin command line scripts: insert-sys-cert: add command line insert capability scripts: insert-sys-cert: change name to insert-symbol CMDLINE: mips: convert to generic builtin command line drivers: firmware: efi: libstub: enable generic commandline CMDLINE: x86: convert to generic builtin command line of: allow sending a NULL value to early_init_dt_scan_chosen CMDLINE: arm64: convert to generic builtin command line arch/arm64/Kconfig| 33 +-- arch/arm64/include/asm/setup.h| 2 + arch/arm64/kernel/idreg-override.c| 9 +- arch/mips/Kconfig | 4 +- arch/mips/Kconfig.debug | 44 arch/mips/configs/ar7_defconfig | 9 +- arch/mips/configs/bcm47xx_defconfig | 8 +- arch/mips/configs/bcm63xx_defconfig | 15 +- arch/mips/configs/bmips_be_defconfig | 11 +- arch/mips/configs/bmips_stb_defconfig | 11 +- arch/mips/configs/capcella_defconfig | 11 +- arch/mips/configs/ci20_defconfig | 10 +- arch/mips/configs/cu1000-neo_defconfig| 10 +- arch/mips/configs/cu1830-neo_defconfig| 10 +- arch/mips/configs/e55_defconfig | 4 +- arch/mips/configs/generic_defconfig | 6 +- arch/mips/configs/gpr_defconfig | 18 +- arch/mips/configs/loongson3_defconfig | 13 +- arch/mips/configs/mpc30x_defconfig| 7 +- arch/mips/configs/tb0219_defconfig| 7 +- arch/mips/configs/tb0226_defconfig| 7 +- arch/mips/configs/tb0287_defconfig| 7 +- arch/mips/configs/workpad_defconfig | 11 +- arch/mips/include/asm/setup.h | 2 + arch/mips/kernel/relocate.c | 17 +- arch/mips/kernel/setup.c | 36 +-- arch/mips/pic32/pic32mzda/early_console.c | 2 +- arch/mips/pic32/pic32mzda/init.c | 3 +- arch/x86/Kconfig | 44 +--- arch/x86/kernel/setup.c | 18 +- .../firmware/efi/libstub/efi-stub-helper.c| 29 +++ drivers/firmware/efi/libstub/efi-stub.c | 9 + drivers/firmware/efi/libstub/efistub.h| 1 + drivers/firmware/efi/libstub/x86-stub.c | 13 +- drivers/of/fdt.c | 44 ++-- include/linux/cmdline.h | 103 init/Kconfig | 78 ++ lib/Kconfig | 4 + lib/Makefile | 3 + lib/generic_cmdline.S | 53 lib/test_cmdline1.c | 139 ++ scripts/Makefile | 2 +- .../{insert-sys-cert.c => insert-symbol.c}| 243 -- 43 files changed, 716 insertions(+), 394 deletions(-) create mode 100644 include/linux/cmdline.h create mode 100644 lib/generic_cmdline.S create mode 100644 lib/test_cmdline1.c rename scripts/{insert-sys-cert.c => insert-symbol.c} (72%) -- 2.25.1
Re: [PATCH 2/8] CMDLINE: drivers: of: ifdef out cmdline section
On Wed, Apr 07, 2021 at 05:59:15PM -0500, Rob Herring wrote: > On Tue, Mar 30, 2021 at 04:17:53PM -0700, Daniel Walker wrote: > > On Tue, Mar 30, 2021 at 02:49:13PM -0500, Rob Herring wrote: > > > On Tue, Mar 30, 2021 at 12:57 PM Daniel Walker wrote: > > > > > > > > It looks like there's some seepage of cmdline stuff into > > > > the generic device tree code. This conflicts with the > > > > generic cmdline implementation so I remove it in the case > > > > when that's enabled. > > > > > > > > Cc: xe-linux-exter...@cisco.com > > > > Signed-off-by: Ruslan Ruslichenko > > > > Signed-off-by: Daniel Walker > > > > --- > > > > drivers/of/fdt.c | 14 ++ > > > > 1 file changed, 14 insertions(+) > > > > > > > > diff --git a/drivers/of/fdt.c b/drivers/of/fdt.c > > > > index dcc1dd96911a..d8805cd9717a 100644 > > > > --- a/drivers/of/fdt.c > > > > +++ b/drivers/of/fdt.c > > > > @@ -25,6 +25,7 @@ > > > > #include > > > > #include > > > > #include > > > > +#include > > > > > > > > #include /* for COMMAND_LINE_SIZE */ > > > > #include > > > > @@ -1050,6 +1051,18 @@ int __init early_init_dt_scan_chosen(unsigned > > > > long node, const char *uname, > > > > > > > > /* Retrieve command line */ > > > > p = of_get_flat_dt_prop(node, "bootargs", ); > > > > + > > > > +#if defined(CONFIG_GENERIC_CMDLINE) && > > > > defined(CONFIG_GENERIC_CMDLINE_OF) > > > > > > Moving in the wrong direction... This code already has too many > > > #ifdef's. I like Christophe's version as it gets rid of all the code > > > here. > > > > It's temporary .. Notice CONFIG_GENERIC_CMDLINE_OF is only used on PowerPC. > > I > > experienced doubling on arm64 when this was used (i.e. the append and > > prepend > > was added twice). > > > > I don't think there are any other users which can't be moved outside the > > device > > tree code, but powerpc uses this function three times during boot up plus > > the > > prom_init user. It's possible to use the generic command line in all four > > places, > > but it become space inefficient. > > What's the 3rd use? I count kaslr code and in > early_init_dt_scan_chosen_ppc. Do we need to build the command line for > kaslr seed? Getting any build time value from the kernel is pointless. I think I may have been mistaken. I added a dump_stack() , but there may have been other stack traces during bootup on prior -rcX's I was testing. I re-ran the test and I only see one user on powerpc and powerpc64, powerpc64, [T0] Call Trace: [T0] [c1517d00] [c077e910] dump_stack+0xc4/0x114 (unreliable) [T0] [c1517d50] [c1186fb4] early_init_dt_scan_chosen+0x238/0x324 [T0] [c1517de0] [c1138b00] early_init_dt_scan_chosen_ppc+0x20/0x194 [T0] [c1517e10] [c1186ae0] of_scan_flat_dt+0xc8/0x130 [T0] [c1517e70] [c1139404] early_init_devtree+0xa4/0x48c [T0] [c1517f10] [c113ac90] early_setup+0xc8/0x254 [T0] [c1517f90] [c754] 0xc754 powerpc32, Call Trace: [c06bbee0] [c067e334] early_init_dt_scan_chosen+0xf8/0x1dc (unreliable) [c06bbf10] [c0666ec4] early_init_dt_scan_chosen_ppc+0x18/0x6c [c06bbf30] [c067e048] of_scan_flat_dt+0x98/0xf4 [c06bbf70] [c0667234] early_init_devtree+0x48/0x2d0 [c06bbfb0] [c06679cc] machine_init+0x98/0xcc [c06bbff0] [c398] set_ivor+0x114/0x154 I think it would be possible to just move the generic handling entire into architecture code. Daniel
Re: [PATCH v4 19/20] mips: Convert to GENERIC_CMDLINE
On Thu, Apr 08, 2021 at 02:04:08PM -0500, Rob Herring wrote: > On Tue, Apr 06, 2021 at 10:38:36AM -0700, Daniel Walker wrote: > > On Fri, Apr 02, 2021 at 03:18:21PM +, Christophe Leroy wrote: > > > -config CMDLINE_BOOL > > > - bool "Built-in kernel command line" > > > - help > > > - For most systems, it is firmware or second stage bootloader that > > > - by default specifies the kernel command line options. However, > > > - it might be necessary or advantageous to either override the > > > - default kernel command line or add a few extra options to it. > > > - For such cases, this option allows you to hardcode your own > > > - command line options directly into the kernel. For that, you > > > - should choose 'Y' here, and fill in the extra boot arguments > > > - in CONFIG_CMDLINE. > > > - > > > - The built-in options will be concatenated to the default command > > > - line if CMDLINE_OVERRIDE is set to 'N'. Otherwise, the default > > > - command line will be ignored and replaced by the built-in string. > > > - > > > - Most MIPS systems will normally expect 'N' here and rely upon > > > - the command line from the firmware or the second-stage bootloader. > > > - > > > > > > See how you complained that I have CMDLINE_BOOL in my changed, and you > > think it > > shouldn't exist. > > > > Yet here mips has it, and you just deleted it with no feature parity in your > > changes for this. > > AFAICT, CMDLINE_BOOL equates to a non-empty or empty CONFIG_CMDLINE. You > seem to need it just because you have CMDLINE_PREPEND and > CMDLINE_APPEND. If that's not it, what feature is missing? CMDLINE_BOOL > is not a feature, but an implementation detail. Not true. It makes it easier to turn it all off inside the Kconfig , so it's for usability and multiple architecture have it even with just CMDLINE as I was commenting here. Daniel
Re: [PATCH v4 19/20] mips: Convert to GENERIC_CMDLINE
On Fri, Apr 02, 2021 at 03:18:21PM +, Christophe Leroy wrote: > -config CMDLINE_BOOL > - bool "Built-in kernel command line" > - help > - For most systems, it is firmware or second stage bootloader that > - by default specifies the kernel command line options. However, > - it might be necessary or advantageous to either override the > - default kernel command line or add a few extra options to it. > - For such cases, this option allows you to hardcode your own > - command line options directly into the kernel. For that, you > - should choose 'Y' here, and fill in the extra boot arguments > - in CONFIG_CMDLINE. > - > - The built-in options will be concatenated to the default command > - line if CMDLINE_OVERRIDE is set to 'N'. Otherwise, the default > - command line will be ignored and replaced by the built-in string. > - > - Most MIPS systems will normally expect 'N' here and rely upon > - the command line from the firmware or the second-stage bootloader. > - See how you complained that I have CMDLINE_BOOL in my changed, and you think it shouldn't exist. Yet here mips has it, and you just deleted it with no feature parity in your changes for this. In my changes I tried to maintain as much feature parity as I could with the architectures. I did the same huge conversion a long time ago you've done here to be sure all platforms have the features needed. Daniel
Re: [PATCH v4 00/20] Implement GENERIC_CMDLINE
On Fri, Apr 02, 2021 at 03:18:01PM +, Christophe Leroy wrote: > The purpose of this series is to improve and enhance the > handling of kernel boot arguments. > > Current situation is that most if not all architectures are using > similar options to do some manupulation on command line arguments: > - Prepend built-in arguments in front of bootloader provided arguments > - Append built-in arguments after bootloader provided arguments > - Replace bootloader provided arguments by built-in arguments > - Use built-in arguments when none is provided by bootloader. > > On some architectures, all the options are possible. On other ones, > only a subset are available. > > The purpose of this series is to refactor and enhance the > handling of kernel boot arguments so that every architecture can > benefit from all possibilities. > > It is first focussed on powerpc but also extends the capability > for other arches. > > The work has been focussed on minimising the churn in architectures > by keeping the most commonly used namings. > > Main changes in V4: > - Included patch from Daniel to replace powerpc's strcpy() by strlcpy() > - Using strlcpy() instead of zeroing first char + strlcat() (idea taken frm > Daniel's series) > - Reworked the convertion of EFI which was wrong in V3 > - Added "too long" command line handling > - Changed cmdline macro into a function > - Done a few fixes in arch (NIOS2, SH, ARM) > - Taken comments into account (see individual responses for details) > - Tested on powerpc, build tested on ARM64, X86_64. > Why submit your changes ? My changes have been around for almost 10 years, and are more widely used. Your changes are very new and unstable, but don't really solve the needs of people using my series. I've tried to work with you and I take comments from you, but yet you insist to submit your own series. I would suggest this isn't going to go anyplace unless we work together. I can't really support your changes because, honestly, your changes are really ugly and they just look more and more like my changes with every passing iteration .. As the maturity of your changes continue they will just become my change set. I've been thru every iteration of these changes, and I see those attempts in your changes. Everything different in your changes I've tried, and found not to be useful, then it falls away in later iterations. When you give me comments on something which I haven't tried I typically incorporate it. Daniel
Re: [PATCH 6/8] drivers: firmware: efi: libstub: enable generic commandline
On Fri, Apr 02, 2021 at 07:36:53PM +0200, Christophe Leroy wrote: > > > Le 30/03/2021 à 19:57, Daniel Walker a écrit : > > This adds code to handle the generic command line changes. > > The efi code appears that it doesn't benefit as much from this design > > as it could. > > > > For example, if you had a prepend command line with "nokaslr" then > > you might be helpful to re-enable it in the boot loader or dts, > > but there appears to be no way to re-enable kaslr or some of the > > other options. > > > > Cc: xe-linux-exter...@cisco.com > > Signed-off-by: Daniel Walker > > --- > > .../firmware/efi/libstub/efi-stub-helper.c| 35 +++ > > drivers/firmware/efi/libstub/efi-stub.c | 7 > > drivers/firmware/efi/libstub/efistub.h| 1 + > > drivers/firmware/efi/libstub/x86-stub.c | 13 +-- > > 4 files changed, 54 insertions(+), 2 deletions(-) > > > > diff --git a/drivers/firmware/efi/libstub/efi-stub-helper.c > > b/drivers/firmware/efi/libstub/efi-stub-helper.c > > index aa8da0a49829..c155837cedc9 100644 > > --- a/drivers/firmware/efi/libstub/efi-stub-helper.c > > +++ b/drivers/firmware/efi/libstub/efi-stub-helper.c > > @@ -13,6 +13,7 @@ > > #include > > #include > > #include /* For CONSOLE_LOGLEVEL_* */ > > +#include > > #include > > #include > > @@ -172,6 +173,40 @@ int efi_printk(const char *fmt, ...) > > return printed; > > } > > +/** > > + * efi_handle_cmdline() - handle adding in building parts of the command > > line > > + * @cmdline: kernel command line > > + * > > + * Add in the generic parts of the commandline and start the parsing of the > > + * command line. > > + * > > + * Return: status code > > + */ > > +efi_status_t efi_handle_cmdline(char const *cmdline) > > +{ > > + efi_status_t status; > > + > > + status = efi_parse_options(CMDLINE_PREPEND); > > + if (status != EFI_SUCCESS) { > > + efi_err("Failed to parse options\n"); > > + return status; > > + } > > + > > + status = efi_parse_options(IS_ENABLED(CONFIG_CMDLINE_OVERRIDE) ? "" : > > cmdline); > > + if (status != EFI_SUCCESS) { > > + efi_err("Failed to parse options\n"); > > + return status; > > + } > > + > > + status = efi_parse_options(CMDLINE_APPEND); > > + if (status != EFI_SUCCESS) { > > + efi_err("Failed to parse options\n"); > > + return status; > > + } > > + > > + return EFI_SUCCESS; > > +} > > I think we can refactor to first build the final command line, then call > efi_parse_options() only once after that. I tried this, like what you did in your v4 .. The issues are similar to the prom_init.c problems. The environment is delicate and requires careful programming to get it done correctly. > The big advantage of GENERIC_CMDLINE should be to not address anymore > CONFIG_CMDLINE_XXX options at all outside of linux/cmdline.h I agree , but not I've found that it's not likely to get this all changed in a single series. Daniel
Re: [PATCH 4/8] CMDLINE: powerpc: convert to generic builtin command line
On Fri, Apr 02, 2021 at 07:34:19PM +0200, Christophe Leroy wrote: > > > Le 30/03/2021 à 19:56, Daniel Walker a écrit : > > This updates the powerpc code to use the CONFIG_GENERIC_CMDLINE > > option. > > > > This includes a scripted mass convert of the config files to use > > the new generic cmdline. There is a bit of a trim effect here. > > It would seems that some of the config haven't been trimmed in > > a while. > > Sorry, this patch is not acceptable as is, the default for powerpc is > CMDLINE_FROM_BOOTLOADER, ie builtin-cmdline is taken if and only if none is > provided by the bootloader. > > As far as I understand, that disappear with this patch. We've talked about it previously. Maybe your not understanding the precedent of the command line options. I tried to explain that one before. What problems do you think are caused if this patch is applied ? Daniel
Re: [PATCH 2/8] CMDLINE: drivers: of: ifdef out cmdline section
On Fri, Apr 02, 2021 at 07:32:08PM +0200, Christophe Leroy wrote: > > > Le 30/03/2021 à 19:56, Daniel Walker a écrit : > > It looks like there's some seepage of cmdline stuff into > > the generic device tree code. This conflicts with the > > generic cmdline implementation so I remove it in the case > > when that's enabled. > > > > Cc: xe-linux-exter...@cisco.com > > Signed-off-by: Ruslan Ruslichenko > > Signed-off-by: Daniel Walker > > --- > > drivers/of/fdt.c | 14 ++ > > 1 file changed, 14 insertions(+) > > > > diff --git a/drivers/of/fdt.c b/drivers/of/fdt.c > > index dcc1dd96911a..d8805cd9717a 100644 > > --- a/drivers/of/fdt.c > > +++ b/drivers/of/fdt.c > > @@ -25,6 +25,7 @@ > > #include > > #include > > #include > > +#include > > #include /* for COMMAND_LINE_SIZE */ > > #include > > @@ -1050,6 +1051,18 @@ int __init early_init_dt_scan_chosen(unsigned long > > node, const char *uname, > > /* Retrieve command line */ > > p = of_get_flat_dt_prop(node, "bootargs", ); > > + > > +#if defined(CONFIG_GENERIC_CMDLINE) && defined(CONFIG_GENERIC_CMDLINE_OF) > > + /* > > +* The builtin command line will be added here, or it can override > > +* with the DT bootargs. > > +*/ > > + cmdline_add_builtin(data, > > + (l > 0 ? p : NULL), /* This is sanity checking */ > > + COMMAND_LINE_SIZE); > > +#elif defined(CONFIG_GENERIC_CMDLINE) > > + strlcpy(data, p, COMMAND_LINE_SIZE); > > +#else > > Ugly. > > Linux codying style recommend to limit the use of #ifdefs to headers as much > as possible. > > Why do we need so many alternatives ? Allthough they are temporary, can we > order the changes in another way to reduce that ? I think this whole section can be removed down even all the CMDLINE ifdef's .. The only architecture which needs this is powerpc because it calls this function three times. If powerpc were made to call this only once , and then call the generic handling for the command line then this whole section would get removed. Daniel
Re: [PATCH v2 3/7] powerpc: convert config files to generic cmdline
On Thu, Apr 01, 2021 at 03:08:04PM -0500, Rob Herring wrote: > On Tue, Mar 30, 2021 at 6:31 PM Daniel Walker wrote: > > > > On Tue, Mar 30, 2021 at 03:13:04PM -0500, Rob Herring wrote: > > > On Tue, Mar 30, 2021 at 12:33 PM Daniel Walker wrote: > > > > > > > > On Thu, Mar 25, 2021 at 05:29:44PM -0600, Rob Herring wrote: > > > > > On Thu, Mar 25, 2021 at 2:00 PM Daniel Walker > > > > > wrote: > > > > > > > > > > > > On Thu, Mar 25, 2021 at 01:03:55PM +0100, Christophe Leroy wrote: > > > > > > > > > > > > > > Ok, so you agree we don't need to provide two CMDLINE, one to be > > > > > > > appended and one to be prepended. > > > > > > > > > > > > > > Let's only provide once CMDLINE as of today, and ask the user to > > > > > > > select > > > > > > > whether he wants it appended or prepended or replacee. Then no > > > > > > > need to > > > > > > > change all existing config to rename CONFIG_CMDLINE into either > > > > > > > of the new > > > > > > > ones. > > > > > > > > > > > > > > That's the main difference between my series and Daniel's series. > > > > > > > So I'll > > > > > > > finish taking Will's comment into account and we'll send out a v3 > > > > > > > soon. > > > > > > > > > > > > It doesn't solve the needs of Cisco, I've stated many times your > > > > > > changes have > > > > > > little value. Please stop submitting them. > > > > > > > > > > Can you please outline what those needs are which aren't met? > > > > > > > > append AND prepend at the same time on all architectures. Christophe > > > > doesn't > > > > understand the need, and hence tries to minimize the feature set which > > > > is > > > > incompatible with Cisco needs and all the other out of tree users. > > > > > > Okay, but that's never been a feature in upstream. For upstream, we > > > refactor first and add features 2nd. In this case, the difference is > > > largely the kconfig and it would be better to not change the options > > > twice, but that's not a blocker for taking the refactoring. You won't > > > find a maintainer that's going to take adding a feature over cleanups > > > and unification. > > > > It kind of is a feature in upstream, it's a matter of opinion. Some platform > > used append and some use prepend, and it's likely because the maintainers > > needed > > one or the other for development. > > Which arch/platform upstream does both prepend and append at the same time? None do it at the same time, however x86 and mips have switched between the two. > > I'm not sure why you think I can't add the features in one go. It would be > > horrid to take Christophe's changes, then have to do basically all the same > > work > > a second time which is what Christophe's changes would force me to do. > > I didn't say it couldn't be done. In fact, I said it would be better > all at once: "it would be better to not change the options twice" > > But both of you ignoring comments and continuing to post competing > series is not going to get us there. TBC, I think Christophe's series > is much closer to being in shape to merge upstream. I'm not the one ignoring comments .. I've taken a number of comments from Christophe, but he still submits his own series.. Christophe series doesn't look good to me.. I suspect you like it cause it deletes lines from of. > > Say for example I implement this change only on one architecture. In that > > case > > the maintainer would be accepting a feature enhancement , but there would > > be no > > stopping it. I shouldn't have to go two strokes on one architecture, but > > each > > change I'm making is essentially a single architecture. They can go in all > > together or one at a time. > > Features do get implemented all the time on one arch. And then maybe a > 2nd and 3rd. At some point we decide no more copying, it needs to be > common and refactored. We're at that point for cmdline handling IMO. I don't think it can be done with one series all at once .. Daniel
Re: [PATCH 6/8] drivers: firmware: efi: libstub: enable generic commandline
On Wed, Mar 31, 2021 at 06:10:08PM +0200, Ard Biesheuvel wrote: > (+ Arvind) > > On Tue, 30 Mar 2021 at 19:57, Daniel Walker wrote: > > > > This adds code to handle the generic command line changes. > > The efi code appears that it doesn't benefit as much from this design > > as it could. > > > > For example, if you had a prepend command line with "nokaslr" then > > you might be helpful to re-enable it in the boot loader or dts, > > but there appears to be no way to re-enable kaslr or some of the > > other options. > > > > Cc: xe-linux-exter...@cisco.com > > Signed-off-by: Daniel Walker > > --- > > .../firmware/efi/libstub/efi-stub-helper.c| 35 +++ > > drivers/firmware/efi/libstub/efi-stub.c | 7 > > drivers/firmware/efi/libstub/efistub.h| 1 + > > drivers/firmware/efi/libstub/x86-stub.c | 13 +-- > > 4 files changed, 54 insertions(+), 2 deletions(-) > > > > diff --git a/drivers/firmware/efi/libstub/efi-stub-helper.c > > b/drivers/firmware/efi/libstub/efi-stub-helper.c > > index aa8da0a49829..c155837cedc9 100644 > > --- a/drivers/firmware/efi/libstub/efi-stub-helper.c > > +++ b/drivers/firmware/efi/libstub/efi-stub-helper.c > > @@ -13,6 +13,7 @@ > > #include > > #include > > #include /* For CONSOLE_LOGLEVEL_* */ > > +#include > > #include > > #include > > > > @@ -172,6 +173,40 @@ int efi_printk(const char *fmt, ...) > > return printed; > > } > > > > +/** > > + * efi_handle_cmdline() - handle adding in building parts of the command > > line > > + * @cmdline: kernel command line > > + * > > + * Add in the generic parts of the commandline and start the parsing of the > > + * command line. > > + * > > + * Return: status code > > + */ > > +efi_status_t efi_handle_cmdline(char const *cmdline) > > +{ > > + efi_status_t status; > > + > > + status = efi_parse_options(CMDLINE_PREPEND); > > + if (status != EFI_SUCCESS) { > > + efi_err("Failed to parse options\n"); > > + return status; > > + } > > Even though I am not a fan of the 'success handling' pattern, > duplicating the exact same error handling three times is not great > either. Could we reuse more of the code here? How about efi_status_t status = 0; status |= efi_parse_options(CMDLINE_PREPEND); then error checking once ? > > + > > + status = efi_parse_options(IS_ENABLED(CONFIG_CMDLINE_OVERRIDE) ? "" > > : cmdline); > > What is the point of calling efi_parse_options() with an empty string? I could change it to if ((IS_ENABLED(CONFIG_CMDLINE_OVERRIDE)) ? > > --- a/drivers/firmware/efi/libstub/efi-stub.c > > +++ b/drivers/firmware/efi/libstub/efi-stub.c > > @@ -172,6 +172,12 @@ efi_status_t __efiapi efi_pe_entry(efi_handle_t handle, > > goto fail; > > } > > > > +#ifdef CONFIG_GENERIC_CMDLINE > > + status = efi_handle_cmdline(cmdline_ptr); > > + if (status != EFI_SUCCESS) { > > + goto fail_free_cmdline; > > + } > > +#else > > if (IS_ENABLED(CONFIG_CMDLINE_EXTEND) || > > IS_ENABLED(CONFIG_CMDLINE_FORCE) || > > Does this mean CONFIG_GENERIC_CMDLINE does not replace CMDLINE_EXTEND > / CMDLINE_FORCE etc, but introduces yet another variant on top of > those? > > That does not seem like an improvement to me. I think it is great that > you are cleaning this up, but only if it means we can get rid of the > old implementation. It does replace extend and force. I was under the impression this code was shared between arm64 and arm32. If that's not the case I can delete the extend and force section. I haven't submitted a conversion for arm32 yet. Daniel
Re: [PATCH v2 3/7] powerpc: convert config files to generic cmdline
On Wed, Mar 31, 2021 at 12:52:19PM +0100, Will Deacon wrote: > On Tue, Mar 30, 2021 at 10:35:21AM -0700, Daniel Walker wrote: > > On Mon, Mar 29, 2021 at 11:07:51AM +0100, Will Deacon wrote: > > > On Thu, Mar 25, 2021 at 12:59:56PM -0700, Daniel Walker wrote: > > > > On Thu, Mar 25, 2021 at 01:03:55PM +0100, Christophe Leroy wrote: > > > > > > > > > > Ok, so you agree we don't need to provide two CMDLINE, one to be > > > > > appended and one to be prepended. > > > > > > > > > > Let's only provide once CMDLINE as of today, and ask the user to > > > > > select > > > > > whether he wants it appended or prepended or replacee. Then no need to > > > > > change all existing config to rename CONFIG_CMDLINE into either of > > > > > the new > > > > > ones. > > > > > > > > > > That's the main difference between my series and Daniel's series. So > > > > > I'll > > > > > finish taking Will's comment into account and we'll send out a v3 > > > > > soon. > > > > > > > > It doesn't solve the needs of Cisco, I've stated many times your > > > > changes have > > > > little value. Please stop submitting them. > > > > > > FWIW, they're useful for arm64 and I will gladly review the updated > > > series. > > > > > > I don't think asking people to stop submitting patches is ever the right > > > answer. Please don't do that. > > > > Why ? It's me nacking his series, is that not allowed anymore ? > > If you're that way inclined then you can "nack" whatever you want, but > please allow the rest of us to continue reviewing the patches. You don't > have any basis on which to veto other people's contributions and so > demanding that somebody stops posting code is neither constructive nor > meaningful. I understand , but that's not what's happening. I've dealt with Christophe on these changes repeatedly, and he's demonstrated he doesn't understand the feature set or the motivation of the changes. I've tried to work with him in the past, but it doesn't work unless he's giving me comments on my changes. His changes don't solve Cisco problems, and likely never will regardless of feedback. Maybe that could change, but I don't see that happening. Daniel
Re: [PATCH v2 3/7] powerpc: convert config files to generic cmdline
On Tue, Mar 30, 2021 at 03:13:04PM -0500, Rob Herring wrote: > On Tue, Mar 30, 2021 at 12:33 PM Daniel Walker wrote: > > > > On Thu, Mar 25, 2021 at 05:29:44PM -0600, Rob Herring wrote: > > > On Thu, Mar 25, 2021 at 2:00 PM Daniel Walker wrote: > > > > > > > > On Thu, Mar 25, 2021 at 01:03:55PM +0100, Christophe Leroy wrote: > > > > > > > > > > Ok, so you agree we don't need to provide two CMDLINE, one to be > > > > > appended and one to be prepended. > > > > > > > > > > Let's only provide once CMDLINE as of today, and ask the user to > > > > > select > > > > > whether he wants it appended or prepended or replacee. Then no need to > > > > > change all existing config to rename CONFIG_CMDLINE into either of > > > > > the new > > > > > ones. > > > > > > > > > > That's the main difference between my series and Daniel's series. So > > > > > I'll > > > > > finish taking Will's comment into account and we'll send out a v3 > > > > > soon. > > > > > > > > It doesn't solve the needs of Cisco, I've stated many times your > > > > changes have > > > > little value. Please stop submitting them. > > > > > > Can you please outline what those needs are which aren't met? > > > > append AND prepend at the same time on all architectures. Christophe doesn't > > understand the need, and hence tries to minimize the feature set which is > > incompatible with Cisco needs and all the other out of tree users. > > Okay, but that's never been a feature in upstream. For upstream, we > refactor first and add features 2nd. In this case, the difference is > largely the kconfig and it would be better to not change the options > twice, but that's not a blocker for taking the refactoring. You won't > find a maintainer that's going to take adding a feature over cleanups > and unification. It kind of is a feature in upstream, it's a matter of opinion. Some platform used append and some use prepend, and it's likely because the maintainers needed one or the other for development. I'm not sure why you think I can't add the features in one go. It would be horrid to take Christophe's changes, then have to do basically all the same work a second time which is what Christophe's changes would force me to do. Say for example I implement this change only on one architecture. In that case the maintainer would be accepting a feature enhancement , but there would be no stopping it. I shouldn't have to go two strokes on one architecture, but each change I'm making is essentially a single architecture. They can go in all together or one at a time. Daniel
Re: [PATCH 2/8] CMDLINE: drivers: of: ifdef out cmdline section
On Tue, Mar 30, 2021 at 02:49:13PM -0500, Rob Herring wrote: > On Tue, Mar 30, 2021 at 12:57 PM Daniel Walker wrote: > > > > It looks like there's some seepage of cmdline stuff into > > the generic device tree code. This conflicts with the > > generic cmdline implementation so I remove it in the case > > when that's enabled. > > > > Cc: xe-linux-exter...@cisco.com > > Signed-off-by: Ruslan Ruslichenko > > Signed-off-by: Daniel Walker > > --- > > drivers/of/fdt.c | 14 ++ > > 1 file changed, 14 insertions(+) > > > > diff --git a/drivers/of/fdt.c b/drivers/of/fdt.c > > index dcc1dd96911a..d8805cd9717a 100644 > > --- a/drivers/of/fdt.c > > +++ b/drivers/of/fdt.c > > @@ -25,6 +25,7 @@ > > #include > > #include > > #include > > +#include > > > > #include /* for COMMAND_LINE_SIZE */ > > #include > > @@ -1050,6 +1051,18 @@ int __init early_init_dt_scan_chosen(unsigned long > > node, const char *uname, > > > > /* Retrieve command line */ > > p = of_get_flat_dt_prop(node, "bootargs", ); > > + > > +#if defined(CONFIG_GENERIC_CMDLINE) && defined(CONFIG_GENERIC_CMDLINE_OF) > > Moving in the wrong direction... This code already has too many > #ifdef's. I like Christophe's version as it gets rid of all the code > here. It's temporary .. Notice CONFIG_GENERIC_CMDLINE_OF is only used on PowerPC. I experienced doubling on arm64 when this was used (i.e. the append and prepend was added twice). I don't think there are any other users which can't be moved outside the device tree code, but powerpc uses this function three times during boot up plus the prom_init user. It's possible to use the generic command line in all four places, but it become space inefficient. So the plan would be make the other architectures call the generic cmdline directly without this code, then powerpc would need to be reworked to call the generic commandline in it's own code hopefully just once. The end results would be this section would reduce down to one string copy and no command line stuff. Maybe you would rather I just use the generic command line in those three place and reduce this at the space code of powerpc ? Daniel
Re: [PATCH v3 01/17] cmdline: Add generic function to build command line.
On Tue, Mar 30, 2021 at 08:07:30PM +0200, H. Nikolaus Schaller wrote: > > > Am 30.03.2021 um 19:27 schrieb Daniel Walker : > > > > On Fri, Mar 26, 2021 at 01:44:48PM +, Christophe Leroy wrote: > >> This code provides architectures with a way to build command line > >> based on what is built in the kernel and what is handed over by the > >> bootloader, based on selected compile-time options. > >> > >> Signed-off-by: Christophe Leroy > >> --- > >> v3: > >> - Addressed comments from Will > >> - Added capability to have src == dst > >> --- > >> include/linux/cmdline.h | 57 + > >> 1 file changed, 57 insertions(+) > >> create mode 100644 include/linux/cmdline.h > >> > >> diff --git a/include/linux/cmdline.h b/include/linux/cmdline.h > >> new file mode 100644 > >> index ..dea87edd41be > >> --- /dev/null > >> +++ b/include/linux/cmdline.h > >> @@ -0,0 +1,57 @@ > >> +/* SPDX-License-Identifier: GPL-2.0 */ > >> +#ifndef _LINUX_CMDLINE_H > >> +#define _LINUX_CMDLINE_H > >> + > >> +#include > >> + > >> +/* Allow architectures to override strlcat, powerpc can't use strings so > >> early */ > >> +#ifndef cmdline_strlcat > >> +#define cmdline_strlcat strlcat > >> +#endif > >> + > >> +/* > >> + * This function will append or prepend a builtin command line to the > >> command > >> + * line provided by the bootloader. Kconfig options can be used to alter > >> + * the behavior of this builtin command line. > >> + * @dst: The destination of the final appended/prepended string. > >> + * @src: The starting string or NULL if there isn't one. > >> + * @len: the length of dest buffer. > >> + */ > > > > Append or prepend ? Cisco requires both at the same time. This is why my > > implementation provides both. I can't use this with both at once. > > Just an idea: what about defining CMDLINE as a pattern where e.g. "$$" or "%%" > is replaced by the boot loader command line? > > Then you can formulate replace, prepend, append, prepend+append with a single > CONFIG setting. > > It may be a little more complex in code (scanning for the pattern and > replacing > it and take care to temporary memory) but IMHO it could be worth to consider. In some cases this code could be used extremely early in boot up. For example in the prom_init.c powerpc code, or in efi changes. The flexibility to find and replace like that is not always an option due to the nature of the environment. It's not impossible of course. Daniel
[PATCH 8/8] CMDLINE: arm64: convert to generic builtin command line
This updates the arm64 code to use the CONFIG_GENERIC_CMDLINE option. Cc: xe-linux-exter...@cisco.com Signed-off-by: Daniel Walker --- arch/arm64/Kconfig | 33 +- arch/arm64/kernel/idreg-override.c | 8 +--- arch/arm64/kernel/setup.c | 4 3 files changed, 10 insertions(+), 35 deletions(-) diff --git a/arch/arm64/Kconfig b/arch/arm64/Kconfig index e4e1b6550115..9781ba3758b1 100644 --- a/arch/arm64/Kconfig +++ b/arch/arm64/Kconfig @@ -105,6 +105,7 @@ config ARM64 select GENERIC_ALLOCATOR select GENERIC_ARCH_TOPOLOGY select GENERIC_CLOCKEVENTS_BROADCAST + select GENERIC_CMDLINE select GENERIC_CPU_AUTOPROBE select GENERIC_CPU_VULNERABILITIES select GENERIC_EARLY_IOREMAP @@ -1841,38 +1842,6 @@ config ARM64_ACPI_PARKING_PROTOCOL protocol even if the corresponding data is present in the ACPI MADT table. -config CMDLINE - string "Default kernel command string" - default "" - help - Provide a set of default command-line options at build time by - entering them here. As a minimum, you should specify the the - root device (e.g. root=/dev/nfs). - -choice - prompt "Kernel command line type" if CMDLINE != "" - default CMDLINE_FROM_BOOTLOADER - help - Choose how the kernel will handle the provided default kernel - command line string. - -config CMDLINE_FROM_BOOTLOADER - bool "Use bootloader kernel arguments if available" - help - Uses the command-line options passed by the boot loader. If - the boot loader doesn't provide any, the default kernel command - string provided in CMDLINE will be used. - -config CMDLINE_FORCE - bool "Always use the default kernel command string" - help - Always use the default kernel command string, even if the boot - loader passes other arguments to the kernel. - This is useful if you cannot or don't want to change the - command-line options your boot loader passes to the kernel. - -endchoice - config EFI_STUB bool diff --git a/arch/arm64/kernel/idreg-override.c b/arch/arm64/kernel/idreg-override.c index 83f1c4b92095..fb10cd860a26 100644 --- a/arch/arm64/kernel/idreg-override.c +++ b/arch/arm64/kernel/idreg-override.c @@ -9,6 +9,7 @@ #include #include #include +#include #include #include @@ -188,11 +189,12 @@ static __init void parse_cmdline(void) { const u8 *prop = get_bootargs_cmdline(); - if (IS_ENABLED(CONFIG_CMDLINE_FORCE) || !prop) - __parse_cmdline(CONFIG_CMDLINE, true); + __parse_cmdline(CMDLINE_PREPEND, true); - if (!IS_ENABLED(CONFIG_CMDLINE_FORCE) && prop) + if (IS_ENABLED(CMDLINE_OVERRIDE) && prop) __parse_cmdline(prop, true); + + __parse_cmdline(CMDLINE_APPEND, true); } /* Keep checkers quiet */ diff --git a/arch/arm64/kernel/setup.c b/arch/arm64/kernel/setup.c index 61845c0821d9..01791ce5244c 100644 --- a/arch/arm64/kernel/setup.c +++ b/arch/arm64/kernel/setup.c @@ -30,6 +30,7 @@ #include #include #include +#include #include #include @@ -322,6 +323,9 @@ void __init __no_sanitize_address setup_arch(char **cmdline_p) * cpufeature code and early parameters. */ jump_label_init(); + + cmdline_add_builtin(boot_command_line, NULL, COMMAND_LINE_SIZE); + parse_early_param(); /* -- 2.25.1
[PATCH 7/8] CMDLINE: x86: convert to generic builtin command line
This updates the x86 code to use the CONFIG_GENERIC_CMDLINE option. Cc: xe-linux-exter...@cisco.com Signed-off-by: Ruslan Ruslichenko Signed-off-by: Ruslan Bilovol Signed-off-by: Daniel Walker --- arch/x86/Kconfig| 44 + arch/x86/kernel/setup.c | 18 ++--- 2 files changed, 3 insertions(+), 59 deletions(-) diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig index 2792879d398e..73ea9589e50d 100644 --- a/arch/x86/Kconfig +++ b/arch/x86/Kconfig @@ -118,6 +118,7 @@ config X86 select EDAC_SUPPORT select GENERIC_CLOCKEVENTS_BROADCASTif X86_64 || (X86_32 && X86_LOCAL_APIC) select GENERIC_CLOCKEVENTS_MIN_ADJUST + select GENERIC_CMDLINE select GENERIC_CMOS_UPDATE select GENERIC_CPU_AUTOPROBE select GENERIC_CPU_VULNERABILITIES @@ -2358,49 +2359,6 @@ choice endchoice -config CMDLINE_BOOL - bool "Built-in kernel command line" - help - Allow for specifying boot arguments to the kernel at - build time. On some systems (e.g. embedded ones), it is - necessary or convenient to provide some or all of the - kernel boot arguments with the kernel itself (that is, - to not rely on the boot loader to provide them.) - - To compile command line arguments into the kernel, - set this option to 'Y', then fill in the - boot arguments in CONFIG_CMDLINE. - - Systems with fully functional boot loaders (i.e. non-embedded) - should leave this option set to 'N'. - -config CMDLINE - string "Built-in kernel command string" - depends on CMDLINE_BOOL - default "" - help - Enter arguments here that should be compiled into the kernel - image and used at boot time. If the boot loader provides a - command line at boot time, it is appended to this string to - form the full kernel command line, when the system boots. - - However, you can use the CONFIG_CMDLINE_OVERRIDE option to - change this behavior. - - In most cases, the command line (whether built-in or provided - by the boot loader) should specify the device for the root - file system. - -config CMDLINE_OVERRIDE - bool "Built-in command line overrides boot loader arguments" - depends on CMDLINE_BOOL && CMDLINE != "" - help - Set this option to 'Y' to have the kernel ignore the boot loader - command line, and use ONLY the built-in command line. - - This is used to work around broken boot loaders. This should - be set to 'N' under normal conditions. - config MODIFY_LDT_SYSCALL bool "Enable the LDT (local descriptor table)" if EXPERT default y diff --git a/arch/x86/kernel/setup.c b/arch/x86/kernel/setup.c index d883176ef2ce..6444a5f1fabf 100644 --- a/arch/x86/kernel/setup.c +++ b/arch/x86/kernel/setup.c @@ -47,6 +47,7 @@ #include #include #include +#include /* * max_low_pfn_mapped: highest directly mapped pfn < 4 GB @@ -161,9 +162,6 @@ unsigned long saved_video_mode; #define RAMDISK_LOAD_FLAG 0x4000 static char __initdata command_line[COMMAND_LINE_SIZE]; -#ifdef CONFIG_CMDLINE_BOOL -static char __initdata builtin_cmdline[COMMAND_LINE_SIZE] = CONFIG_CMDLINE; -#endif #if defined(CONFIG_EDD) || defined(CONFIG_EDD_MODULE) struct edd edd; @@ -883,19 +881,7 @@ void __init setup_arch(char **cmdline_p) bss_resource.start = __pa_symbol(__bss_start); bss_resource.end = __pa_symbol(__bss_stop)-1; -#ifdef CONFIG_CMDLINE_BOOL -#ifdef CONFIG_CMDLINE_OVERRIDE - strlcpy(boot_command_line, builtin_cmdline, COMMAND_LINE_SIZE); -#else - if (builtin_cmdline[0]) { - /* append boot loader cmdline to builtin */ - strlcat(builtin_cmdline, " ", COMMAND_LINE_SIZE); - strlcat(builtin_cmdline, boot_command_line, COMMAND_LINE_SIZE); - strlcpy(boot_command_line, builtin_cmdline, COMMAND_LINE_SIZE); - } -#endif -#endif - + cmdline_add_builtin(boot_command_line, NULL, COMMAND_LINE_SIZE); strlcpy(command_line, boot_command_line, COMMAND_LINE_SIZE); *cmdline_p = command_line; -- 2.25.1
[PATCH 6/8] drivers: firmware: efi: libstub: enable generic commandline
This adds code to handle the generic command line changes. The efi code appears that it doesn't benefit as much from this design as it could. For example, if you had a prepend command line with "nokaslr" then you might be helpful to re-enable it in the boot loader or dts, but there appears to be no way to re-enable kaslr or some of the other options. Cc: xe-linux-exter...@cisco.com Signed-off-by: Daniel Walker --- .../firmware/efi/libstub/efi-stub-helper.c| 35 +++ drivers/firmware/efi/libstub/efi-stub.c | 7 drivers/firmware/efi/libstub/efistub.h| 1 + drivers/firmware/efi/libstub/x86-stub.c | 13 +-- 4 files changed, 54 insertions(+), 2 deletions(-) diff --git a/drivers/firmware/efi/libstub/efi-stub-helper.c b/drivers/firmware/efi/libstub/efi-stub-helper.c index aa8da0a49829..c155837cedc9 100644 --- a/drivers/firmware/efi/libstub/efi-stub-helper.c +++ b/drivers/firmware/efi/libstub/efi-stub-helper.c @@ -13,6 +13,7 @@ #include #include #include /* For CONSOLE_LOGLEVEL_* */ +#include #include #include @@ -172,6 +173,40 @@ int efi_printk(const char *fmt, ...) return printed; } +/** + * efi_handle_cmdline() - handle adding in building parts of the command line + * @cmdline: kernel command line + * + * Add in the generic parts of the commandline and start the parsing of the + * command line. + * + * Return: status code + */ +efi_status_t efi_handle_cmdline(char const *cmdline) +{ + efi_status_t status; + + status = efi_parse_options(CMDLINE_PREPEND); + if (status != EFI_SUCCESS) { + efi_err("Failed to parse options\n"); + return status; + } + + status = efi_parse_options(IS_ENABLED(CONFIG_CMDLINE_OVERRIDE) ? "" : cmdline); + if (status != EFI_SUCCESS) { + efi_err("Failed to parse options\n"); + return status; + } + + status = efi_parse_options(CMDLINE_APPEND); + if (status != EFI_SUCCESS) { + efi_err("Failed to parse options\n"); + return status; + } + + return EFI_SUCCESS; +} + /** * efi_parse_options() - Parse EFI command line options * @cmdline: kernel command line diff --git a/drivers/firmware/efi/libstub/efi-stub.c b/drivers/firmware/efi/libstub/efi-stub.c index 26e69788f27a..760480248adf 100644 --- a/drivers/firmware/efi/libstub/efi-stub.c +++ b/drivers/firmware/efi/libstub/efi-stub.c @@ -172,6 +172,12 @@ efi_status_t __efiapi efi_pe_entry(efi_handle_t handle, goto fail; } +#ifdef CONFIG_GENERIC_CMDLINE + status = efi_handle_cmdline(cmdline_ptr); + if (status != EFI_SUCCESS) { + goto fail_free_cmdline; + } +#else if (IS_ENABLED(CONFIG_CMDLINE_EXTEND) || IS_ENABLED(CONFIG_CMDLINE_FORCE) || cmdline_size == 0) { @@ -189,6 +195,7 @@ efi_status_t __efiapi efi_pe_entry(efi_handle_t handle, goto fail_free_cmdline; } } +#endif efi_info("Booting Linux Kernel...\n"); diff --git a/drivers/firmware/efi/libstub/efistub.h b/drivers/firmware/efi/libstub/efistub.h index cde0a2ef507d..07c7f9fdfffc 100644 --- a/drivers/firmware/efi/libstub/efistub.h +++ b/drivers/firmware/efi/libstub/efistub.h @@ -800,6 +800,7 @@ efi_status_t efi_relocate_kernel(unsigned long *image_addr, unsigned long alignment, unsigned long min_addr); +efi_status_t efi_handle_cmdline(char const *cmdline); efi_status_t efi_parse_options(char const *cmdline); void efi_parse_option_graphics(char *option); diff --git a/drivers/firmware/efi/libstub/x86-stub.c b/drivers/firmware/efi/libstub/x86-stub.c index f14c4ff5839f..30ad8fb7122d 100644 --- a/drivers/firmware/efi/libstub/x86-stub.c +++ b/drivers/firmware/efi/libstub/x86-stub.c @@ -673,6 +673,8 @@ unsigned long efi_main(efi_handle_t handle, unsigned long bzimage_addr = (unsigned long)startup_32; unsigned long buffer_start, buffer_end; struct setup_header *hdr = _params->hdr; + unsigned long cmdline_paddr = ((u64)hdr->cmd_line_ptr | + ((u64)boot_params->ext_cmd_line_ptr << 32)); efi_status_t status; efi_system_table = sys_table_arg; @@ -735,6 +737,14 @@ unsigned long efi_main(efi_handle_t handle, image_offset = 0; } +#ifdef CONFIG_GENERIC_CMDLINE + status = efi_handle_cmdline((char *)cmdline_paddr); + if (status != EFI_SUCCESS) { + efi_err("Failed to parse options\n"); + goto fail; + } +#else /* CONFIG_GENERIC_CMDLINE */ + #ifdef CONFIG_CMDLINE_BOOL status = efi_parse_options(CONFIG_CMDLINE); if (status != EFI_SUCCESS) { @@ -743,8 +753,6 @@ unsigned long efi_main(e
[PATCH 4/8] CMDLINE: powerpc: convert to generic builtin command line
This updates the powerpc code to use the CONFIG_GENERIC_CMDLINE option. This includes a scripted mass convert of the config files to use the new generic cmdline. There is a bit of a trim effect here. It would seems that some of the config haven't been trimmed in a while. The bash script used to convert is as follows, if [[ -z "$1" || -z "$2" ]]; then echo "Two arguments are needed." exit 1 fi mkdir $1 cp $2 $1/.config sed -i 's/CONFIG_CMDLINE=/CONFIG_CMDLINE_BOOL=y\nCONFIG_CMDLINE_PREPEND=/g' $1/.config make ARCH=$1 O=$1 olddefconfig make ARCH=$1 O=$1 savedefconfig cp $1/defconfig $2 rm -Rf $1 Cc: xe-linux-exter...@cisco.com Signed-off-by: Ruslan Ruslichenko Signed-off-by: Ruslan Bilovol Signed-off-by: Daniel Walker --- arch/powerpc/Kconfig | 38 +-- arch/powerpc/configs/44x/fsp2_defconfig | 32 arch/powerpc/configs/44x/iss476-smp_defconfig | 24 ++-- arch/powerpc/configs/44x/warp_defconfig | 17 - arch/powerpc/configs/holly_defconfig | 13 --- arch/powerpc/configs/mvme5100_defconfig | 23 +-- arch/powerpc/configs/skiroot_defconfig| 12 +++--- arch/powerpc/configs/storcenter_defconfig | 18 - arch/powerpc/kernel/prom_init.c | 10 +++-- 9 files changed, 74 insertions(+), 113 deletions(-) diff --git a/arch/powerpc/Kconfig b/arch/powerpc/Kconfig index 386ae12d8523..3a19e5b74177 100644 --- a/arch/powerpc/Kconfig +++ b/arch/powerpc/Kconfig @@ -167,6 +167,8 @@ config PPC select EDAC_SUPPORT select GENERIC_ATOMIC64 if PPC32 select GENERIC_CLOCKEVENTS_BROADCASTif SMP + select GENERIC_CMDLINE + select GENERIC_CMDLINE_OF select GENERIC_CMOS_UPDATE select GENERIC_CPU_AUTOPROBE select GENERIC_CPU_VULNERABILITIES if PPC_BARRIER_NOSPEC @@ -886,42 +888,6 @@ config PPC_DENORMALISATION Add support for handling denormalisation of single precision values. Useful for bare metal only. If unsure say Y here. -config CMDLINE - string "Initial kernel command string" - default "" - help - On some platforms, there is currently no way for the boot loader to - pass arguments to the kernel. For these platforms, you can supply - some command-line options at build time by entering them here. In - most cases you will need to specify the root device here. - -choice - prompt "Kernel command line type" if CMDLINE != "" - default CMDLINE_FROM_BOOTLOADER - -config CMDLINE_FROM_BOOTLOADER - bool "Use bootloader kernel arguments if available" - help - Uses the command-line options passed by the boot loader. If - the boot loader doesn't provide any, the default kernel command - string provided in CMDLINE will be used. - -config CMDLINE_EXTEND - bool "Extend bootloader kernel arguments" - help - The command-line arguments provided by the boot loader will be - appended to the default kernel command string. - -config CMDLINE_FORCE - bool "Always use the default kernel command string" - help - Always use the default kernel command string, even if the boot - loader passes other arguments to the kernel. - This is useful if you cannot or don't want to change the - command-line options your boot loader passes to the kernel. - -endchoice - config EXTRA_TARGETS string "Additional default image types" help diff --git a/arch/powerpc/configs/44x/fsp2_defconfig b/arch/powerpc/configs/44x/fsp2_defconfig index 8da316e61a08..4993db054589 100644 --- a/arch/powerpc/configs/44x/fsp2_defconfig +++ b/arch/powerpc/configs/44x/fsp2_defconfig @@ -1,8 +1,6 @@ -CONFIG_44x=y # CONFIG_SWAP is not set CONFIG_SYSVIPC=y # CONFIG_CROSS_MEMORY_ATTACH is not set -# CONFIG_FHANDLE is not set CONFIG_NO_HZ=y CONFIG_HIGH_RES_TIMERS=y CONFIG_IKCONFIG=y @@ -13,23 +11,25 @@ CONFIG_BLK_DEV_INITRD=y # CONFIG_RD_XZ is not set # CONFIG_RD_LZO is not set # CONFIG_RD_LZ4 is not set +# CONFIG_FHANDLE is not set CONFIG_KALLSYMS_ALL=y CONFIG_BPF_SYSCALL=y CONFIG_EMBEDDED=y CONFIG_PROFILING=y -CONFIG_MODULES=y -CONFIG_MODULE_UNLOAD=y -# CONFIG_BLK_DEV_BSG is not set +CONFIG_CMDLINE_BOOL=y +CONFIG_CMDLINE_PREPEND="ip=on rw" +CONFIG_44x=y CONFIG_PPC_47x=y # CONFIG_EBONY is not set CONFIG_FSP2=y CONFIG_476FPE_ERR46=y -CONFIG_SWIOTLB=y CONFIG_KEXEC=y CONFIG_CRASH_DUMP=y -CONFIG_CMDLINE="ip=on rw" # CONFIG_SUSPEND is not set -# CONFIG_PCI is not set +CONFIG_OPROFILE=y +CONFIG_MODULES=y +CONFIG_MODULE_UNLOAD=y +# CONFIG_BLK_DEV_BSG is not set CONFIG_NET=y CONFIG_PACKET=y CONFIG_UNIX=y @@ -46,14 +46,12 @@ CONFIG_MTD=y CONFIG_MTD_BLOCK=y CONFIG_MTD_JEDECPROBE=y CONFIG_MTD_CFI_AMDSTD=y -C
[PATCH 5/8] CMDLINE: mips: convert to generic builtin command line
This updates the mips code to use the CONFIG_GENERIC_CMDLINE option. This deletes the option for MIPS_CMDLINE_BUILTIN_EXTEND and replaces the functionality with generic code. This includes a scripted mass convert of the config files to use the new generic cmdline. There is a bit of a trim effect here. It would seems that some of the config haven't been trimmed in a while. The script used is as follows, if [[ -z "$1" || -z "$2" ]]; then echo "Two arguments are needed." exit 1 fi mkdir $1 cp $2 $1/.config sed -i 's/CONFIG_CMDLINE=/CONFIG_CMDLINE_BOOL=y\nCONFIG_CMDLINE_PREPEND=/g' $1/.config make ARCH=$1 O=$1 olddefconfig make ARCH=$1 O=$1 savedefconfig cp $1/defconfig $2 rm -Rf $1 Cc: xe-linux-exter...@cisco.com Signed-off-by: Ruslan Ruslichenko Signed-off-by: Ruslan Bilovol Signed-off-by: Daniel Walker --- arch/mips/Kconfig | 4 +-- arch/mips/Kconfig.debug| 44 -- arch/mips/configs/ar7_defconfig| 9 ++ arch/mips/configs/bcm47xx_defconfig| 8 ++--- arch/mips/configs/bcm63xx_defconfig| 15 +++-- arch/mips/configs/bmips_be_defconfig | 11 +++ arch/mips/configs/bmips_stb_defconfig | 11 +++ arch/mips/configs/capcella_defconfig | 11 ++- arch/mips/configs/ci20_defconfig | 10 +++--- arch/mips/configs/cu1000-neo_defconfig | 10 +++--- arch/mips/configs/cu1830-neo_defconfig | 10 +++--- arch/mips/configs/e55_defconfig| 4 +-- arch/mips/configs/generic_defconfig| 6 ++-- arch/mips/configs/gpr_defconfig| 18 ++- arch/mips/configs/loongson3_defconfig | 13 ++-- arch/mips/configs/mpc30x_defconfig | 7 ++-- arch/mips/configs/tb0219_defconfig | 7 ++-- arch/mips/configs/tb0226_defconfig | 7 ++-- arch/mips/configs/tb0287_defconfig | 7 ++-- arch/mips/configs/workpad_defconfig| 11 +++ arch/mips/kernel/setup.c | 36 +++-- 21 files changed, 59 insertions(+), 200 deletions(-) diff --git a/arch/mips/Kconfig b/arch/mips/Kconfig index d89efba3d8a4..0e753894d28d 100644 --- a/arch/mips/Kconfig +++ b/arch/mips/Kconfig @@ -24,6 +24,7 @@ config MIPS select CPU_NO_EFFICIENT_FFS if (TARGET_ISA_REV < 1) select CPU_PM if CPU_IDLE select GENERIC_ATOMIC64 if !64BIT + select GENERIC_CMDLINE select GENERIC_CMOS_UPDATE select GENERIC_CPU_AUTOPROBE select GENERIC_GETTIMEOFDAY @@ -3212,9 +3213,6 @@ choice config MIPS_CMDLINE_FROM_BOOTLOADER bool "Bootloader kernel arguments if available" - config MIPS_CMDLINE_BUILTIN_EXTEND - depends on CMDLINE_BOOL - bool "Extend builtin kernel arguments with bootloader arguments" endchoice endmenu diff --git a/arch/mips/Kconfig.debug b/arch/mips/Kconfig.debug index 7a8d94cdd493..b5a099c74eb6 100644 --- a/arch/mips/Kconfig.debug +++ b/arch/mips/Kconfig.debug @@ -30,50 +30,6 @@ config EARLY_PRINTK_8250 config USE_GENERIC_EARLY_PRINTK_8250 bool -config CMDLINE_BOOL - bool "Built-in kernel command line" - help - For most systems, it is firmware or second stage bootloader that - by default specifies the kernel command line options. However, - it might be necessary or advantageous to either override the - default kernel command line or add a few extra options to it. - For such cases, this option allows you to hardcode your own - command line options directly into the kernel. For that, you - should choose 'Y' here, and fill in the extra boot arguments - in CONFIG_CMDLINE. - - The built-in options will be concatenated to the default command - line if CMDLINE_OVERRIDE is set to 'N'. Otherwise, the default - command line will be ignored and replaced by the built-in string. - - Most MIPS systems will normally expect 'N' here and rely upon - the command line from the firmware or the second-stage bootloader. - -config CMDLINE - string "Default kernel command string" - depends on CMDLINE_BOOL - help - On some platforms, there is currently no way for the boot loader to - pass arguments to the kernel. For these platforms, and for the cases - when you want to add some extra options to the command line or ignore - the default command line, you can supply some command-line options at - build time by entering them here. In other cases you can specify - kernel args so that you don't have to set them up in board prom - initialization routines. - - For more information, see the CMDLINE_BOOL and CMDLINE_OVERRIDE - options. - -config CMDLINE_OVERRIDE - bool "Built-in command line overrides firmware arguments" - depends on CMDLINE_BOOL - help - By setting this o
[PATCH 2/8] CMDLINE: drivers: of: ifdef out cmdline section
It looks like there's some seepage of cmdline stuff into the generic device tree code. This conflicts with the generic cmdline implementation so I remove it in the case when that's enabled. Cc: xe-linux-exter...@cisco.com Signed-off-by: Ruslan Ruslichenko Signed-off-by: Daniel Walker --- drivers/of/fdt.c | 14 ++ 1 file changed, 14 insertions(+) diff --git a/drivers/of/fdt.c b/drivers/of/fdt.c index dcc1dd96911a..d8805cd9717a 100644 --- a/drivers/of/fdt.c +++ b/drivers/of/fdt.c @@ -25,6 +25,7 @@ #include #include #include +#include #include /* for COMMAND_LINE_SIZE */ #include @@ -1050,6 +1051,18 @@ int __init early_init_dt_scan_chosen(unsigned long node, const char *uname, /* Retrieve command line */ p = of_get_flat_dt_prop(node, "bootargs", ); + +#if defined(CONFIG_GENERIC_CMDLINE) && defined(CONFIG_GENERIC_CMDLINE_OF) + /* +* The builtin command line will be added here, or it can override +* with the DT bootargs. +*/ + cmdline_add_builtin(data, + (l > 0 ? p : NULL), /* This is sanity checking */ + COMMAND_LINE_SIZE); +#elif defined(CONFIG_GENERIC_CMDLINE) + strlcpy(data, p, COMMAND_LINE_SIZE); +#else if (p != NULL && l > 0) strlcpy(data, p, min(l, COMMAND_LINE_SIZE)); @@ -1070,6 +1083,7 @@ int __init early_init_dt_scan_chosen(unsigned long node, const char *uname, strlcpy(data, CONFIG_CMDLINE, COMMAND_LINE_SIZE); #endif #endif /* CONFIG_CMDLINE */ +#endif /* CONFIG_GENERIC_CMDLINE */ pr_debug("Command line is: %s\n", (char *)data); -- 2.25.1
[PATCH 3/8] powerpc: convert strcpy to strlcpy in prom_init
There's only two users of strcpy and one is the command line handling. The generic command line handling uses strlcpy and it makes sense to convert this one other user to strlcpy to keep prom_init size consistent. Cc: xe-linux-exter...@cisco.com Signed-off-by: Daniel Walker --- arch/powerpc/kernel/prom_init.c | 25 +++-- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/arch/powerpc/kernel/prom_init.c b/arch/powerpc/kernel/prom_init.c index ccf77b985c8f..2c2f33155317 100644 --- a/arch/powerpc/kernel/prom_init.c +++ b/arch/powerpc/kernel/prom_init.c @@ -242,15 +242,6 @@ static int __init prom_strcmp(const char *cs, const char *ct) return 0; } -static char __init *prom_strcpy(char *dest, const char *src) -{ - char *tmp = dest; - - while ((*dest++ = *src++) != '\0') - /* nothing */; - return tmp; -} - static int __init prom_strncmp(const char *cs, const char *ct, size_t count) { unsigned char c1, c2; @@ -276,6 +267,20 @@ static size_t __init prom_strlen(const char *s) return sc - s; } +static size_t __init prom_strlcpy(char *dest, const char *src, size_t size) +{ + size_t ret = prom_strlen(src); + + if (size) { + size_t len = (ret >= size) ? size - 1 : ret; + + memcpy(dest, src, len); + dest[len] = '\0'; + } + return ret; +} + + static int __init prom_memcmp(const void *cs, const void *ct, size_t count) { const unsigned char *su1, *su2; @@ -2702,7 +2707,7 @@ static void __init flatten_device_tree(void) /* Add "phandle" in there, we'll need it */ namep = make_room(_start, _end, 16, 1); - prom_strcpy(namep, "phandle"); + prom_strlcpy(namep, "phandle", 8); mem_start = (unsigned long)namep + prom_strlen(namep) + 1; /* Build string array */ -- 2.25.1
[PATCH 1/8] CMDLINE: add generic builtin command line
This code allows architectures to use a generic builtin command line. The state of the builtin command line options across architecture is diverse. MIPS and X86 once has similar systems, then mips added some options to allow extending the command line. Powerpc did something simiar in adding the ability to extend. Even with mips and powerpc enhancement the needs of Cisco are not met on these platforms. The code in this commit unifies the code into a generic header file under the CONFIG_GENERIC_CMDLINE option. When this option is enabled the architecture can call the cmdline_add_builtin() to add the builtin command line. This unified implementation offers the same functionality needed by Cisco on all platform which use it. Cc: xe-linux-exter...@cisco.com Signed-off-by: Ruslan Bilovol Signed-off-by: Daniel Walker --- include/linux/cmdline.h | 98 + init/Kconfig| 72 ++ 2 files changed, 170 insertions(+) create mode 100644 include/linux/cmdline.h diff --git a/include/linux/cmdline.h b/include/linux/cmdline.h new file mode 100644 index ..439c4585feba --- /dev/null +++ b/include/linux/cmdline.h @@ -0,0 +1,98 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +#ifndef _LINUX_CMDLINE_H +#define _LINUX_CMDLINE_H + +/* + * + * Copyright (C) 2006,2021. Cisco Systems, Inc. + * + * Generic Append/Prepend cmdline support. + */ + +#if defined(CONFIG_GENERIC_CMDLINE) && defined(CONFIG_CMDLINE_BOOL) + +#ifndef CONFIG_CMDLINE_OVERRIDE +#define GENERIC_CMDLINE_NEED_STRLCAT +#define CMDLINE_PREPEND CONFIG_CMDLINE_PREPEND +#define CMDLINE_APPEND CONFIG_CMDLINE_APPEND + +/* + * This function will append or prepend a builtin command line to the command + * line provided by the bootloader. Kconfig options can be used to alter + * the behavior of this builtin command line. + * @dest: The destination of the final appended/prepended string + * @src: The starting string or NULL if there isn't one. + * @tmp: temporary space used for prepending + * @length: the maximum length of the strings above. + * @cmdline_strlcpy: point to a compatible strlcpy + * @cmdline_strlcat: point to a compatible strlcat + */ +static inline void +__cmdline_add_builtin(char *dest, const char *src, char *tmp, unsigned long length, + size_t (*cmdline_strlcpy)(char *dest, const char *src, size_t size), + size_t (*cmdline_strlcat)(char *dest, const char *src, size_t count)) +{ + if (src != dest && src != NULL) { + cmdline_strlcpy(dest, " ", length); + cmdline_strlcat(dest, src, length); + } + + if (sizeof(CONFIG_CMDLINE_APPEND) > 1) + cmdline_strlcat(dest, " " CONFIG_CMDLINE_APPEND, length); + + if (sizeof(CONFIG_CMDLINE_PREPEND) > 1) { + cmdline_strlcpy(tmp, CONFIG_CMDLINE_PREPEND " ", length); + cmdline_strlcat(tmp, dest, length); + cmdline_strlcpy(dest, tmp, length); + } +} + +#define cmdline_add_builtin_custom(dest, src, length, label, cmdline_strlcpy, cmdline_strlcat) \ +{ \ + if (sizeof(CONFIG_CMDLINE_PREPEND) > 1) { \ + static label char cmdline_tmp_space[length]; \ + __cmdline_add_builtin(dest, src, cmdline_tmp_space, length, cmdline_strlcpy, cmdline_strlcat); \ + } else if (sizeof(CONFIG_CMDLINE_APPEND) > 1) { \ + __cmdline_add_builtin(dest, src, NULL, length, cmdline_strlcpy, cmdline_strlcat); \ + } \ +} +#define cmdline_add_builtin(dest, src, length) \ + cmdline_add_builtin_custom(dest, src, length, __initdata, strlcpy, strlcat) + +#else /* CONFIG_CMDLINE_OVERRIDE */ + +#define CMDLINE_PREPEND CONFIG_CMDLINE_PREPEND +#define CMDLINE_APPEND CONFIG_CMDLINE_APPEND + +static inline void +__cmdline_add_builtin_custom(char *dest, const char *src, unsigned long length, + size_t (*cmdline_strlcpy)(char *dest, const char *src, size_t size)) +{ + cmdline_strlcpy(dest, CONFIG_CMDLINE_PREPEND " " CONFIG_CMDLINE_APPEND, length); +} +#define cmdline_add_builtin_custom(dest, src, length, label, cmdline_strlcpy, cmdline_strlcat) \ + __cmdline_add_builtin_custom(dest, src, length, cmdline_strlcpy) +#define cmdline_add_builtin(dest, src, length) \ + __cmdline_add_builtin_custom(dest, src, length, strlcpy) +#endif /* !CONFIG_CMDLINE_OVERRIDE */ + +#else /* !CONFIG_GENERIC_CMDLINE || !CONFIG_CMDLINE_BOOL */ + +#define CMDLINE_PREPEND "" +#define CM
Re: [PATCH v2 3/7] powerpc: convert config files to generic cmdline
On Mon, Mar 29, 2021 at 11:07:51AM +0100, Will Deacon wrote: > On Thu, Mar 25, 2021 at 12:59:56PM -0700, Daniel Walker wrote: > > On Thu, Mar 25, 2021 at 01:03:55PM +0100, Christophe Leroy wrote: > > > > > > Ok, so you agree we don't need to provide two CMDLINE, one to be appended > > > and one to be prepended. > > > > > > Let's only provide once CMDLINE as of today, and ask the user to select > > > whether he wants it appended or prepended or replacee. Then no need to > > > change all existing config to rename CONFIG_CMDLINE into either of the new > > > ones. > > > > > > That's the main difference between my series and Daniel's series. So I'll > > > finish taking Will's comment into account and we'll send out a v3 soon. > > > > It doesn't solve the needs of Cisco, I've stated many times your changes > > have > > little value. Please stop submitting them. > > FWIW, they're useful for arm64 and I will gladly review the updated series. > > I don't think asking people to stop submitting patches is ever the right > answer. Please don't do that. Why ? It's me nacking his series, is that not allowed anymore ? Daniel
Re: [PATCH v2 3/7] powerpc: convert config files to generic cmdline
On Thu, Mar 25, 2021 at 05:29:44PM -0600, Rob Herring wrote: > On Thu, Mar 25, 2021 at 2:00 PM Daniel Walker wrote: > > > > On Thu, Mar 25, 2021 at 01:03:55PM +0100, Christophe Leroy wrote: > > > > > > Ok, so you agree we don't need to provide two CMDLINE, one to be appended > > > and one to be prepended. > > > > > > Let's only provide once CMDLINE as of today, and ask the user to select > > > whether he wants it appended or prepended or replacee. Then no need to > > > change all existing config to rename CONFIG_CMDLINE into either of the new > > > ones. > > > > > > That's the main difference between my series and Daniel's series. So I'll > > > finish taking Will's comment into account and we'll send out a v3 soon. > > > > It doesn't solve the needs of Cisco, I've stated many times your changes > > have > > little value. Please stop submitting them. > > Can you please outline what those needs are which aren't met? append AND prepend at the same time on all architectures. Christophe doesn't understand the need, and hence tries to minimize the feature set which is incompatible with Cisco needs and all the other out of tree users. Daniel
Re: [PATCH v3 01/17] cmdline: Add generic function to build command line.
On Fri, Mar 26, 2021 at 01:44:48PM +, Christophe Leroy wrote: > This code provides architectures with a way to build command line > based on what is built in the kernel and what is handed over by the > bootloader, based on selected compile-time options. > > Signed-off-by: Christophe Leroy > --- > v3: > - Addressed comments from Will > - Added capability to have src == dst > --- > include/linux/cmdline.h | 57 + > 1 file changed, 57 insertions(+) > create mode 100644 include/linux/cmdline.h > > diff --git a/include/linux/cmdline.h b/include/linux/cmdline.h > new file mode 100644 > index ..dea87edd41be > --- /dev/null > +++ b/include/linux/cmdline.h > @@ -0,0 +1,57 @@ > +/* SPDX-License-Identifier: GPL-2.0 */ > +#ifndef _LINUX_CMDLINE_H > +#define _LINUX_CMDLINE_H > + > +#include > + > +/* Allow architectures to override strlcat, powerpc can't use strings so > early */ > +#ifndef cmdline_strlcat > +#define cmdline_strlcat strlcat > +#endif > + > +/* > + * This function will append or prepend a builtin command line to the command > + * line provided by the bootloader. Kconfig options can be used to alter > + * the behavior of this builtin command line. > + * @dst: The destination of the final appended/prepended string. > + * @src: The starting string or NULL if there isn't one. > + * @len: the length of dest buffer. > + */ Append or prepend ? Cisco requires both at the same time. This is why my implementation provides both. I can't use this with both at once. Daniel
Re: [PATCH v2 4/7] CMDLINE: powerpc: convert to generic builtin command line
On Wed, Mar 24, 2021 at 04:31:35PM +0100, Christophe Leroy wrote: > > > Le 09/03/2021 à 22:40, Daniel Walker a écrit : > > On Tue, Mar 09, 2021 at 08:56:47AM +0100, Christophe Leroy wrote: > > > > > > > > > Le 09/03/2021 à 01:02, Daniel Walker a écrit : > > > > This updates the powerpc code to use the CONFIG_GENERIC_CMDLINE > > > > option. > > > > > > > > Cc: xe-linux-exter...@cisco.com > > > > Signed-off-by: Ruslan Ruslichenko > > > > Signed-off-by: Ruslan Bilovol > > > > Signed-off-by: Daniel Walker > > > > --- > > > >arch/powerpc/Kconfig| 37 > > > > + > > > >arch/powerpc/kernel/prom.c | 1 + > > > >arch/powerpc/kernel/prom_init.c | 35 ++- > > > >3 files changed, 23 insertions(+), 50 deletions(-) > > > > > > > > diff --git a/arch/powerpc/Kconfig b/arch/powerpc/Kconfig > > > > index 107bb4319e0e..276b06d5c961 100644 > > > > --- a/arch/powerpc/Kconfig > > > > +++ b/arch/powerpc/Kconfig > > > > @@ -167,6 +167,7 @@ config PPC > > > > select EDAC_SUPPORT > > > > select GENERIC_ATOMIC64 if PPC32 > > > > select GENERIC_CLOCKEVENTS_BROADCASTif SMP > > > > + select GENERIC_CMDLINE > > > > select GENERIC_CMOS_UPDATE > > > > select GENERIC_CPU_AUTOPROBE > > > > select GENERIC_CPU_VULNERABILITIES if PPC_BARRIER_NOSPEC > > > > @@ -906,42 +907,6 @@ config PPC_DENORMALISATION > > > > Add support for handling denormalisation of single precision > > > > values. Useful for bare metal only. If unsure say Y here. > > > > -config CMDLINE > > > > - string "Initial kernel command string" > > > > - default "" > > > > - help > > > > - On some platforms, there is currently no way for the boot > > > > loader to > > > > - pass arguments to the kernel. For these platforms, you can > > > > supply > > > > - some command-line options at build time by entering them > > > > here. In > > > > - most cases you will need to specify the root device here. > > > > - > > > > -choice > > > > - prompt "Kernel command line type" if CMDLINE != "" > > > > - default CMDLINE_FROM_BOOTLOADER > > > > - > > > > -config CMDLINE_FROM_BOOTLOADER > > > > - bool "Use bootloader kernel arguments if available" > > > > - help > > > > - Uses the command-line options passed by the boot loader. If > > > > - the boot loader doesn't provide any, the default kernel > > > > command > > > > - string provided in CMDLINE will be used. > > I can't see how the above is supported in the generic builtin. > > Taking into account that it is the default on powerpc, I'm having hardtime > with that. Hmm, so this ignores the built in changes. You just don't enable it, or you don't add PREPEND or APPEND. > Any feedback on the proposed changes I made on the 13th ? I know it is > partly buggy but that was more for the principle. I can make clean working > patch if it helps. The reason I added it into the function parameters is because I can get free type checking on the functions. If you use macro's then you don't know if the function is compatible. Daniel
Re: [PATCH v2 3/7] powerpc: convert config files to generic cmdline
On Thu, Mar 25, 2021 at 01:03:55PM +0100, Christophe Leroy wrote: > > Ok, so you agree we don't need to provide two CMDLINE, one to be appended and > one to be prepended. > > Let's only provide once CMDLINE as of today, and ask the user to select > whether he wants it appended or prepended or replacee. Then no need to > change all existing config to rename CONFIG_CMDLINE into either of the new > ones. > > That's the main difference between my series and Daniel's series. So I'll > finish taking Will's comment into account and we'll send out a v3 soon. It doesn't solve the needs of Cisco, I've stated many times your changes have little value. Please stop submitting them. Daniel
Re: [PATCH v2 3/7] powerpc: convert config files to generic cmdline
On Wed, Mar 24, 2021 at 05:59:59PM +0100, Christophe Leroy wrote: > > I think my changes maintain most of this due to the override of > > CONFIG_CMDLINE_PREPEND. This is an upgrade and the inflexibility in powerpc > > is > > an example of why these changes were created in the first place. > > "inflexibility in powerpc" : Can you elaborate ? the prom environment. > > > > For example , say the default command line is "root=/dev/issblk0" from > > iss476 > > platform. And the bootloader adds "root=/dev/sda1" > > > > The result is . > > > I'm still having hard time understanding the benefit of having both > and . > Could you please provide a complete exemple from real life, ie what exactly > the problem is and what it solves ? Say the boot loader of an old product is released with a command line of "root=/dev/sda" and per the needs of the company or product the boot loader can not be upgraded to change this command line. To change this behavior you would need append or EXTEND. Below I detail an example of PREPEND due to your list question. > > > > Then you have, > > > > root=/dev/issblk0 root=/dev/sda1 > > > > and the bootloader has precedent over the default command line. So root= in > > the > > above cases is defined by the bootloader. A person could input a command line into a boot loader, and it would override the PREPEND values. Can you imagine you have a default command line which makes root=/dev/issblk0 , but that doesn't work for you testing purpose. So you input into the boot loader root=/dev/sda1 , since you have the default input in the bootloader OVERRIDEABLE you can do this without re-compiling and just input the single root= command into the bootloader. Daniel
Re: [PATCH v2 4/7] CMDLINE: powerpc: convert to generic builtin command line
On Tue, Mar 09, 2021 at 08:56:47AM +0100, Christophe Leroy wrote: > > > Le 09/03/2021 à 01:02, Daniel Walker a écrit : > > This updates the powerpc code to use the CONFIG_GENERIC_CMDLINE > > option. > > > > Cc: xe-linux-exter...@cisco.com > > Signed-off-by: Ruslan Ruslichenko > > Signed-off-by: Ruslan Bilovol > > Signed-off-by: Daniel Walker > > --- > > arch/powerpc/Kconfig| 37 + > > arch/powerpc/kernel/prom.c | 1 + > > arch/powerpc/kernel/prom_init.c | 35 ++- > > 3 files changed, 23 insertions(+), 50 deletions(-) > > > > diff --git a/arch/powerpc/Kconfig b/arch/powerpc/Kconfig > > index 107bb4319e0e..276b06d5c961 100644 > > --- a/arch/powerpc/Kconfig > > +++ b/arch/powerpc/Kconfig > > @@ -167,6 +167,7 @@ config PPC > > select EDAC_SUPPORT > > select GENERIC_ATOMIC64 if PPC32 > > select GENERIC_CLOCKEVENTS_BROADCASTif SMP > > + select GENERIC_CMDLINE > > select GENERIC_CMOS_UPDATE > > select GENERIC_CPU_AUTOPROBE > > select GENERIC_CPU_VULNERABILITIES if PPC_BARRIER_NOSPEC > > @@ -906,42 +907,6 @@ config PPC_DENORMALISATION > > Add support for handling denormalisation of single precision > > values. Useful for bare metal only. If unsure say Y here. > > -config CMDLINE > > - string "Initial kernel command string" > > - default "" > > - help > > - On some platforms, there is currently no way for the boot loader to > > - pass arguments to the kernel. For these platforms, you can supply > > - some command-line options at build time by entering them here. In > > - most cases you will need to specify the root device here. > > - > > -choice > > - prompt "Kernel command line type" if CMDLINE != "" > > - default CMDLINE_FROM_BOOTLOADER > > - > > -config CMDLINE_FROM_BOOTLOADER > > - bool "Use bootloader kernel arguments if available" > > - help > > - Uses the command-line options passed by the boot loader. If > > - the boot loader doesn't provide any, the default kernel command > > - string provided in CMDLINE will be used. > > - > > -config CMDLINE_EXTEND > > - bool "Extend bootloader kernel arguments" > > - help > > - The command-line arguments provided by the boot loader will be > > - appended to the default kernel command string. > > - > > -config CMDLINE_FORCE > > - bool "Always use the default kernel command string" > > - help > > - Always use the default kernel command string, even if the boot > > - loader passes other arguments to the kernel. > > - This is useful if you cannot or don't want to change the > > - command-line options your boot loader passes to the kernel. > > - > > -endchoice > > - > > config EXTRA_TARGETS > > string "Additional default image types" > > help > > diff --git a/arch/powerpc/kernel/prom.c b/arch/powerpc/kernel/prom.c > > index ae3c41730367..96d0a01be1b4 100644 > > --- a/arch/powerpc/kernel/prom.c > > +++ b/arch/powerpc/kernel/prom.c > > @@ -27,6 +27,7 @@ > > #include > > #include > > #include > > +#include > > Why is this needed in prom.c ? Must have been a mistake, I don't think it's needed. > > #include > > #include > > #include > > diff --git a/arch/powerpc/kernel/prom_init.c > > b/arch/powerpc/kernel/prom_init.c > > index e9d4eb6144e1..657241534d69 100644 > > --- a/arch/powerpc/kernel/prom_init.c > > +++ b/arch/powerpc/kernel/prom_init.c > > @@ -27,6 +27,7 @@ > > #include > > #include > > #include > > +#include > > #include > > #include > > #include > > @@ -242,15 +243,6 @@ static int __init prom_strcmp(const char *cs, const > > char *ct) > > return 0; > > } > > -static char __init *prom_strcpy(char *dest, const char *src) > > -{ > > - char *tmp = dest; > > - > > - while ((*dest++ = *src++) != '\0') > > - /* nothing */; > > - return tmp; > > -} > > - > > This game with prom_strcpy() should go a separate preceeding patch. > > Also, it looks like checkpatch.pl recommends to use strscpy() instead of > strlcpy(). strscpy() is very large. I'm not sure it's compatible with this prom_init.c environment. > > static int __init prom_strncmp(co
Re: [PATCH v2 3/7] powerpc: convert config files to generic cmdline
On Tue, Mar 09, 2021 at 08:47:09AM +0100, Christophe Leroy wrote: > > > Le 09/03/2021 à 01:02, Daniel Walker a écrit : > > This is a scripted mass convert of the config files to use > > the new generic cmdline. There is a bit of a trim effect here. > > It would seems that some of the config haven't been trimmed in > > a while. > > If you do that in a separate patch, you loose bisectability. > > I think it would have been better to do things in a different way, more or > less like I did in my series: > 1/ Provide GENERIC cmdline at the same functionnality level as what is > spread in the different architectures > 2/ Convert architectures to the generic with least churn. > 3/ Add new features to the generic You have to have the churn eventually, no matter how you do it. The only way you don't have churn is if you never upgrade the feature set. > > > > The bash script used to convert is as follows, > > > > if [[ -z "$1" || -z "$2" ]]; then > > echo "Two arguments are needed." > > exit 1 > > fi > > mkdir $1 > > cp $2 $1/.config > > sed -i 's/CONFIG_CMDLINE=/CONFIG_CMDLINE_BOOL=y\nCONFIG_CMDLINE_PREPEND=/g' > > $1/.config > > This is not correct. > > By default, on powerpc the provided command line is used only if the > bootloader doesn't provide one. > > Otherwise: > - the builtin command line is appended to the one provided by the bootloader > if CONFIG_CMDLINE_EXTEND is selected > - the builtin command line replaces to the one provided by the bootloader if > CONFIG_CMDLINE_FORCE is selected I think my changes maintain most of this due to the override of CONFIG_CMDLINE_PREPEND. This is an upgrade and the inflexibility in powerpc is an example of why these changes were created in the first place. For example , say the default command line is "root=/dev/issblk0" from iss476 platform. And the bootloader adds "root=/dev/sda1" The result is . Then you have, root=/dev/issblk0 root=/dev/sda1 and the bootloader has precedent over the default command line. So root= in the above cases is defined by the bootloader. The only issue would be if a person wants to override the default command line with an unrelated bootloader command line. I don't know how many people do this, but I doubt it's many. Can you think of any use cases like this? I would imagine there are many more people who have to entirely duplicate the default command line in the boot loader when they really just want to change a single part of it like the root= device or console device or speed. Daniel
[PATCH v2 7/7] CMDLINE: x86: convert to generic builtin command line
This updates the x86 code to use the CONFIG_GENERIC_CMDLINE option. Cc: xe-linux-exter...@cisco.com Signed-off-by: Ruslan Ruslichenko Signed-off-by: Ruslan Bilovol Signed-off-by: Daniel Walker --- arch/x86/Kconfig| 44 + arch/x86/kernel/setup.c | 18 ++ drivers/firmware/efi/libstub/x86-stub.c | 2 +- 3 files changed, 4 insertions(+), 60 deletions(-) diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig index 21f851179ff0..3950f9bf9855 100644 --- a/arch/x86/Kconfig +++ b/arch/x86/Kconfig @@ -115,6 +115,7 @@ config X86 select EDAC_SUPPORT select GENERIC_CLOCKEVENTS_BROADCASTif X86_64 || (X86_32 && X86_LOCAL_APIC) select GENERIC_CLOCKEVENTS_MIN_ADJUST + select GENERIC_CMDLINE select GENERIC_CMOS_UPDATE select GENERIC_CPU_AUTOPROBE select GENERIC_CPU_VULNERABILITIES @@ -2368,49 +2369,6 @@ choice endchoice -config CMDLINE_BOOL - bool "Built-in kernel command line" - help - Allow for specifying boot arguments to the kernel at - build time. On some systems (e.g. embedded ones), it is - necessary or convenient to provide some or all of the - kernel boot arguments with the kernel itself (that is, - to not rely on the boot loader to provide them.) - - To compile command line arguments into the kernel, - set this option to 'Y', then fill in the - boot arguments in CONFIG_CMDLINE. - - Systems with fully functional boot loaders (i.e. non-embedded) - should leave this option set to 'N'. - -config CMDLINE - string "Built-in kernel command string" - depends on CMDLINE_BOOL - default "" - help - Enter arguments here that should be compiled into the kernel - image and used at boot time. If the boot loader provides a - command line at boot time, it is appended to this string to - form the full kernel command line, when the system boots. - - However, you can use the CONFIG_CMDLINE_OVERRIDE option to - change this behavior. - - In most cases, the command line (whether built-in or provided - by the boot loader) should specify the device for the root - file system. - -config CMDLINE_OVERRIDE - bool "Built-in command line overrides boot loader arguments" - depends on CMDLINE_BOOL && CMDLINE != "" - help - Set this option to 'Y' to have the kernel ignore the boot loader - command line, and use ONLY the built-in command line. - - This is used to work around broken boot loaders. This should - be set to 'N' under normal conditions. - config MODIFY_LDT_SYSCALL bool "Enable the LDT (local descriptor table)" if EXPERT default y diff --git a/arch/x86/kernel/setup.c b/arch/x86/kernel/setup.c index 740f3bdb3f61..e748c3e5c1ae 100644 --- a/arch/x86/kernel/setup.c +++ b/arch/x86/kernel/setup.c @@ -48,6 +48,7 @@ #include #include #include +#include /* * max_low_pfn_mapped: highest directly mapped pfn < 4 GB @@ -162,9 +163,6 @@ unsigned long saved_video_mode; #define RAMDISK_LOAD_FLAG 0x4000 static char __initdata command_line[COMMAND_LINE_SIZE]; -#ifdef CONFIG_CMDLINE_BOOL -static char __initdata builtin_cmdline[COMMAND_LINE_SIZE] = CONFIG_CMDLINE; -#endif #if defined(CONFIG_EDD) || defined(CONFIG_EDD_MODULE) struct edd edd; @@ -884,19 +882,7 @@ void __init setup_arch(char **cmdline_p) bss_resource.start = __pa_symbol(__bss_start); bss_resource.end = __pa_symbol(__bss_stop)-1; -#ifdef CONFIG_CMDLINE_BOOL -#ifdef CONFIG_CMDLINE_OVERRIDE - strlcpy(boot_command_line, builtin_cmdline, COMMAND_LINE_SIZE); -#else - if (builtin_cmdline[0]) { - /* append boot loader cmdline to builtin */ - strlcat(builtin_cmdline, " ", COMMAND_LINE_SIZE); - strlcat(builtin_cmdline, boot_command_line, COMMAND_LINE_SIZE); - strlcpy(boot_command_line, builtin_cmdline, COMMAND_LINE_SIZE); - } -#endif -#endif - + cmdline_add_builtin(boot_command_line, NULL, COMMAND_LINE_SIZE); strlcpy(command_line, boot_command_line, COMMAND_LINE_SIZE); *cmdline_p = command_line; diff --git a/drivers/firmware/efi/libstub/x86-stub.c b/drivers/firmware/efi/libstub/x86-stub.c index f14c4ff5839f..9538c9d4a0bc 100644 --- a/drivers/firmware/efi/libstub/x86-stub.c +++ b/drivers/firmware/efi/libstub/x86-stub.c @@ -736,7 +736,7 @@ unsigned long efi_main(efi_handle_t handle, } #ifdef CONFIG_CMDLINE_BOOL - status = efi_parse_options(CONFIG_CMDLINE); + status = efi_parse_options(CONFIG_CMDLINE_PREPEND " " CONFIG_CMDLINE_APPEND); if (status != EFI_SUCCESS) { efi_err("Failed to parse options\n"); goto fail; -- 2.25.1
[PATCH v2 6/7] CMDLINE: mips: convert to generic builtin command line
This updates the mips code to use the CONFIG_GENERIC_CMDLINE option. This deletes the option for MIPS_CMDLINE_BUILTIN_EXTEND and replaces the functionality with generic code. Cc: xe-linux-exter...@cisco.com Signed-off-by: Ruslan Ruslichenko Signed-off-by: Ruslan Bilovol Signed-off-by: Daniel Walker --- arch/mips/Kconfig| 4 +--- arch/mips/Kconfig.debug | 44 arch/mips/kernel/setup.c | 36 3 files changed, 5 insertions(+), 79 deletions(-) diff --git a/arch/mips/Kconfig b/arch/mips/Kconfig index 0a17bedf4f0d..7c07b3bca9fc 100644 --- a/arch/mips/Kconfig +++ b/arch/mips/Kconfig @@ -23,6 +23,7 @@ config MIPS select CPU_NO_EFFICIENT_FFS if (TARGET_ISA_REV < 1) select CPU_PM if CPU_IDLE select GENERIC_ATOMIC64 if !64BIT + select GENERIC_CMDLINE select GENERIC_CMOS_UPDATE select GENERIC_CPU_AUTOPROBE select GENERIC_GETTIMEOFDAY @@ -3171,9 +3172,6 @@ choice config MIPS_CMDLINE_FROM_BOOTLOADER bool "Bootloader kernel arguments if available" - config MIPS_CMDLINE_BUILTIN_EXTEND - depends on CMDLINE_BOOL - bool "Extend builtin kernel arguments with bootloader arguments" endchoice endmenu diff --git a/arch/mips/Kconfig.debug b/arch/mips/Kconfig.debug index 7a8d94cdd493..b5a099c74eb6 100644 --- a/arch/mips/Kconfig.debug +++ b/arch/mips/Kconfig.debug @@ -30,50 +30,6 @@ config EARLY_PRINTK_8250 config USE_GENERIC_EARLY_PRINTK_8250 bool -config CMDLINE_BOOL - bool "Built-in kernel command line" - help - For most systems, it is firmware or second stage bootloader that - by default specifies the kernel command line options. However, - it might be necessary or advantageous to either override the - default kernel command line or add a few extra options to it. - For such cases, this option allows you to hardcode your own - command line options directly into the kernel. For that, you - should choose 'Y' here, and fill in the extra boot arguments - in CONFIG_CMDLINE. - - The built-in options will be concatenated to the default command - line if CMDLINE_OVERRIDE is set to 'N'. Otherwise, the default - command line will be ignored and replaced by the built-in string. - - Most MIPS systems will normally expect 'N' here and rely upon - the command line from the firmware or the second-stage bootloader. - -config CMDLINE - string "Default kernel command string" - depends on CMDLINE_BOOL - help - On some platforms, there is currently no way for the boot loader to - pass arguments to the kernel. For these platforms, and for the cases - when you want to add some extra options to the command line or ignore - the default command line, you can supply some command-line options at - build time by entering them here. In other cases you can specify - kernel args so that you don't have to set them up in board prom - initialization routines. - - For more information, see the CMDLINE_BOOL and CMDLINE_OVERRIDE - options. - -config CMDLINE_OVERRIDE - bool "Built-in command line overrides firmware arguments" - depends on CMDLINE_BOOL - help - By setting this option to 'Y' you will have your kernel ignore - command line arguments from firmware or second stage bootloader. - Instead, the built-in command line will be used exclusively. - - Normally, you will choose 'N' here. - config SB1XXX_CORELIS bool "Corelis Debugger" depends on SIBYTE_SB1xxx_SOC diff --git a/arch/mips/kernel/setup.c b/arch/mips/kernel/setup.c index 7e1f8e277437..8ce763e03792 100644 --- a/arch/mips/kernel/setup.c +++ b/arch/mips/kernel/setup.c @@ -23,6 +23,7 @@ #include #include #include +#include #include #include #include @@ -67,12 +68,6 @@ EXPORT_SYMBOL(mips_machtype); static char __initdata command_line[COMMAND_LINE_SIZE]; char __initdata arcs_cmdline[COMMAND_LINE_SIZE]; -#ifdef CONFIG_CMDLINE_BOOL -static const char builtin_cmdline[] __initconst = CONFIG_CMDLINE; -#else -static const char builtin_cmdline[] __initconst = ""; -#endif - /* * mips_io_port_base is the begin of the address space to which x86 style * I/O ports are mapped. @@ -546,27 +541,7 @@ static void __init bootcmdline_init(void) { bool dt_bootargs = false; - /* -* If CMDLINE_OVERRIDE is enabled then initializing the command line is -* trivial - we simply use the built-in command line unconditionally & -* unmodified. -*/ - if (IS_ENABLED(CONFIG_CMDLINE_OVERRIDE)) { - strlcpy(boot_command_line, builtin_cmdline, COMMAND_LINE_SIZE); - return; -
[PATCH v2 5/7] mips: convert config files to generic cmdline
This is a scripted mass convert of the config files to use the new generic cmdline. There is a bit of a trim effect here. It would seems that some of the config haven't been trimmed in a while. The script used is as follows, if [[ -z "$1" || -z "$2" ]]; then echo "Two arguments are needed." exit 1 fi mkdir $1 cp $2 $1/.config sed -i 's/CONFIG_CMDLINE=/CONFIG_CMDLINE_BOOL=y\nCONFIG_CMDLINE_PREPEND=/g' $1/.config make ARCH=$1 O=$1 olddefconfig make ARCH=$1 O=$1 savedefconfig cp $1/defconfig $2 rm -Rf $1 Cc: xe-linux-exter...@cisco.com Signed-off-by: Daniel Walker --- arch/mips/configs/ar7_defconfig| 9 ++--- arch/mips/configs/bcm47xx_defconfig| 8 arch/mips/configs/bcm63xx_defconfig| 15 +-- arch/mips/configs/bmips_be_defconfig | 11 --- arch/mips/configs/bmips_stb_defconfig | 11 --- arch/mips/configs/capcella_defconfig | 11 ++- arch/mips/configs/ci20_defconfig | 10 -- arch/mips/configs/cu1000-neo_defconfig | 10 -- arch/mips/configs/cu1830-neo_defconfig | 10 -- arch/mips/configs/e55_defconfig| 4 ++-- arch/mips/configs/generic_defconfig| 6 ++ arch/mips/configs/gpr_defconfig| 18 +++--- arch/mips/configs/loongson3_defconfig | 13 ++--- arch/mips/configs/mpc30x_defconfig | 7 ++- arch/mips/configs/tb0219_defconfig | 7 ++- arch/mips/configs/tb0226_defconfig | 7 ++- arch/mips/configs/tb0287_defconfig | 7 ++- arch/mips/configs/workpad_defconfig| 11 --- 18 files changed, 54 insertions(+), 121 deletions(-) diff --git a/arch/mips/configs/ar7_defconfig b/arch/mips/configs/ar7_defconfig index cf9c6329b807..c09470aa672f 100644 --- a/arch/mips/configs/ar7_defconfig +++ b/arch/mips/configs/ar7_defconfig @@ -12,6 +12,8 @@ CONFIG_EXPERT=y # CONFIG_VM_EVENT_COUNTERS is not set # CONFIG_COMPAT_BRK is not set CONFIG_SLAB=y +CONFIG_CMDLINE_BOOL=y +CONFIG_CMDLINE_PREPEND="rootfstype=squashfs,jffs2" CONFIG_AR7=y CONFIG_HZ_100=y CONFIG_KEXEC=y @@ -32,9 +34,6 @@ CONFIG_IP_ROUTE_MULTIPATH=y CONFIG_IP_ROUTE_VERBOSE=y CONFIG_IP_MROUTE=y CONFIG_SYN_COOKIES=y -# CONFIG_INET_XFRM_MODE_TRANSPORT is not set -# CONFIG_INET_XFRM_MODE_TUNNEL is not set -# CONFIG_INET_XFRM_MODE_BEET is not set # CONFIG_INET_DIAG is not set CONFIG_TCP_CONG_ADVANCED=y # CONFIG_TCP_CONG_BIC is not set @@ -43,7 +42,6 @@ CONFIG_TCP_CONG_WESTWOOD=y # CONFIG_TCP_CONG_HTCP is not set # CONFIG_IPV6 is not set CONFIG_NETFILTER=y -# CONFIG_BRIDGE_NETFILTER is not set CONFIG_NF_CONNTRACK=m CONFIG_NF_CONNTRACK_MARK=y CONFIG_NF_CONNTRACK_FTP=m @@ -117,8 +115,5 @@ CONFIG_JFFS2_SUMMARY=y CONFIG_JFFS2_COMPRESSION_OPTIONS=y CONFIG_SQUASHFS=y # CONFIG_CRYPTO_HW is not set -# CONFIG_ENABLE_MUST_CHECK is not set CONFIG_STRIP_ASM_SYMS=y CONFIG_DEBUG_FS=y -CONFIG_CMDLINE_BOOL=y -CONFIG_CMDLINE="rootfstype=squashfs,jffs2" diff --git a/arch/mips/configs/bcm47xx_defconfig b/arch/mips/configs/bcm47xx_defconfig index 91ce75edbfb4..69a965bb2dd9 100644 --- a/arch/mips/configs/bcm47xx_defconfig +++ b/arch/mips/configs/bcm47xx_defconfig @@ -4,8 +4,9 @@ CONFIG_BLK_DEV_INITRD=y CONFIG_CC_OPTIMIZE_FOR_SIZE=y CONFIG_EMBEDDED=y CONFIG_SLAB=y +CONFIG_CMDLINE_BOOL=y +CONFIG_CMDLINE_PREPEND="console=ttyS0,115200" CONFIG_BCM47XX=y -CONFIG_PCI=y # CONFIG_SUSPEND is not set CONFIG_MODULES=y CONFIG_MODULE_UNLOAD=y @@ -32,6 +33,7 @@ CONFIG_NET_SCH_FQ_CODEL=y CONFIG_HAMRADIO=y CONFIG_CFG80211=y CONFIG_MAC80211=y +CONFIG_PCI=y CONFIG_MTD=y CONFIG_MTD_BCM47XX_PARTS=y CONFIG_MTD_BLOCK=y @@ -75,7 +77,5 @@ CONFIG_PRINTK_TIME=y CONFIG_DEBUG_INFO=y CONFIG_DEBUG_INFO_REDUCED=y CONFIG_STRIP_ASM_SYMS=y -CONFIG_DEBUG_FS=y CONFIG_MAGIC_SYSRQ=y -CONFIG_CMDLINE_BOOL=y -CONFIG_CMDLINE="console=ttyS0,115200" +CONFIG_DEBUG_FS=y diff --git a/arch/mips/configs/bcm63xx_defconfig b/arch/mips/configs/bcm63xx_defconfig index 861f680184b9..6791e48b2d7d 100644 --- a/arch/mips/configs/bcm63xx_defconfig +++ b/arch/mips/configs/bcm63xx_defconfig @@ -11,27 +11,26 @@ CONFIG_EXPERT=y # CONFIG_AIO is not set # CONFIG_VM_EVENT_COUNTERS is not set # CONFIG_SLUB_DEBUG is not set +CONFIG_CMDLINE_BOOL=y +CONFIG_CMDLINE_PREPEND="console=ttyS0,115200" CONFIG_BCM63XX=y CONFIG_BCM63XX_CPU_6338=y CONFIG_BCM63XX_CPU_6345=y CONFIG_BCM63XX_CPU_6348=y CONFIG_BCM63XX_CPU_6358=y # CONFIG_SECCOMP is not set -CONFIG_PCI=y -CONFIG_PCCARD=y -CONFIG_PCMCIA_BCM63XX=y # CONFIG_BLK_DEV_BSG is not set CONFIG_NET=y CONFIG_UNIX=y CONFIG_INET=y -# CONFIG_INET_XFRM_MODE_TRANSPORT is not set -# CONFIG_INET_XFRM_MODE_TUNNEL is not set -# CONFIG_INET_XFRM_MODE_BEET is not set # CONFIG_INET_DIAG is not set # CONFIG_IPV6 is not set CONFIG_CFG80211=y CONFIG_NL80211_TESTMODE=y CONFIG_MAC80211=y +CONFIG_PCI=y +CONFIG_PCCARD=y +CONFIG_PCMCIA_BCM63XX=y # CONFIG_STANDALONE is not set # CONFIG_PREVENT_FIRMWA
[PATCH v2 4/7] CMDLINE: powerpc: convert to generic builtin command line
This updates the powerpc code to use the CONFIG_GENERIC_CMDLINE option. Cc: xe-linux-exter...@cisco.com Signed-off-by: Ruslan Ruslichenko Signed-off-by: Ruslan Bilovol Signed-off-by: Daniel Walker --- arch/powerpc/Kconfig| 37 + arch/powerpc/kernel/prom.c | 1 + arch/powerpc/kernel/prom_init.c | 35 ++- 3 files changed, 23 insertions(+), 50 deletions(-) diff --git a/arch/powerpc/Kconfig b/arch/powerpc/Kconfig index 107bb4319e0e..276b06d5c961 100644 --- a/arch/powerpc/Kconfig +++ b/arch/powerpc/Kconfig @@ -167,6 +167,7 @@ config PPC select EDAC_SUPPORT select GENERIC_ATOMIC64 if PPC32 select GENERIC_CLOCKEVENTS_BROADCASTif SMP + select GENERIC_CMDLINE select GENERIC_CMOS_UPDATE select GENERIC_CPU_AUTOPROBE select GENERIC_CPU_VULNERABILITIES if PPC_BARRIER_NOSPEC @@ -906,42 +907,6 @@ config PPC_DENORMALISATION Add support for handling denormalisation of single precision values. Useful for bare metal only. If unsure say Y here. -config CMDLINE - string "Initial kernel command string" - default "" - help - On some platforms, there is currently no way for the boot loader to - pass arguments to the kernel. For these platforms, you can supply - some command-line options at build time by entering them here. In - most cases you will need to specify the root device here. - -choice - prompt "Kernel command line type" if CMDLINE != "" - default CMDLINE_FROM_BOOTLOADER - -config CMDLINE_FROM_BOOTLOADER - bool "Use bootloader kernel arguments if available" - help - Uses the command-line options passed by the boot loader. If - the boot loader doesn't provide any, the default kernel command - string provided in CMDLINE will be used. - -config CMDLINE_EXTEND - bool "Extend bootloader kernel arguments" - help - The command-line arguments provided by the boot loader will be - appended to the default kernel command string. - -config CMDLINE_FORCE - bool "Always use the default kernel command string" - help - Always use the default kernel command string, even if the boot - loader passes other arguments to the kernel. - This is useful if you cannot or don't want to change the - command-line options your boot loader passes to the kernel. - -endchoice - config EXTRA_TARGETS string "Additional default image types" help diff --git a/arch/powerpc/kernel/prom.c b/arch/powerpc/kernel/prom.c index ae3c41730367..96d0a01be1b4 100644 --- a/arch/powerpc/kernel/prom.c +++ b/arch/powerpc/kernel/prom.c @@ -27,6 +27,7 @@ #include #include #include +#include #include #include #include diff --git a/arch/powerpc/kernel/prom_init.c b/arch/powerpc/kernel/prom_init.c index e9d4eb6144e1..657241534d69 100644 --- a/arch/powerpc/kernel/prom_init.c +++ b/arch/powerpc/kernel/prom_init.c @@ -27,6 +27,7 @@ #include #include #include +#include #include #include #include @@ -242,15 +243,6 @@ static int __init prom_strcmp(const char *cs, const char *ct) return 0; } -static char __init *prom_strcpy(char *dest, const char *src) -{ - char *tmp = dest; - - while ((*dest++ = *src++) != '\0') - /* nothing */; - return tmp; -} - static int __init prom_strncmp(const char *cs, const char *ct, size_t count) { unsigned char c1, c2; @@ -276,6 +268,20 @@ static size_t __init prom_strlen(const char *s) return sc - s; } +static size_t __init prom_strlcpy(char *dest, const char *src, size_t size) +{ + size_t ret = prom_strlen(src); + + if (size) { + size_t len = (ret >= size) ? size - 1 : ret; + + memcpy(dest, src, len); + dest[len] = '\0'; + } + return ret; +} + + static int __init prom_memcmp(const void *cs, const void *ct, size_t count) { const unsigned char *su1, *su2; @@ -304,6 +310,7 @@ static char __init *prom_strstr(const char *s1, const char *s2) return NULL; } +#ifdef GENERIC_CMDLINE_NEED_STRLCAT static size_t __init prom_strlcat(char *dest, const char *src, size_t count) { size_t dsize = prom_strlen(dest); @@ -323,6 +330,7 @@ static size_t __init prom_strlcat(char *dest, const char *src, size_t count) return res; } +#endif #ifdef CONFIG_PPC_PSERIES static int __init prom_strtobool(const char *s, bool *res) @@ -775,12 +783,11 @@ static void __init early_cmdline_parse(void) prom_cmd_line[0] = 0; p = prom_cmd_line; - if (!IS_ENABLED(CONFIG_CMDLINE_FORCE) && (long)prom.chosen > 0) + if ((long)prom.chosen > 0) l = prom_getprop(prom.chosen, "bootarg
[PATCH v2 3/7] powerpc: convert config files to generic cmdline
This is a scripted mass convert of the config files to use the new generic cmdline. There is a bit of a trim effect here. It would seems that some of the config haven't been trimmed in a while. The bash script used to convert is as follows, if [[ -z "$1" || -z "$2" ]]; then echo "Two arguments are needed." exit 1 fi mkdir $1 cp $2 $1/.config sed -i 's/CONFIG_CMDLINE=/CONFIG_CMDLINE_BOOL=y\nCONFIG_CMDLINE_PREPEND=/g' $1/.config make ARCH=$1 O=$1 olddefconfig make ARCH=$1 O=$1 savedefconfig cp $1/defconfig $2 rm -Rf $1 Cc: xe-linux-exter...@cisco.com Signed-off-by: Daniel Walker --- arch/powerpc/configs/44x/fsp2_defconfig | 33 +-- arch/powerpc/configs/44x/iss476-smp_defconfig | 25 +++--- arch/powerpc/configs/44x/warp_defconfig | 17 +- arch/powerpc/configs/holly_defconfig | 13 arch/powerpc/configs/mvme5100_defconfig | 23 ++--- arch/powerpc/configs/skiroot_defconfig| 12 +++ arch/powerpc/configs/storcenter_defconfig | 18 -- 7 files changed, 66 insertions(+), 75 deletions(-) diff --git a/arch/powerpc/configs/44x/fsp2_defconfig b/arch/powerpc/configs/44x/fsp2_defconfig index 30845ce0885a..4993db054589 100644 --- a/arch/powerpc/configs/44x/fsp2_defconfig +++ b/arch/powerpc/configs/44x/fsp2_defconfig @@ -1,8 +1,6 @@ -CONFIG_44x=y # CONFIG_SWAP is not set CONFIG_SYSVIPC=y # CONFIG_CROSS_MEMORY_ATTACH is not set -# CONFIG_FHANDLE is not set CONFIG_NO_HZ=y CONFIG_HIGH_RES_TIMERS=y CONFIG_IKCONFIG=y @@ -13,24 +11,25 @@ CONFIG_BLK_DEV_INITRD=y # CONFIG_RD_XZ is not set # CONFIG_RD_LZO is not set # CONFIG_RD_LZ4 is not set +# CONFIG_FHANDLE is not set CONFIG_KALLSYMS_ALL=y CONFIG_BPF_SYSCALL=y CONFIG_EMBEDDED=y CONFIG_PROFILING=y -CONFIG_OPROFILE=y -CONFIG_MODULES=y -CONFIG_MODULE_UNLOAD=y -# CONFIG_BLK_DEV_BSG is not set +CONFIG_CMDLINE_BOOL=y +CONFIG_CMDLINE_PREPEND="ip=on rw" +CONFIG_44x=y CONFIG_PPC_47x=y # CONFIG_EBONY is not set CONFIG_FSP2=y CONFIG_476FPE_ERR46=y -CONFIG_SWIOTLB=y CONFIG_KEXEC=y CONFIG_CRASH_DUMP=y -CONFIG_CMDLINE="ip=on rw" # CONFIG_SUSPEND is not set -# CONFIG_PCI is not set +CONFIG_OPROFILE=y +CONFIG_MODULES=y +CONFIG_MODULE_UNLOAD=y +# CONFIG_BLK_DEV_BSG is not set CONFIG_NET=y CONFIG_PACKET=y CONFIG_UNIX=y @@ -47,14 +46,12 @@ CONFIG_MTD=y CONFIG_MTD_BLOCK=y CONFIG_MTD_JEDECPROBE=y CONFIG_MTD_CFI_AMDSTD=y -CONFIG_MTD_PHYSMAP_OF=y CONFIG_BLK_DEV_RAM=y CONFIG_BLK_DEV_RAM_SIZE=35000 # CONFIG_SCSI_PROC_FS is not set CONFIG_BLK_DEV_SD=y # CONFIG_SCSI_LOWLEVEL is not set CONFIG_ATA=y -# CONFIG_SATA_PMP is not set # CONFIG_ATA_SFF is not set CONFIG_NETDEVICES=y CONFIG_BONDING=m @@ -63,7 +60,6 @@ CONFIG_IBM_EMAC=m # CONFIG_SERIO is not set # CONFIG_VT is not set # CONFIG_LEGACY_PTYS is not set -# CONFIG_DEVMEM is not set CONFIG_SERIAL_8250=y CONFIG_SERIAL_8250_CONSOLE=y CONFIG_SERIAL_8250_NR_UARTS=32 @@ -72,6 +68,7 @@ CONFIG_SERIAL_8250_EXTENDED=y CONFIG_SERIAL_8250_SHARE_IRQ=y CONFIG_SERIAL_OF_PLATFORM=y # CONFIG_HW_RANDOM is not set +# CONFIG_DEVMEM is not set CONFIG_I2C=y CONFIG_I2C_IBM_IIC=y CONFIG_PTP_1588_CLOCK=y @@ -107,6 +104,12 @@ CONFIG_NFS_V3_ACL=y CONFIG_NFS_V4=y CONFIG_ROOT_NFS=y CONFIG_NLS_DEFAULT="n" +CONFIG_CRYPTO_CBC=y +CONFIG_CRYPTO_ECB=y +CONFIG_CRYPTO_PCBC=y +CONFIG_CRYPTO_MD5=y +CONFIG_CRYPTO_DES=y +# CONFIG_CRYPTO_HW is not set CONFIG_XZ_DEC=y CONFIG_PRINTK_TIME=y CONFIG_MESSAGE_LOGLEVEL_DEFAULT=3 @@ -114,9 +117,3 @@ CONFIG_DYNAMIC_DEBUG=y CONFIG_DEBUG_INFO=y CONFIG_MAGIC_SYSRQ=y CONFIG_DETECT_HUNG_TASK=y -CONFIG_CRYPTO_CBC=y -CONFIG_CRYPTO_ECB=y -CONFIG_CRYPTO_PCBC=y -CONFIG_CRYPTO_MD5=y -CONFIG_CRYPTO_DES=y -# CONFIG_CRYPTO_HW is not set diff --git a/arch/powerpc/configs/44x/iss476-smp_defconfig b/arch/powerpc/configs/44x/iss476-smp_defconfig index 2c3834eebca3..b8d97061517a 100644 --- a/arch/powerpc/configs/44x/iss476-smp_defconfig +++ b/arch/powerpc/configs/44x/iss476-smp_defconfig @@ -1,5 +1,3 @@ -CONFIG_44x=y -CONFIG_SMP=y CONFIG_SYSVIPC=y CONFIG_POSIX_MQUEUE=y CONFIG_LOG_BUF_SHIFT=14 @@ -7,20 +5,22 @@ CONFIG_BLK_DEV_INITRD=y CONFIG_EXPERT=y CONFIG_KALLSYMS_ALL=y CONFIG_PROFILING=y -CONFIG_OPROFILE=y -CONFIG_MODULES=y -CONFIG_MODULE_UNLOAD=y -# CONFIG_BLK_DEV_BSG is not set +CONFIG_CMDLINE_BOOL=y +CONFIG_CMDLINE_PREPEND="root=/dev/issblk0" +CONFIG_44x=y +CONFIG_SMP=y CONFIG_PPC_47x=y # CONFIG_EBONY is not set CONFIG_ISS4xx=y CONFIG_HZ_100=y CONFIG_MATH_EMULATION=y CONFIG_IRQ_ALL_CPUS=y -CONFIG_CMDLINE="root=/dev/issblk0" -# CONFIG_PCI is not set CONFIG_ADVANCED_OPTIONS=y CONFIG_DYNAMIC_MEMSTART=y +CONFIG_OPROFILE=y +CONFIG_MODULES=y +CONFIG_MODULE_UNLOAD=y +# CONFIG_BLK_DEV_BSG is not set CONFIG_NET=y CONFIG_PACKET=y CONFIG_UNIX=y @@ -34,7 +34,6 @@ CONFIG_MTD=y CONFIG_MTD_BLOCK=y CONFIG_MTD_JEDECPROBE=y CONFIG_MTD_CFI_AMDSTD=y -CONFIG_MTD_PHYSMAP_OF=y CONFIG_BLK_DEV_RAM=y CONFIG_BLK_DEV_R
[PATCH v2 2/7] CMDLINE: drivers: of: ifdef out cmdline section
It looks like there's some seepage of cmdline stuff into the generic device tree code. This conflicts with the generic cmdline implementation so I remove it in the case when that's enabled. Cc: xe-linux-exter...@cisco.com Signed-off-by: Ruslan Ruslichenko Signed-off-by: Daniel Walker --- drivers/of/fdt.c | 12 1 file changed, 12 insertions(+) diff --git a/drivers/of/fdt.c b/drivers/of/fdt.c index feb0f2d67fc5..e25240d84632 100644 --- a/drivers/of/fdt.c +++ b/drivers/of/fdt.c @@ -25,6 +25,7 @@ #include #include #include +#include #include /* for COMMAND_LINE_SIZE */ #include @@ -1050,6 +1051,16 @@ int __init early_init_dt_scan_chosen(unsigned long node, const char *uname, /* Retrieve command line */ p = of_get_flat_dt_prop(node, "bootargs", ); + +#ifdef CONFIG_GENERIC_CMDLINE + /* +* The builtin command line will be added here, or it can override +* with the DT bootargs. +*/ + cmdline_add_builtin(data, + (l > 0 ? p : NULL), /* This is sanity checking */ + COMMAND_LINE_SIZE); +#else if (p != NULL && l > 0) strlcpy(data, p, min(l, COMMAND_LINE_SIZE)); @@ -1070,6 +1081,7 @@ int __init early_init_dt_scan_chosen(unsigned long node, const char *uname, strlcpy(data, CONFIG_CMDLINE, COMMAND_LINE_SIZE); #endif #endif /* CONFIG_CMDLINE */ +#endif /* CONFIG_GENERIC_CMDLINE */ pr_debug("Command line is: %s\n", (char *)data); -- 2.25.1
[PATCH v2 0/7] Generic Command Line changes
This fixed some problem identified in my last release. I made updates based on comments from Christophe Leroy. I added scripted updates to the defconfig file for mips and powerpc. This is required in order to maintain the status quo for those platforms which used the prior builtin command line system. These were tested on all effected architectures. Daniel Walker (7): CMDLINE: add generic builtin command line CMDLINE: drivers: of: ifdef out cmdline section powerpc: convert config files to generic cmdline CMDLINE: powerpc: convert to generic builtin command line mips: convert config files to generic cmdline CMDLINE: mips: convert to generic builtin command line CMDLINE: x86: convert to generic builtin command line arch/mips/Kconfig | 4 +- arch/mips/Kconfig.debug | 44 - arch/mips/configs/ar7_defconfig | 9 +- arch/mips/configs/bcm47xx_defconfig | 8 +- arch/mips/configs/bcm63xx_defconfig | 15 ++-- arch/mips/configs/bmips_be_defconfig | 11 +-- arch/mips/configs/bmips_stb_defconfig | 11 +-- arch/mips/configs/capcella_defconfig | 11 +-- arch/mips/configs/ci20_defconfig | 10 +-- arch/mips/configs/cu1000-neo_defconfig| 10 +-- arch/mips/configs/cu1830-neo_defconfig| 10 +-- arch/mips/configs/e55_defconfig | 4 +- arch/mips/configs/generic_defconfig | 6 +- arch/mips/configs/gpr_defconfig | 18 +--- arch/mips/configs/loongson3_defconfig | 13 +-- arch/mips/configs/mpc30x_defconfig| 7 +- arch/mips/configs/tb0219_defconfig| 7 +- arch/mips/configs/tb0226_defconfig| 7 +- arch/mips/configs/tb0287_defconfig| 7 +- arch/mips/configs/workpad_defconfig | 11 +-- arch/mips/kernel/setup.c | 36 +--- arch/powerpc/Kconfig | 37 +--- arch/powerpc/configs/44x/fsp2_defconfig | 33 --- arch/powerpc/configs/44x/iss476-smp_defconfig | 25 +++--- arch/powerpc/configs/44x/warp_defconfig | 17 ++-- arch/powerpc/configs/holly_defconfig | 13 +-- arch/powerpc/configs/mvme5100_defconfig | 23 ++--- arch/powerpc/configs/skiroot_defconfig| 12 ++- arch/powerpc/configs/storcenter_defconfig | 18 ++-- arch/powerpc/kernel/prom.c| 1 + arch/powerpc/kernel/prom_init.c | 35 +--- arch/x86/Kconfig | 44 + arch/x86/kernel/setup.c | 18 +--- drivers/firmware/efi/libstub/x86-stub.c | 2 +- drivers/of/fdt.c | 12 +++ include/linux/cmdline.h | 89 +++ init/Kconfig | 68 ++ 37 files changed, 321 insertions(+), 385 deletions(-) create mode 100644 include/linux/cmdline.h -- 2.25.1
[PATCH v2 1/7] CMDLINE: add generic builtin command line
This code allows architectures to use a generic builtin command line. The state of the builtin command line options across architecture is diverse. On x86 and mips they have pretty much the same code and the code prepends the builtin command line onto the boot loader provided one. On powerpc there is only a builtin override and nothing else. The code in this commit unifies the code into a generic header file under the CONFIG_GENERIC_CMDLINE option. When this option is enabled the architecture can call the cmdline_add_builtin() to add the builtin command line. Cc: xe-linux-exter...@cisco.com Signed-off-by: Ruslan Bilovol Signed-off-by: Daniel Walker --- include/linux/cmdline.h | 89 + init/Kconfig| 68 +++ 2 files changed, 157 insertions(+) create mode 100644 include/linux/cmdline.h diff --git a/include/linux/cmdline.h b/include/linux/cmdline.h new file mode 100644 index ..00929b6e49e6 --- /dev/null +++ b/include/linux/cmdline.h @@ -0,0 +1,89 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +#ifndef _LINUX_CMDLINE_H +#define _LINUX_CMDLINE_H + +/* + * + * Copyright (C) 2006,2021. Cisco Systems, Inc. + * + * Generic Append/Prepend cmdline support. + */ + +#if defined(CONFIG_GENERIC_CMDLINE) && defined(CONFIG_CMDLINE_BOOL) + +#ifndef CONFIG_CMDLINE_OVERRIDE +#define GENERIC_CMDLINE_NEED_STRLCAT +/* + * This function will append or prepend a builtin command line to the command + * line provided by the bootloader. Kconfig options can be used to alter + * the behavior of this builtin command line. + * @dest: The destination of the final appended/prepended string + * @src: The starting string or NULL if there isn't one. + * @tmp: temporary space used for prepending + * @length: the maximum length of the strings above. + * @cmdline_strlcpy: point to a compatible strlcpy + * @cmdline_strlcat: point to a compatible strlcat + */ +static inline void +__cmdline_add_builtin(char *dest, const char *src, char *tmp, unsigned long length, + size_t (*cmdline_strlcpy)(char *dest, const char *src, size_t size), + size_t (*cmdline_strlcat)(char *dest, const char *src, size_t count)) +{ + if (src != dest && src != NULL) { + cmdline_strlcpy(dest, " ", length); + cmdline_strlcat(dest, src, length); + } + + if (sizeof(CONFIG_CMDLINE_APPEND) > 1) + cmdline_strlcat(dest, " " CONFIG_CMDLINE_APPEND, length); + + if (sizeof(CONFIG_CMDLINE_PREPEND) > 1) { + cmdline_strlcpy(tmp, CONFIG_CMDLINE_PREPEND " ", length); + cmdline_strlcat(tmp, dest, length); + cmdline_strlcpy(dest, tmp, length); + } +} + +#define cmdline_add_builtin_custom(dest, src, length, label, cmdline_strlcpy, cmdline_strlcat) \ +{ \ + if (sizeof(CONFIG_CMDLINE_PREPEND) > 1) { \ + static label char cmdline_tmp_space[length]; \ + __cmdline_add_builtin(dest, src, cmdline_tmp_space, length, cmdline_strlcpy, cmdline_strlcat); \ + } else if (sizeof(CONFIG_CMDLINE_APPEND) > 1) { \ + __cmdline_add_builtin(dest, src, NULL, length, cmdline_strlcpy, cmdline_strlcat); \ + } \ +} +#define cmdline_add_builtin(dest, src, length) \ + cmdline_add_builtin_custom(dest, src, length, __initdata, strlcpy, strlcat) + +#else /* CONFIG_CMDLINE_OVERRIDE */ + +static inline void +__cmdline_add_builtin_custom(char *dest, const char *src, unsigned long length, + size_t (*cmdline_strlcpy)(char *dest, const char *src, size_t size)) +{ + cmdline_strlcpy(dest, CONFIG_CMDLINE_PREPEND " " CONFIG_CMDLINE_APPEND, length); +} +#define cmdline_add_builtin_custom(dest, src, length, label, cmdline_strlcpy, cmdline_strlcat) \ + __cmdline_add_builtin_custom(dest, src, length, cmdline_strlcpy) +#define cmdline_add_builtin(dest, src, length) \ + __cmdline_add_builtin_custom(dest, src, length, strlcpy) +#endif /* !CONFIG_CMDLINE_OVERRIDE */ + +#else /* !CONFIG_GENERIC_CMDLINE || !CONFIG_CMDLINE_BOOL */ + +static inline void +__cmdline_add_builtin_custom(char *dest, const char *src, unsigned long length, + size_t (*cmdline_strlcpy)(char *dest, const char *src, size_t size)) +{ + if (src != NULL) + cmdline_strlcpy(dest, src, length); +} +#define cmdline_add_builtin_custom(dest, src, length, label, cmdline_strlcpy, cmdline_strlcat) \ + __cmdline_add_builtin_custom(d
[PATCH v2 2/7] CMDLINE: drivers: of: ifdef out cmdline section
It looks like there's some seepage of cmdline stuff into the generic device tree code. This conflicts with the generic cmdline implementation so I remove it in the case when that's enabled. Cc: xe-linux-exter...@cisco.com Signed-off-by: Ruslan Ruslichenko Signed-off-by: Daniel Walker --- drivers/of/fdt.c | 12 1 file changed, 12 insertions(+) diff --git a/drivers/of/fdt.c b/drivers/of/fdt.c index feb0f2d67fc5..e25240d84632 100644 --- a/drivers/of/fdt.c +++ b/drivers/of/fdt.c @@ -25,6 +25,7 @@ #include #include #include +#include #include /* for COMMAND_LINE_SIZE */ #include @@ -1050,6 +1051,16 @@ int __init early_init_dt_scan_chosen(unsigned long node, const char *uname, /* Retrieve command line */ p = of_get_flat_dt_prop(node, "bootargs", ); + +#ifdef CONFIG_GENERIC_CMDLINE + /* +* The builtin command line will be added here, or it can override +* with the DT bootargs. +*/ + cmdline_add_builtin(data, + (l > 0 ? p : NULL), /* This is sanity checking */ + COMMAND_LINE_SIZE); +#else if (p != NULL && l > 0) strlcpy(data, p, min(l, COMMAND_LINE_SIZE)); @@ -1070,6 +1081,7 @@ int __init early_init_dt_scan_chosen(unsigned long node, const char *uname, strlcpy(data, CONFIG_CMDLINE, COMMAND_LINE_SIZE); #endif #endif /* CONFIG_CMDLINE */ +#endif /* CONFIG_GENERIC_CMDLINE */ pr_debug("Command line is: %s\n", (char *)data); -- 2.25.1
[PATCH v2 1/7] CMDLINE: add generic builtin command line
This code allows architectures to use a generic builtin command line. The state of the builtin command line options across architecture is diverse. On x86 and mips they have pretty much the same code and the code prepends the builtin command line onto the boot loader provided one. On powerpc there is only a builtin override and nothing else. The code in this commit unifies the code into a generic header file under the CONFIG_GENERIC_CMDLINE option. When this option is enabled the architecture can call the cmdline_add_builtin() to add the builtin command line. Cc: xe-linux-exter...@cisco.com Signed-off-by: Ruslan Bilovol Signed-off-by: Daniel Walker --- include/linux/cmdline.h | 89 + init/Kconfig| 68 +++ 2 files changed, 157 insertions(+) create mode 100644 include/linux/cmdline.h diff --git a/include/linux/cmdline.h b/include/linux/cmdline.h new file mode 100644 index ..00929b6e49e6 --- /dev/null +++ b/include/linux/cmdline.h @@ -0,0 +1,89 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +#ifndef _LINUX_CMDLINE_H +#define _LINUX_CMDLINE_H + +/* + * + * Copyright (C) 2006,2021. Cisco Systems, Inc. + * + * Generic Append/Prepend cmdline support. + */ + +#if defined(CONFIG_GENERIC_CMDLINE) && defined(CONFIG_CMDLINE_BOOL) + +#ifndef CONFIG_CMDLINE_OVERRIDE +#define GENERIC_CMDLINE_NEED_STRLCAT +/* + * This function will append or prepend a builtin command line to the command + * line provided by the bootloader. Kconfig options can be used to alter + * the behavior of this builtin command line. + * @dest: The destination of the final appended/prepended string + * @src: The starting string or NULL if there isn't one. + * @tmp: temporary space used for prepending + * @length: the maximum length of the strings above. + * @cmdline_strlcpy: point to a compatible strlcpy + * @cmdline_strlcat: point to a compatible strlcat + */ +static inline void +__cmdline_add_builtin(char *dest, const char *src, char *tmp, unsigned long length, + size_t (*cmdline_strlcpy)(char *dest, const char *src, size_t size), + size_t (*cmdline_strlcat)(char *dest, const char *src, size_t count)) +{ + if (src != dest && src != NULL) { + cmdline_strlcpy(dest, " ", length); + cmdline_strlcat(dest, src, length); + } + + if (sizeof(CONFIG_CMDLINE_APPEND) > 1) + cmdline_strlcat(dest, " " CONFIG_CMDLINE_APPEND, length); + + if (sizeof(CONFIG_CMDLINE_PREPEND) > 1) { + cmdline_strlcpy(tmp, CONFIG_CMDLINE_PREPEND " ", length); + cmdline_strlcat(tmp, dest, length); + cmdline_strlcpy(dest, tmp, length); + } +} + +#define cmdline_add_builtin_custom(dest, src, length, label, cmdline_strlcpy, cmdline_strlcat) \ +{ \ + if (sizeof(CONFIG_CMDLINE_PREPEND) > 1) { \ + static label char cmdline_tmp_space[length]; \ + __cmdline_add_builtin(dest, src, cmdline_tmp_space, length, cmdline_strlcpy, cmdline_strlcat); \ + } else if (sizeof(CONFIG_CMDLINE_APPEND) > 1) { \ + __cmdline_add_builtin(dest, src, NULL, length, cmdline_strlcpy, cmdline_strlcat); \ + } \ +} +#define cmdline_add_builtin(dest, src, length) \ + cmdline_add_builtin_custom(dest, src, length, __initdata, strlcpy, strlcat) + +#else /* CONFIG_CMDLINE_OVERRIDE */ + +static inline void +__cmdline_add_builtin_custom(char *dest, const char *src, unsigned long length, + size_t (*cmdline_strlcpy)(char *dest, const char *src, size_t size)) +{ + cmdline_strlcpy(dest, CONFIG_CMDLINE_PREPEND " " CONFIG_CMDLINE_APPEND, length); +} +#define cmdline_add_builtin_custom(dest, src, length, label, cmdline_strlcpy, cmdline_strlcat) \ + __cmdline_add_builtin_custom(dest, src, length, cmdline_strlcpy) +#define cmdline_add_builtin(dest, src, length) \ + __cmdline_add_builtin_custom(dest, src, length, strlcpy) +#endif /* !CONFIG_CMDLINE_OVERRIDE */ + +#else /* !CONFIG_GENERIC_CMDLINE || !CONFIG_CMDLINE_BOOL */ + +static inline void +__cmdline_add_builtin_custom(char *dest, const char *src, unsigned long length, + size_t (*cmdline_strlcpy)(char *dest, const char *src, size_t size)) +{ + if (src != NULL) + cmdline_strlcpy(dest, src, length); +} +#define cmdline_add_builtin_custom(dest, src, length, label, cmdline_strlcpy, cmdline_strlcat) \ + __cmdline_add_builtin_custom(d
[PATCH v2 0/7] Generic Command Line changes
This fixed some problem identified in my last release. I made updates based on comments from Christophe Leroy. I added scripted updates to the defconfig file for mips and powerpc. This is required in order to maintain the status quo for those platforms which used the prior builtin command line system. These were tested on all effected architectures. Daniel Walker (7): CMDLINE: add generic builtin command line CMDLINE: drivers: of: ifdef out cmdline section powerpc: convert config files to generic cmdline CMDLINE: powerpc: convert to generic builtin command line mips: convert config files to generic cmdline CMDLINE: mips: convert to generic builtin command line CMDLINE: x86: convert to generic builtin command line arch/mips/Kconfig | 4 +- arch/mips/Kconfig.debug | 44 - arch/mips/configs/ar7_defconfig | 9 +- arch/mips/configs/bcm47xx_defconfig | 8 +- arch/mips/configs/bcm63xx_defconfig | 15 ++-- arch/mips/configs/bmips_be_defconfig | 11 +-- arch/mips/configs/bmips_stb_defconfig | 11 +-- arch/mips/configs/capcella_defconfig | 11 +-- arch/mips/configs/ci20_defconfig | 10 +-- arch/mips/configs/cu1000-neo_defconfig| 10 +-- arch/mips/configs/cu1830-neo_defconfig| 10 +-- arch/mips/configs/e55_defconfig | 4 +- arch/mips/configs/generic_defconfig | 6 +- arch/mips/configs/gpr_defconfig | 18 +--- arch/mips/configs/loongson3_defconfig | 13 +-- arch/mips/configs/mpc30x_defconfig| 7 +- arch/mips/configs/tb0219_defconfig| 7 +- arch/mips/configs/tb0226_defconfig| 7 +- arch/mips/configs/tb0287_defconfig| 7 +- arch/mips/configs/workpad_defconfig | 11 +-- arch/mips/kernel/setup.c | 36 +--- arch/powerpc/Kconfig | 37 +--- arch/powerpc/configs/44x/fsp2_defconfig | 33 --- arch/powerpc/configs/44x/iss476-smp_defconfig | 25 +++--- arch/powerpc/configs/44x/warp_defconfig | 17 ++-- arch/powerpc/configs/holly_defconfig | 13 +-- arch/powerpc/configs/mvme5100_defconfig | 23 ++--- arch/powerpc/configs/skiroot_defconfig| 12 ++- arch/powerpc/configs/storcenter_defconfig | 18 ++-- arch/powerpc/kernel/prom.c| 1 + arch/powerpc/kernel/prom_init.c | 35 +--- arch/x86/Kconfig | 44 + arch/x86/kernel/setup.c | 18 +--- drivers/firmware/efi/libstub/x86-stub.c | 2 +- drivers/of/fdt.c | 12 +++ include/linux/cmdline.h | 89 +++ init/Kconfig | 68 ++ 37 files changed, 321 insertions(+), 385 deletions(-) create mode 100644 include/linux/cmdline.h -- 2.25.1
Re: [PATCH 2/5] CMDLINE: drivers: of: ifdef out cmdline section
On Thu, Mar 04, 2021 at 08:09:52AM +0100, Christophe Leroy wrote: > > > Le 04/03/2021 à 05:47, Daniel Walker a écrit : > > It looks like there's some seepage of cmdline stuff into > > the generic device tree code. This conflicts with the > > generic cmdline implementation so I remove it in the case > > when that's enabled. > > > > Cc: xe-linux-exter...@cisco.com > > Signed-off-by: Ruslan Ruslichenko > > Signed-off-by: Daniel Walker > > --- > > drivers/of/fdt.c | 12 > > 1 file changed, 12 insertions(+) > > > > diff --git a/drivers/of/fdt.c b/drivers/of/fdt.c > > index feb0f2d67fc5..cfe4f8d3c9f5 100644 > > --- a/drivers/of/fdt.c > > +++ b/drivers/of/fdt.c > > @@ -25,6 +25,7 @@ > > #include > > #include > > #include > > +#include > > #include /* for COMMAND_LINE_SIZE */ > > #include > > @@ -1048,8 +1049,18 @@ int __init early_init_dt_scan_chosen(unsigned long > > node, const char *uname, > > early_init_dt_check_for_initrd(node); > > +#ifdef CONFIG_GENERIC_CMDLINE > > /* Retrieve command line */ > > p = of_get_flat_dt_prop(node, "bootargs", ); > > + > > + /* > > +* The builtin command line will be added here, or it can override > > +* with the DT bootargs. > > +*/ > > + cmdline_add_builtin(data, > > + ((p != NULL && l > 0) ? p : NULL), /* This is > > sanity checking */ > > Can we do more simple ? If p is NULL, p is already NULL, so (l > 0 ? p : > NULL) should be enough. I believe Rob gave me this line. Maybe he can comment on it. Daniel
Re: [PATCH 1/5] CMDLINE: add generic builtin command line
On Thu, Mar 04, 2021 at 08:00:49AM +0100, Christophe Leroy wrote: > > > Le 04/03/2021 à 05:47, Daniel Walker a écrit : > > This code allows architectures to use a generic builtin command line. > > The state of the builtin command line options across architecture is > > diverse. On x86 and mips they have pretty much the same code and the > > code prepends the builtin command line onto the boot loader provided > > one. On powerpc there is only a builtin override and nothing else. > > This is not exact. powerpc has: > CONFIG_FROM_BOOTLOADER > CONFIG_EXTEND > CONFIG_FORCE I don't currently have ppc64 to test on, but CONFIG_FROM_BOOTLOADER should likely stay, but the other two can come from the generic code. > > > > The code in this commit unifies the code into a generic > > header file under the CONFIG_GENERIC_CMDLINE option. When this > > option is enabled the architecture can call the cmdline_add_builtin() > > to add the builtin command line. > > > > Cc: xe-linux-exter...@cisco.com > > Signed-off-by: Ruslan Bilovol > > Signed-off-by: Daniel Walker > > --- > > include/linux/cmdline.h | 75 + > > init/Kconfig| 68 + > > 2 files changed, 143 insertions(+) > > create mode 100644 include/linux/cmdline.h > > > > diff --git a/include/linux/cmdline.h b/include/linux/cmdline.h > > new file mode 100644 > > index ..f44011d1a9ee > > --- /dev/null > > +++ b/include/linux/cmdline.h > > @@ -0,0 +1,75 @@ > > Missing the SPDX Licence Identifier > > > +#ifndef _LINUX_CMDLINE_H > > +#define _LINUX_CMDLINE_H > > + > > +/* > > + * > > + * Copyright (C) 2006,2021. Cisco Systems, Inc. > > + * > > + * Generic Append/Prepend cmdline support. > > + */ > > + > > +#if defined(CONFIG_GENERIC_CMDLINE) && defined(CONFIG_CMDLINE_BOOL) > > I think it would be better if we can avoid the CONFIG_CMDLINE_BOOL. > By making the CMDLINEs default to "" at all time, I think we can about that > BOOL. Wouldn't it be annoying if you have to deleted all the characters from two text boxes vs. just disabling a single option ? What if you leave a space accidentally , woops. > > + > > +#ifndef CONFIG_CMDLINE_OVERRIDE > > +/* > > + * This function will append or prepend a builtin command line to the > > command > > As far as I understand, it doesn't "append _or_ prepend" but it does "append > _and_ prepend" I think the end results is accurately , no need to get pedantic. > > + * line provided by the bootloader. Kconfig options can be used to alter > > + * the behavior of this builtin command line. > > + * @dest: The destination of the final appended/prepended string > > + * @src: The starting string or NULL if there isn't one. > > + * @tmp: temporary space used for prepending > > + * @length: the maximum length of the strings above. > > Missing some parameters here, but I think we should avoid those 'strlcpy' > and 'strlcat', see later comment. > > > + */ > > +static inline void > > +__cmdline_add_builtin(char *dest, const char *src, char *tmp, unsigned > > long length, > > + size_t (*strlcpy)(char *dest, const char *src, size_t size), > > + size_t (*strlcat)(char *dest, const char *src, size_t count) > > Don't use names that overide names of existing functions. > > 'count' is __kernel_size_t not size_t It's type checking all the parameters at compile time, it doesn't complain about this that I've seen. > > + ) > > +{ > > + if (src != dest && src != NULL) { > > + strlcpy(dest, " ", length); > > Why do you need a space up front in that case ? Why not just copy the source > to the destination ? There may not be a space between them, it doesn't cost anything to have one. > > + strlcat(dest, src, length); > > + } > > + > > + if (sizeof(CONFIG_CMDLINE_APPEND) > 1) > > + strlcat(dest, " " CONFIG_CMDLINE_APPEND, length); > > + > > + if (sizeof(CONFIG_CMDLINE_PREPEND) > 1) { > > + strlcpy(tmp, CONFIG_CMDLINE_PREPEND " ", length); > > + strlcat(tmp, dest, length); > > + strlcpy(dest, tmp, length); > > Could we use memmove(), or implement strmove() and avoid the temporary buffer > at all ? I don't really want to make drastic alteration like this, unless there is a better reason for it. Most of this hasn't change insi
Re: [PATCH 2/5] CMDLINE: drivers: of: ifdef out cmdline section
On Thu, Mar 04, 2021 at 08:32:37AM -0600, Rob Herring wrote: > On Wed, Mar 3, 2021 at 10:48 PM Daniel Walker wrote: > > > > It looks like there's some seepage of cmdline stuff into > > the generic device tree code. This conflicts with the > > generic cmdline implementation so I remove it in the case > > when that's enabled. > > > > Cc: xe-linux-exter...@cisco.com > > Signed-off-by: Ruslan Ruslichenko > > Signed-off-by: Daniel Walker > > --- > > drivers/of/fdt.c | 12 > > 1 file changed, 12 insertions(+) > > > > diff --git a/drivers/of/fdt.c b/drivers/of/fdt.c > > index feb0f2d67fc5..cfe4f8d3c9f5 100644 > > --- a/drivers/of/fdt.c > > +++ b/drivers/of/fdt.c > > @@ -25,6 +25,7 @@ > > #include > > #include > > #include > > +#include > > > > #include /* for COMMAND_LINE_SIZE */ > > #include > > @@ -1048,8 +1049,18 @@ int __init early_init_dt_scan_chosen(unsigned long > > node, const char *uname, > > > > early_init_dt_check_for_initrd(node); > > > > +#ifdef CONFIG_GENERIC_CMDLINE > > What I like about Christophe's version is it removes the old DT > implementation. Who's going to convert the rest of the DT based > arches? That's arm, arm64, hexagon, microblaze, nios2, openrisc, > riscv, sh, and xtensa. Either separate the common code from the config > like Christophe's version or these all need converting. Though it's > fine to hash out patch 1 with a couple of arches first. I'm limited in what I can test, so I can't know for sure that I have something which works on those architectures. Even powerpc 64 is part of this series but I can't really test it at this time. Also Cisco's needs out strip the implementation of extend or override. I have un-tested conversions for arm32, arm64, c6x, microblaze, nios2, and openrisc. These could go into -next and we can see who complains. The implementation on these architectures isn't all uniform. > > /* Retrieve command line */ > > p = of_get_flat_dt_prop(node, "bootargs", ); > > This needs to be outside the ifdef. Ok .. Daniel
[PATCH 5/5] CMDLINE: x86: convert to generic builtin command line
This updates the x86 code to use the CONFIG_GENERIC_CMDLINE option. Cc: xe-linux-exter...@cisco.com Signed-off-by: Ruslan Ruslichenko Signed-off-by: Ruslan Bilovol Signed-off-by: Daniel Walker --- arch/x86/Kconfig| 44 + arch/x86/kernel/setup.c | 18 ++ drivers/firmware/efi/libstub/x86-stub.c | 2 +- 3 files changed, 4 insertions(+), 60 deletions(-) diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig index 21f851179ff0..3950f9bf9855 100644 --- a/arch/x86/Kconfig +++ b/arch/x86/Kconfig @@ -115,6 +115,7 @@ config X86 select EDAC_SUPPORT select GENERIC_CLOCKEVENTS_BROADCASTif X86_64 || (X86_32 && X86_LOCAL_APIC) select GENERIC_CLOCKEVENTS_MIN_ADJUST + select GENERIC_CMDLINE select GENERIC_CMOS_UPDATE select GENERIC_CPU_AUTOPROBE select GENERIC_CPU_VULNERABILITIES @@ -2368,49 +2369,6 @@ choice endchoice -config CMDLINE_BOOL - bool "Built-in kernel command line" - help - Allow for specifying boot arguments to the kernel at - build time. On some systems (e.g. embedded ones), it is - necessary or convenient to provide some or all of the - kernel boot arguments with the kernel itself (that is, - to not rely on the boot loader to provide them.) - - To compile command line arguments into the kernel, - set this option to 'Y', then fill in the - boot arguments in CONFIG_CMDLINE. - - Systems with fully functional boot loaders (i.e. non-embedded) - should leave this option set to 'N'. - -config CMDLINE - string "Built-in kernel command string" - depends on CMDLINE_BOOL - default "" - help - Enter arguments here that should be compiled into the kernel - image and used at boot time. If the boot loader provides a - command line at boot time, it is appended to this string to - form the full kernel command line, when the system boots. - - However, you can use the CONFIG_CMDLINE_OVERRIDE option to - change this behavior. - - In most cases, the command line (whether built-in or provided - by the boot loader) should specify the device for the root - file system. - -config CMDLINE_OVERRIDE - bool "Built-in command line overrides boot loader arguments" - depends on CMDLINE_BOOL && CMDLINE != "" - help - Set this option to 'Y' to have the kernel ignore the boot loader - command line, and use ONLY the built-in command line. - - This is used to work around broken boot loaders. This should - be set to 'N' under normal conditions. - config MODIFY_LDT_SYSCALL bool "Enable the LDT (local descriptor table)" if EXPERT default y diff --git a/arch/x86/kernel/setup.c b/arch/x86/kernel/setup.c index 740f3bdb3f61..e748c3e5c1ae 100644 --- a/arch/x86/kernel/setup.c +++ b/arch/x86/kernel/setup.c @@ -48,6 +48,7 @@ #include #include #include +#include /* * max_low_pfn_mapped: highest directly mapped pfn < 4 GB @@ -162,9 +163,6 @@ unsigned long saved_video_mode; #define RAMDISK_LOAD_FLAG 0x4000 static char __initdata command_line[COMMAND_LINE_SIZE]; -#ifdef CONFIG_CMDLINE_BOOL -static char __initdata builtin_cmdline[COMMAND_LINE_SIZE] = CONFIG_CMDLINE; -#endif #if defined(CONFIG_EDD) || defined(CONFIG_EDD_MODULE) struct edd edd; @@ -884,19 +882,7 @@ void __init setup_arch(char **cmdline_p) bss_resource.start = __pa_symbol(__bss_start); bss_resource.end = __pa_symbol(__bss_stop)-1; -#ifdef CONFIG_CMDLINE_BOOL -#ifdef CONFIG_CMDLINE_OVERRIDE - strlcpy(boot_command_line, builtin_cmdline, COMMAND_LINE_SIZE); -#else - if (builtin_cmdline[0]) { - /* append boot loader cmdline to builtin */ - strlcat(builtin_cmdline, " ", COMMAND_LINE_SIZE); - strlcat(builtin_cmdline, boot_command_line, COMMAND_LINE_SIZE); - strlcpy(boot_command_line, builtin_cmdline, COMMAND_LINE_SIZE); - } -#endif -#endif - + cmdline_add_builtin(boot_command_line, NULL, COMMAND_LINE_SIZE); strlcpy(command_line, boot_command_line, COMMAND_LINE_SIZE); *cmdline_p = command_line; diff --git a/drivers/firmware/efi/libstub/x86-stub.c b/drivers/firmware/efi/libstub/x86-stub.c index f14c4ff5839f..9538c9d4a0bc 100644 --- a/drivers/firmware/efi/libstub/x86-stub.c +++ b/drivers/firmware/efi/libstub/x86-stub.c @@ -736,7 +736,7 @@ unsigned long efi_main(efi_handle_t handle, } #ifdef CONFIG_CMDLINE_BOOL - status = efi_parse_options(CONFIG_CMDLINE); + status = efi_parse_options(CONFIG_CMDLINE_PREPEND " " CONFIG_CMDLINE_APPEND); if (status != EFI_SUCCESS) { efi_err("Failed to parse options\n"); goto fail; -- 2.25.1
[PATCH 1/5] CMDLINE: add generic builtin command line
This code allows architectures to use a generic builtin command line. The state of the builtin command line options across architecture is diverse. On x86 and mips they have pretty much the same code and the code prepends the builtin command line onto the boot loader provided one. On powerpc there is only a builtin override and nothing else. The code in this commit unifies the code into a generic header file under the CONFIG_GENERIC_CMDLINE option. When this option is enabled the architecture can call the cmdline_add_builtin() to add the builtin command line. Cc: xe-linux-exter...@cisco.com Signed-off-by: Ruslan Bilovol Signed-off-by: Daniel Walker --- include/linux/cmdline.h | 75 + init/Kconfig| 68 + 2 files changed, 143 insertions(+) create mode 100644 include/linux/cmdline.h diff --git a/include/linux/cmdline.h b/include/linux/cmdline.h new file mode 100644 index ..f44011d1a9ee --- /dev/null +++ b/include/linux/cmdline.h @@ -0,0 +1,75 @@ +#ifndef _LINUX_CMDLINE_H +#define _LINUX_CMDLINE_H + +/* + * + * Copyright (C) 2006,2021. Cisco Systems, Inc. + * + * Generic Append/Prepend cmdline support. + */ + +#if defined(CONFIG_GENERIC_CMDLINE) && defined(CONFIG_CMDLINE_BOOL) + +#ifndef CONFIG_CMDLINE_OVERRIDE +/* + * This function will append or prepend a builtin command line to the command + * line provided by the bootloader. Kconfig options can be used to alter + * the behavior of this builtin command line. + * @dest: The destination of the final appended/prepended string + * @src: The starting string or NULL if there isn't one. + * @tmp: temporary space used for prepending + * @length: the maximum length of the strings above. + */ +static inline void +__cmdline_add_builtin(char *dest, const char *src, char *tmp, unsigned long length, + size_t (*strlcpy)(char *dest, const char *src, size_t size), + size_t (*strlcat)(char *dest, const char *src, size_t count) + ) +{ + if (src != dest && src != NULL) { + strlcpy(dest, " ", length); + strlcat(dest, src, length); + } + + if (sizeof(CONFIG_CMDLINE_APPEND) > 1) + strlcat(dest, " " CONFIG_CMDLINE_APPEND, length); + + if (sizeof(CONFIG_CMDLINE_PREPEND) > 1) { + strlcpy(tmp, CONFIG_CMDLINE_PREPEND " ", length); + strlcat(tmp, dest, length); + strlcpy(dest, tmp, length); + } +} + +#define cmdline_add_builtin_custom(dest, src, length, label, strlcpy, strlcat) \ +{ \ + if (sizeof(CONFIG_CMDLINE_PREPEND) > 1) { \ + static label char cmdline_tmp_space[length]; \ + __cmdline_add_builtin(dest, src, cmdline_tmp_space, length, strlcpy, strlcat); \ + } else if (sizeof(CONFIG_CMDLINE_APPEND) > 1) { \ + __cmdline_add_builtin(dest, src, NULL, length, strlcpy, strlcat); \ + } \ +} +#define cmdline_add_builtin(dest, src, length)\ + cmdline_add_builtin_custom(dest, src, length, __initdata, , ) +#else +#define cmdline_add_builtin(dest, src, length)\ +{ \ + strlcpy(dest, CONFIG_CMDLINE_PREPEND " " CONFIG_CMDLINE_APPEND,\ + length); \ +} +#endif /* !CONFIG_CMDLINE_OVERRIDE */ + +#else +#define cmdline_add_builtin_custom(dest, src, length, label, strlcpy, strlcat) { \ + if (src != NULL) \ + strlcpy(dest, src, length); \ +} + +#define cmdline_add_builtin(dest, src, length) { \ + cmdline_add_builtin_custom(dest, src, length, strlcpy, strlcat); \ +} +#endif /* CONFIG_GENERIC_CMDLINE */ + + +#endif /* _LINUX_CMDLINE_H */ diff --git a/init/Kconfig b/init/Kconfig index 29ad68325028..28363ab07cd4 100644 --- a/init/Kconfig +++ b/init/Kconfig @@ -2032,6 +2032,74 @@ config PROFILING config TRACEPOINTS bool +config GENERIC_CMDLINE + bool + +if GENERIC_CMDLINE + +config CMDLINE_BOOL + bool "Built-in kernel command line" + help + Allow for specifying boot arguments to the kernel at + build time. On some systems (e.g. embedded ones), it is + necessary or convenient to provide some or all of the + kernel boot arguments with the ke
[PATCH 2/5] CMDLINE: drivers: of: ifdef out cmdline section
It looks like there's some seepage of cmdline stuff into the generic device tree code. This conflicts with the generic cmdline implementation so I remove it in the case when that's enabled. Cc: xe-linux-exter...@cisco.com Signed-off-by: Ruslan Ruslichenko Signed-off-by: Daniel Walker --- drivers/of/fdt.c | 12 1 file changed, 12 insertions(+) diff --git a/drivers/of/fdt.c b/drivers/of/fdt.c index feb0f2d67fc5..cfe4f8d3c9f5 100644 --- a/drivers/of/fdt.c +++ b/drivers/of/fdt.c @@ -25,6 +25,7 @@ #include #include #include +#include #include /* for COMMAND_LINE_SIZE */ #include @@ -1048,8 +1049,18 @@ int __init early_init_dt_scan_chosen(unsigned long node, const char *uname, early_init_dt_check_for_initrd(node); +#ifdef CONFIG_GENERIC_CMDLINE /* Retrieve command line */ p = of_get_flat_dt_prop(node, "bootargs", ); + + /* +* The builtin command line will be added here, or it can override +* with the DT bootargs. +*/ + cmdline_add_builtin(data, + ((p != NULL && l > 0) ? p : NULL), /* This is sanity checking */ + COMMAND_LINE_SIZE); +#else if (p != NULL && l > 0) strlcpy(data, p, min(l, COMMAND_LINE_SIZE)); @@ -1070,6 +1081,7 @@ int __init early_init_dt_scan_chosen(unsigned long node, const char *uname, strlcpy(data, CONFIG_CMDLINE, COMMAND_LINE_SIZE); #endif #endif /* CONFIG_CMDLINE */ +#endif /* CONFIG_GENERIC_CMDLINE */ pr_debug("Command line is: %s\n", (char *)data); -- 2.25.1
[PATCH 3/5] CMDLINE: powerpc: convert to generic builtin command line
This updates the powerpc code to use the CONFIG_GENERIC_CMDLINE option. Cc: xe-linux-exter...@cisco.com Signed-off-by: Ruslan Ruslichenko Signed-off-by: Ruslan Bilovol Signed-off-by: Daniel Walker --- arch/powerpc/Kconfig| 37 + arch/powerpc/kernel/prom.c | 1 + arch/powerpc/kernel/prom_init.c | 31 +++ 3 files changed, 20 insertions(+), 49 deletions(-) diff --git a/arch/powerpc/Kconfig b/arch/powerpc/Kconfig index 107bb4319e0e..276b06d5c961 100644 --- a/arch/powerpc/Kconfig +++ b/arch/powerpc/Kconfig @@ -167,6 +167,7 @@ config PPC select EDAC_SUPPORT select GENERIC_ATOMIC64 if PPC32 select GENERIC_CLOCKEVENTS_BROADCASTif SMP + select GENERIC_CMDLINE select GENERIC_CMOS_UPDATE select GENERIC_CPU_AUTOPROBE select GENERIC_CPU_VULNERABILITIES if PPC_BARRIER_NOSPEC @@ -906,42 +907,6 @@ config PPC_DENORMALISATION Add support for handling denormalisation of single precision values. Useful for bare metal only. If unsure say Y here. -config CMDLINE - string "Initial kernel command string" - default "" - help - On some platforms, there is currently no way for the boot loader to - pass arguments to the kernel. For these platforms, you can supply - some command-line options at build time by entering them here. In - most cases you will need to specify the root device here. - -choice - prompt "Kernel command line type" if CMDLINE != "" - default CMDLINE_FROM_BOOTLOADER - -config CMDLINE_FROM_BOOTLOADER - bool "Use bootloader kernel arguments if available" - help - Uses the command-line options passed by the boot loader. If - the boot loader doesn't provide any, the default kernel command - string provided in CMDLINE will be used. - -config CMDLINE_EXTEND - bool "Extend bootloader kernel arguments" - help - The command-line arguments provided by the boot loader will be - appended to the default kernel command string. - -config CMDLINE_FORCE - bool "Always use the default kernel command string" - help - Always use the default kernel command string, even if the boot - loader passes other arguments to the kernel. - This is useful if you cannot or don't want to change the - command-line options your boot loader passes to the kernel. - -endchoice - config EXTRA_TARGETS string "Additional default image types" help diff --git a/arch/powerpc/kernel/prom.c b/arch/powerpc/kernel/prom.c index ae3c41730367..96d0a01be1b4 100644 --- a/arch/powerpc/kernel/prom.c +++ b/arch/powerpc/kernel/prom.c @@ -27,6 +27,7 @@ #include #include #include +#include #include #include #include diff --git a/arch/powerpc/kernel/prom_init.c b/arch/powerpc/kernel/prom_init.c index e9d4eb6144e1..d752be688b62 100644 --- a/arch/powerpc/kernel/prom_init.c +++ b/arch/powerpc/kernel/prom_init.c @@ -27,6 +27,7 @@ #include #include #include +#include #include #include #include @@ -242,15 +243,6 @@ static int __init prom_strcmp(const char *cs, const char *ct) return 0; } -static char __init *prom_strcpy(char *dest, const char *src) -{ - char *tmp = dest; - - while ((*dest++ = *src++) != '\0') - /* nothing */; - return tmp; -} - static int __init prom_strncmp(const char *cs, const char *ct, size_t count) { unsigned char c1, c2; @@ -276,6 +268,19 @@ static size_t __init prom_strlen(const char *s) return sc - s; } +static size_t __init prom_strlcpy(char *dest, const char *src, size_t size) +{ + size_t ret = prom_strlen(src); + + if (size) { + size_t len = (ret >= size) ? size - 1 : ret; + memcpy(dest, src, len); + dest[len] = '\0'; + } + return ret; +} + + static int __init prom_memcmp(const void *cs, const void *ct, size_t count) { const unsigned char *su1, *su2; @@ -778,9 +783,9 @@ static void __init early_cmdline_parse(void) if (!IS_ENABLED(CONFIG_CMDLINE_FORCE) && (long)prom.chosen > 0) l = prom_getprop(prom.chosen, "bootargs", p, COMMAND_LINE_SIZE-1); - if (IS_ENABLED(CONFIG_CMDLINE_EXTEND) || l <= 0 || p[0] == '\0') - prom_strlcat(prom_cmd_line, " " CONFIG_CMDLINE, -sizeof(prom_cmd_line)); + if (l <= 0 || p[0] == '\0') /* dbl check */ + cmdline_add_builtin_custom(prom_cmd_line, NULL, sizeof(prom_cmd_line), + __prombss, _strlcpy, _strlcat); prom_printf("command line: %s\n", prom_cmd_line); @@ -2706,7 +2711,7 @@ static void __init flatten_device_tree(void)
[PATCH 4/5] CMDLINE: mips: convert to generic builtin command line
This updates the mips code to use the CONFIG_GENERIC_CMDLINE option. This deletes the option for MIPS_CMDLINE_BUILTIN_EXTEND and replaces the functionality with generic code. Cc: xe-linux-exter...@cisco.com Signed-off-by: Ruslan Ruslichenko Signed-off-by: Ruslan Bilovol Signed-off-by: Daniel Walker --- arch/mips/Kconfig| 4 +--- arch/mips/Kconfig.debug | 44 arch/mips/kernel/setup.c | 37 + 3 files changed, 6 insertions(+), 79 deletions(-) diff --git a/arch/mips/Kconfig b/arch/mips/Kconfig index 0a17bedf4f0d..7c07b3bca9fc 100644 --- a/arch/mips/Kconfig +++ b/arch/mips/Kconfig @@ -23,6 +23,7 @@ config MIPS select CPU_NO_EFFICIENT_FFS if (TARGET_ISA_REV < 1) select CPU_PM if CPU_IDLE select GENERIC_ATOMIC64 if !64BIT + select GENERIC_CMDLINE select GENERIC_CMOS_UPDATE select GENERIC_CPU_AUTOPROBE select GENERIC_GETTIMEOFDAY @@ -3171,9 +3172,6 @@ choice config MIPS_CMDLINE_FROM_BOOTLOADER bool "Bootloader kernel arguments if available" - config MIPS_CMDLINE_BUILTIN_EXTEND - depends on CMDLINE_BOOL - bool "Extend builtin kernel arguments with bootloader arguments" endchoice endmenu diff --git a/arch/mips/Kconfig.debug b/arch/mips/Kconfig.debug index 7a8d94cdd493..b5a099c74eb6 100644 --- a/arch/mips/Kconfig.debug +++ b/arch/mips/Kconfig.debug @@ -30,50 +30,6 @@ config EARLY_PRINTK_8250 config USE_GENERIC_EARLY_PRINTK_8250 bool -config CMDLINE_BOOL - bool "Built-in kernel command line" - help - For most systems, it is firmware or second stage bootloader that - by default specifies the kernel command line options. However, - it might be necessary or advantageous to either override the - default kernel command line or add a few extra options to it. - For such cases, this option allows you to hardcode your own - command line options directly into the kernel. For that, you - should choose 'Y' here, and fill in the extra boot arguments - in CONFIG_CMDLINE. - - The built-in options will be concatenated to the default command - line if CMDLINE_OVERRIDE is set to 'N'. Otherwise, the default - command line will be ignored and replaced by the built-in string. - - Most MIPS systems will normally expect 'N' here and rely upon - the command line from the firmware or the second-stage bootloader. - -config CMDLINE - string "Default kernel command string" - depends on CMDLINE_BOOL - help - On some platforms, there is currently no way for the boot loader to - pass arguments to the kernel. For these platforms, and for the cases - when you want to add some extra options to the command line or ignore - the default command line, you can supply some command-line options at - build time by entering them here. In other cases you can specify - kernel args so that you don't have to set them up in board prom - initialization routines. - - For more information, see the CMDLINE_BOOL and CMDLINE_OVERRIDE - options. - -config CMDLINE_OVERRIDE - bool "Built-in command line overrides firmware arguments" - depends on CMDLINE_BOOL - help - By setting this option to 'Y' you will have your kernel ignore - command line arguments from firmware or second stage bootloader. - Instead, the built-in command line will be used exclusively. - - Normally, you will choose 'N' here. - config SB1XXX_CORELIS bool "Corelis Debugger" depends on SIBYTE_SB1xxx_SOC diff --git a/arch/mips/kernel/setup.c b/arch/mips/kernel/setup.c index 7e1f8e277437..b7e9c1c9 100644 --- a/arch/mips/kernel/setup.c +++ b/arch/mips/kernel/setup.c @@ -23,6 +23,7 @@ #include #include #include +#include #include #include #include @@ -67,12 +68,6 @@ EXPORT_SYMBOL(mips_machtype); static char __initdata command_line[COMMAND_LINE_SIZE]; char __initdata arcs_cmdline[COMMAND_LINE_SIZE]; -#ifdef CONFIG_CMDLINE_BOOL -static const char builtin_cmdline[] __initconst = CONFIG_CMDLINE; -#else -static const char builtin_cmdline[] __initconst = ""; -#endif - /* * mips_io_port_base is the begin of the address space to which x86 style * I/O ports are mapped. @@ -546,27 +541,7 @@ static void __init bootcmdline_init(void) { bool dt_bootargs = false; - /* -* If CMDLINE_OVERRIDE is enabled then initializing the command line is -* trivial - we simply use the built-in command line unconditionally & -* unmodified. -*/ - if (IS_ENABLED(CONFIG_CMDLINE_OVERRIDE)) { - strlcpy(boot_command_line, builtin_cmdline, COMMAND_LINE_SIZE); - return; -
Re: [PATCH v2 0/7] Improve boot command line handling
On Wed, Mar 03, 2021 at 07:07:45PM +0100, Christophe Leroy wrote: > > > Le 03/03/2021 à 18:39, Daniel Walker a écrit : > > On Tue, Mar 02, 2021 at 08:01:01PM -0600, Rob Herring wrote: > > > +Will D > > > > > > On Tue, Mar 2, 2021 at 11:36 AM Daniel Walker wrote: > > > > > > > > On Tue, Mar 02, 2021 at 05:25:16PM +, Christophe Leroy wrote: > > > > > The purpose of this series is to improve and enhance the > > > > > handling of kernel boot arguments. > > > > > > > > > > It is first focussed on powerpc but also extends the capability > > > > > for other arches. > > > > > > > > > > This is based on suggestion from Daniel Walker > > > > > > > > > > > > > > > > > I don't see a point in your changes at this time. My changes are much > > > > more > > > > mature, and you changes don't really make improvements. > > > > > > Not really a helpful comment. What we merge here will be from whomever > > > is persistent and timely in their efforts. But please, work together > > > on a common solution. > > > > > > This one meets my requirements of moving the kconfig and code out of > > > the arches, supports prepend/append, and is up to date. > > > > > > Maintainers are capable of merging whatever they want to merge. However, I > > wouldn't make hasty choices. The changes I've been submitting have been > > deployed > > on millions of router instances and are more feature rich. > > > > I believe I worked with you on this change, or something like it, > > > > https://lkml.org/lkml/2019/3/19/970 > > > > I don't think Christophe has even addressed this. > > I thing I have, see > https://patchwork.ozlabs.org/project/linuxppc-dev/patch/3b4291271ce4af4941a771e5af5cbba3c8fa1b2a.1614705851.git.christophe.le...@csgroup.eu/ > > If you see something missing in that patch, can you tell me. Ok, must have missed that one. > > I've converted many > > architectures, and Cisco uses my changes on at least 4 different > > architecture. With products deployed and tested. > > As far as we know, only powerpc was converted in the last series you > submitted, see > https://patchwork.ozlabs.org/project/linuxppc-dev/list/?series=98106=* Me and others submitted my changes many times, and other architectures have been included. The patch you submitted I've submitted similar at Rob's request years ago. Here a fuller submissions some time ago, https://lore.kernel.org/patchwork/cover/992768/ You've only been involved in prior powerpc only submissions. Daniel
Re: [PATCH v2 0/7] Improve boot command line handling
On Tue, Mar 02, 2021 at 08:01:01PM -0600, Rob Herring wrote: > +Will D > > On Tue, Mar 2, 2021 at 11:36 AM Daniel Walker wrote: > > > > On Tue, Mar 02, 2021 at 05:25:16PM +, Christophe Leroy wrote: > > > The purpose of this series is to improve and enhance the > > > handling of kernel boot arguments. > > > > > > It is first focussed on powerpc but also extends the capability > > > for other arches. > > > > > > This is based on suggestion from Daniel Walker > > > > > > > > > I don't see a point in your changes at this time. My changes are much more > > mature, and you changes don't really make improvements. > > Not really a helpful comment. What we merge here will be from whomever > is persistent and timely in their efforts. But please, work together > on a common solution. > > This one meets my requirements of moving the kconfig and code out of > the arches, supports prepend/append, and is up to date. Maintainers are capable of merging whatever they want to merge. However, I wouldn't make hasty choices. The changes I've been submitting have been deployed on millions of router instances and are more feature rich. I believe I worked with you on this change, or something like it, https://lkml.org/lkml/2019/3/19/970 I don't think Christophe has even addressed this. I've converted many architectures, and Cisco uses my changes on at least 4 different architecture. With products deployed and tested. I will resubmit my changes as soon as I can. Daniel
Re: [PATCH v2 0/7] Improve boot command line handling
On Tue, Mar 02, 2021 at 05:25:16PM +, Christophe Leroy wrote: > The purpose of this series is to improve and enhance the > handling of kernel boot arguments. > > It is first focussed on powerpc but also extends the capability > for other arches. > > This is based on suggestion from Daniel Walker > I don't see a point in your changes at this time. My changes are much more mature, and you changes don't really make improvements. Daniel
Re: [PATCH 0/2] Fix CMDLINE_EXTEND handling for FDT "bootargs"
On Mon, Mar 01, 2021 at 11:26:14AM -0600, Rob Herring wrote: > +PPC folks and Daniel W > > On Mon, Mar 1, 2021 at 8:42 AM Will Deacon wrote: > > > > On Mon, Mar 01, 2021 at 08:19:32AM -0600, Rob Herring wrote: > > > On Thu, Feb 25, 2021 at 6:59 AM Will Deacon wrote: > > > > We recently [1] enabled support for CMDLINE_EXTEND on arm64, however > > > > when I started looking at replacing Android's out-of-tree > > > > implementation [2] > > > > > > Did anyone go read the common, reworked version of all this I > > > referenced that supports prepend and append. Here it is again[1]. > > > Maybe I should have been more assertive there and said 'extend' is > > > ambiguous. > > > > I tried reading that, but (a) most of the series is not in the mailing list > > archives and (b) the patch that _is_ doesn't touch CMDLINE_EXTEND at all. > > Right now the code in mainline does the opposite of what it's documented to > > do. > > Actually, there is a newer version I found: > > https://lore.kernel.org/linuxppc-dev/1551469472-53043-1-git-send-email-danie...@cisco.com/ > https://lore.kernel.org/linuxppc-dev/1551469472-53043-2-git-send-email-danie...@cisco.com/ > https://lore.kernel.org/linuxppc-dev/1551469472-53043-3-git-send-email-danie...@cisco.com/ > > (Once again, there's some weird threading going on) > I'm happy to work with anyone to resubmit the changes. We currently use the changes in Cisco, and we have used them for many years. I was planning to update and resubmit since someone has recently inquired about why it wasn't upstream. Daniel
Re: [PATCH 1/4] add generic builtin command line
On Mon, Feb 15, 2021 at 11:32:01AM -0800, Daniel Gimpelevich wrote: > On Thu, 2019-03-21 at 15:15 -0700, Andrew Morton wrote: > > On Thu, 21 Mar 2019 08:13:08 -0700 Daniel Walker wrote: > > > On Wed, Mar 20, 2019 at 08:14:33PM -0700, Andrew Morton wrote: > > > > The patches (or some version of them) are already in linux-next, > > > > which messes me up. I'll disable them for now. > > > > > > Those are from my tree, but I remove them when you picked up the series. > > > The > > > next linux-next should not have them. > > > > Yup, thanks, all looks good now. > > This patchset is currently neither in mainline nor in -next. May I ask > what happened to it? Thanks. > It was dropped silently by Andrew at some point. I wasn't watching -next closely to know when. I have no idea why he dropped it. We still use this series extensively in Cisco, and have extended it beyond this current series. We can re-submit. Daniel
Re: [PATCH 1/4] add generic builtin command line
On Wed, Mar 20, 2019 at 08:14:33PM -0700, Andrew Morton wrote: > On Wed, 20 Mar 2019 16:23:28 -0700 Daniel Walker wrote: > > > On Wed, Mar 20, 2019 at 03:53:19PM -0700, Andrew Morton wrote: > > > On Tue, 19 Mar 2019 16:24:45 -0700 Daniel Walker > > > wrote: > > > > > > > This code allows architectures to use a generic builtin command line. > > > > > > I wasn't cc'ed on [2/4]. No mailing lists were cc'ed on [0/4] but it > > > didn't say anything useful anyway ;) > > > > > > I'll queue them up for testing and shall await feedback from the > > > powerpc developers. > > > > > > > You weren't CC'd , but it was To: you, > > > > 35 From: Daniel Walker > > 36 To: Andrew Morton , > > 37 Christophe Leroy , > > 38 Michael Ellerman , > > 39 Rob Herring , xe-linux-exter...@cisco.com, > > 40 linuxppc-dev@lists.ozlabs.org, Frank Rowand > > > > 41 Cc: devicet...@vger.kernel.org, linux-ker...@vger.kernel.org > > 42 Subject: [PATCH 2/4] drivers: of: generic command line support > > hm. > > > Thanks for picking it up. > > The patches (or some version of them) are already in linux-next, > which messes me up. I'll disable them for now. Those are from my tree, but I remove them when you picked up the series. The next linux-next should not have them. Daniel
Re: [PATCH 1/4] add generic builtin command line
On Wed, Mar 20, 2019 at 03:53:19PM -0700, Andrew Morton wrote: > On Tue, 19 Mar 2019 16:24:45 -0700 Daniel Walker wrote: > > > This code allows architectures to use a generic builtin command line. > > I wasn't cc'ed on [2/4]. No mailing lists were cc'ed on [0/4] but it > didn't say anything useful anyway ;) > > I'll queue them up for testing and shall await feedback from the > powerpc developers. > You weren't CC'd , but it was To: you, 35 From: Daniel Walker 36 To: Andrew Morton , 37 Christophe Leroy , 38 Michael Ellerman , 39 Rob Herring , xe-linux-exter...@cisco.com, 40 linuxppc-dev@lists.ozlabs.org, Frank Rowand 41 Cc: devicet...@vger.kernel.org, linux-ker...@vger.kernel.org 42 Subject: [PATCH 2/4] drivers: of: generic command line support and the first one [0/4] should have went to the linuxppc-dev , and xe-linux-external. Maybe our git-send-email isn't working with our mail servers. Thanks for picking it up. Daniel
[PATCH 4/4] powerpc: convert config files to generic cmdline
This is a mass convert of the config files to use the new generic cmdline. The command used to convert is as follows, sed -i 's/CONFIG_CMDLINE=/CONFIG_CMDLINE_PREPEND=/g' Cc: xe-linux-exter...@cisco.com Cc: Daniel Walker Signed-off-by: Daniel Walker Change-Id: Idf7cae45ef5f8afebcb1ee7e025aafcb6541ad35 Signed-off-by: Daniel Walker --- arch/powerpc/configs/44x/fsp2_defconfig | 2 +- arch/powerpc/configs/44x/iss476-smp_defconfig | 2 +- arch/powerpc/configs/44x/warp_defconfig | 2 +- arch/powerpc/configs/holly_defconfig | 2 +- arch/powerpc/configs/mvme5100_defconfig | 2 +- arch/powerpc/configs/skiroot_defconfig| 2 +- arch/powerpc/configs/storcenter_defconfig | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/arch/powerpc/configs/44x/fsp2_defconfig b/arch/powerpc/configs/44x/fsp2_defconfig index bae6b26bcfba..1e9b1e7e281f 100644 --- a/arch/powerpc/configs/44x/fsp2_defconfig +++ b/arch/powerpc/configs/44x/fsp2_defconfig @@ -29,7 +29,7 @@ CONFIG_SWIOTLB=y CONFIG_KEXEC=y CONFIG_CRASH_DUMP=y CONFIG_CMDLINE_BOOL=y -CONFIG_CMDLINE="ip=on rw" +CONFIG_CMDLINE_PREPEND="ip=on rw" # CONFIG_SUSPEND is not set # CONFIG_PCI is not set CONFIG_NET=y diff --git a/arch/powerpc/configs/44x/iss476-smp_defconfig b/arch/powerpc/configs/44x/iss476-smp_defconfig index d24bfa6ecd62..ed234c2b1956 100644 --- a/arch/powerpc/configs/44x/iss476-smp_defconfig +++ b/arch/powerpc/configs/44x/iss476-smp_defconfig @@ -18,7 +18,7 @@ CONFIG_HZ_100=y CONFIG_MATH_EMULATION=y CONFIG_IRQ_ALL_CPUS=y CONFIG_CMDLINE_BOOL=y -CONFIG_CMDLINE="root=/dev/issblk0" +CONFIG_CMDLINE_PREPEND="root=/dev/issblk0" # CONFIG_PCI is not set CONFIG_ADVANCED_OPTIONS=y CONFIG_DYNAMIC_MEMSTART=y diff --git a/arch/powerpc/configs/44x/warp_defconfig b/arch/powerpc/configs/44x/warp_defconfig index 6c02f53271cd..ddb395840bb9 100644 --- a/arch/powerpc/configs/44x/warp_defconfig +++ b/arch/powerpc/configs/44x/warp_defconfig @@ -15,7 +15,7 @@ CONFIG_WARP=y CONFIG_PPC4xx_GPIO=y CONFIG_HZ_1000=y CONFIG_CMDLINE_BOOL=y -CONFIG_CMDLINE="ip=on" +CONFIG_CMDLINE_PREPEND="ip=on" # CONFIG_PCI is not set CONFIG_NET=y CONFIG_PACKET=y diff --git a/arch/powerpc/configs/holly_defconfig b/arch/powerpc/configs/holly_defconfig index 71d8d2430b6c..14945562d193 100644 --- a/arch/powerpc/configs/holly_defconfig +++ b/arch/powerpc/configs/holly_defconfig @@ -14,7 +14,7 @@ CONFIG_PPC_HOLLY=y CONFIG_GEN_RTC=y CONFIG_BINFMT_MISC=y CONFIG_CMDLINE_BOOL=y -CONFIG_CMDLINE="console=ttyS0,115200" +CONFIG_CMDLINE_PREPEND="console=ttyS0,115200" # CONFIG_SECCOMP is not set CONFIG_NET=y CONFIG_PACKET=y diff --git a/arch/powerpc/configs/mvme5100_defconfig b/arch/powerpc/configs/mvme5100_defconfig index 63e38c7220f1..07a68ebb3713 100644 --- a/arch/powerpc/configs/mvme5100_defconfig +++ b/arch/powerpc/configs/mvme5100_defconfig @@ -23,7 +23,7 @@ CONFIG_HZ_100=y # CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set # CONFIG_COMPACTION is not set CONFIG_CMDLINE_BOOL=y -CONFIG_CMDLINE="console=ttyS0,9600 ip=dhcp root=/dev/nfs" +CONFIG_CMDLINE_PREPEND="console=ttyS0,9600 ip=dhcp root=/dev/nfs" CONFIG_NET=y CONFIG_PACKET=y CONFIG_UNIX=y diff --git a/arch/powerpc/configs/skiroot_defconfig b/arch/powerpc/configs/skiroot_defconfig index cfdd08897a06..a79984208224 100644 --- a/arch/powerpc/configs/skiroot_defconfig +++ b/arch/powerpc/configs/skiroot_defconfig @@ -53,7 +53,7 @@ CONFIG_NUMA=y CONFIG_PPC_64K_PAGES=y CONFIG_SCHED_SMT=y CONFIG_CMDLINE_BOOL=y -CONFIG_CMDLINE="console=tty0 console=hvc0 ipr.fast_reboot=1 quiet" +CONFIG_CMDLINE_PREPEND="console=tty0 console=hvc0 ipr.fast_reboot=1 quiet" # CONFIG_SECCOMP is not set # CONFIG_PPC_MEM_KEYS is not set CONFIG_NET=y diff --git a/arch/powerpc/configs/storcenter_defconfig b/arch/powerpc/configs/storcenter_defconfig index 74bca2eccd0f..83b3b92176a0 100644 --- a/arch/powerpc/configs/storcenter_defconfig +++ b/arch/powerpc/configs/storcenter_defconfig @@ -13,7 +13,7 @@ CONFIG_STORCENTER=y CONFIG_HZ_100=y CONFIG_BINFMT_MISC=y CONFIG_CMDLINE_BOOL=y -CONFIG_CMDLINE="console=ttyS0,115200" +CONFIG_CMDLINE_PREPEND="console=ttyS0,115200" # CONFIG_SECCOMP is not set CONFIG_NET=y CONFIG_PACKET=m -- 2.19.1
[PATCH 1/4] add generic builtin command line
This code allows architectures to use a generic builtin command line. The state of the builtin command line options across architecture is diverse. On x86 and mips they have pretty much the same code and the code prepends the builtin command line onto the boot loader provided one. On powerpc there is only a builtin override and nothing else. The code in this commit unifies the mips and x86 code into a generic header file under the CONFIG_GENERIC_CMDLINE option. When this option is enabled the architecture can call the cmdline_add_builtin() to add the builtin command line. [maksym.kok...@globallogic.com: fix cmdline_add_builtin() macro] Cc: Daniel Walker Cc: Daniel Walker Cc: xe-linux-exter...@cisco.com Signed-off-by: Daniel Walker Signed-off-by: Maksym Kokhan --- include/linux/cmdline.h | 69 + init/Kconfig| 69 + 2 files changed, 138 insertions(+) create mode 100644 include/linux/cmdline.h diff --git a/include/linux/cmdline.h b/include/linux/cmdline.h new file mode 100644 index ..4a16ee134585 --- /dev/null +++ b/include/linux/cmdline.h @@ -0,0 +1,69 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +#ifndef _LINUX_CMDLINE_H +#define _LINUX_CMDLINE_H + +/* + * + * Copyright (C) 2015. Cisco Systems, Inc. + * + * Generic Append/Prepend cmdline support. + */ + +#if defined(CONFIG_GENERIC_CMDLINE) && defined(CONFIG_CMDLINE_BOOL) + +#ifndef CONFIG_CMDLINE_OVERRIDE +/* + * This function will append or prepend a builtin command line to the command + * line provided by the bootloader. Kconfig options can be used to alter + * the behavior of this builtin command line. + * @dest: The destination of the final appended/prepended string + * @src: The starting string or NULL if there isn't one. + * @tmp: temporary space used for prepending + * @length: the maximum length of the strings above. + */ +static inline void +_cmdline_add_builtin(char *dest, char *src, char *tmp, unsigned long length) +{ + if (src != dest && src != NULL) { + strlcpy(dest, " ", length); + strlcat(dest, src, length); + } + + if (sizeof(CONFIG_CMDLINE_APPEND) > 1) + strlcat(dest, " " CONFIG_CMDLINE_APPEND, length); + + if (sizeof(CONFIG_CMDLINE_PREPEND) > 1) { + strlcpy(tmp, CONFIG_CMDLINE_PREPEND " ", length); + strlcat(tmp, dest, length); + strlcpy(dest, tmp, length); + } +} + +#define cmdline_add_builtin_section(dest, src, length, section)\ +{ \ + if (sizeof(CONFIG_CMDLINE_PREPEND) > 1) { \ + static char cmdline_tmp_space[length] section; \ + _cmdline_add_builtin(dest, src, cmdline_tmp_space, length); \ + } else {\ + _cmdline_add_builtin(dest, src, NULL, length); \ + } \ +} +#else +#define cmdline_add_builtin_section(dest, src, length, section) \ +{ \ + strlcpy(dest, CONFIG_CMDLINE_PREPEND " " CONFIG_CMDLINE_APPEND,\ + length); \ +} +#endif /* !CONFIG_CMDLINE_OVERRIDE */ + +#else +#define cmdline_add_builtin_section(dest, src, length, section) { \ + if (src != NULL) \ + strlcpy(dest, src, length);\ +} +#endif /* CONFIG_GENERIC_CMDLINE */ + +#define cmdline_add_builtin(dest, src, length) \ + cmdline_add_builtin_section(dest, src, length, __initdata) + +#endif /* _LINUX_CMDLINE_H */ diff --git a/init/Kconfig b/init/Kconfig index d47cb77a220e..b9b9e7702ea3 100644 --- a/init/Kconfig +++ b/init/Kconfig @@ -1778,6 +1778,75 @@ config PROFILING config TRACEPOINTS bool +config GENERIC_CMDLINE + bool + +if GENERIC_CMDLINE + +config CMDLINE_BOOL + bool "Built-in kernel command line" + help + Allow for specifying boot arguments to the kernel at + build time. On some systems (e.g. embedded ones), it is + necessary or convenient to provide some or all of the + kernel boot arguments with the kernel itself (that is, + to not rely on the boot loader to provide them.) + + To compile command line arguments into the kernel, + set this option to 'Y', then fill in the + the boot arguments in CONFIG_CMDLINE. + + Systems with fully functional boot loaders (i.e. non-embedded) + should leave this option set to 'N'. + +config CMDLINE_APPEND + string "Built-in kernel comman
[PATCH 2/4] drivers: of: generic command line support
This adds support for the generic command line implementation into the device tree code. This allows some platforms to use the original CONFIG_CMDLINE implementation, but powerpc platforms can used the newer generic command line code. As platforms support the generic command line code they can simply add "select GENERIC_CMDLINE" and delete their Kconfig options for the current CMDLINE. Change-Id: Ief473a5ffac01a999b0aba7619f5b63bc4b36ac4 Cc: Andrew Morton Cc: Christophe Leroy Cc: Michael Ellerman Signed-off-by: Daniel Walker --- drivers/of/fdt.c | 10 -- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/drivers/of/fdt.c b/drivers/of/fdt.c index 7099c652c6a5..9dc5550697c2 100644 --- a/drivers/of/fdt.c +++ b/drivers/of/fdt.c @@ -24,6 +24,7 @@ #include #include #include +#include #include /* for COMMAND_LINE_SIZE */ #include @@ -1102,7 +1103,7 @@ int __init early_init_dt_scan_chosen(unsigned long node, const char *uname, * managed to set the command line, unless CONFIG_CMDLINE_FORCE * is set in which case we override whatever was found earlier. */ -#ifdef CONFIG_CMDLINE +#if defined(CONFIG_CMDLINE) && !defined(CONFIG_GENERIC_CMDLINE) #if defined(CONFIG_CMDLINE_EXTEND) strlcat(data, " ", COMMAND_LINE_SIZE); strlcat(data, CONFIG_CMDLINE, COMMAND_LINE_SIZE); @@ -1113,7 +1114,12 @@ int __init early_init_dt_scan_chosen(unsigned long node, const char *uname, if (!((char *)data)[0]) strlcpy(data, CONFIG_CMDLINE, COMMAND_LINE_SIZE); #endif -#endif /* CONFIG_CMDLINE */ +#endif /* CONFIG_CMDLINE && !CONFIG_GENERIC_CMDLINE */ + + /* append and prepend any arguments built into the kernel via +* generic cmdline. +*/ + cmdline_add_builtin(data, NULL, COMMAND_LINE_SIZE); pr_debug("Command line is: %s\n", (char*)data); -- 2.19.1
[PATCH 3/4] powerpc: convert to generic builtin command line
This updates the powerpc code to use the CONFIG_GENERIC_CMDLINE option. [maksym.kok...@globallogic.com: add strlcat to prom_init_check.sh whitelist] Cc: Daniel Walker Cc: Daniel Walker Cc: xe-linux-exter...@cisco.com Signed-off-by: Daniel Walker Signed-off-by: Maksym Kokhan --- arch/powerpc/Kconfig | 23 +-- arch/powerpc/kernel/prom_init.c| 8 arch/powerpc/kernel/prom_init_check.sh | 2 +- 3 files changed, 6 insertions(+), 27 deletions(-) diff --git a/arch/powerpc/Kconfig b/arch/powerpc/Kconfig index def41a06377b..385120ff0236 100644 --- a/arch/powerpc/Kconfig +++ b/arch/powerpc/Kconfig @@ -173,6 +173,7 @@ config PPC select GENERIC_STRNCPY_FROM_USER select GENERIC_STRNLEN_USER select GENERIC_TIME_VSYSCALL + select GENERIC_CMDLINE select HAVE_ARCH_AUDITSYSCALL select HAVE_ARCH_JUMP_LABEL select HAVE_ARCH_KGDB @@ -780,28 +781,6 @@ config PPC_DENORMALISATION Add support for handling denormalisation of single precision values. Useful for bare metal only. If unsure say Y here. -config CMDLINE_BOOL - bool "Default bootloader kernel arguments" - -config CMDLINE - string "Initial kernel command string" - depends on CMDLINE_BOOL - default "console=ttyS0,9600 console=tty0 root=/dev/sda2" - help - On some platforms, there is currently no way for the boot loader to - pass arguments to the kernel. For these platforms, you can supply - some command-line options at build time by entering them here. In - most cases you will need to specify the root device here. - -config CMDLINE_FORCE - bool "Always use the default kernel command string" - depends on CMDLINE_BOOL - help - Always use the default kernel command string, even if the boot - loader passes other arguments to the kernel. - This is useful if you cannot or don't want to change the - command-line options your boot loader passes to the kernel. - config EXTRA_TARGETS string "Additional default image types" help diff --git a/arch/powerpc/kernel/prom_init.c b/arch/powerpc/kernel/prom_init.c index f33ff4163a51..e8e9fca22470 100644 --- a/arch/powerpc/kernel/prom_init.c +++ b/arch/powerpc/kernel/prom_init.c @@ -30,6 +30,7 @@ #include #include #include +#include #include #include #include @@ -637,11 +638,10 @@ static void __init early_cmdline_parse(void) p = prom_cmd_line; if ((long)prom.chosen > 0) l = prom_getprop(prom.chosen, "bootargs", p, COMMAND_LINE_SIZE-1); -#ifdef CONFIG_CMDLINE + if (l <= 0 || p[0] == '\0') /* dbl check */ - strlcpy(prom_cmd_line, - CONFIG_CMDLINE, sizeof(prom_cmd_line)); -#endif /* CONFIG_CMDLINE */ + cmdline_add_builtin_section(prom_cmd_line, NULL, sizeof(prom_cmd_line), __prombss); + prom_printf("command line: %s\n", prom_cmd_line); #ifdef CONFIG_PPC64 diff --git a/arch/powerpc/kernel/prom_init_check.sh b/arch/powerpc/kernel/prom_init_check.sh index 667df97d2595..ab2acc8d8b5a 100644 --- a/arch/powerpc/kernel/prom_init_check.sh +++ b/arch/powerpc/kernel/prom_init_check.sh @@ -18,7 +18,7 @@ WHITELIST="add_reloc_offset __bss_start __bss_stop copy_and_flush _end enter_prom memcpy memset reloc_offset __secondary_hold -__secondary_hold_acknowledge __secondary_hold_spinloop __start +__secondary_hold_acknowledge __secondary_hold_spinloop __start strlcat strcmp strcpy strlcpy strlen strncmp strstr kstrtobool logo_linux_clut224 reloc_got2 kernstart_addr memstart_addr linux_banner _stext __prom_init_toc_start __prom_init_toc_end btext_setup_display TOC." -- 2.19.1
Generic command line -v2
Hi all, new in -v2 * Updated with some changes to adding spaces from Christophe Leroy. * Added OF support with comments from Rob on my 2015 submission which he reviewed. (https://lore.kernel.org/patchwork/patch/604997/) Christophe and Rob suggested to have support for this inside the OF code. * Powerpc was made to use the OF parts instead of having changes into it's code. * Removed trim effect from powerpc config files. sed only was used to convert. requested by Michael Ellerman. That's basically it. Otherwise the same changes. Daniel
Re: [PATCH 2/3] powerpc: convert to generic builtin command line
On Mon, Mar 04, 2019 at 03:26:59PM +0100, Christophe Leroy wrote: > > > Le 01/03/2019 à 20:44, Daniel Walker a écrit : > > This updates the powerpc code to use the CONFIG_GENERIC_CMDLINE > > option. > > Please explain more in details how each powerpc option is replaced by one of > the generic options. CMDLINE is replace by two options to either which allow static options to either be appended or prepended to the boot loader arguemnts. If you wanted a lateral changes you would only fill in CONFIG_CMDLINE_PREPEND. CONFIG_CMDLINE_OVERRIDE does the same as CMDLINE_FORCE, only with the append and prepend arguemnts merged without the boot loader arguments. > > --- a/arch/powerpc/kernel/prom.c > > +++ b/arch/powerpc/kernel/prom.c > > @@ -34,6 +34,7 @@ > > #include > > #include > > #include > > +#include > > #include > > #include > > @@ -716,6 +717,9 @@ void __init early_init_devtree(void *params) > > */ > > of_scan_flat_dt(early_init_dt_scan_chosen_ppc, boot_command_line); > > + /* append and prepend any arguments built into the kernel. */ > > + cmdline_add_builtin(boot_command_line, NULL, COMMAND_LINE_SIZE); > > + > > I don't think it is worth an implementation as complex as in the previous > patch just for the above line. > Could easily define the temporary buffer in this file directely, then just > locally do: > > strlcpy(temp_buff, CONFIG_CMDLINE_PREPEND, COMMAND_LINE_SIZE); > strlcat(temp_buff, boot_command_line, COMMAND_LINE_SIZE); > strlcat(temp_buff, CONFIG_CMDLINE_APPEND, COMMAND_LINE_SIZE); > strlcpy(boot_command_line, temp_buff, COMMAND_LINE_SIZE); The point of the code is to have an implementation that other architecture can use. If we open code it in powerpc we're no better off. > > > > /* Scan memory nodes and rebuild MEMBLOCKs */ > > of_scan_flat_dt(early_init_dt_scan_root, NULL); > > of_scan_flat_dt(early_init_dt_scan_memory_ppc, NULL); > > diff --git a/arch/powerpc/kernel/prom_init.c > > b/arch/powerpc/kernel/prom_init.c > > index f33ff4163a51..e8e9fca22470 100644 > > --- a/arch/powerpc/kernel/prom_init.c > > +++ b/arch/powerpc/kernel/prom_init.c > > @@ -30,6 +30,7 @@ > > #include > > #include > > #include > > +#include > > #include > > #include > > #include > > @@ -637,11 +638,10 @@ static void __init early_cmdline_parse(void) > > p = prom_cmd_line; > > if ((long)prom.chosen > 0) > > l = prom_getprop(prom.chosen, "bootargs", p, > > COMMAND_LINE_SIZE-1); > > -#ifdef CONFIG_CMDLINE > > + > > if (l <= 0 || p[0] == '\0') /* dbl check */ > > - strlcpy(prom_cmd_line, > > - CONFIG_CMDLINE, sizeof(prom_cmd_line)); > > -#endif /* CONFIG_CMDLINE */ > > + cmdline_add_builtin_section(prom_cmd_line, NULL, > > sizeof(prom_cmd_line), __prombss); > > + > > You don't need something as complex as what your generic code does for that. > It could be done with the following simple line: > > strlcpy(prom_cmd_line, CONFIG_CMDLINE_PREPEND " " CONFIG_CMDLINE_APPEND, > sizeof(prom_cmd_line)); > > > prom_printf("command line: %s\n", prom_cmd_line); > > #ifdef CONFIG_PPC64 > > diff --git a/arch/powerpc/kernel/prom_init_check.sh > > b/arch/powerpc/kernel/prom_init_check.sh > > index 667df97d2595..ab2acc8d8b5a 100644 > > --- a/arch/powerpc/kernel/prom_init_check.sh > > +++ b/arch/powerpc/kernel/prom_init_check.sh > > @@ -18,7 +18,7 @@ > > WHITELIST="add_reloc_offset __bss_start __bss_stop copy_and_flush > > _end enter_prom memcpy memset reloc_offset __secondary_hold > > -__secondary_hold_acknowledge __secondary_hold_spinloop __start > > +__secondary_hold_acknowledge __secondary_hold_spinloop __start strlcat > > The above is a big issue. In the scope of KASAN implementation, we are > getting rid of generic string functions from prom_init because they are > KASAN instrumented and that's far too early for prom_init. See series > https://patchwork.ozlabs.org/project/linuxppc-dev/list/?series=94949 and > especially patch [v9,03/11] powerpc/prom_init: don't use string functions > from lib/ You already re-implemented a number of string functions, seem easy enough to add another one. What your doing here is exactly what I'm trying to prevent in my implementation. Say there is a small, but horrific defect in one of the string functions. Some other architecture fixes it in lib/strings.c , woops , you just missed it and now prom_init.c is stuck with it unless powerpc maintainers are watching closely to
Re: [PULL REQUEST] powerpc generic command line
On Tue, Mar 19, 2019 at 06:42:35PM +0100, Christophe Leroy wrote: > Well, that's what I started with, but at the end my main worry has been that > you bring a non exciting set of complicated macros and code to replace > simple code, and you break something out of generic OF code to a new brand > new generic one, instead of updating the existing generic OF code. Even if we update the generic OF code it only changes the powerpc changes slightly. Because in arch/powerpc/kernel/prom_init.c there is a second version of the same thing, which doesn't use OF. We're not replacing simple macro's in powerpc with in-kind replacements, we're adding a feature which we want. So yes our macros are more complicated, but in the grand scheme of things they are very simple macros. If you think my stuff is complicated, you haven't seen complicated. I didn't see anyplace in your comments when you found code which would cause a problem ? Did you find breakage which I missed? > I like the idea behind your series very much, but I don't like too much the > way it is proposed to be implemented. If you give me one week or two, I will > come with a lighter proposal that should achieve the same goal. It's fine with us, we just want the feature set. We'll continue with our version tho, unless you decide to submit something. I will incorporate your comments now, but immediately prior to a pull request I couldn't add them. Daniel
Re: [PULL REQUEST] powerpc generic command line
On Tue, Mar 19, 2019 at 12:18:03PM +1100, Michael Ellerman wrote: > Hi Daniel, > > Daniel Walker writes: > > Here are the generic command line changes for powerpc. > > > > These changes have been in linux-next for two cycles, with few problems > > reported. > > It's also been used at Cisco Systems, Inc. in production products for many > > many > > years with no problems. > > > > Please pull these changes. > > Sorry I didn't reply to this earlier, have been busy with merge window > bugs and so on. > > As I imagine you noticed, I didn't pull this. There are a few reasons. > > Firstly you sent it a bit late, about a day before the 5.0 release, and > at 6am Saturday my time :) In future if you want me to merge something > please send a pull at least the ~Wednesday before the release. Ok .. It was Friday morning my time. > Secondly I had no idea this code was even in linux-next. I'm not sure if > I was Cc'ed at some point when you added it, if so sorry I missed it, > but I get lots of email. If you're going to add changes to arch/powerpc > in your next tree I'd appreciate some notice, or preferably an explicit > ack. Can I have an ack now ? Since your looking at it. Do you think this has no use, certainly Cisco has use for it. It's still in linux-next as of now. > The main reason I didn't merge it is that it's adding a bunch of code > outside of arch/powerpc, into files which I'm not the maintainer for, > and the patches doing so have no acks or reviews from anyone. With the exception of the Kconfig the header file is brand new, so I'm not sure who would ack that. From a maintainer perspective I think you could add new files without issues from other maintainers. > It's also adding a generic implementation with no indication that any > other arches are willing/able to use the generic implementation, which > begs the question whether it will actually used. It would have been used by powerpc ;) I've gotten feedback in the past from Ralf Baechle who thought this was useful, however that was years ago when this was first submitted and the code around this area in mips has changed and it would require a fair amount of new work to function properly on mips. Also , no other platforms need to use this. Powerpc could be the only user of it. This isn't really a question of a new exciting implementation of something. This is really simple, it's just consolidation across architectures. The implementation is vanilla, non-exciting stuff. > I appreciate it's hard to get these sort of cross architecture changes > into mainline, but I don't think this is the way to do it. > > I'd suggest you post a patch series to linux-arch with the generic > changes and as many architecture conversions as you can manage, then get > some review/acks for the generic changes and chase arch maintainers for > some acks. I didn't post to linux-arch , but the code has been around for years, submitted multiple times with more architectures than powerpc. It was scaled down to just powerpc to simplify it's submission. It's really a simple set of changes, I don't think it needs as much thought as other cross architecture changes. > I realise you have posted the series before, it may require some > persistence. There were also quite a few comments from Christophe, so > replying to those would be a good place to start. I've looked at his comments, but I think he was more worried about conflicts with his debugging enablement, not something to stop a pull request. > > The following changes since commit ccda4af0f4b92f7b4c308d3acc262f4a7e3affad: > > > > Linux 4.20-rc2 (2018-11-11 17:12:31 -0600) > > > > are available in the git repository at: > > > > https://github.com/daniel-walker/cisco-linux.git for-powerpc > > > > for you to fetch changes up to 5d4514a9c291ecf19b0626695161673d35e5d549: > > > > powerpc: convert config files to generic cmdline (2018-11-16 07:32:26 > > -0800) > > > > > > Daniel Walker (3): > > add generic builtin command line > > powerpc: convert to generic builtin command line > > powerpc: convert config files to generic cmdline > > > > arch/powerpc/Kconfig | 23 + > > arch/powerpc/configs/44x/fsp2_defconfig | 29 ++- > > arch/powerpc/configs/44x/iss476-smp_defconfig | 24 - > > arch/powerpc/configs/44x/warp_defconfig | 12 ++--- > > arch/powerpc/configs/holly_defconfig | 12 ++--- > > arch/powerpc/configs/mvme5100_defconfig | 25 +- > > arch/powerpc/configs/skiroot_defconfig| 48 +- > > arch/powerpc/c
Re: [PULL REQUEST] powerpc generic command line
On Mon, Mar 04, 2019 at 06:29:12PM +0100, Christophe Leroy wrote: > > > Le 04/03/2019 à 17:57, Daniel Walker a écrit : > > On Mon, Mar 04, 2019 at 02:55:08PM +0100, Christophe Leroy wrote: > > > > > > > > > Le 01/03/2019 à 20:44, Daniel Walker a écrit : > > > > Here are the generic command line changes for powerpc. > > > > > > > > These changes have been in linux-next for two cycles, with few problems > > > > reported. > > > > It's also been used at Cisco Systems, Inc. in production products for > > > > many many > > > > years with no problems. > > > > > > > > Please pull these changes. > > > > > > > > > > > > The following changes since commit > > > > ccda4af0f4b92f7b4c308d3acc262f4a7e3affad: > > > > > > > > Linux 4.20-rc2 (2018-11-11 17:12:31 -0600) > > > > > > > > are available in the git repository at: > > > > > > > > https://github.com/daniel-walker/cisco-linux.git for-powerpc > > > > > > > > for you to fetch changes up to 5d4514a9c291ecf19b0626695161673d35e5d549: > > > > > > > > powerpc: convert config files to generic cmdline (2018-11-16 > > > > 07:32:26 -0800) > > > > > > > > > > > > Daniel Walker (3): > > > > add generic builtin command line > > > > powerpc: convert to generic builtin command line > > > > powerpc: convert config files to generic cmdline > > > > > > Hello, > > > > > > This series is in total contradiction with the work being done to add > > > KASAN > > > support to powerpc. > > > > > > It also modifies the behaviour for powerpc. > > > > > > Please do not apply this series as is, see my comments on the individual > > > patchs for details. > > > > > > > Not trying to offend you, but you comments seems overly alarmist. KASAN is a > > debug feature, generally we don't write code around debug features > > (especially > > ones which aren't merged yet). It would not be hard to correct our use of > > string > > functions when your KASAN enablement is merged, I'm sure you could do it, > > but I would be happy > > to do it also. The other comments you had I don't think rise to the level of > > stopping a pull request. Our code is stabilized, so I'm not going to > > re-design it at a late date like this. > > > > I think the pull request is still valid. > > > > Ok, lets the KASAN stuff aside. And I agree I misread the patch when I felt > that it was changing the behaviour in prom_init.c > > I don't want to criticise your work either, but your series seems overkill. > Anyway, could you explain your approach and what is the benefit of your > series compared to what is already existing ? Current behavior varies across different architectures. Some platforms prepend the command line with the boot loader arguments some platforms append it. Cisco uses all these platforms. We desire a method to either append or prepend on a number of architectures. It reduces code duplication across multiple architectures. It allows a number of other command line related features to be added in a single location instead of across all architectures. For example MIPS has some additional features added related to the command line arguments, this could be made generic and available to all architectures. > > Can you also explain how your changes fit with the what is done is the > function early_init_dt_scan_chosen_ppc() in drivers/of/fdt.c as your series > doesn't modify it ? (extract below) > > > > /* >* CONFIG_CMDLINE is meant to be a default in case nothing else >* managed to set the command line, unless CONFIG_CMDLINE_FORCE >* is set in which case we override whatever was found earlier. >*/ > #ifdef CONFIG_CMDLINE > #if defined(CONFIG_CMDLINE_EXTEND) > strlcat(data, " ", COMMAND_LINE_SIZE); > strlcat(data, CONFIG_CMDLINE, COMMAND_LINE_SIZE); > #elif defined(CONFIG_CMDLINE_FORCE) > strlcpy(data, CONFIG_CMDLINE, COMMAND_LINE_SIZE); > #else > /* No arguments from boot loader, use kernel's cmdl*/ > if (!((char *)data)[0]) > strlcpy(data, CONFIG_CMDLINE, COMMAND_LINE_SIZE); > #endif > #endif /* CONFIG_CMDLINE */ Our code supersedes this code, and you can see the code is doing similar things. Eventually this block
Re: [PULL REQUEST] powerpc generic command line
On Mon, Mar 04, 2019 at 02:55:08PM +0100, Christophe Leroy wrote: > > > Le 01/03/2019 à 20:44, Daniel Walker a écrit : > > Here are the generic command line changes for powerpc. > > > > These changes have been in linux-next for two cycles, with few problems > > reported. > > It's also been used at Cisco Systems, Inc. in production products for many > > many > > years with no problems. > > > > Please pull these changes. > > > > > > The following changes since commit ccda4af0f4b92f7b4c308d3acc262f4a7e3affad: > > > >Linux 4.20-rc2 (2018-11-11 17:12:31 -0600) > > > > are available in the git repository at: > > > >https://github.com/daniel-walker/cisco-linux.git for-powerpc > > > > for you to fetch changes up to 5d4514a9c291ecf19b0626695161673d35e5d549: > > > >powerpc: convert config files to generic cmdline (2018-11-16 07:32:26 > > -0800) > > > > > > Daniel Walker (3): > >add generic builtin command line > >powerpc: convert to generic builtin command line > >powerpc: convert config files to generic cmdline > > Hello, > > This series is in total contradiction with the work being done to add KASAN > support to powerpc. > > It also modifies the behaviour for powerpc. > > Please do not apply this series as is, see my comments on the individual > patchs for details. > Not trying to offend you, but you comments seems overly alarmist. KASAN is a debug feature, generally we don't write code around debug features (especially ones which aren't merged yet). It would not be hard to correct our use of string functions when your KASAN enablement is merged, I'm sure you could do it, but I would be happy to do it also. The other comments you had I don't think rise to the level of stopping a pull request. Our code is stabilized, so I'm not going to re-design it at a late date like this. I think the pull request is still valid. Daniel
[PULL REQUEST] powerpc generic command line
Here are the generic command line changes for powerpc. These changes have been in linux-next for two cycles, with few problems reported. It's also been used at Cisco Systems, Inc. in production products for many many years with no problems. Please pull these changes. The following changes since commit ccda4af0f4b92f7b4c308d3acc262f4a7e3affad: Linux 4.20-rc2 (2018-11-11 17:12:31 -0600) are available in the git repository at: https://github.com/daniel-walker/cisco-linux.git for-powerpc for you to fetch changes up to 5d4514a9c291ecf19b0626695161673d35e5d549: powerpc: convert config files to generic cmdline (2018-11-16 07:32:26 -0800) Daniel Walker (3): add generic builtin command line powerpc: convert to generic builtin command line powerpc: convert config files to generic cmdline arch/powerpc/Kconfig | 23 + arch/powerpc/configs/44x/fsp2_defconfig | 29 ++- arch/powerpc/configs/44x/iss476-smp_defconfig | 24 - arch/powerpc/configs/44x/warp_defconfig | 12 ++--- arch/powerpc/configs/holly_defconfig | 12 ++--- arch/powerpc/configs/mvme5100_defconfig | 25 +- arch/powerpc/configs/skiroot_defconfig| 48 +- arch/powerpc/configs/storcenter_defconfig | 15 +++--- arch/powerpc/kernel/prom.c| 4 ++ arch/powerpc/kernel/prom_init.c | 8 +-- arch/powerpc/kernel/prom_init_check.sh| 2 +- include/linux/cmdline.h | 72 +++ init/Kconfig | 69 + 13 files changed, 231 insertions(+), 112 deletions(-) create mode 100644 include/linux/cmdline.h