[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH v2 03/15] x86/boot: add cmdline to struct boot_domain
On 26.12.2024 17:57, Daniel P. Smith wrote: > @@ -759,9 +758,10 @@ static int __init pvh_load_kernel( > /* Free temporary buffers. */ > free_boot_modules(); > > - if ( cmdline != NULL ) > + if ( bd->cmdline != NULL ) > { > - rc = hvm_copy_to_guest_phys(last_addr, cmdline, strlen(cmdline) + 1, > v); > + rc = hvm_copy_to_guest_phys( > + last_addr, bd->cmdline, strlen(bd->cmdline) + 1, v); Nit: Indentation. The anchor point for this kind of increased indentation is the function name being called, so you want to add one more blank. (It is not N times the usual indentation of 4, until "it looks okay".) > --- a/xen/arch/x86/include/asm/bootdomain.h > +++ b/xen/arch/x86/include/asm/bootdomain.h > @@ -11,6 +11,8 @@ > #define __XEN_X86_BOOTDOMAIN_H__ > > struct boot_domain { > + const char *cmdline; > + > domid_t domid; > > struct boot_module *kernel; I can see why in the earlier patch you added domid at the top. But cmdline? > --- a/xen/arch/x86/setup.c > +++ b/xen/arch/x86/setup.c > @@ -975,10 +975,29 @@ static unsigned int __init copy_bios_e820(struct > e820entry *map, unsigned int li > return n; > } > > -static struct domain *__init create_dom0(struct boot_info *bi) > +static size_t __init domain_cmdline_size( > + struct boot_info *bi, struct boot_domain *bd) > { > - static char __initdata cmdline[MAX_GUEST_CMDLINE]; > + size_t s = bi->kextra ? strlen(bi->kextra) : 0; > + > + s += bd->kernel->cmdline_pa ? strlen(__va(bd->kernel->cmdline_pa)) : 0; > + > + if ( s == 0 ) > + return s; > + > + /* > + * Certain parameters from the Xen command line may be added to the dom0 > + * command line. Add additional space for the possible cases along with > one > + * extra char to hold \0. > + */ > + s += strlen(" noapic") + strlen(" acpi=") + sizeof(acpi_param) + 1; See below; I question this all being necessary for PVH Dom0. > @@ -1018,39 +1037,52 @@ static struct domain *__init create_dom0(struct > boot_info *bi) > panic("Error creating d%uv0\n", bd->domid); > > /* Grab the DOM0 command line. */ > - if ( bd->kernel->cmdline_pa || bi->kextra ) > + if ( (bd->kernel->cmdline_pa && > + ((char *)__va(bd->kernel->cmdline_pa))[0]) || > + bi->kextra ) > { > - if ( bd->kernel->cmdline_pa ) > - safe_strcpy(cmdline, > - cmdline_cook(__va(bd->kernel->cmdline_pa), > bi->loader)); > + size_t cmdline_size = domain_cmdline_size(bi, bd); > + > + if ( cmdline_size ) > + { > + if ( !(cmdline = xzalloc_array(char, cmdline_size)) ) > + panic("Error allocating cmdline buffer for %pd\n", d); > > - if ( bi->kextra ) > - /* kextra always includes exactly one leading space. */ > - safe_strcat(cmdline, bi->kextra); > + if ( bd->kernel->cmdline_pa ) > + strlcpy(cmdline, > + cmdline_cook(__va(bd->kernel->cmdline_pa), > bi->loader), > + cmdline_size); > > - /* Append any extra parameters. */ > - if ( skip_ioapic_setup && !strstr(cmdline, "noapic") ) > - safe_strcat(cmdline, " noapic"); > + if ( bi->kextra ) > + /* kextra always includes exactly one leading space. */ > + strlcat(cmdline, bi->kextra, cmdline_size); > > - if ( (strlen(acpi_param) == 0) && acpi_disabled ) > - { > - printk("ACPI is disabled, notifying Domain 0 (acpi=off)\n"); > - safe_strcpy(acpi_param, "off"); > - } > + /* Append any extra parameters. */ > + if ( skip_ioapic_setup && !strstr(cmdline, "noapic") ) > + strlcat(cmdline, " noapic", cmdline_size); Roger - this isn't going to work very well with PVH Dom0, is it? > - if ( (strlen(acpi_param) != 0) && !strstr(cmdline, "acpi=") ) > - { > - safe_strcat(cmdline, " acpi="); > - safe_strcat(cmdline, acpi_param); > - } > + if ( (strlen(acpi_param) == 0) && acpi_disabled ) Not sure whether the compiler will do that transformation anyway, but this check looks odd to me. Why not simply check whether the first char is the nul one? > + { > + printk("ACPI is disabled, notifying Domain 0 (acpi=off)\n"); > + safe_strcpy(acpi_param, "off"); > + } Here I'm doubtful, too, when it comes to PVH Dom0. If Xen's even works in this mode anymore at all, I don't think we can sensibly start a PVH Dom0 then. (This is leaving aside that all of this is Linux-centric anyway.) > - bd->kernel->cmdline_pa = __pa(cmdline); > + if ( (strlen(acpi_param) != 0) && !strstr(cmdline, "acpi=") ) > + { > + strlcat(cmdline, " acpi=", cmdline_size); > + strlcat(cmdline, acpi_param, cmdline_size); > + } (This, btw, won't work quite well when acpi= is specified more than once on the command line.) > + bd->kernel->cmdline_pa = 0; > + bd->cmdline = cmdline; > + } > } > > bd->d = d; > if ( construct_dom0(bd) != 0 ) > panic("Could not construct domain 0\n"); > > + xfree(cmdline); Leaving bd->cmdline dangling? Jan
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |