@@ -69,8 +69,6 @@ static __init int bzimage_check(struct setup_header *hdr, unsigned long len)
return 1;
}
-static unsigned long __initdata orig_image_len;
-
unsigned long __init bzimage_headroom(void *image_start,
unsigned long image_length)
{
@@ -91,7 +89,6 @@ unsigned long __init bzimage_headroom(void *image_start,
if ( elf_is_elfbinary(image_start, image_length) )
return 0;
- orig_image_len = image_length;
headroom = output_length(image_start, image_length);
if (gzip_check(image_start, image_length))
{
@@ -105,11 +102,14 @@ unsigned long __init bzimage_headroom(void *image_start,
}
int __init bzimage_parse(void *image_base, void **image_start,
+ unsigned int headroom,
unsigned long *image_len)
{
struct setup_header *hdr = (struct setup_header *)(*image_start);
int err = bzimage_check(hdr, *image_len);
- unsigned long output_len;
+ unsigned long output_len, orig_image_len;
+
+ orig_image_len = *image_len - headroom;
if ( err < 0 )
return err;
@@ -125,7 +125,7 @@ int __init bzimage_parse(void *image_base, void **image_start,
BUG_ON(!(image_base < *image_start));
- output_len = output_length(*image_start, orig_image_len);
+ output_len = output_length(*image_start, *image_len);
if ( (err = perform_gunzip(image_base, *image_start, orig_image_len)) > 0 )
err = decompress(*image_start, orig_image_len, image_base);
@@ -545,7 +545,8 @@ static int __init pvh_load_kernel(struct domain *d, const module_t *image,
struct vcpu *v = d->vcpu[0];
int rc;
- if ( (rc = bzimage_parse(image_base, &image_start, &image_len)) != 0 )
+ if ( (rc = bzimage_parse(image_base, &image_start, image_headroom,
+ &image_len)) != 0 )
{
printk("Error trying to detect bz compressed kernel\n");
return rc;
new file mode 100644
@@ -0,0 +1,18 @@
+#ifndef __ARCH_X86_BOOTINFO_H__
+#define __ARCH_X86_BOOTINFO_H__
+
+struct arch_bootmodule {
+ unsigned headroom;
+};
+
+#endif
+
+/*
+ * Local variables:
+ * mode: C
+ * c-file-style: "BSD"
+ * c-basic-offset: 4
+ * tab-width: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
@@ -5,7 +5,7 @@
unsigned long bzimage_headroom(void *image_start, unsigned long image_length);
-int bzimage_parse(void *image_base, void **image_start,
+int bzimage_parse(void *image_base, void **image_start, unsigned int headroom,
unsigned long *image_len);
#endif /* __X86_BZIMAGE_H__ */
@@ -416,7 +416,8 @@ int __init dom0_construct_pv(struct domain *d,
d->max_pages = ~0U;
- if ( (rc = bzimage_parse(image_base, &image_start, &image_len)) != 0 )
+ if ( (rc = bzimage_parse(image_base, &image_start, image_headroom,
+ &image_len)) != 0 )
return rc;
if ( (rc = elf_init(&elf, image_start, image_len)) != 0 )
@@ -273,10 +273,16 @@ static struct boot_info __initdata *boot_info;
static void __init multiboot_to_bootinfo(multiboot_info_t *mbi)
{
- static struct boot_info __initdata info;
+ static struct boot_info __initdata info;
+ static struct boot_module __initdata boot_mods[1];
+ static struct arch_bootmodule __initdata arch_boot_mods[1];
+
+ info.mods = boot_mods;
info.nr_mods = mbi->mods_count;
+ boot_mods[0].arch = &arch_boot_mods[0];
+
boot_info = &info;
}
@@ -961,7 +967,8 @@ static struct domain *__init create_dom0(const module_t *image,
write_cr4(read_cr4() & ~X86_CR4_SMAP);
}
- if ( construct_dom0(d, image, headroom, initrd, cmdline) != 0 )
+ if ( construct_dom0(d, image, boot_info->mods[0].arch->headroom, initrd,
+ cmdline) != 0 )
panic("Could not construct domain 0\n");
if ( cpu_has_smap )
@@ -985,7 +992,7 @@ void __init noreturn __start_xen(unsigned long mbi_p)
unsigned int initrdidx, num_parked = 0;
multiboot_info_t *mbi;
module_t *mod;
- unsigned long nr_pages, raw_max_page, modules_headroom, module_map[1];
+ unsigned long nr_pages, raw_max_page, module_map[1];
int i, j, e820_warn = 0, bytes = 0;
unsigned long eb_start, eb_end;
bool acpi_boot_table_init_done = false, relocated = false;
@@ -1353,7 +1360,8 @@ void __init noreturn __start_xen(unsigned long mbi_p)
mod[boot_info->nr_mods].mod_end = __2M_rwdata_end - _stext;
}
- modules_headroom = bzimage_headroom(bootstrap_map(mod), mod->mod_end);
+ boot_info->mods[0].arch->headroom = bzimage_headroom(bootstrap_map(mod),
+ mod->mod_end);
bootstrap_map(NULL);
#ifndef highmem_start
@@ -1433,7 +1441,8 @@ void __init noreturn __start_xen(unsigned long mbi_p)
/* Is the region suitable for relocating the multiboot modules? */
for ( j = boot_info->nr_mods - 1; j >= 0; j-- )
{
- unsigned long headroom = j ? 0 : modules_headroom;
+ struct boot_module *boot_mods = boot_info->mods;
+ unsigned long headroom = j ? 0 : boot_mods[0].arch->headroom;
unsigned long size = PAGE_ALIGN(headroom + mod[j].mod_end);
if ( mod[j].reserved )
@@ -1481,7 +1490,7 @@ void __init noreturn __start_xen(unsigned long mbi_p)
#endif
}
- if ( modules_headroom && !mod->reserved )
+ if ( boot_info->mods[0].arch->headroom && !mod->reserved )
panic("Not enough memory to relocate the dom0 kernel image\n");
for ( i = 0; i < boot_info->nr_mods; ++i )
{
@@ -2021,7 +2030,7 @@ void __init noreturn __start_xen(unsigned long mbi_p)
* We're going to setup domain0 using the module(s) that we stashed safely
* above our heap. The second module, if present, is an initrd ramdisk.
*/
- dom0 = create_dom0(mod, modules_headroom,
+ dom0 = create_dom0(mod, boot_info->mods[0].arch->headroom,
initrdidx < boot_info->nr_mods ? mod + initrdidx : NULL,
kextra, loader);
if ( !dom0 )
@@ -3,8 +3,19 @@
#include <xen/types.h>
+#ifdef CONFIG_X86
+#include <asm/bootinfo.h>
+#else
+ struct arch_bootmodule { };
+#endif
+
+struct boot_module {
+ struct arch_bootmodule *arch;
+};
+
struct boot_info {
unsigned int nr_mods;
+ struct boot_module *mods;
};
#endif