|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH RFC 08/15] xen/arm: probe domU kernels and initrds
Find addresses and sizes on device tree.
Introduce a new boot_module_find_by_addr_and_kind function to match not
just on boot module kind, but also by address so that we can support
multiple domUs.
Signed-off-by: Stefano Stabellini <stefanos@xxxxxxxxxx>
---
xen/arch/arm/kernel.c | 54 +++++++++++++++++++++++++++++++++++++++++++++
xen/arch/arm/kernel.h | 2 ++
xen/arch/arm/setup.c | 15 +++++++++++++
xen/include/asm-arm/setup.h | 2 ++
4 files changed, 73 insertions(+)
diff --git a/xen/arch/arm/kernel.c b/xen/arch/arm/kernel.c
index 8fdfd91..c41092e 100644
--- a/xen/arch/arm/kernel.c
+++ b/xen/arch/arm/kernel.c
@@ -496,6 +496,60 @@ err:
return rc;
}
+int kernel_probe_domU(struct kernel_info *info, struct dt_device_node *domU)
+{
+ struct bootmodule *mod;
+ struct dt_device_node *node;
+ u64 kernel_addr, initrd_addr, size;
+ int rc;
+
+ dt_for_each_child_node(domU, node)
+ {
+ if ( dt_device_is_compatible(node, "multiboot,domU-kernel") )
+ {
+ u32 len;
+ const __be32 *val;
+ val = dt_get_property(node, "reg", &len);
+ dt_get_range(&val, node, &kernel_addr, &size);
+ }
+ else if ( dt_device_is_compatible(node, "multiboot,domU-ramdisk") )
+ {
+ u32 len;
+ const __be32 *val;
+ val = dt_get_property(node, "reg", &len);
+ dt_get_range(&val, node, &initrd_addr, &size);
+ }
+ else
+ continue;
+ }
+ info->kernel_bootmodule = mod = boot_module_find_by_addr_and_kind(
+
BOOTMOD_DOMU_KERNEL, kernel_addr);
+ info->initrd_bootmodule = boot_module_find_by_addr_and_kind(
+
BOOTMOD_DOMU_RAMDISK, initrd_addr);
+ printk("Loading DomU kernel from boot module @ %"PRIpaddr"\n",
+ info->kernel_bootmodule->start);
+ if ( info->initrd_bootmodule )
+ printk("Loading ramdisk from boot module @ %"PRIpaddr"\n",
+ info->initrd_bootmodule->start);
+
+ /* if it is a gzip'ed image, 32bit or 64bit, uncompress it */
+ rc = kernel_decompress(mod);
+ if (rc < 0 && rc != -EINVAL)
+ return rc;
+
+#ifdef CONFIG_ARM_64
+ rc = kernel_zimage64_probe(info, mod->start, mod->size);
+ if (rc < 0)
+#endif
+ rc = kernel_uimage_probe(info, mod->start, mod->size);
+ if (rc < 0)
+ rc = kernel_zimage32_probe(info, mod->start, mod->size);
+ if (rc < 0)
+ rc = kernel_elf_probe(info, mod->start, mod->size);
+
+ return rc;
+}
+
int kernel_probe(struct kernel_info *info)
{
struct bootmodule *mod = boot_module_find_by_kind(BOOTMOD_KERNEL);
diff --git a/xen/arch/arm/kernel.h b/xen/arch/arm/kernel.h
index 6d69509..8e1614b 100644
--- a/xen/arch/arm/kernel.h
+++ b/xen/arch/arm/kernel.h
@@ -64,6 +64,8 @@ struct kernel_info {
*/
int kernel_probe(struct kernel_info *info);
+int kernel_probe_domU(struct kernel_info *info, struct dt_device_node *node);
+
/*
* Loads the kernel into guest RAM.
*
diff --git a/xen/arch/arm/setup.c b/xen/arch/arm/setup.c
index 82593c8..98bdb24 100644
--- a/xen/arch/arm/setup.c
+++ b/xen/arch/arm/setup.c
@@ -241,6 +241,21 @@ struct bootmodule * __init
boot_module_find_by_kind(bootmodule_kind kind)
return NULL;
}
+struct bootmodule * __init boot_module_find_by_addr_and_kind(bootmodule_kind
kind,
+ paddr_t start)
+{
+ struct bootmodules *mods = &bootinfo.modules;
+ struct bootmodule *mod;
+ int i;
+ for (i = 0 ; i < mods->nr_mods ; i++ )
+ {
+ mod = &mods->module[i];
+ if ( mod->kind == kind && mod->start == start )
+ return mod;
+ }
+ return NULL;
+}
+
const char * __init boot_module_kind_as_string(bootmodule_kind kind)
{
switch ( kind )
diff --git a/xen/include/asm-arm/setup.h b/xen/include/asm-arm/setup.h
index 86aac0e..903782f 100644
--- a/xen/include/asm-arm/setup.h
+++ b/xen/include/asm-arm/setup.h
@@ -83,6 +83,8 @@ struct bootmodule *add_boot_module(bootmodule_kind kind,
paddr_t start, paddr_t size,
const char *cmdline);
struct bootmodule *boot_module_find_by_kind(bootmodule_kind kind);
+struct bootmodule * __init boot_module_find_by_addr_and_kind(bootmodule_kind
kind,
+ paddr_t start);
const char * __init boot_module_kind_as_string(bootmodule_kind kind);
#endif
--
1.9.1
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |