@@ -652,6 +652,7 @@ static int __init pvh_load_kernel(
unsigned long image_len = image->size;
unsigned long initrd_len = initrd ? initrd->size : 0;
const char *cmdline = image->cmdline_pa ? __va(image->cmdline_pa) : NULL;
+ const char *initrd_cmdline = NULL;
struct elf_binary elf;
struct elf_dom_parms parms;
size_t extra_space;
@@ -715,7 +716,23 @@ static int __init pvh_load_kernel(
extra_space = sizeof(start_info);
if ( initrd )
- extra_space += sizeof(mod) + ROUNDUP(initrd_len, PAGE_SIZE);
+ {
+ size_t initrd_space = elf_round_up(&elf, initrd_len);
+
+ if ( initrd->cmdline_pa )
+ {
+ initrd_cmdline = __va(initrd->cmdline_pa);
+ if ( !*initrd_cmdline )
+ initrd_cmdline = NULL;
+ }
+ if ( initrd_cmdline )
+ initrd_space += strlen(initrd_cmdline) + 1;
+
+ if ( initrd_space )
+ extra_space += ROUNDUP(initrd_space, PAGE_SIZE) + sizeof(mod);
+ else
+ initrd = NULL;
+ }
if ( cmdline )
extra_space += elf_round_up(&elf, strlen(cmdline) + 1);
@@ -740,12 +757,11 @@ static int __init pvh_load_kernel(
mod.paddr = last_addr;
mod.size = initrd_len;
last_addr += elf_round_up(&elf, initrd_len);
- if ( initrd->cmdline_pa )
+ if ( initrd_cmdline )
{
- char *str = __va(initrd->cmdline_pa);
- size_t len = strlen(str) + 1;
+ size_t len = strlen(initrd_cmdline) + 1;
- rc = hvm_copy_to_guest_phys(last_addr, str, len, v);
+ rc = hvm_copy_to_guest_phys(last_addr, initrd_cmdline, len, v);
if ( rc )
{
printk("Unable to copy module command line\n");
As per observation in practice, initrd->cmdline_pa is not normally zero. Hence so far we always appended at least one byte. That alone may already render insufficient the "allocation" made by find_memory(). Things would be worse when there's actually a (perhaps long) command line. Skip setup when the command line is empty. Amend the "allocation" size by padding and actual size of module command line. Along these lines also skip initrd setup when the initrd is zero size. Fixes: 0ecb8eb09f9f ("x86/pvh: pass module command line to dom0") Signed-off-by: Jan Beulich <jbeulich@suse.com> --- v4: Keep only ever accumulating into extra_space. v3: Permit empty initrd with non-empty module command line again. v2: Use elf_round_up(). Introduce initrd_cmdline local. Re-base.