Re: [LIBFDT] Fixup byteswapping code
From: Grant Likely <hidden>
Date: 2006-12-04 05:18:29
On 12/3/06, David Gibson [off-list ref] 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@secretlab.ca (403) 399-0195