On Wed, 30 Apr 2025, at 21:21, BALATON Zoltan wrote:
> On Wed, 23 Apr 2025, BALATON Zoltan wrote:
> > The FDT does not normally store name properties but reconstructs it
> > from path but Open Firmware specification says each node should at
> > least have this property. This is correctly handled in getprop but
> > nextprop should also return it even if not present as a property.
> >
> > Explicit name properties are still allowed because they are needed
> > e.g. on the root node that guests expect to have specific names as
> > seen on real machines instead of being empty so sometimes the node
> > name may need to be overriden. For example on pegasos MorphOS checks
> > the name of "/" and expects to find bplan,Pegasos2 which is how it
> > identifies the machine.
> >
> > Signed-off-by: BALATON Zoltan <bala...@eik.bme.hu>
> > ---
> > v3:
> > Keep phandle properties
> > Changed commit message
> 
> Ping?
>

sorry for the delay, looks okay to me but (probably was answered but I forgot 
because I am slow) I still do not understand what is adding the explicit 
property called "name" so vof_nextprop() needs to check if it is the actual 
property. Thanks,


> Regards,
> BALATON Zoltan
> 
> > v2:
> > Fixed a typo in commit message
> > Simplified loop to get next property name
> >
> > hw/ppc/vof.c | 50 +++++++++++++++++++++++++++++++++-----------------
> > 1 file changed, 33 insertions(+), 17 deletions(-)
> >
> > diff --git a/hw/ppc/vof.c b/hw/ppc/vof.c
> > index 09cb77de93..10bafd011e 100644
> > --- a/hw/ppc/vof.c
> > +++ b/hw/ppc/vof.c
> > @@ -353,34 +353,50 @@ static uint32_t vof_nextprop(const void *fdt, 
> > uint32_t phandle,
> > {
> >     int offset, nodeoff = fdt_node_offset_by_phandle(fdt, phandle);
> >     char prev[OF_PROPNAME_LEN_MAX + 1];
> > -    const char *tmp;
> > +    const char *tmp = NULL;
> > +    bool match = false;
> >
> >     if (readstr(prevaddr, prev, sizeof(prev))) {
> >         return PROM_ERROR;
> >     }
> > -
> > -    fdt_for_each_property_offset(offset, fdt, nodeoff) {
> > -        if (!fdt_getprop_by_offset(fdt, offset, &tmp, NULL)) {
> > -            return 0;
> > +    /*
> > +     * "name" may or may not be present in fdt but we should still return 
> > it.
> > +     * Do that first and then skip it if seen later.
> > +     */
> > +    if (prev[0] == '\0') {
> > +        tmp = "name";
> > +    } else {
> > +        if (strcmp(prev, "name") == 0) {
> > +            prev[0] = '\0';
> >         }
> > -        if (prev[0] == '\0' || strcmp(prev, tmp) == 0) {
> > -            if (prev[0] != '\0') {
> > -                offset = fdt_next_property_offset(fdt, offset);
> > -                if (offset < 0) {
> > -                    return 0;
> > -                }
> > -            }
> > +        fdt_for_each_property_offset(offset, fdt, nodeoff) {
> >             if (!fdt_getprop_by_offset(fdt, offset, &tmp, NULL)) {
> >                 return 0;
> >             }
> > -
> > -            if (VOF_MEM_WRITE(nameaddr, tmp, strlen(tmp) + 1) != MEMTX_OK) 
> > {
> > -                return PROM_ERROR;
> > +            if (strcmp(tmp, "name") == 0) {
> > +                continue;
> > +            }
> > +            if (match) {
> > +                break;
> >             }
> > -            return 1;
> > +            if (strcmp(prev, tmp) == 0) {
> > +                match = true;
> > +                continue;
> > +            }
> > +            if (prev[0] == '\0') {
> > +                break;
> > +            }
> > +        }
> > +        if (offset < 0) {
> > +            return 0;
> >         }
> >     }
> > -
> > +    if (tmp) {
> > +        if (VOF_MEM_WRITE(nameaddr, tmp, strlen(tmp) + 1) != MEMTX_OK) {
> > +            return PROM_ERROR;
> > +        }
> > +        return 1;
> > +    }
> >     return 0;
> > }
> >
> >
> 

Reply via email to