[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [PATCH v2 06/15] xen: Refactor kernel_info to have a header like boot_domain
Create a struct header with the contents common to kernel_info and boot_domain, and define that header in common code. This enables x86 to use that header as-is. Not a functional change. Signed-off-by: Alejandro Vallejo <agarciav@xxxxxxx> --- v2: * New patch --- xen/arch/arm/dom0less-build.c | 8 ++++---- xen/arch/arm/domain_build.c | 20 ++++++++++---------- xen/arch/arm/kernel.c | 8 ++++---- xen/common/device-tree/dom0less-build.c | 18 +++++++++--------- xen/common/device-tree/domain-build.c | 20 ++++++++++---------- xen/common/device-tree/kernel.c | 20 ++++++++++---------- xen/include/xen/bootfdt.h | 10 ++++++++++ xen/include/xen/fdt-kernel.h | 5 ++--- 8 files changed, 59 insertions(+), 50 deletions(-) diff --git a/xen/arch/arm/dom0less-build.c b/xen/arch/arm/dom0less-build.c index 20aabf6be5..a335551484 100644 --- a/xen/arch/arm/dom0less-build.c +++ b/xen/arch/arm/dom0less-build.c @@ -32,7 +32,7 @@ static int __init make_gicv2_domU_node(struct kernel_info *kinfo) int res = 0; __be32 reg[(GUEST_ROOT_ADDRESS_CELLS + GUEST_ROOT_SIZE_CELLS) * 2]; __be32 *cells; - const struct domain *d = kinfo->d; + const struct domain *d = kinfo->hdr.d; res = domain_fdt_begin_node(fdt, "interrupt-controller", vgic_dist_base(&d->arch.vgic)); @@ -85,7 +85,7 @@ static int __init make_gicv3_domU_node(struct kernel_info *kinfo) void *fdt = kinfo->fdt; int res = 0; __be32 *reg, *cells; - const struct domain *d = kinfo->d; + const struct domain *d = kinfo->hdr.d; unsigned int i, len = 0; res = domain_fdt_begin_node(fdt, "interrupt-controller", @@ -152,7 +152,7 @@ static int __init make_gicv3_domU_node(struct kernel_info *kinfo) int __init make_intc_domU_node(struct kernel_info *kinfo) { - switch ( kinfo->d->arch.vgic.version ) + switch ( kinfo->hdr.d->arch.vgic.version ) { #ifdef CONFIG_GICV3 case GIC_V3: @@ -175,7 +175,7 @@ static int __init make_vpl011_uart_node(struct kernel_info *kinfo) gic_interrupt_t intr; __be32 reg[GUEST_ROOT_ADDRESS_CELLS + GUEST_ROOT_SIZE_CELLS]; __be32 *cells; - struct domain *d = kinfo->d; + struct domain *d = kinfo->hdr.d; res = domain_fdt_begin_node(fdt, "sbsa-uart", d->arch.vpl011.base_addr); if ( res ) diff --git a/xen/arch/arm/domain_build.c b/xen/arch/arm/domain_build.c index 590f38e520..5317665555 100644 --- a/xen/arch/arm/domain_build.c +++ b/xen/arch/arm/domain_build.c @@ -464,8 +464,8 @@ static int __init write_properties(struct domain *d, struct kernel_info *kinfo, int had_dom0_bootargs = 0; struct dt_device_node *iommu_node; - if ( kinfo->cmdline && kinfo->cmdline[0] ) - bootargs = &kinfo->cmdline[0]; + if ( kinfo->hdr.cmdline && kinfo->hdr.cmdline[0] ) + bootargs = &kinfo->hdr.cmdline[0]; /* * We always skip the IOMMU device when creating DT for hwdom if there is @@ -579,7 +579,7 @@ static int __init write_properties(struct domain *d, struct kernel_info *kinfo, if ( dt_node_path_is_equal(node, "/chosen") ) { - const struct bootmodule *initrd = kinfo->initrd_bootmodule; + const struct bootmodule *initrd = kinfo->hdr.initrd; if ( bootargs ) { @@ -1386,7 +1386,7 @@ int __init make_timer_node(const struct kernel_info *kinfo) if ( res ) return res; - if ( !is_64bit_domain(kinfo->d) ) + if ( !is_64bit_domain(kinfo->hdr.d) ) res = fdt_property_string(fdt, "compatible", "arm,armv7-timer"); else res = fdt_property_string(fdt, "compatible", "arm,armv8-timer"); @@ -1398,7 +1398,7 @@ int __init make_timer_node(const struct kernel_info *kinfo) * It always exposes an active-low level-sensitive interrupt. */ - if ( is_hardware_domain(kinfo->d) ) + if ( is_hardware_domain(kinfo->hdr.d) ) { irq[TIMER_PHYS_SECURE_PPI] = timer_get_irq(TIMER_PHYS_SECURE_PPI); irq[TIMER_PHYS_NONSECURE_PPI] = @@ -1447,7 +1447,7 @@ int __init make_chosen_node(const struct kernel_info *kinfo) { int res; const char *bootargs = NULL; - const struct bootmodule *initrd = kinfo->initrd_bootmodule; + const struct bootmodule *initrd = kinfo->hdr.initrd; void *fdt = kinfo->fdt; dt_dprintk("Create chosen node\n"); @@ -1455,9 +1455,9 @@ int __init make_chosen_node(const struct kernel_info *kinfo) if ( res ) return res; - if ( kinfo->cmdline && kinfo->cmdline[0] ) + if ( kinfo->hdr.cmdline && kinfo->hdr.cmdline[0] ) { - bootargs = &kinfo->cmdline[0]; + bootargs = &kinfo->hdr.cmdline[0]; res = fdt_property(fdt, "bootargs", bootargs, strlen(bootargs) + 1); if ( res ) return res; @@ -1906,7 +1906,7 @@ static int __init construct_dom0(struct domain *d) d->max_pages = dom0_mem >> PAGE_SHIFT; kinfo.unassigned_mem = dom0_mem; - kinfo.d = d; + kinfo.hdr.d = d; rc = kernel_probe(&kinfo, NULL); if ( rc < 0 ) @@ -1918,7 +1918,7 @@ static int __init construct_dom0(struct domain *d) int __init construct_hwdom(struct kernel_info *kinfo, const struct dt_device_node *node) { - struct domain *d = kinfo->d; + struct domain *d = kinfo->hdr.d; int rc; iommu_hwdom_init(d); diff --git a/xen/arch/arm/kernel.c b/xen/arch/arm/kernel.c index cb1efb19e7..0561d60d5a 100644 --- a/xen/arch/arm/kernel.c +++ b/xen/arch/arm/kernel.c @@ -46,7 +46,7 @@ static void __init place_modules(struct kernel_info *info, paddr_t kernbase, paddr_t kernend) { /* Align DTB and initrd size to 2Mb. Linux only requires 4 byte alignment */ - const struct bootmodule *mod = info->initrd_bootmodule; + const struct bootmodule *mod = info->hdr.initrd; const struct membanks *mem = kernel_info_get_mem(info); const paddr_t initrd_len = ROUNDUP(mod ? mod->size : 0, MB(2)); const paddr_t dtb_len = ROUNDUP(fdt_totalsize(info->fdt), MB(2)); @@ -152,12 +152,12 @@ static void __init kernel_zimage_load(struct kernel_info *info) kernel = ioremap_wc(paddr, len); if ( !kernel ) - panic("Unable to map the %pd kernel\n", info->d); + panic("Unable to map the %pd kernel\n", info->hdr.d); - rc = copy_to_guest_phys_flush_dcache(info->d, load_addr, + rc = copy_to_guest_phys_flush_dcache(info->hdr.d, load_addr, kernel, len); if ( rc != 0 ) - panic("Unable to copy the kernel in the %pd memory\n", info->d); + panic("Unable to copy the kernel in the %pd memory\n", info->hdr.d); iounmap(kernel); } diff --git a/xen/common/device-tree/dom0less-build.c b/xen/common/device-tree/dom0less-build.c index d5bb1d5d35..809cb3c232 100644 --- a/xen/common/device-tree/dom0less-build.c +++ b/xen/common/device-tree/dom0less-build.c @@ -168,18 +168,18 @@ static int __init handle_passthrough_prop(struct kernel_info *kinfo, return -EINVAL; } - res = iomem_permit_access(kinfo->d, paddr_to_pfn(mstart), + res = iomem_permit_access(kinfo->hdr.d, paddr_to_pfn(mstart), paddr_to_pfn(PAGE_ALIGN(mstart + size - 1))); if ( res ) { printk(XENLOG_ERR "Unable to permit to dom%d access to" " 0x%"PRIpaddr" - 0x%"PRIpaddr"\n", - kinfo->d->domain_id, + kinfo->hdr.d->domain_id, mstart & PAGE_MASK, PAGE_ALIGN(mstart + size) - 1); return res; } - res = map_regions_p2mt(kinfo->d, + res = map_regions_p2mt(kinfo->hdr.d, gaddr_to_gfn(gstart), PFN_DOWN(size), maddr_to_mfn(mstart), @@ -218,7 +218,7 @@ static int __init handle_passthrough_prop(struct kernel_info *kinfo, return -EINVAL; } - res = map_device_irqs_to_domain(kinfo->d, node, true, NULL); + res = map_device_irqs_to_domain(kinfo->hdr.d, node, true, NULL); if ( res < 0 ) return res; @@ -230,7 +230,7 @@ static int __init handle_passthrough_prop(struct kernel_info *kinfo, if ( xen_force && !dt_device_is_protected(node) ) return 0; - return iommu_assign_dt_device(kinfo->d, node); + return iommu_assign_dt_device(kinfo->hdr.d, node); } static int __init handle_prop_pfdt(struct kernel_info *kinfo, @@ -297,14 +297,14 @@ static int __init handle_prop_pfdt(struct kernel_info *kinfo, address_cells, size_cells); if ( res < 0 ) { - printk(XENLOG_ERR "Failed to assign device to %pd\n", kinfo->d); + printk(XENLOG_ERR "Failed to assign device to %pd\n", kinfo->hdr.d); return res; } } else if ( (xen_path && !xen_reg) || (xen_reg && !xen_path && !xen_force) ) { printk(XENLOG_ERR "xen,reg or xen,path missing for %pd\n", - kinfo->d); + kinfo->hdr.d); return -EINVAL; } @@ -607,7 +607,7 @@ static int __init alloc_xenstore_page(struct domain *d) static int __init alloc_xenstore_params(struct kernel_info *kinfo) { - struct domain *d = kinfo->d; + struct domain *d = kinfo->hdr.d; int rc = 0; #ifdef CONFIG_HVM @@ -775,7 +775,7 @@ static int __init construct_domU(struct domain *d, d->max_pages = ((paddr_t)mem * SZ_1K) >> PAGE_SHIFT; - kinfo.d = d; + kinfo.hdr.d = d; rc = kernel_probe(&kinfo, node); if ( rc < 0 ) diff --git a/xen/common/device-tree/domain-build.c b/xen/common/device-tree/domain-build.c index 6b8b8d7cac..e602cb91c9 100644 --- a/xen/common/device-tree/domain-build.c +++ b/xen/common/device-tree/domain-build.c @@ -76,7 +76,7 @@ bool __init allocate_bank_memory(struct kernel_info *kinfo, gfn_t sgfn, paddr_t tot_size) { struct membanks *mem = kernel_info_get_mem(kinfo); - struct domain *d = kinfo->d; + struct domain *d = kinfo->hdr.d; struct membank *bank; /* @@ -170,7 +170,7 @@ int __init find_unallocated_memory(const struct kernel_info *kinfo, unsigned int i, j; int res; - ASSERT(domain_use_host_layout(kinfo->d)); + ASSERT(domain_use_host_layout(kinfo->hdr.d)); unalloc_mem = rangeset_new(NULL, NULL, 0); if ( !unalloc_mem ) @@ -331,23 +331,23 @@ void __init dtb_load(struct kernel_info *kinfo, unsigned long left; printk("Loading %pd DTB to 0x%"PRIpaddr"-0x%"PRIpaddr"\n", - kinfo->d, kinfo->dtb_paddr, + kinfo->hdr.d, kinfo->dtb_paddr, kinfo->dtb_paddr + fdt_totalsize(kinfo->fdt)); - left = copy_to_guest(kinfo->d, kinfo->dtb_paddr, + left = copy_to_guest(kinfo->hdr.d, kinfo->dtb_paddr, kinfo->fdt, fdt_totalsize(kinfo->fdt)); if ( left != 0 ) panic("Unable to copy the DTB to %pd memory (left = %lu bytes)\n", - kinfo->d, left); + kinfo->hdr.d, left); xfree(kinfo->fdt); } void __init initrd_load(struct kernel_info *kinfo, copy_to_guest_phys_cb copy_to_guest) { - const struct bootmodule *mod = kinfo->initrd_bootmodule; + const struct bootmodule *mod = kinfo->hdr.initrd; paddr_t load_addr = kinfo->initrd_paddr; paddr_t paddr, len; int node; @@ -363,7 +363,7 @@ void __init initrd_load(struct kernel_info *kinfo, len = mod->size; printk("Loading %pd initrd from %"PRIpaddr" to 0x%"PRIpaddr"-0x%"PRIpaddr"\n", - kinfo->d, paddr, load_addr, load_addr + len); + kinfo->hdr.d, paddr, load_addr, load_addr + len); /* Fix up linux,initrd-start and linux,initrd-end in /chosen */ node = fdt_path_offset(kinfo->fdt, "/chosen"); @@ -386,12 +386,12 @@ void __init initrd_load(struct kernel_info *kinfo, initrd = ioremap_wc(paddr, len); if ( !initrd ) - panic("Unable to map the %pd initrd\n", kinfo->d); + panic("Unable to map the %pd initrd\n", kinfo->hdr.d); - res = copy_to_guest(kinfo->d, load_addr, + res = copy_to_guest(kinfo->hdr.d, load_addr, initrd, len); if ( res != 0 ) - panic("Unable to copy the initrd in the %pd memory\n", kinfo->d); + panic("Unable to copy the initrd in the %pd memory\n", kinfo->hdr.d); iounmap(initrd); } diff --git a/xen/common/device-tree/kernel.c b/xen/common/device-tree/kernel.c index cb04cd9d50..3960f951f7 100644 --- a/xen/common/device-tree/kernel.c +++ b/xen/common/device-tree/kernel.c @@ -136,16 +136,16 @@ int __init kernel_probe(struct kernel_info *info, /* domain is NULL only for the hardware domain */ if ( domain == NULL ) { - ASSERT(is_hardware_domain(info->d)); + ASSERT(is_hardware_domain(info->hdr.d)); mod = boot_module_find_by_kind(BOOTMOD_KERNEL); - info->kernel_bootmodule = mod; - info->initrd_bootmodule = boot_module_find_by_kind(BOOTMOD_RAMDISK); + info->hdr.kernel = mod; + info->hdr.initrd = boot_module_find_by_kind(BOOTMOD_RAMDISK); cmd = boot_cmdline_find_by_kind(BOOTMOD_KERNEL); if ( cmd ) - info->cmdline = &cmd->cmdline[0]; + info->hdr.cmdline = &cmd->cmdline[0]; } else { @@ -162,7 +162,7 @@ int __init kernel_probe(struct kernel_info *info, dt_get_range(&val, node, &kernel_addr, &size); mod = boot_module_find_by_addr_and_kind( BOOTMOD_KERNEL, kernel_addr); - info->kernel_bootmodule = mod; + info->hdr.kernel = mod; } else if ( dt_device_is_compatible(node, "multiboot,ramdisk") ) { @@ -171,7 +171,7 @@ int __init kernel_probe(struct kernel_info *info, val = dt_get_property(node, "reg", &len); dt_get_range(&val, node, &initrd_addr, &size); - info->initrd_bootmodule = boot_module_find_by_addr_and_kind( + info->hdr.initrd = boot_module_find_by_addr_and_kind( BOOTMOD_RAMDISK, initrd_addr); } else if ( dt_device_is_compatible(node, "multiboot,device-tree") ) @@ -192,7 +192,7 @@ int __init kernel_probe(struct kernel_info *info, name = dt_node_name(domain); cmd = boot_cmdline_find_by_name(name); if ( cmd ) - info->cmdline = &cmd->cmdline[0]; + info->hdr.cmdline = &cmd->cmdline[0]; } if ( !mod || !mod->size ) { @@ -201,10 +201,10 @@ int __init kernel_probe(struct kernel_info *info, } printk("Loading %pd kernel from boot module @ %"PRIpaddr"\n", - info->d, info->kernel_bootmodule->start); - if ( info->initrd_bootmodule ) + info->hdr.d, info->hdr.kernel->start); + if ( info->hdr.initrd ) printk("Loading ramdisk from boot module @ %"PRIpaddr"\n", - info->initrd_bootmodule->start); + info->hdr.initrd->start); /* * uImage isn't really used nowadays thereby leave kernel_uimage_probe() diff --git a/xen/include/xen/bootfdt.h b/xen/include/xen/bootfdt.h index 4cab5d5202..e6d52a599f 100644 --- a/xen/include/xen/bootfdt.h +++ b/xen/include/xen/bootfdt.h @@ -100,6 +100,16 @@ struct shared_meminfo { struct shmem_membank_extra extra[NR_SHMEM_BANKS]; }; + +struct bootdomain { + struct domain *d; + + struct bootmodule *kernel; + struct bootmodule *initrd; + + const char* cmdline; +}; + /* * The domU flag is set for kernels and ramdisks of "xen,domain" nodes. * The purpose of the domU flag is to avoid getting confused in diff --git a/xen/include/xen/fdt-kernel.h b/xen/include/xen/fdt-kernel.h index 1939c3ebf7..dd009f01d0 100644 --- a/xen/include/xen/fdt-kernel.h +++ b/xen/include/xen/fdt-kernel.h @@ -16,7 +16,7 @@ #endif struct kernel_info { - struct domain *d; + struct bootdomain hdr; void *fdt; /* flat device tree */ paddr_t unassigned_mem; /* RAM not (yet) assigned to a bank */ @@ -34,8 +34,7 @@ struct kernel_info { paddr_t gnttab_size; /* boot blob load addresses */ - const struct bootmodule *kernel_bootmodule, *initrd_bootmodule, *dtb_bootmodule; - const char* cmdline; + const struct bootmodule *dtb_bootmodule; paddr_t dtb_paddr; paddr_t initrd_paddr; -- 2.43.0
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |