On 12/16/14 21:06, Laszlo Ersek wrote: > On 12/16/14 20:49, Paolo Bonzini wrote: >> >> >> 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). > > I can't imagine how that would happen; fw_cfg_data_mem_read() ignores > both "addr" and "size", and fw_cfg_read() simply advances the > "cur_offset" member.
Ah okay, I understand your point now; you're probably saying that access_with_adjusted_size() traverses the offsets in the wrong order. ... I don't see how; the only difference in the access() param list is the shift count. (I don't know how it should work by design.) In any case fw_cfg should be able to handle the larger accesses itself. Thanks Laszlo