23
23
#include <linux/slab.h>
24
24
#include <linux/sched.h>
25
25
#include <linux/virtio.h>
26
+ #include <linux/virtio_byteorder.h>
26
27
#include <linux/virtio_ids.h>
27
28
#include <linux/virtio_config.h>
28
29
#include <linux/wait.h>
@@ -84,11 +85,11 @@ struct virtproc_info {
84
85
* Every message sent(/received) on the rpmsg bus begins with this header.
85
86
*/
86
87
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 ;
92
93
u8 data [];
93
94
} __packed ;
94
95
@@ -106,8 +107,8 @@ struct rpmsg_hdr {
106
107
*/
107
108
struct rpmsg_ns_msg {
108
109
char name [RPMSG_NAME_SIZE ];
109
- u32 addr ;
110
- u32 flags ;
110
+ __virtio32 addr ;
111
+ __virtio32 flags ;
111
112
} __packed ;
112
113
113
114
/**
@@ -335,8 +336,8 @@ static int virtio_rpmsg_announce_create(struct rpmsg_device *rpdev)
335
336
struct rpmsg_ns_msg nsm ;
336
337
337
338
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 ) ;
340
341
341
342
err = rpmsg_sendto (rpdev -> ept , & nsm , sizeof (nsm ), RPMSG_NS_ADDR );
342
343
if (err )
@@ -359,8 +360,8 @@ static int virtio_rpmsg_announce_destroy(struct rpmsg_device *rpdev)
359
360
struct rpmsg_ns_msg nsm ;
360
361
361
362
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 ) ;
364
365
365
366
err = rpmsg_sendto (rpdev -> ept , & nsm , sizeof (nsm ), RPMSG_NS_ADDR );
366
367
if (err )
@@ -612,18 +613,18 @@ static int rpmsg_send_offchannel_raw(struct rpmsg_device *rpdev,
612
613
}
613
614
}
614
615
615
- msg -> len = len ;
616
+ msg -> len = cpu_to_virtio16 ( vrp -> vdev , len ) ;
616
617
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 ) ;
619
620
msg -> reserved = 0 ;
620
621
memcpy (msg -> data , data , len );
621
622
622
623
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 );
624
625
#if defined(CONFIG_DYNAMIC_DEBUG )
625
626
dynamic_hex_dump ("rpmsg_virtio TX: " , DUMP_PREFIX_NONE , 16 , 1 ,
626
- msg , sizeof (* msg ) + msg -> len , true);
627
+ msg , sizeof (* msg ) + len , true);
627
628
#endif
628
629
629
630
rpmsg_sg_init (& sg , msg , sizeof (* msg ) + len );
@@ -704,29 +705,33 @@ static int rpmsg_recv_single(struct virtproc_info *vrp, struct device *dev,
704
705
{
705
706
struct rpmsg_endpoint * ept ;
706
707
struct scatterlist sg ;
708
+ unsigned int msg_len = virtio16_to_cpu (vrp -> vdev , msg -> len );
707
709
int err ;
708
710
709
711
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 ));
711
716
#if defined(CONFIG_DYNAMIC_DEBUG )
712
717
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);
714
719
#endif
715
720
716
721
/*
717
722
* We currently use fixed-sized buffers, so trivially sanitize
718
723
* the reported payload length.
719
724
*/
720
725
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 );
723
728
return - EINVAL ;
724
729
}
725
730
726
731
/* use the dst addr to fetch the callback of the appropriate user */
727
732
mutex_lock (& vrp -> endpoints_lock );
728
733
729
- ept = idr_find (& vrp -> endpoints , msg -> dst );
734
+ ept = idr_find (& vrp -> endpoints , virtio32_to_cpu ( vrp -> vdev , msg -> dst ) );
730
735
731
736
/* let's make sure no one deallocates ept while we use it */
732
737
if (ept )
@@ -739,8 +744,8 @@ static int rpmsg_recv_single(struct virtproc_info *vrp, struct device *dev,
739
744
mutex_lock (& ept -> cb_lock );
740
745
741
746
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 ) );
744
749
745
750
mutex_unlock (& ept -> cb_lock );
746
751
@@ -846,15 +851,15 @@ static int rpmsg_ns_cb(struct rpmsg_device *rpdev, void *data, int len,
846
851
/* don't trust the remote processor for null terminating the name */
847
852
msg -> name [RPMSG_NAME_SIZE - 1 ] = '\0' ;
848
853
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
-
853
854
strncpy (chinfo .name , msg -> name , sizeof (chinfo .name ));
854
855
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 );
856
861
857
- if (msg -> flags & RPMSG_NS_DESTROY ) {
862
+ if (virtio32_to_cpu ( vrp -> vdev , msg -> flags ) & RPMSG_NS_DESTROY ) {
858
863
ret = rpmsg_unregister_device (& vrp -> vdev -> dev , & chinfo );
859
864
if (ret )
860
865
dev_err (dev , "rpmsg_destroy_channel failed: %d\n" , ret );
0 commit comments