On Fri, Mar 26, 2021 at 8:14 AM Viresh Kumar viresh.kumar@linaro.org wrote:
On 25-03-21, 17:16, Arnd Bergmann wrote:
On Wed, Mar 24, 2021 at 8:33 AM Viresh Kumar viresh.kumar@linaro.org wrote:
It looks like you are not handling endianness conversion here. As far as I can tell, the protocol requires little-endian data, but the code might run on a big-endian CPU.
I hope this is all we are required to do here, right ?
@@ -442,7 +421,7 @@ static void vi2c_handle_ctrl(VuDev *dev, int qidx) out_hdr = elem->out_sg[0].iov_base;
/* Bit 0 is reserved in virtio spec */
msg.addr = out_hdr->addr >> 1;
msg.addr = le16toh(out_hdr->addr) >> 1; /* Read Operation */ if (elem->out_num == 1 && elem->in_num == 2) {
@@ -489,7 +468,7 @@ static void vi2c_handle_ctrl(VuDev *dev, int qidx) in_hdr->status = fail_next ? VIRTIO_I2C_MSG_ERR : vi2c_xfer(dev, &msg); if (in_hdr->status == VIRTIO_I2C_MSG_ERR) { /* We need to fail remaining transfers as well */
fail_next = out_hdr->flags & VIRTIO_I2C_FLAGS_FAIL_NEXT;
fail_next = le32toh(out_hdr->flags) & VIRTIO_I2C_FLAGS_FAIL_NEXT; }
These are the only fields we are passing apart from buf, which goes directly to the client device.
I think so, the in_hdr is only one byte long, so it doesn't have an endianness.
Arnd