Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 4 Jun 2010 23:21:34 GMT
From:      Hans Petter Selasky <hselasky@FreeBSD.org>
To:        Perforce Change Reviews <perforce@FreeBSD.org>
Subject:   PERFORCE change 179196 for review
Message-ID:  <201006042321.o54NLYhX059467@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
http://p4web.freebsd.org/@@179196?ac=10

Change 179196 by hselasky@hselasky_laptop001 on 2010/06/04 23:21:32

	
	LibUSB:
		- Fix for running USB userland code in 32-bit compatibility mode.

Affected files ...

.. //depot/projects/usb/src/lib/libusb/Makefile#8 edit
.. //depot/projects/usb/src/lib/libusb/libusb20.c#18 edit
.. //depot/projects/usb/src/lib/libusb/libusb20_int.h#12 edit
.. //depot/projects/usb/src/lib/libusb/libusb20_ugen20.c#15 edit
.. //depot/projects/usb/src/sys/dev/usb/usb_ioctl.h#7 edit

Differences ...

==== //depot/projects/usb/src/lib/libusb/Makefile#8 (text+ko) ====

@@ -30,5 +30,9 @@
 SRCS+=		libusb10_desc.c
 SRCS+=		libusb10_io.c
 
+.if defined(COMPAT_32BIT)
+CFLAGS+=	-DCOMPAT_32BIT
+.endif
+
 .include <bsd.lib.mk>
 

==== //depot/projects/usb/src/lib/libusb/libusb20.c#18 (text+ko) ====

@@ -320,7 +320,7 @@
 void
 libusb20_tr_set_buffer(struct libusb20_transfer *xfer, void *buffer, uint16_t frIndex)
 {
-	xfer->ppBuffer[frIndex] = buffer;
+	xfer->ppBuffer[frIndex] = libusb20_pass_ptr(buffer);
 	return;
 }
 
@@ -386,7 +386,7 @@
 void
 libusb20_tr_setup_bulk(struct libusb20_transfer *xfer, void *pBuf, uint32_t length, uint32_t timeout)
 {
-	xfer->ppBuffer[0] = pBuf;
+	xfer->ppBuffer[0] = libusb20_pass_ptr(pBuf);
 	xfer->pLength[0] = length;
 	xfer->timeout = timeout;
 	xfer->nFrames = 1;
@@ -398,7 +398,7 @@
 {
 	uint16_t len;
 
-	xfer->ppBuffer[0] = psetup;
+	xfer->ppBuffer[0] = libusb20_pass_ptr(psetup);
 	xfer->pLength[0] = 8;		/* fixed */
 	xfer->timeout = timeout;
 
@@ -406,7 +406,7 @@
 
 	if (len != 0) {
 		xfer->nFrames = 2;
-		xfer->ppBuffer[1] = pBuf;
+		xfer->ppBuffer[1] = libusb20_pass_ptr(pBuf);
 		xfer->pLength[1] = len;
 	} else {
 		xfer->nFrames = 1;
@@ -417,7 +417,7 @@
 void
 libusb20_tr_setup_intr(struct libusb20_transfer *xfer, void *pBuf, uint32_t length, uint32_t timeout)
 {
-	xfer->ppBuffer[0] = pBuf;
+	xfer->ppBuffer[0] = libusb20_pass_ptr(pBuf);
 	xfer->pLength[0] = length;
 	xfer->timeout = timeout;
 	xfer->nFrames = 1;
@@ -431,7 +431,7 @@
 		/* should not happen */
 		return;
 	}
-	xfer->ppBuffer[frIndex] = pBuf;
+	xfer->ppBuffer[frIndex] = libusb20_pass_ptr(pBuf);
 	xfer->pLength[frIndex] = length;
 	return;
 }

==== //depot/projects/usb/src/lib/libusb/libusb20_int.h#12 (text+ko) ====

@@ -31,6 +31,12 @@
 #ifndef _LIBUSB20_INT_H_
 #define	_LIBUSB20_INT_H_
 
+#ifdef COMPAT_32BIT
+#define	libusb20_pass_ptr(ptr)	((uint64_t)(uintptr_t)(ptr))
+#else
+#define	libusb20_pass_ptr(ptr)	(ptr)
+#endif
+
 struct libusb20_device;
 struct libusb20_backend;
 struct libusb20_transfer;
@@ -148,7 +154,11 @@
 	/*
 	 * Pointer to a list of buffer pointers:
 	 */
+#ifdef COMPAT_32BIT
+	uint64_t *ppBuffer;
+#else
 	void  **ppBuffer;
+#endif
 	/*
 	 * Pointer to frame lengths, which are updated to actual length
 	 * after the USB transfer completes:

==== //depot/projects/usb/src/lib/libusb/libusb20_ugen20.c#15 (text+ko) ====

@@ -227,7 +227,7 @@
 repeat:
 	if (st->ptr == NULL) {
 		st->urd.urd_startentry += st->nparsed;
-		st->urd.urd_data = st->buf;
+		st->urd.urd_data = libusb20_pass_ptr(st->buf);
 		st->urd.urd_maxlen = sizeof(st->buf);
 		st->nparsed = 0;
 
@@ -340,7 +340,7 @@
 
 	memset(&fs_init, 0, sizeof(fs_init));
 
-	fs_init.pEndpoints = pdev->privBeData;
+	fs_init.pEndpoints = libusb20_pass_ptr(pdev->privBeData);
 	fs_init.ep_index_max = nMaxTransfer;
 
 	if (ioctl(pdev->file, USB_FS_INIT, &fs_init)) {
@@ -454,7 +454,7 @@
 	memset(&cdesc, 0, sizeof(cdesc));
 	memset(&gen_desc, 0, sizeof(gen_desc));
 
-	gen_desc.ugd_data = &cdesc;
+	gen_desc.ugd_data = libusb20_pass_ptr(&cdesc);
 	gen_desc.ugd_maxlen = sizeof(cdesc);
 	gen_desc.ugd_config_index = cfg_index;
 
@@ -475,7 +475,7 @@
 	/* make sure memory is initialised */
 	memset(ptr, 0, len);
 
-	gen_desc.ugd_data = ptr;
+	gen_desc.ugd_data = libusb20_pass_ptr(ptr);
 	gen_desc.ugd_maxlen = len;
 
 	error = ioctl(pdev->file_ctrl, USB_GET_FULL_DESC, &gen_desc);
@@ -667,7 +667,7 @@
 
 	memset(&req, 0, sizeof(req));
 
-	req.ucr_data = data;
+	req.ucr_data = libusb20_pass_ptr(data);
 	if (!(flags & LIBUSB20_TRANSFER_SINGLE_SHORT_NOT_OK)) {
 		req.ucr_flags |= USB_SHORT_XFER_OK;
 	}
@@ -762,9 +762,9 @@
 	xfer->maxTotalLength = temp.max_bufsize;
 	xfer->maxPacketLen = temp.max_packet_length;
 
-	/* setup buffer and length lists */
-	fsep->ppBuffer = xfer->ppBuffer;/* zero copy */
-	fsep->pLength = xfer->pLength;	/* zero copy */
+	/* setup buffer and length lists using zero copy */
+	fsep->ppBuffer = libusb20_pass_ptr(xfer->ppBuffer);
+	fsep->pLength = libusb20_pass_ptr(xfer->pLength);
 
 	return (0);			/* success */
 }
@@ -884,7 +884,7 @@
 
 	memset(&ugd, 0, sizeof(ugd));
 
-	ugd.ugd_data = buf;
+	ugd.ugd_data = libusb20_pass_ptr(buf);
 	ugd.ugd_maxlen = len;
 	ugd.ugd_iface_index = iface_index;
 

==== //depot/projects/usb/src/sys/dev/usb/usb_ioctl.h#7 (text+ko) ====

@@ -41,13 +41,21 @@
 #define	USB_GENERIC_NAME "ugen"
 
 struct usb_read_dir {
+#ifdef COMPAT_32BIT
+	uint64_t urd_data;
+#else
 	void   *urd_data;
+#endif
 	uint32_t urd_startentry;
 	uint32_t urd_maxlen;
 };
 
 struct usb_ctl_request {
+#ifdef COMPAT_32BIT
+	uint64_t ucr_data;
+#else
 	void   *ucr_data;
+#endif
 	uint16_t ucr_flags;
 	uint16_t ucr_actlen;		/* actual length transferred */
 	uint8_t	ucr_addr;		/* zero - currently not used */
@@ -65,7 +73,11 @@
 };
 
 struct usb_gen_descriptor {
+#ifdef COMPAT_32BIT
+	uint64_t ugd_data;
+#else
 	void   *ugd_data;
+#endif
 	uint16_t ugd_lang_id;
 	uint16_t ugd_maxlen;
 	uint16_t ugd_actlen;
@@ -131,9 +143,14 @@
 	 * NOTE: isochronous USB transfer only use one buffer, but can have
 	 * multiple frame lengths !
 	 */
+#ifdef COMPAT_32BIT
+	uint64_t ppBuffer;
+	uint64_t pLength;
+#else
 	void  **ppBuffer;		/* pointer to userland buffers */
 	uint32_t *pLength;		/* pointer to frame lengths, updated
 					 * to actual length */
+#endif
 	uint32_t nFrames;		/* number of frames */
 	uint32_t aFrames;		/* actual number of frames */
 	uint16_t flags;
@@ -155,7 +172,11 @@
 
 struct usb_fs_init {
 	/* userland pointer to endpoints structure */
+#ifdef COMPAT_32BIT
+	uint64_t pEndpoints;
+#else
 	struct usb_fs_endpoint *pEndpoints;
+#endif
 	/* maximum number of endpoints */
 	uint8_t	ep_index_max;
 };



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201006042321.o54NLYhX059467>