|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH v4 3/8] xen/arm: introduce kinfo->guest_phandle_gic
Instead of always hard-coding the GIC phandle (GUEST_PHANDLE_GIC), store
it in a variable under kinfo. This way it can be dynamically chosen per
domain.
Initialize guest_phandle_gic to GUEST_PHANDLE_GIC at the beginning of
prepare_dtb_domU. Later patches will change the value of
guest_phandle_gic depending on user provided information.
Signed-off-by: Stefano Stabellini <stefanos@xxxxxxxxxx>
---
Changes in v4:
- new patch
---
xen/arch/arm/domain_build.c | 42 ++++++++++++++++++++----------------
xen/include/asm-arm/kernel.h | 3 +++
2 files changed, 27 insertions(+), 18 deletions(-)
diff --git a/xen/arch/arm/domain_build.c b/xen/arch/arm/domain_build.c
index f92069c85f..cd585f05ca 100644
--- a/xen/arch/arm/domain_build.c
+++ b/xen/arch/arm/domain_build.c
@@ -1510,8 +1510,9 @@ static int __init handle_node(struct domain *d, struct
kernel_info *kinfo,
return res;
}
-static int __init make_gicv2_domU_node(const struct domain *d, void *fdt)
+static int __init make_gicv2_domU_node(struct kernel_info *kinfo)
{
+ void *fdt = kinfo->fdt;
int res = 0;
__be32 reg[(GUEST_ROOT_ADDRESS_CELLS + GUEST_ROOT_SIZE_CELLS) * 2];
__be32 *cells;
@@ -1546,11 +1547,11 @@ static int __init make_gicv2_domU_node(const struct
domain *d, void *fdt)
if (res)
return res;
- res = fdt_property_cell(fdt, "linux,phandle", GUEST_PHANDLE_GIC);
+ res = fdt_property_cell(fdt, "linux,phandle", kinfo->guest_phandle_gic);
if (res)
return res;
- res = fdt_property_cell(fdt, "phandle", GUEST_PHANDLE_GIC);
+ res = fdt_property_cell(fdt, "phandle", kinfo->guest_phandle_gic);
if (res)
return res;
@@ -1559,8 +1560,9 @@ static int __init make_gicv2_domU_node(const struct
domain *d, void *fdt)
return res;
}
-static int __init make_gicv3_domU_node(const struct domain *d, void *fdt)
+static int __init make_gicv3_domU_node(struct kernel_info *kinfo)
{
+ void *fdt = kinfo->fdt;
int res = 0;
__be32 reg[(GUEST_ROOT_ADDRESS_CELLS + GUEST_ROOT_SIZE_CELLS) * 2];
__be32 *cells;
@@ -1595,11 +1597,11 @@ static int __init make_gicv3_domU_node(const struct
domain *d, void *fdt)
if (res)
return res;
- res = fdt_property_cell(fdt, "linux,phandle", GUEST_PHANDLE_GIC);
+ res = fdt_property_cell(fdt, "linux,phandle", kinfo->guest_phandle_gic);
if (res)
return res;
- res = fdt_property_cell(fdt, "phandle", GUEST_PHANDLE_GIC);
+ res = fdt_property_cell(fdt, "phandle", kinfo->guest_phandle_gic);
if (res)
return res;
@@ -1608,21 +1610,22 @@ static int __init make_gicv3_domU_node(const struct
domain *d, void *fdt)
return res;
}
-static int __init make_gic_domU_node(const struct domain *d, void *fdt)
+static int __init make_gic_domU_node(struct kernel_info *kinfo)
{
- switch ( d->arch.vgic.version )
+ switch ( kinfo->d->arch.vgic.version )
{
case GIC_V3:
- return make_gicv3_domU_node(d, fdt);
+ return make_gicv3_domU_node(kinfo);
case GIC_V2:
- return make_gicv2_domU_node(d, fdt);
+ return make_gicv2_domU_node(kinfo);
default:
panic("Unsupported GIC version\n");
}
}
-static int __init make_timer_domU_node(const struct domain *d, void *fdt)
+static int __init make_timer_domU_node(struct kernel_info *kinfo)
{
+ void *fdt = kinfo->fdt;
int res;
gic_interrupt_t intrs[3];
@@ -1630,7 +1633,7 @@ static int __init make_timer_domU_node(const struct
domain *d, void *fdt)
if ( res )
return res;
- if ( !is_64bit_domain(d) )
+ if ( !is_64bit_domain(kinfo->d) )
{
res = fdt_property_string(fdt, "compatible", "arm,armv7-timer");
if ( res )
@@ -1652,7 +1655,7 @@ static int __init make_timer_domU_node(const struct
domain *d, void *fdt)
return res;
res = fdt_property_cell(fdt, "interrupt-parent",
- GUEST_PHANDLE_GIC);
+ kinfo->guest_phandle_gic);
if (res)
return res;
@@ -1662,8 +1665,9 @@ static int __init make_timer_domU_node(const struct
domain *d, void *fdt)
}
#ifdef CONFIG_SBSA_VUART_CONSOLE
-static int __init make_vpl011_uart_node(const struct domain *d, void *fdt)
+static int __init make_vpl011_uart_node(struct kernel_info *kinfo)
{
+ void *fdt = kinfo->fdt;
int res;
gic_interrupt_t intr;
__be32 reg[GUEST_ROOT_ADDRESS_CELLS + GUEST_ROOT_SIZE_CELLS];
@@ -1694,7 +1698,7 @@ static int __init make_vpl011_uart_node(const struct
domain *d, void *fdt)
return res;
res = fdt_property_cell(fdt, "interrupt-parent",
- GUEST_PHANDLE_GIC);
+ kinfo->guest_phandle_gic);
if ( res )
return res;
@@ -1719,6 +1723,8 @@ static int __init prepare_dtb_domU(struct domain *d,
struct kernel_info *kinfo)
int addrcells, sizecells;
int ret;
+ kinfo->guest_phandle_gic = GUEST_PHANDLE_GIC;
+
addrcells = GUEST_ROOT_ADDRESS_CELLS;
sizecells = GUEST_ROOT_SIZE_CELLS;
@@ -1762,11 +1768,11 @@ static int __init prepare_dtb_domU(struct domain *d,
struct kernel_info *kinfo)
if ( ret )
goto err;
- ret = make_gic_domU_node(d, kinfo->fdt);
+ ret = make_gic_domU_node(kinfo);
if ( ret )
goto err;
- ret = make_timer_domU_node(d, kinfo->fdt);
+ ret = make_timer_domU_node(kinfo);
if ( ret )
goto err;
@@ -1774,7 +1780,7 @@ static int __init prepare_dtb_domU(struct domain *d,
struct kernel_info *kinfo)
{
ret = -EINVAL;
#ifdef CONFIG_SBSA_VUART_CONSOLE
- ret = make_vpl011_uart_node(d, kinfo->fdt);
+ ret = make_vpl011_uart_node(kinfo);
#endif
if ( ret )
goto err;
diff --git a/xen/include/asm-arm/kernel.h b/xen/include/asm-arm/kernel.h
index 33f3e72b11..760434369b 100644
--- a/xen/include/asm-arm/kernel.h
+++ b/xen/include/asm-arm/kernel.h
@@ -36,6 +36,9 @@ struct kernel_info {
/* Enable pl011 emulation */
bool vpl011;
+ /* GIC phandle */
+ uint32_t guest_phandle_gic;
+
/* loader to use for this kernel */
void (*load)(struct kernel_info *info);
/* loader specific state */
--
2.17.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 |