[LIBFDT] Fixup byteswapping code

Grant Likely grant.likely at secretlab.ca
Mon Dec 4 16:18:25 EST 2006


On 12/3/06, David Gibson <david at gibson.dropbear.id.au> wrote:
> I just applied a patch with a whole batch of endian fixes, obsoleting
> this patch of yours.

Cool, looks good and the tests pass on my machine now.

Now; here's an AMD64 related bug; consider line #44 in libfdt_internal.h:

#define PTR_ERROR(code)         (void *)(-(code))

Followed by line #67 in libfdt.h:

#define fdt_ptr_error(ptr) \
	( (((long)(ptr) < 0) && ((long)(ptr) >= -FDT_ERR_MAX)) ? -(long)(ptr) : 0 )


'code' being an integer.

This requires a hacky cast from int to pointer and back again, and it
makes the assumption that int and void* are the same size.  However,
on a x86_64 system (not sure about power64), int is 32 bits and void*
is 64.  Therefore; a return of (void*)-1 results in address
0xffffffff; not 0xffffffffffffffff.  0xffffffff is right in the middle
of valid address ranges.

This, of course, produces the warning: "cast to pointer from integer
of different size"

I believe the accepted convention (at least in the kernel) is to
return NULL on error, and libfdt should probably follow that
convention.  If you must return the actual error code; maybe rework
the API to accept a void** argument to be used to pass back the
pointer and use 'return code', or include an 'int*' argument for
passing back the err code.

Cheers,
g.

-- 
Grant Likely, B.Sc. P.Eng.
Secret Lab Technologies Ltd.
grant.likely at secretlab.ca
(403) 399-0195



More information about the Linuxppc-dev mailing list