Message ID | 20181122182335.9038-1-pbonzini@redhat.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | nvme: fix CMB endianness confusion | expand |
On 22 November 2018 at 18:23, Paolo Bonzini <pbonzini@redhat.com> wrote: > The CMB is marked as DEVICE_LITTLE_ENDIAN, so the data must be > read/written as if it was little-endian output (in the case of > big endian, we get two swaps, one in the memory core and one > in nvme.c). > > Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> > --- > hw/block/nvme.c | 7 ++----- > 1 file changed, 2 insertions(+), 5 deletions(-) Tested-by: Peter Maydell <peter.maydell@linaro.org> This is sufficient to get the nvme-test to pass on sparc (big-endian host). thanks -- PMM
Am 22.11.2018 um 19:23 hat Paolo Bonzini geschrieben: > The CMB is marked as DEVICE_LITTLE_ENDIAN, so the data must be > read/written as if it was little-endian output (in the case of > big endian, we get two swaps, one in the memory core and one > in nvme.c). > > Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> Thanks, applied to the block branch. Kevin
diff --git a/hw/block/nvme.c b/hw/block/nvme.c index 5d92794ef7..8a12fba24f 100644 --- a/hw/block/nvme.c +++ b/hw/block/nvme.c @@ -1175,16 +1175,13 @@ static void nvme_cmb_write(void *opaque, hwaddr addr, uint64_t data, unsigned size) { NvmeCtrl *n = (NvmeCtrl *)opaque; - memcpy(&n->cmbuf[addr], &data, size); + stn_le_p(&n->cmbuf[addr], size, data); } static uint64_t nvme_cmb_read(void *opaque, hwaddr addr, unsigned size) { - uint64_t val; NvmeCtrl *n = (NvmeCtrl *)opaque; - - memcpy(&val, &n->cmbuf[addr], size); - return val; + return ldn_le_p(&n->cmbuf[addr], size); } static const MemoryRegionOps nvme_cmb_ops = {
The CMB is marked as DEVICE_LITTLE_ENDIAN, so the data must be read/written as if it was little-endian output (in the case of big endian, we get two swaps, one in the memory core and one in nvme.c). Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> --- hw/block/nvme.c | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-)