From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:47415) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Y0y7b-0003rU-TW for qemu-devel@nongnu.org; Tue, 16 Dec 2014 14:49:34 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Y0y7V-0001wE-Pu for qemu-devel@nongnu.org; Tue, 16 Dec 2014 14:49:27 -0500 Received: from mx1.redhat.com ([209.132.183.28]:54765) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Y0y7V-0001v8-Ik for qemu-devel@nongnu.org; Tue, 16 Dec 2014 14:49:21 -0500 Message-ID: <54908CB6.8030501@redhat.com> Date: Tue, 16 Dec 2014 20:49:10 +0100 From: Paolo Bonzini MIME-Version: 1.0 References: <1418399932-7658-1-git-send-email-lersek@redhat.com> <1418399932-7658-2-git-send-email-lersek@redhat.com> <20141216134858.GD3283@hawk.usersys.redhat.com> <5490815E.8@redhat.com> In-Reply-To: <5490815E.8@redhat.com> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 8bit Subject: Re: [Qemu-devel] [PATCH v4 1/8] fw_cfg: max access size and region size are the same for MMIO data reg List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Laszlo Ersek , Andrew Jones Cc: peter.maydell@linaro.org, Alexander Graf , qemu-devel@nongnu.org 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