|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH v4 07/13] x86/hyperlaunch: obtain cmdline from device tree
On Fri Apr 18, 2025 at 11:53 PM BST, dmkhn wrote:
> On Thu, Apr 17, 2025 at 01:48:29PM +0100, Alejandro Vallejo wrote:
>> From: "Daniel P. Smith" <dpsmith@xxxxxxxxxxxxxxxxxxxx>
>>
>> Add support to read the command line from the hyperlauunch device tree.
>> The device tree command line is located in the "bootargs" property of the
>> "multiboot,kernel" node.
>>
>> A boot loader command line, e.g. a grub module string field, takes
>> precendence ove the device tree one since it is easier to modify.
>
> ^^ over
Oops. yes.
>
> Also, I would explain the command line parsing rules in the code commentary
> for
> domain_cmdline_size() below.
As in, also state the contents of the commit message in the function
header?
>
>>
>> Signed-off-by: Daniel P. Smith <dpsmith@xxxxxxxxxxxxxxxxxxxx>
>> Signed-off-by: Jason Andryuk <jason.andryuk@xxxxxxx>
>> Signed-off-by: Alejandro Vallejo <agarciav@xxxxxxx>
>> ---
>> v4:
>> * Removed __init from header declarations.
>> * Removed ifdef guards, as DCE ensures the missing definitions don't
>> matter.
>> * Removed ifdef guards from new helpers in domain-builder/fdt.c
>> * Rely on DCE instead.
>> * Restored checks for cmdline_pa being zero.
>> * swapped offset and poffset varnames in libfdt-xen.h helper.
>> * swapped name and pname varnames in libfdt-xen.h helper.
>> * Turned foo == 0 into !foo in libfdt-xen.h helper.
>> ---
>> xen/arch/x86/include/asm/bootinfo.h | 6 ++++--
>> xen/arch/x86/setup.c | 10 +++++++--
>> xen/common/domain-builder/core.c | 32 +++++++++++++++++++++++++++++
>> xen/common/domain-builder/fdt.c | 6 ++++++
>> xen/common/domain-builder/fdt.h | 24 ++++++++++++++++++++++
>> xen/include/xen/domain-builder.h | 4 ++++
>> xen/include/xen/libfdt/libfdt-xen.h | 23 +++++++++++++++++++++
>> 7 files changed, 101 insertions(+), 4 deletions(-)
>>
>> diff --git a/xen/arch/x86/include/asm/bootinfo.h
>> b/xen/arch/x86/include/asm/bootinfo.h
>> index 1e3d582e45..5b2c93b1ef 100644
>> --- a/xen/arch/x86/include/asm/bootinfo.h
>> +++ b/xen/arch/x86/include/asm/bootinfo.h
>> @@ -35,11 +35,13 @@ struct boot_module {
>>
>> /*
>> * Module State Flags:
>> - * relocated: indicates module has been relocated in memory.
>> - * released: indicates module's pages have been freed.
>> + * relocated: indicates module has been relocated in memory.
>> + * released: indicates module's pages have been freed.
>> + * fdt_cmdline: indicates module's cmdline is in the FDT.
>> */
>> bool relocated:1;
>> bool released:1;
>> + bool fdt_cmdline:1;
>>
>> /*
>> * A boot module may need decompressing by Xen. Headroom is an
>> estimate of
>> diff --git a/xen/arch/x86/setup.c b/xen/arch/x86/setup.c
>> index 4f669f3c60..4cae13163b 100644
>> --- a/xen/arch/x86/setup.c
>> +++ b/xen/arch/x86/setup.c
>> @@ -984,7 +984,10 @@ static size_t __init domain_cmdline_size(const struct
>> boot_info *bi,
>> {
>> size_t s = bi->kextra ? strlen(bi->kextra) : 0;
>>
>> - s += bd->kernel->cmdline_pa ? strlen(__va(bd->kernel->cmdline_pa)) : 0;
>> + if ( bd->kernel->fdt_cmdline )
>> + s += builder_get_cmdline_size(bi, bd->kernel->cmdline_pa);
>> + else if ( bd->kernel->cmdline_pa )
>> + s += strlen(__va(bd->kernel->cmdline_pa));
>>
>> if ( s == 0 )
>> return s;
>> @@ -1047,7 +1050,10 @@ static struct domain *__init create_dom0(struct
>> boot_info *bi)
>> if ( !(cmdline = xzalloc_array(char, cmdline_size)) )
>> panic("Error allocating cmdline buffer for %pd\n", d);
>>
>> - if ( bd->kernel->cmdline_pa )
>> + if ( bd->kernel->fdt_cmdline )
>> + builder_get_cmdline(
>> + bi, bd->kernel->cmdline_pa, cmdline, cmdline_size);
>> + else if ( bd->kernel->cmdline_pa )
>> strlcpy(cmdline,
>> cmdline_cook(__va(bd->kernel->cmdline_pa), bi->loader),
>> cmdline_size);
>> diff --git a/xen/common/domain-builder/core.c
>> b/xen/common/domain-builder/core.c
>> index 924cb495a3..4b4230f2ff 100644
>> --- a/xen/common/domain-builder/core.c
>> +++ b/xen/common/domain-builder/core.c
>> @@ -8,9 +8,41 @@
>> #include <xen/lib.h>
>>
>> #include <asm/bootinfo.h>
>> +#include <asm/setup.h>
>>
>> #include "fdt.h"
>>
>> +size_t __init builder_get_cmdline_size(struct boot_info *bi, int offset)
>> +{
>> + const void *fdt;
>> + int size;
>> +
>> + if ( !IS_ENABLED(CONFIG_DOMAIN_BUILDER) )
>> + return 0;
>> +
>> + fdt = bootstrap_map_bm(&bi->mods[HYPERLAUNCH_MODULE_IDX]);
>> + size = fdt_cmdline_prop_size(fdt, offset);
>> + bootstrap_unmap();
>> +
>> + return max(0, size);
>> +}
>> +
>> +int __init builder_get_cmdline(
>> + struct boot_info *bi, int offset, char *cmdline, size_t size)
>> +{
>> + const void *fdt;
>> + int ret;
>> +
>> + if ( !IS_ENABLED(CONFIG_DOMAIN_BUILDER) )
>> + return 0;
>> +
>> + fdt = bootstrap_map_bm(&bi->mods[HYPERLAUNCH_MODULE_IDX]);
>> + ret = fdt_cmdline_prop_copy(fdt, offset, cmdline, size);
>> + bootstrap_unmap();
>> +
>> + return ret;
>> +}
>> +
>> void __init builder_init(struct boot_info *bi)
>> {
>> bi->hyperlaunch_enabled = false;
>> diff --git a/xen/common/domain-builder/fdt.c
>> b/xen/common/domain-builder/fdt.c
>> index 1fae6add3b..50fde2d007 100644
>> --- a/xen/common/domain-builder/fdt.c
>> +++ b/xen/common/domain-builder/fdt.c
>> @@ -209,6 +209,12 @@ static int __init process_domain_node(
>> printk(XENLOG_INFO " kernel: multiboot-index=%d\n", idx);
>> bi->mods[idx].type = BOOTMOD_KERNEL;
>> bd->kernel = &bi->mods[idx];
>> +
>> + /* If bootloader didn't set cmdline, see if FDT provides one. */
>> + if ( bd->kernel->cmdline_pa &&
>> + !((char *)__va(bd->kernel->cmdline_pa))[0] )
>> + bd->kernel->fdt_cmdline = fdt_get_prop_offset(
>> + fdt, node, "bootargs", &bd->kernel->cmdline_pa);
>> }
>> }
>>
>> diff --git a/xen/common/domain-builder/fdt.h
>> b/xen/common/domain-builder/fdt.h
>> index 8c98a256eb..d2ae7d5c36 100644
>> --- a/xen/common/domain-builder/fdt.h
>> +++ b/xen/common/domain-builder/fdt.h
>> @@ -9,6 +9,30 @@ struct boot_info;
>> /* hyperlaunch fdt is required to be module 0 */
>> #define HYPERLAUNCH_MODULE_IDX 0
>>
>> +static inline int __init fdt_cmdline_prop_size(const void *fdt, int offset)
>> +{
>> + int ret;
>> +
>> + fdt_get_property_by_offset(fdt, offset, &ret);
>
> Perhaps something like
>
> (void)fdt_get_property_by_offset...
>
> since there's no need to check the return value?
I vaguely seem to remember doing something like that a few years ago
(because it does show intent and many linters require it) and being told
not to. But maybe I misremember. I'm definitely happy to use that
convention here and later unless someone pushes back for some reason.
Cheers,
Alejandro
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |