[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [PATCH v4 3/8] xen/arm: introduce kinfo->guest_phandle_gic



Hi Stefano,

On 8/21/19 4:53 AM, Stefano Stabellini wrote:
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)

It is a bit unclear why the first argument is dropped but not replace by the declaration of a variable. If it was never used before, then please mention it in the commit message.

Similarly, please mention why the prototype has been changed.

  {
+    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)

Ditto.

  {
+    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_timer_domU_node(const struct domain *d, void *fdt)
+static int __init make_timer_domU_node(struct kernel_info *kinfo)

This definitely needs some rebase on the latest staging to pick up the new prototype. Actually, the prototype was modified beginning of August but this was sent end of August... Please make sure you are using the latest staging at the time when sending a series.

  {
+    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;

Looking at the usage, I think this should be fdt32_t because you are directly passing the value to the FDT calls.

This makes me realize that we consistently use wrongly GUEST_PHANDLE_GIC in both Xen and libxl. Indeed, as we pass the value directly the guest will not see 65000 but 3908894720 as it will do the conversion from big-endian to little-endian.

I can see two solution to fix this:
   1) define GUEST_PHANDLE_GIC as cpu_to_be32(65000)
   2) Use cpu_to_be32(GUEST_PHANDLE_GIC)

It would be good to agree how GUEST_PHANDLE_GIC is used so we have the same behavior when the DT is created by Xen and libxl.

Cheers,

--
Julien Grall

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/xen-devel

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.