On 16/12/2014 20:00, Laszlo Ersek wrote: > Yes. > > The root of this question is what each of > > enum device_endian { > DEVICE_NATIVE_ENDIAN, > DEVICE_BIG_ENDIAN, > DEVICE_LITTLE_ENDIAN, > };
Actually, I think the root of the answer :) is that fw_cfg_read (and thus fw_cfg_data_mem_read) is not idempotent. The split/compose stuff accesses the bytes at offsets 8,9,10,11,12,13,14,15 and composes them according to the endianness. In the case of fw_cfg it just retrieves 8 bytes, but in the case of host big endian it reads them in the "wrong" order for some reason (sorry, I haven't looked at this thoroughly). So the solution is: 1) make fw_cfg_data_mem_ops DEVICE_LITTLE_ENDIAN 2) make fw_cfg_data_mem_read and fw_cfg_data_mem_write call fw_cfg_read and fw_cfg_write SIZE times and build up a value from the lowest byte up. Paolo