diff options
author | Paolo Bonzini <pbonzini@redhat.com> | 2018-11-22 19:23:35 +0100 |
---|---|---|
committer | Kevin Wolf <kwolf@redhat.com> | 2018-11-22 19:37:31 +0100 |
commit | 71a86ddece548860f040d565204cf1bf59d74663 (patch) | |
tree | c64dc8208eba88addce9661078b3317c6ff6cfa2 | |
parent | 2067d39e5e53b053bece6fa15711640123c119ed (diff) |
nvme: fix CMB endianness confusion
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>
Tested-by: Peter Maydell <peter.maydell@linaro.org>
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
-rw-r--r-- | hw/block/nvme.c | 7 |
1 files changed, 2 insertions, 5 deletions
diff --git a/hw/block/nvme.c b/hw/block/nvme.c index 84062d388f..01f3e853cf 100644 --- a/hw/block/nvme.c +++ b/hw/block/nvme.c @@ -1177,16 +1177,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 = { |