[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