CHROMIUM: virtwl: change VIRTWL_SEND_MAX_ALLOCS to match libwayland

This is a breaking change and needs to be checked in lockstep with guest
proxy changes.

While we're breaking things, this fixes inconsistent uint*_t type usage
and makes virtwl_ioctl_new 32/64 bit safe.

BUG=chromium:782474
TEST=None

Change-Id: Ifbdb03d3d7b92dd6187f5d29d1e4a7d6d63b4415
Signed-off-by: Zach Reizner <zachr@google.com>
Reviewed-on: https://chromium-review.googlesource.com/770594
Commit-Ready: Zach Reizner <zachr@chromium.org>
Tested-by: Zach Reizner <zachr@chromium.org>
Reviewed-by: Dmitry Torokhov <dtor@chromium.org>
Reviewed-by: Dylan Reid <dgreid@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/780816
Commit-Ready: Dylan Reid <dgreid@chromium.org>
Tested-by: Dylan Reid <dgreid@chromium.org>
Reviewed-by: Zach Reizner <zachr@chromium.org>
diff --git a/drivers/virtio/virtio_wl.c b/drivers/virtio/virtio_wl.c
index df9f190..0e3159d 100644
--- a/drivers/virtio/virtio_wl.c
+++ b/drivers/virtio/virtio_wl.c
@@ -882,13 +882,13 @@
 static long virtwl_ioctl_send(struct file *filp, unsigned long arg)
 {
 	struct virtwl_vfd *vfd = filp->private_data;
-	struct virtwl_ioctl_send ioctl_send;
+	struct virtwl_ioctl_txn ioctl_send;
 	void __user *user_data = (void __user *)arg +
-				 sizeof(struct virtwl_ioctl_send);
+				 sizeof(struct virtwl_ioctl_txn);
 	int ret;
 
 	ret = copy_from_user(&ioctl_send, (void __user *)arg,
-			     sizeof(struct virtwl_ioctl_send));
+			     sizeof(struct virtwl_ioctl_txn));
 	if (ret)
 		return -EFAULT;
 
@@ -903,9 +903,9 @@
 
 static long virtwl_ioctl_recv(struct file *filp, unsigned long arg)
 {
-	struct virtwl_ioctl_recv ioctl_recv;
+	struct virtwl_ioctl_txn ioctl_recv;
 	void __user *user_data = (void __user *)arg +
-				 sizeof(struct virtwl_ioctl_recv);
+				 sizeof(struct virtwl_ioctl_txn);
 	int __user *user_fds = (int __user *)arg;
 	size_t vfd_count = VIRTWL_SEND_MAX_ALLOCS;
 	struct virtwl_vfd *vfds[VIRTWL_SEND_MAX_ALLOCS] = { 0 };
@@ -918,7 +918,7 @@
 		fds[i] = -1;
 
 	ret = copy_from_user(&ioctl_recv, (void __user *)arg,
-			     sizeof(struct virtwl_ioctl_recv));
+			     sizeof(struct virtwl_ioctl_txn));
 	if (ret)
 		return -EFAULT;
 
@@ -932,7 +932,7 @@
 	if (ret < 0)
 		return ret;
 
-	ret = copy_to_user(&((struct virtwl_ioctl_recv __user *)arg)->len, &ret,
+	ret = copy_to_user(&((struct virtwl_ioctl_txn __user *)arg)->len, &ret,
 			   sizeof(ioctl_recv.len));
 	if (ret) {
 		ret = -EFAULT;
diff --git a/include/uapi/linux/virtwl.h b/include/uapi/linux/virtwl.h
index cde61c0..8374dd6 100644
--- a/include/uapi/linux/virtwl.h
+++ b/include/uapi/linux/virtwl.h
@@ -2,8 +2,9 @@
 #define _LINUX_VIRTWL_H
 
 #include <asm/ioctl.h>
+#include <linux/types.h>
 
-#define VIRTWL_SEND_MAX_ALLOCS 16
+#define VIRTWL_SEND_MAX_ALLOCS 28
 
 #define VIRTWL_IOCTL_BASE 'w'
 #define VIRTWL_IO(nr)		_IO(VIRTWL_IOCTL_BASE, nr)
@@ -12,32 +13,26 @@
 #define VIRTWL_IOWR(nr, type)	_IOWR(VIRTWL_IOCTL_BASE, nr, type)
 
 enum virtwl_ioctl_new_type {
-	VIRTWL_IOCTL_NEW_CTX, // struct virtwl_ioctl_new
-	VIRTWL_IOCTL_NEW_ALLOC, // struct virtwl_ioctl_new_alloc
+	VIRTWL_IOCTL_NEW_CTX, /* open a new wayland connection context */
+	VIRTWL_IOCTL_NEW_ALLOC, /* create a new virtwl shm allocation */
 };
 
 struct virtwl_ioctl_new {
-	uint32_t type; // always 0
-	int fd; // return fd
-	uint32_t flags; // always 0
-	size_t size; // only for VIRTWL_IOCTL_NEW_ALLOC
+	__u32 type; /* VIRTWL_IOCTL_NEW_* */
+	int fd; /* return fd */
+	__u32 flags; /* currently always 0 */
+	__u32 size; /* size of allocation if type == VIRTWL_IOCTL_NEW_ALLOC */
 };
 
-struct virtwl_ioctl_send {
+struct virtwl_ioctl_txn {
 	int fds[VIRTWL_SEND_MAX_ALLOCS];
-	uint32_t len;
-	uint8_t data[0];
-};
-
-struct virtwl_ioctl_recv {
-	int fds[VIRTWL_SEND_MAX_ALLOCS];
-	uint32_t len;
-	uint8_t data[0];
+	__u32 len;
+	__u8 data[0];
 };
 
 #define VIRTWL_IOCTL_NEW VIRTWL_IOWR(0x00, struct virtwl_ioctl_new)
-#define VIRTWL_IOCTL_SEND VIRTWL_IOR(0x01, struct virtwl_ioctl_send)
-#define VIRTWL_IOCTL_RECV VIRTWL_IOW(0x02, struct virtwl_ioctl_recv)
+#define VIRTWL_IOCTL_SEND VIRTWL_IOR(0x01, struct virtwl_ioctl_txn)
+#define VIRTWL_IOCTL_RECV VIRTWL_IOW(0x02, struct virtwl_ioctl_txn)
 #define VIRTWL_IOCTL_MAXNR 3
 
 #endif /* _LINUX_VIRTWL_H */