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

Re: [XEN v3 1/3] xen/arm: Use the correct format specifier



On Mon, 23 Jan 2023, Julien Grall wrote:
> Hi Stefano,
> 
> On 23/01/2023 21:19, Stefano Stabellini wrote:
> > On Mon, 23 Jan 2023, Ayan Kumar Halder wrote:
> > > 1. One should use 'PRIpaddr' to display 'paddr_t' variables. However,
> > > while creating nodes in fdt, the address (if present in the node name)
> > > should be represented using 'PRIx64'. This is to be in conformance
> > > with the following rule present in https://elinux.org/Device_Tree_Linux
> > > 
> > > . node names
> > > "unit-address does not have leading zeros"
> > > 
> > > As 'PRIpaddr' introduces leading zeros, we cannot use it.
> > > 
> > > So, we have introduced a wrapper ie domain_fdt_begin_node() which will
> > > represent physical address using 'PRIx64'.
> > > 
> > > 2. One should use 'PRIx64' to display 'u64' in hex format. The current
> > > use of 'PRIpaddr' for printing PTE is buggy as this is not a physical
> > > address.
> > > 
> > > Signed-off-by: Ayan Kumar Halder <ayan.kumar.halder@xxxxxxx>
> > > ---
> > > 
> > > Changes from -
> > > 
> > > v1 - 1. Moved the patch earlier.
> > > 2. Moved a part of change from "[XEN v1 8/9] xen/arm: Other adaptations
> > > required to support 32bit paddr"
> > > into this patch.
> > > 
> > > v2 - 1. Use PRIx64 for appending addresses to fdt node names. This fixes
> > > the CI failure.
> > > 
> > >   xen/arch/arm/domain_build.c | 45 +++++++++++++++++--------------------
> > >   xen/arch/arm/gic-v2.c       |  6 ++---
> > >   xen/arch/arm/mm.c           |  2 +-
> > 
> > The changes to mm.c and gic-v2.c look OK and I'd ack them already. One
> > question on the changes to domain_build.c below.
> > 
> > 
> > >   3 files changed, 25 insertions(+), 28 deletions(-)
> > > 
> > > diff --git a/xen/arch/arm/domain_build.c b/xen/arch/arm/domain_build.c
> > > index f35f4d2456..97c2395f9a 100644
> > > --- a/xen/arch/arm/domain_build.c
> > > +++ b/xen/arch/arm/domain_build.c
> > > @@ -1288,6 +1288,20 @@ static int __init fdt_property_interrupts(const
> > > struct kernel_info *kinfo,
> > >       return res;
> > >   }
> > >   +static int __init domain_fdt_begin_node(void *fdt, const char *name,
> > > +                                        uint64_t unit)
> > > +{
> > > +    /*
> > > +     * The size of the buffer to hold the longest possible string ie
> > > +     * interrupt-controller@ + a 64-bit number + \0
> > > +     */
> > > +    char buf[38];
> > > +
> > > +    /* ePAPR 3.4 */
> > > +    snprintf(buf, sizeof(buf), "%s@%"PRIx64, name, unit);
> 
> The return wants to be checked.
> 
> > > +    return fdt_begin_node(fdt, buf);
> > > +}
> > > +
> > >   static int __init make_memory_node(const struct domain *d,
> > >                                      void *fdt,
> > >                                      int addrcells, int sizecells,
> > > @@ -1296,8 +1310,6 @@ static int __init make_memory_node(const struct
> > > domain *d,
> > >       unsigned int i;
> > >       int res, reg_size = addrcells + sizecells;
> > >       int nr_cells = 0;
> > > -    /* Placeholder for memory@ + a 64-bit number + \0 */
> > > -    char buf[24];
> > >       __be32 reg[NR_MEM_BANKS * 4 /* Worst case addrcells + sizecells */];
> > >       __be32 *cells;
> > >   @@ -1314,9 +1326,7 @@ static int __init make_memory_node(const struct
> > > domain *d,
> > >         dt_dprintk("Create memory node\n");
> > >   -    /* ePAPR 3.4 */
> > > -    snprintf(buf, sizeof(buf), "memory@%"PRIx64, mem->bank[i].start);
> > > -    res = fdt_begin_node(fdt, buf);
> > > +    res = domain_fdt_begin_node(fdt, "memory", mem->bank[i].start);
> > 
> > Basically this "hides" the paddr_t->uint64_t cast because it happens
> > implicitly when passing mem->bank[i].start as an argument to
> > domain_fdt_begin_node.
> > 
> > To be honest, I don't know if it is necessary. Also a normal cast would
> > be fine:
> > 
> >      snprintf(buf, sizeof(buf), "memory@%"PRIx64,
> > (uint64_t)mem->bank[i].start);
> >      res = fdt_begin_node(fdt, buf);
> The problem with the open-coding version is you would need to explain the cast
> everywhere (I disliked unexplained one).
> 
> I don't particular mind 'hidden cast' but I think we need to explain on top of
> domain_fdt_begin_node() why it is necessary.
> 
> > 
> > Julien, what do you prefer?
> 
> Definitely the function because that's what I suggested (see the rationale
> above).

OK, no worries



 


Rackspace

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