Skip to content

Commit dded87a

Browse files
committed
Merge tag 'rpmsg-v5.9' of git://git.kernel.org/pub/scm/linux/kernel/git/andersson/remoteproc
Pull rpmsg update from Bjorn Andersson: "This ensures that rpmsg uses little-endian, per the VirtIO 1.0 specification" * tag 'rpmsg-v5.9' of git://git.kernel.org/pub/scm/linux/kernel/git/andersson/remoteproc: rpmsg: virtio: add endianness conversions
2 parents 4bf5e36 + 111d108 commit dded87a

File tree

1 file changed

+34
-29
lines changed

1 file changed

+34
-29
lines changed

drivers/rpmsg/virtio_rpmsg_bus.c

Lines changed: 34 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
#include <linux/slab.h>
2424
#include <linux/sched.h>
2525
#include <linux/virtio.h>
26+
#include <linux/virtio_byteorder.h>
2627
#include <linux/virtio_ids.h>
2728
#include <linux/virtio_config.h>
2829
#include <linux/wait.h>
@@ -84,11 +85,11 @@ struct virtproc_info {
8485
* Every message sent(/received) on the rpmsg bus begins with this header.
8586
*/
8687
struct rpmsg_hdr {
87-
u32 src;
88-
u32 dst;
89-
u32 reserved;
90-
u16 len;
91-
u16 flags;
88+
__virtio32 src;
89+
__virtio32 dst;
90+
__virtio32 reserved;
91+
__virtio16 len;
92+
__virtio16 flags;
9293
u8 data[];
9394
} __packed;
9495

@@ -106,8 +107,8 @@ struct rpmsg_hdr {
106107
*/
107108
struct rpmsg_ns_msg {
108109
char name[RPMSG_NAME_SIZE];
109-
u32 addr;
110-
u32 flags;
110+
__virtio32 addr;
111+
__virtio32 flags;
111112
} __packed;
112113

113114
/**
@@ -335,8 +336,8 @@ static int virtio_rpmsg_announce_create(struct rpmsg_device *rpdev)
335336
struct rpmsg_ns_msg nsm;
336337

337338
strncpy(nsm.name, rpdev->id.name, RPMSG_NAME_SIZE);
338-
nsm.addr = rpdev->ept->addr;
339-
nsm.flags = RPMSG_NS_CREATE;
339+
nsm.addr = cpu_to_virtio32(vrp->vdev, rpdev->ept->addr);
340+
nsm.flags = cpu_to_virtio32(vrp->vdev, RPMSG_NS_CREATE);
340341

341342
err = rpmsg_sendto(rpdev->ept, &nsm, sizeof(nsm), RPMSG_NS_ADDR);
342343
if (err)
@@ -359,8 +360,8 @@ static int virtio_rpmsg_announce_destroy(struct rpmsg_device *rpdev)
359360
struct rpmsg_ns_msg nsm;
360361

361362
strncpy(nsm.name, rpdev->id.name, RPMSG_NAME_SIZE);
362-
nsm.addr = rpdev->ept->addr;
363-
nsm.flags = RPMSG_NS_DESTROY;
363+
nsm.addr = cpu_to_virtio32(vrp->vdev, rpdev->ept->addr);
364+
nsm.flags = cpu_to_virtio32(vrp->vdev, RPMSG_NS_DESTROY);
364365

365366
err = rpmsg_sendto(rpdev->ept, &nsm, sizeof(nsm), RPMSG_NS_ADDR);
366367
if (err)
@@ -612,18 +613,18 @@ static int rpmsg_send_offchannel_raw(struct rpmsg_device *rpdev,
612613
}
613614
}
614615

615-
msg->len = len;
616+
msg->len = cpu_to_virtio16(vrp->vdev, len);
616617
msg->flags = 0;
617-
msg->src = src;
618-
msg->dst = dst;
618+
msg->src = cpu_to_virtio32(vrp->vdev, src);
619+
msg->dst = cpu_to_virtio32(vrp->vdev, dst);
619620
msg->reserved = 0;
620621
memcpy(msg->data, data, len);
621622

622623
dev_dbg(dev, "TX From 0x%x, To 0x%x, Len %d, Flags %d, Reserved %d\n",
623-
msg->src, msg->dst, msg->len, msg->flags, msg->reserved);
624+
src, dst, len, msg->flags, msg->reserved);
624625
#if defined(CONFIG_DYNAMIC_DEBUG)
625626
dynamic_hex_dump("rpmsg_virtio TX: ", DUMP_PREFIX_NONE, 16, 1,
626-
msg, sizeof(*msg) + msg->len, true);
627+
msg, sizeof(*msg) + len, true);
627628
#endif
628629

629630
rpmsg_sg_init(&sg, msg, sizeof(*msg) + len);
@@ -704,29 +705,33 @@ static int rpmsg_recv_single(struct virtproc_info *vrp, struct device *dev,
704705
{
705706
struct rpmsg_endpoint *ept;
706707
struct scatterlist sg;
708+
unsigned int msg_len = virtio16_to_cpu(vrp->vdev, msg->len);
707709
int err;
708710

709711
dev_dbg(dev, "From: 0x%x, To: 0x%x, Len: %d, Flags: %d, Reserved: %d\n",
710-
msg->src, msg->dst, msg->len, msg->flags, msg->reserved);
712+
virtio32_to_cpu(vrp->vdev, msg->src),
713+
virtio32_to_cpu(vrp->vdev, msg->dst), msg_len,
714+
virtio16_to_cpu(vrp->vdev, msg->flags),
715+
virtio32_to_cpu(vrp->vdev, msg->reserved));
711716
#if defined(CONFIG_DYNAMIC_DEBUG)
712717
dynamic_hex_dump("rpmsg_virtio RX: ", DUMP_PREFIX_NONE, 16, 1,
713-
msg, sizeof(*msg) + msg->len, true);
718+
msg, sizeof(*msg) + msg_len, true);
714719
#endif
715720

716721
/*
717722
* We currently use fixed-sized buffers, so trivially sanitize
718723
* the reported payload length.
719724
*/
720725
if (len > vrp->buf_size ||
721-
msg->len > (len - sizeof(struct rpmsg_hdr))) {
722-
dev_warn(dev, "inbound msg too big: (%d, %d)\n", len, msg->len);
726+
msg_len > (len - sizeof(struct rpmsg_hdr))) {
727+
dev_warn(dev, "inbound msg too big: (%d, %d)\n", len, msg_len);
723728
return -EINVAL;
724729
}
725730

726731
/* use the dst addr to fetch the callback of the appropriate user */
727732
mutex_lock(&vrp->endpoints_lock);
728733

729-
ept = idr_find(&vrp->endpoints, msg->dst);
734+
ept = idr_find(&vrp->endpoints, virtio32_to_cpu(vrp->vdev, msg->dst));
730735

731736
/* let's make sure no one deallocates ept while we use it */
732737
if (ept)
@@ -739,8 +744,8 @@ static int rpmsg_recv_single(struct virtproc_info *vrp, struct device *dev,
739744
mutex_lock(&ept->cb_lock);
740745

741746
if (ept->cb)
742-
ept->cb(ept->rpdev, msg->data, msg->len, ept->priv,
743-
msg->src);
747+
ept->cb(ept->rpdev, msg->data, msg_len, ept->priv,
748+
virtio32_to_cpu(vrp->vdev, msg->src));
744749

745750
mutex_unlock(&ept->cb_lock);
746751

@@ -846,15 +851,15 @@ static int rpmsg_ns_cb(struct rpmsg_device *rpdev, void *data, int len,
846851
/* don't trust the remote processor for null terminating the name */
847852
msg->name[RPMSG_NAME_SIZE - 1] = '\0';
848853

849-
dev_info(dev, "%sing channel %s addr 0x%x\n",
850-
msg->flags & RPMSG_NS_DESTROY ? "destroy" : "creat",
851-
msg->name, msg->addr);
852-
853854
strncpy(chinfo.name, msg->name, sizeof(chinfo.name));
854855
chinfo.src = RPMSG_ADDR_ANY;
855-
chinfo.dst = msg->addr;
856+
chinfo.dst = virtio32_to_cpu(vrp->vdev, msg->addr);
857+
858+
dev_info(dev, "%sing channel %s addr 0x%x\n",
859+
virtio32_to_cpu(vrp->vdev, msg->flags) & RPMSG_NS_DESTROY ?
860+
"destroy" : "creat", msg->name, chinfo.dst);
856861

857-
if (msg->flags & RPMSG_NS_DESTROY) {
862+
if (virtio32_to_cpu(vrp->vdev, msg->flags) & RPMSG_NS_DESTROY) {
858863
ret = rpmsg_unregister_device(&vrp->vdev->dev, &chinfo);
859864
if (ret)
860865
dev_err(dev, "rpmsg_destroy_channel failed: %d\n", ret);

0 commit comments

Comments
 (0)