|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [xen staging-4.19] x86/PVH: account for module command line length
commit 43e1996c02d2c810920577574aefe6dfdb19f5ad
Author: Jan Beulich <jbeulich@xxxxxxxx>
AuthorDate: Thu Mar 27 15:06:33 2025 +0100
Commit: Jan Beulich <jbeulich@xxxxxxxx>
CommitDate: Thu Mar 27 15:06:33 2025 +0100
x86/PVH: account for module command line length
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@xxxxxxxx>
Reviewed-by: Jason Andryuk <jason.andryuk@xxxxxxx>
master commit: 989584e532c9517a0f789e993f5f6744beaebe3e
master date: 2025-03-27 12:21:08 +0100
---
xen/arch/x86/hvm/dom0_build.c | 28 ++++++++++++++++++++++------
1 file changed, 22 insertions(+), 6 deletions(-)
diff --git a/xen/arch/x86/hvm/dom0_build.c b/xen/arch/x86/hvm/dom0_build.c
index 4a094ae317..2b4505ebbf 100644
--- a/xen/arch/x86/hvm/dom0_build.c
+++ b/xen/arch/x86/hvm/dom0_build.c
@@ -651,6 +651,7 @@ static int __init pvh_load_kernel(struct domain *d, const
module_t *image,
void *image_start = image_base + image_headroom;
unsigned long image_len = image->mod_end;
unsigned long initrd_len = initrd ? initrd->mod_end : 0;
+ const char *initrd_cmdline = NULL;
struct elf_binary elf;
struct elf_dom_parms parms;
size_t extra_space;
@@ -714,7 +715,23 @@ static int __init pvh_load_kernel(struct domain *d, const
module_t *image,
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->string )
+ {
+ initrd_cmdline = __va(initrd->string);
+ 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 += ROUNDUP(strlen(cmdline) + 1,
@@ -739,13 +756,12 @@ static int __init pvh_load_kernel(struct domain *d, const
module_t *image,
mod.paddr = last_addr;
mod.size = initrd_len;
- last_addr += ROUNDUP(initrd_len, elf_64bit(&elf) ? 8 : 4);
- if ( initrd->string )
+ last_addr += elf_round_up(&elf, initrd_len);
+ if ( initrd_cmdline )
{
- char *str = __va(initrd->string);
- 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");
--
generated by git-patchbot for /home/xen/git/xen.git#staging-4.19
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |