From nobody Sun May 5 11:35:55 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (208.118.235.17 [208.118.235.17]) by mx.zohomail.com with SMTPS id 153995182417679.83794533457194; Fri, 19 Oct 2018 05:23:44 -0700 (PDT) Received: from localhost ([::1]:49862 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gDToX-00028y-J3 for importer@patchew.org; Fri, 19 Oct 2018 08:23:37 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:35601) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gDTkb-0007PC-F9 for qemu-devel@nongnu.org; Fri, 19 Oct 2018 08:19:37 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1gDTkW-00006U-F2 for qemu-devel@nongnu.org; Fri, 19 Oct 2018 08:19:32 -0400 Received: from mout.kundenserver.de ([212.227.126.133]:50555) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1gDTkV-0008C1-QR for qemu-devel@nongnu.org; Fri, 19 Oct 2018 08:19:28 -0400 Received: from localhost.localdomain ([78.238.229.36]) by mrelayeu.kundenserver.de (mreue011 [212.227.15.167]) with ESMTPSA (Nemesis) id 1MderZ-1fdroR1RTN-00ZchP; Fri, 19 Oct 2018 14:19:14 +0200 Received: from localhost.localdomain ([78.238.229.36]) by mrelayeu.kundenserver.de (mreue011 [212.227.15.167]) with ESMTPSA (Nemesis) id 1MderZ-1fdroR1RTN-00ZchP; Fri, 19 Oct 2018 14:19:14 +0200 From: Laurent Vivier To: qemu-devel@nongnu.org Date: Fri, 19 Oct 2018 14:19:08 +0200 Message-Id: <20181019121910.29726-2-laurent@vivier.eu> X-Mailer: git-send-email 2.17.2 In-Reply-To: <20181019121910.29726-1-laurent@vivier.eu> References: <20181019121910.29726-1-laurent@vivier.eu> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-Provags-ID: V03:K1:XbNgQAEubfG3A08uSd+6B+ZUN2iehVZiIzyD6R3Fgrg5X+2/3PY xmeumlAbjoJfRqf0+GsfudDaQRmZ6x76cl2HjdaJ4wsOmhnbF3WnPvDyftriSekhSg7HjXG lmQ36vzawWQ5XBLcLLtuXAIt0L+OrvdizK5sVImIVzfmJebEDjhLlnUXSPezxx1IUxHJhdC IdrZZ5CZfvThOpCu2tDKQ== X-UI-Out-Filterresults: notjunk:1;V01:K0:AGRh480Obfk=:+QUBeyx7gOyV0uVCCkB5OT Q7S6zqLuoz8ERO+SNudtX08pfyKO5IMHkQonkba/BBHGpfmBPzzcC/neWHeCvCzZ7LUqnxb4a utIReIv/DYePbenvnjW1uxO2Z+A8OZ8FbIVqD7vsyU2gdD7N0+4ZSGZxe0VtxCgEh+aneM+tJ lOdQqTAOZqKjmTw9dSY9mebCsbBV0WmWPBFYnXR6MkGHTIriTdchSaafY05Xmi57vqnJU9J8u eYl7cuLODKIxrtIn+8+qhS6S6tvY/IEl6VSt/9iN3LGYxPKz4rjsn5ZEDj2iVjZRfiZXzV8li hQf+hs4ThKp8LxapDmQ/614WhuAJyNiZGMYjAi1u1zO3u/394bRB50imVsnlAOmO8NzGe+OwT hOqSSwh/YsRK5280A+p2/qgxh0n5Op11u7oWAZ0uo7mMZv8OytUEgOvIJL9PyfhRaPPO/Amqn sdgZ806VLyxMcseYL/C5oZIVVTC/Q2Rqmtw80rBfIt5pm2oRd9l3mPSGsAwEsqC2bbuxiARuq R68Zsqiegkok8y6KaTOpaaOB+24GW47BuanV8EdZbobRU2jvoYslwk4lP8a4vqogJkgBK8Fv9 AfA/sdaVxCHH19/EgZQOGDt04M4mn++1NzyC6lCNT5BrZdn4qBTfy6XdMAv3wcMMNAz9tCyEP ubxp01Cd3CezPbiw53VF/5IPJg/sB8wagZsdXME+OQSvtp2XdJXAWa4Hq4WIV1DrmV8TqJkku ug5/RAjtewp6UBua X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 212.227.126.133 Subject: [Qemu-devel] [PULL 1/3] linux-user: Check for Linux USBFS in configure X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Riku Voipio , Laurent Vivier , =?UTF-8?q?Cortland=20T=C3=B6lva?= Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 From: Cortland T=C3=B6lva In preparation for adding user mode emulation support for the Linux usbfs interface, check for its kernel header. Signed-off-by: Cortland T=C3=B6lva Reviewed-by: Laurent Vivier Message-Id: <20181008163521.17341-2-cst@tolva.net> Signed-off-by: Laurent Vivier --- configure | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/configure b/configure index 9138af37f8..37277fd591 100755 --- a/configure +++ b/configure @@ -4202,7 +4202,14 @@ if compile_prog "" "" ; then memfd=3Dyes fi =20 - +# check for usbfs +have_usbfs=3Dno +if test "$linux_user" =3D "yes"; then + if check_include linux/usbdevice_fs.h; then + have_usbfs=3Dyes + fi + have_usbfs=3Dyes +fi =20 # check for fallocate fallocate=3Dno @@ -6310,6 +6317,9 @@ fi if test "$memfd" =3D "yes" ; then echo "CONFIG_MEMFD=3Dy" >> $config_host_mak fi +if test "$have_usbfs" =3D "yes" ; then + echo "CONFIG_USBFS=3Dy" >> $config_host_mak +fi if test "$fallocate" =3D "yes" ; then echo "CONFIG_FALLOCATE=3Dy" >> $config_host_mak fi --=20 2.17.2 From nobody Sun May 5 11:35:55 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1539951671857766.9851955067955; Fri, 19 Oct 2018 05:21:11 -0700 (PDT) Received: from localhost ([::1]:49848 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gDTmA-0008KM-JJ for importer@patchew.org; Fri, 19 Oct 2018 08:21:10 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:35584) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gDTkY-0007NI-Lo for qemu-devel@nongnu.org; Fri, 19 Oct 2018 08:19:31 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1gDTkW-000063-C5 for qemu-devel@nongnu.org; Fri, 19 Oct 2018 08:19:30 -0400 Received: from mout.kundenserver.de ([212.227.126.135]:58401) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1gDTkU-0008AR-EF for qemu-devel@nongnu.org; Fri, 19 Oct 2018 08:19:26 -0400 Received: from localhost.localdomain ([78.238.229.36]) by mrelayeu.kundenserver.de (mreue011 [212.227.15.167]) with ESMTPSA (Nemesis) id 1My2lr-1fQ3lF3W63-00zXyv; Fri, 19 Oct 2018 14:19:15 +0200 Received: from localhost.localdomain ([78.238.229.36]) by mrelayeu.kundenserver.de (mreue011 [212.227.15.167]) with ESMTPSA (Nemesis) id 1My2lr-1fQ3lF3W63-00zXyv; Fri, 19 Oct 2018 14:19:15 +0200 From: Laurent Vivier To: qemu-devel@nongnu.org Date: Fri, 19 Oct 2018 14:19:09 +0200 Message-Id: <20181019121910.29726-3-laurent@vivier.eu> X-Mailer: git-send-email 2.17.2 In-Reply-To: <20181019121910.29726-1-laurent@vivier.eu> References: <20181019121910.29726-1-laurent@vivier.eu> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-Provags-ID: V03:K1:sUjyt7A9CmJqMT77rl+AhDA4+hZnoPqUZCjpKWl1R2jEKxvzo/r b0An5Ig3OJxNI7nh5Z56aR0nhx8kDpEPGG70KwaBj9GJMAeqM4T60/OXkSHG9w0aGQdrIM+ d0Cp4DeBZ7raF9hPzicTh5roAO+ourfcNt0rSw8jsk/zGbbKAYUJBmP0jAeJrHnRJEcBgG2 4a3jEKic0S+Q6ojl/d29g== X-UI-Out-Filterresults: notjunk:1;V01:K0:u5dw4THzCWo=:QkeLX4olXruEC6+Msgtbfd eE4+X/tZZJgsZHulfiJDD+NjscNSxeMriryhDqqaT4Ioh2E+VbKQJpN/VOb/9uj/IbU9gc+2W oKpZbzJWFGlnJNqX6+4rWDA9szdKUjf6Fu+/CVN+UrnbtEUgpYhvkrK1bIh0O1yXZ/XXbuCq9 shyzg5uENk3GDWkDvWuD1YduUaoBX9g8wE22vL3+F3FSHVy8CwbXyEGhrf9Uuxui8rkBz6DA2 xf6FSC1wxcQgSvOZWVdRxINo5qc7vnbLLw2VpdQPLYbNLXjK57RG4sVw6JKD5jMPJHx+iI+Fm 5vdo4MsbLvMdUNfx0OeBB0KxZjkL8ZRX0TbTuKwEjPw2oQ6r6WwVYbLg5Yh2ImqD7uoMhnJb5 PKOhBhG/dz2X2/tY17c9zryg9ycHjTr4YnPxaSeHeGWHhE1qgx3a6PVLldBZ+//i5CqZCf5WG xQ0ZzdoDxoDuqnHkCRMpnn7eync5ItYZV9PibmUTtHRMk2x9jTKHUG4D7LsPNA1rJasKJjVGH GZMkhGryGhn3zxStFToeRMMtZtEAl8WXlXPf3QEYcifYB/qjyS+1P0bGgCNGq/SC3wdi94Ol2 L7kDdqWOtQFf/SqSo6hXfq1hCWCzocA/4pReycx3irsYWzdopCIq2qoOcqDMlLPdfjrqKpg8V AcB3IJ9XudK8BE0c8rtK1NTItG03toEtlml0z7jsXjPxSBQYd/IfCqYP/dSaY7j/v76ZycBqx yGQr/r16udsFa1VP X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 212.227.126.135 Subject: [Qemu-devel] [PULL 2/3] linux-user: Define ordinary usbfs ioctls. X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Riku Voipio , Laurent Vivier , =?UTF-8?q?Cortland=20T=C3=B6lva?= Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 From: Cortland T=C3=B6lva Provide ioctl definitions for the generic thunk mechanism to convert most usbfs calls. Calculate arg size at runtime. Signed-off-by: Cortland T=C3=B6lva Reviewed-by: Laurent Vivier Message-Id: <20181008163521.17341-3-cst@tolva.net> Signed-off-by: Laurent Vivier --- linux-user/ioctls.h | 38 ++++++++++++++++++++++++++++++ linux-user/syscall.c | 3 +++ linux-user/syscall_defs.h | 24 +++++++++++++++++++ linux-user/syscall_types.h | 48 ++++++++++++++++++++++++++++++++++++++ 4 files changed, 113 insertions(+) diff --git a/linux-user/ioctls.h b/linux-user/ioctls.h index 586c794639..92f6177f1d 100644 --- a/linux-user/ioctls.h +++ b/linux-user/ioctls.h @@ -131,6 +131,44 @@ IOCTL(FS_IOC_GETFLAGS, IOC_R, MK_PTR(TYPE_INT)) IOCTL(FS_IOC_SETFLAGS, IOC_W, MK_PTR(TYPE_INT)) =20 +#ifdef CONFIG_USBFS + /* USB ioctls */ + IOCTL(USBDEVFS_CONTROL, IOC_RW, + MK_PTR(MK_STRUCT(STRUCT_usbdevfs_ctrltransfer))) + IOCTL(USBDEVFS_BULK, IOC_RW, + MK_PTR(MK_STRUCT(STRUCT_usbdevfs_bulktransfer))) + IOCTL(USBDEVFS_RESETEP, IOC_W, MK_PTR(TYPE_INT)) + IOCTL(USBDEVFS_SETINTERFACE, IOC_W, + MK_PTR(MK_STRUCT(STRUCT_usbdevfs_setinterface))) + IOCTL(USBDEVFS_SETCONFIGURATION, IOC_W, MK_PTR(TYPE_INT)) + IOCTL(USBDEVFS_GETDRIVER, IOC_R, + MK_PTR(MK_STRUCT(STRUCT_usbdevfs_getdriver))) + IOCTL(USBDEVFS_DISCSIGNAL, IOC_W, + MK_PTR(MK_STRUCT(STRUCT_usbdevfs_disconnectsignal))) + IOCTL(USBDEVFS_CLAIMINTERFACE, IOC_W, MK_PTR(TYPE_INT)) + IOCTL(USBDEVFS_RELEASEINTERFACE, IOC_W, MK_PTR(TYPE_INT)) + IOCTL(USBDEVFS_CONNECTINFO, IOC_R, + MK_PTR(MK_STRUCT(STRUCT_usbdevfs_connectinfo))) + IOCTL(USBDEVFS_IOCTL, IOC_RW, MK_PTR(MK_STRUCT(STRUCT_usbdevfs_ioctl))) + IOCTL(USBDEVFS_HUB_PORTINFO, IOC_R, + MK_PTR(MK_STRUCT(STRUCT_usbdevfs_hub_portinfo))) + IOCTL(USBDEVFS_RESET, 0, TYPE_NULL) + IOCTL(USBDEVFS_CLEAR_HALT, IOC_W, MK_PTR(TYPE_INT)) + IOCTL(USBDEVFS_DISCONNECT, 0, TYPE_NULL) + IOCTL(USBDEVFS_CONNECT, 0, TYPE_NULL) + IOCTL(USBDEVFS_CLAIM_PORT, IOC_W, MK_PTR(TYPE_INT)) + IOCTL(USBDEVFS_RELEASE_PORT, IOC_W, MK_PTR(TYPE_INT)) + IOCTL(USBDEVFS_GET_CAPABILITIES, IOC_R, MK_PTR(TYPE_INT)) + IOCTL(USBDEVFS_DISCONNECT_CLAIM, IOC_W, + MK_PTR(MK_STRUCT(STRUCT_usbdevfs_disconnect_claim))) +#ifdef USBDEVFS_DROP_PRIVILEGES + IOCTL(USBDEVFS_DROP_PRIVILEGES, IOC_W, MK_PTR(TYPE_INT)) +#endif +#ifdef USBDEVFS_GET_SPEED + IOCTL(USBDEVFS_GET_SPEED, 0, TYPE_NULL) +#endif +#endif /* CONFIG_USBFS */ + IOCTL(SIOCATMARK, IOC_R, MK_PTR(TYPE_INT)) IOCTL(SIOCGIFNAME, IOC_RW, MK_PTR(TYPE_INT)) IOCTL(SIOCGIFFLAGS, IOC_W | IOC_R, MK_PTR(MK_STRUCT(STRUCT_short_ifreq))) diff --git a/linux-user/syscall.c b/linux-user/syscall.c index d2cc971143..6eb20c14c9 100644 --- a/linux-user/syscall.c +++ b/linux-user/syscall.c @@ -94,6 +94,9 @@ #include #endif #include +#if defined(CONFIG_USBFS) +#include +#endif #include #include #include diff --git a/linux-user/syscall_defs.h b/linux-user/syscall_defs.h index 18d434d6dc..2daa5ebdcc 100644 --- a/linux-user/syscall_defs.h +++ b/linux-user/syscall_defs.h @@ -863,6 +863,30 @@ struct target_pollfd { =20 #define TARGET_FS_IOC_FIEMAP TARGET_IOWR('f',11,struct fiemap) =20 +/* usb ioctls */ +#define TARGET_USBDEVFS_CONTROL TARGET_IOWRU('U', 0) +#define TARGET_USBDEVFS_BULK TARGET_IOWRU('U', 2) +#define TARGET_USBDEVFS_RESETEP TARGET_IORU('U', 3) +#define TARGET_USBDEVFS_SETINTERFACE TARGET_IORU('U', 4) +#define TARGET_USBDEVFS_SETCONFIGURATION TARGET_IORU('U', 5) +#define TARGET_USBDEVFS_GETDRIVER TARGET_IOWU('U', 8) +#define TARGET_USBDEVFS_DISCSIGNAL TARGET_IORU('U', 14) +#define TARGET_USBDEVFS_CLAIMINTERFACE TARGET_IORU('U', 15) +#define TARGET_USBDEVFS_RELEASEINTERFACE TARGET_IORU('U', 16) +#define TARGET_USBDEVFS_CONNECTINFO TARGET_IOWU('U', 17) +#define TARGET_USBDEVFS_IOCTL TARGET_IOWRU('U', 18) +#define TARGET_USBDEVFS_HUB_PORTINFO TARGET_IORU('U', 19) +#define TARGET_USBDEVFS_RESET TARGET_IO('U', 20) +#define TARGET_USBDEVFS_CLEAR_HALT TARGET_IORU('U', 21) +#define TARGET_USBDEVFS_DISCONNECT TARGET_IO('U', 22) +#define TARGET_USBDEVFS_CONNECT TARGET_IO('U', 23) +#define TARGET_USBDEVFS_CLAIM_PORT TARGET_IORU('U', 24) +#define TARGET_USBDEVFS_RELEASE_PORT TARGET_IORU('U', 25) +#define TARGET_USBDEVFS_GET_CAPABILITIES TARGET_IORU('U', 26) +#define TARGET_USBDEVFS_DISCONNECT_CLAIM TARGET_IORU('U', 27) +#define TARGET_USBDEVFS_DROP_PRIVILEGES TARGET_IOWU('U', 30) +#define TARGET_USBDEVFS_GET_SPEED TARGET_IO('U', 31) + /* cdrom commands */ #define TARGET_CDROMPAUSE 0x5301 /* Pause Audio Operation */ #define TARGET_CDROMRESUME 0x5302 /* Resume paused Audio Operation */ diff --git a/linux-user/syscall_types.h b/linux-user/syscall_types.h index 24631b09be..6f64a8bdf7 100644 --- a/linux-user/syscall_types.h +++ b/linux-user/syscall_types.h @@ -266,3 +266,51 @@ STRUCT(blkpg_ioctl_arg, TYPE_INT, /* flags */ TYPE_INT, /* datalen */ TYPE_PTRVOID) /* data */ + +#if defined(CONFIG_USBFS) +/* usb device ioctls */ +STRUCT(usbdevfs_ctrltransfer, + TYPE_CHAR, /* bRequestType */ + TYPE_CHAR, /* bRequest */ + TYPE_SHORT, /* wValue */ + TYPE_SHORT, /* wIndex */ + TYPE_SHORT, /* wLength */ + TYPE_INT, /* timeout */ + TYPE_PTRVOID) /* data */ + +STRUCT(usbdevfs_bulktransfer, + TYPE_INT, /* ep */ + TYPE_INT, /* len */ + TYPE_INT, /* timeout */ + TYPE_PTRVOID) /* data */ + +STRUCT(usbdevfs_setinterface, + TYPE_INT, /* interface */ + TYPE_INT) /* altsetting */ + +STRUCT(usbdevfs_disconnectsignal, + TYPE_INT, /* signr */ + TYPE_PTRVOID) /* context */ + +STRUCT(usbdevfs_getdriver, + TYPE_INT, /* interface */ + MK_ARRAY(TYPE_CHAR, USBDEVFS_MAXDRIVERNAME + 1)) /* driver */ + +STRUCT(usbdevfs_connectinfo, + TYPE_INT, /* devnum */ + TYPE_CHAR) /* slow */ + +STRUCT(usbdevfs_ioctl, + TYPE_INT, /* ifno */ + TYPE_INT, /* ioctl_code */ + TYPE_PTRVOID) /* data */ + +STRUCT(usbdevfs_hub_portinfo, + TYPE_CHAR, /* nports */ + MK_ARRAY(TYPE_CHAR, 127)) /* port */ + +STRUCT(usbdevfs_disconnect_claim, + TYPE_INT, /* interface */ + TYPE_INT, /* flags */ + MK_ARRAY(TYPE_CHAR, USBDEVFS_MAXDRIVERNAME + 1)) /* driver */ +#endif /* CONFIG_USBFS */ --=20 2.17.2 From nobody Sun May 5 11:35:55 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1539951683569849.04814248658; Fri, 19 Oct 2018 05:21:23 -0700 (PDT) Received: from localhost ([::1]:49851 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gDTmM-0008Qv-5j for importer@patchew.org; Fri, 19 Oct 2018 08:21:22 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:35611) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gDTkc-0007Po-5z for qemu-devel@nongnu.org; Fri, 19 Oct 2018 08:19:38 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1gDTkW-00006Y-F5 for qemu-devel@nongnu.org; Fri, 19 Oct 2018 08:19:33 -0400 Received: from mout.kundenserver.de ([212.227.126.134]:52965) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1gDTkV-000869-SV for qemu-devel@nongnu.org; Fri, 19 Oct 2018 08:19:28 -0400 Received: from localhost.localdomain ([78.238.229.36]) by mrelayeu.kundenserver.de (mreue011 [212.227.15.167]) with ESMTPSA (Nemesis) id 1MqsGv-1fr7Mw1dwH-00msFv; Fri, 19 Oct 2018 14:19:15 +0200 Received: from localhost.localdomain ([78.238.229.36]) by mrelayeu.kundenserver.de (mreue011 [212.227.15.167]) with ESMTPSA (Nemesis) id 1MqsGv-1fr7Mw1dwH-00msFv; Fri, 19 Oct 2018 14:19:15 +0200 From: Laurent Vivier To: qemu-devel@nongnu.org Date: Fri, 19 Oct 2018 14:19:10 +0200 Message-Id: <20181019121910.29726-4-laurent@vivier.eu> X-Mailer: git-send-email 2.17.2 In-Reply-To: <20181019121910.29726-1-laurent@vivier.eu> References: <20181019121910.29726-1-laurent@vivier.eu> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-Provags-ID: V03:K1:bpuiXVZFsHAy0XA/1Amimij1F1IcwDWR9kM/JBNSm//NNbSIR/s DWzYrqxMZs08GvWJRIe4VPn/5U/QYihnZcsFJKBsLenBWa5nLLt7IUmdsZg7Pyb4jb8sWNA 7Ivmot3y8KgSsdiQMiM0gbPamcsjPWtH8SAXF7Jv33dMX6pIXLQx3f8Ixb6OdhUq5uKKkBN VpQAFjVxSaxch7v4CKBFw== X-UI-Out-Filterresults: notjunk:1;V01:K0:CDDKgMoGDUg=:Tx0nOZg9M8vZ7e2hRUqd7S BdK3EKXE2cDBGeo4hPlAUiF1zKxXGZMqYoiqo1i3MZcHWvUmxmreWAJaGkcSYBNKXNYHa9uHw /J4ifNjSXbY2kYac2N+DvwEIOdvXJLFWgc5kYKywBRsulHfNRbx+zMjSLZEgIrXWWpT2AKbcz 3wEg0o1P5cINS28mF6/Jv+dG9uwQ43+ul0mU3itnmaNSThZCyvVRIaij9MFnTEncw2JWYGx4S WLx7g4vtSLWLQKMA3HuF4IXqOgGpf3BsZxNRqFkyEK0rBeEM+iVvNw7OK8LRLTzxaQI9wO9ak EbvAMs4MnBpVB0fHzJnOEguvPdDcqC3MZVMiALtvuDEik5TxCepD1J6FDVpUcRlJgdR4YlDNa ZPVzH9IYkKpBcVUv6OcJ6yE/w3a8CYc757o/rqN/11BK7CVmr8pbstCN0qsMVqzthqGe5SFWs d9lHbsenzC++tsCTPuN0jh00jXusP2yh5ZhZikXBViBBCh1uoXsVtxtiiRsaV+NVbIjUQ4WwT m/A1RNx8usD6yd7T8bgcySPwCadQb+Im1csJh2fsS7q/u7MGrDri7auxtVxpHOpvSkt6oehpp jj3XRIlcvK+J4Gmhv3yrLpBpdghlvzXfjshmVxu+2wOw4Tz/AmLHKk4vhC9W3FAISgM/zFT22 aloxijvuClO7W66xA5ruzsZnJFoAiDA8JGqCvEescsjBZsG+zzIgBtqzU5O+HxmAfp7qCXn9H tzDIq9UM4l0g4mRP X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 212.227.126.134 Subject: [Qemu-devel] [PULL 3/3] linux-user: Implement special usbfs ioctls. X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Riku Voipio , Laurent Vivier , =?UTF-8?q?Cortland=20T=C3=B6lva?= Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 From: Cortland T=C3=B6lva Userspace submits a USB Request Buffer to the kernel, optionally discards it, and finally reaps the URB. Thunk buffers from target to host and back. Tested by running an i386 scanner driver on ARMv7 and by running the PowerPC lsusb utility on x86_64. The discardurb ioctl is not exercised in these tests. Signed-off-by: Cortland T=C3=B6lva Message-Id: <20181008163521.17341-4-cst@tolva.net> Signed-off-by: Laurent Vivier --- linux-user/ioctls.h | 8 ++ linux-user/syscall.c | 177 +++++++++++++++++++++++++++++++++++++ linux-user/syscall_defs.h | 4 + linux-user/syscall_types.h | 20 +++++ 4 files changed, 209 insertions(+) diff --git a/linux-user/ioctls.h b/linux-user/ioctls.h index 92f6177f1d..ae8951625f 100644 --- a/linux-user/ioctls.h +++ b/linux-user/ioctls.h @@ -143,6 +143,14 @@ IOCTL(USBDEVFS_SETCONFIGURATION, IOC_W, MK_PTR(TYPE_INT)) IOCTL(USBDEVFS_GETDRIVER, IOC_R, MK_PTR(MK_STRUCT(STRUCT_usbdevfs_getdriver))) + IOCTL_SPECIAL(USBDEVFS_SUBMITURB, IOC_W, do_ioctl_usbdevfs_submiturb, + MK_PTR(MK_STRUCT(STRUCT_usbdevfs_urb))) + IOCTL_SPECIAL(USBDEVFS_DISCARDURB, IOC_RW, do_ioctl_usbdevfs_discardurb, + MK_PTR(MK_STRUCT(STRUCT_usbdevfs_urb))) + IOCTL_SPECIAL(USBDEVFS_REAPURB, IOC_R, do_ioctl_usbdevfs_reapurb, + MK_PTR(TYPE_PTRVOID)) + IOCTL_SPECIAL(USBDEVFS_REAPURBNDELAY, IOC_R, do_ioctl_usbdevfs_reapurb, + MK_PTR(TYPE_PTRVOID)) IOCTL(USBDEVFS_DISCSIGNAL, IOC_W, MK_PTR(MK_STRUCT(STRUCT_usbdevfs_disconnectsignal))) IOCTL(USBDEVFS_CLAIMINTERFACE, IOC_W, MK_PTR(TYPE_INT)) diff --git a/linux-user/syscall.c b/linux-user/syscall.c index 6eb20c14c9..cf4511b0e4 100644 --- a/linux-user/syscall.c +++ b/linux-user/syscall.c @@ -96,6 +96,7 @@ #include #if defined(CONFIG_USBFS) #include +#include #endif #include #include @@ -4199,6 +4200,182 @@ static abi_long do_ioctl_ifconf(const IOCTLEntry *i= e, uint8_t *buf_temp, return ret; } =20 +#if defined(CONFIG_USBFS) +#if HOST_LONG_BITS > 64 +#error USBDEVFS thunks do not support >64 bit hosts yet. +#endif +struct live_urb { + uint64_t target_urb_adr; + uint64_t target_buf_adr; + char *target_buf_ptr; + struct usbdevfs_urb host_urb; +}; + +static GHashTable *usbdevfs_urb_hashtable(void) +{ + static GHashTable *urb_hashtable; + + if (!urb_hashtable) { + urb_hashtable =3D g_hash_table_new(g_int64_hash, g_int64_equal); + } + return urb_hashtable; +} + +static void urb_hashtable_insert(struct live_urb *urb) +{ + GHashTable *urb_hashtable =3D usbdevfs_urb_hashtable(); + g_hash_table_insert(urb_hashtable, urb, urb); +} + +static struct live_urb *urb_hashtable_lookup(uint64_t target_urb_adr) +{ + GHashTable *urb_hashtable =3D usbdevfs_urb_hashtable(); + return g_hash_table_lookup(urb_hashtable, &target_urb_adr); +} + +static void urb_hashtable_remove(struct live_urb *urb) +{ + GHashTable *urb_hashtable =3D usbdevfs_urb_hashtable(); + g_hash_table_remove(urb_hashtable, urb); +} + +static abi_long +do_ioctl_usbdevfs_reapurb(const IOCTLEntry *ie, uint8_t *buf_temp, + int fd, int cmd, abi_long arg) +{ + const argtype usbfsurb_arg_type[] =3D { MK_STRUCT(STRUCT_usbdevfs_urb)= }; + const argtype ptrvoid_arg_type[] =3D { TYPE_PTRVOID, 0, 0 }; + struct live_urb *lurb; + void *argptr; + uint64_t hurb; + int target_size; + uintptr_t target_urb_adr; + abi_long ret; + + target_size =3D thunk_type_size(usbfsurb_arg_type, THUNK_TARGET); + + memset(buf_temp, 0, sizeof(uint64_t)); + ret =3D get_errno(safe_ioctl(fd, ie->host_cmd, buf_temp)); + if (is_error(ret)) { + return ret; + } + + memcpy(&hurb, buf_temp, sizeof(uint64_t)); + lurb =3D (void *)((uintptr_t)hurb - offsetof(struct live_urb, host_urb= )); + if (!lurb->target_urb_adr) { + return -TARGET_EFAULT; + } + urb_hashtable_remove(lurb); + unlock_user(lurb->target_buf_ptr, lurb->target_buf_adr, + lurb->host_urb.buffer_length); + lurb->target_buf_ptr =3D NULL; + + /* restore the guest buffer pointer */ + lurb->host_urb.buffer =3D (void *)(uintptr_t)lurb->target_buf_adr; + + /* update the guest urb struct */ + argptr =3D lock_user(VERIFY_WRITE, lurb->target_urb_adr, target_size, = 0); + if (!argptr) { + g_free(lurb); + return -TARGET_EFAULT; + } + thunk_convert(argptr, &lurb->host_urb, usbfsurb_arg_type, THUNK_TARGET= ); + unlock_user(argptr, lurb->target_urb_adr, target_size); + + target_size =3D thunk_type_size(ptrvoid_arg_type, THUNK_TARGET); + /* write back the urb handle */ + argptr =3D lock_user(VERIFY_WRITE, arg, target_size, 0); + if (!argptr) { + g_free(lurb); + return -TARGET_EFAULT; + } + + /* GHashTable uses 64-bit keys but thunk_convert expects uintptr_t */ + target_urb_adr =3D lurb->target_urb_adr; + thunk_convert(argptr, &target_urb_adr, ptrvoid_arg_type, THUNK_TARGET); + unlock_user(argptr, arg, target_size); + + g_free(lurb); + return ret; +} + +static abi_long +do_ioctl_usbdevfs_discardurb(const IOCTLEntry *ie, + uint8_t *buf_temp __attribute__((unused)), + int fd, int cmd, abi_long arg) +{ + struct live_urb *lurb; + + /* map target address back to host URB with metadata. */ + lurb =3D urb_hashtable_lookup(arg); + if (!lurb) { + return -TARGET_EFAULT; + } + return get_errno(safe_ioctl(fd, ie->host_cmd, &lurb->host_urb)); +} + +static abi_long +do_ioctl_usbdevfs_submiturb(const IOCTLEntry *ie, uint8_t *buf_temp, + int fd, int cmd, abi_long arg) +{ + const argtype *arg_type =3D ie->arg_type; + int target_size; + abi_long ret; + void *argptr; + int rw_dir; + struct live_urb *lurb; + + /* + * each submitted URB needs to map to a unique ID for the + * kernel, and that unique ID needs to be a pointer to + * host memory. hence, we need to malloc for each URB. + * isochronous transfers have a variable length struct. + */ + arg_type++; + target_size =3D thunk_type_size(arg_type, THUNK_TARGET); + + /* construct host copy of urb and metadata */ + lurb =3D g_try_malloc0(sizeof(struct live_urb)); + if (!lurb) { + return -TARGET_ENOMEM; + } + + argptr =3D lock_user(VERIFY_READ, arg, target_size, 1); + if (!argptr) { + g_free(lurb); + return -TARGET_EFAULT; + } + thunk_convert(&lurb->host_urb, argptr, arg_type, THUNK_HOST); + unlock_user(argptr, arg, 0); + + lurb->target_urb_adr =3D arg; + lurb->target_buf_adr =3D (uintptr_t)lurb->host_urb.buffer; + + /* buffer space used depends on endpoint type so lock the entire buffe= r */ + /* control type urbs should check the buffer contents for true directi= on */ + rw_dir =3D lurb->host_urb.endpoint & USB_DIR_IN ? VERIFY_WRITE : VERIF= Y_READ; + lurb->target_buf_ptr =3D lock_user(rw_dir, lurb->target_buf_adr, + lurb->host_urb.buffer_length, 1); + if (lurb->target_buf_ptr =3D=3D NULL) { + g_free(lurb); + return -TARGET_EFAULT; + } + + /* update buffer pointer in host copy */ + lurb->host_urb.buffer =3D lurb->target_buf_ptr; + + ret =3D get_errno(safe_ioctl(fd, ie->host_cmd, &lurb->host_urb)); + if (is_error(ret)) { + unlock_user(lurb->target_buf_ptr, lurb->target_buf_adr, 0); + g_free(lurb); + } else { + urb_hashtable_insert(lurb); + } + + return ret; +} +#endif /* CONFIG_USBFS */ + static abi_long do_ioctl_dm(const IOCTLEntry *ie, uint8_t *buf_temp, int f= d, int cmd, abi_long arg) { diff --git a/linux-user/syscall_defs.h b/linux-user/syscall_defs.h index 2daa5ebdcc..99bbce083c 100644 --- a/linux-user/syscall_defs.h +++ b/linux-user/syscall_defs.h @@ -870,6 +870,10 @@ struct target_pollfd { #define TARGET_USBDEVFS_SETINTERFACE TARGET_IORU('U', 4) #define TARGET_USBDEVFS_SETCONFIGURATION TARGET_IORU('U', 5) #define TARGET_USBDEVFS_GETDRIVER TARGET_IOWU('U', 8) +#define TARGET_USBDEVFS_SUBMITURB TARGET_IORU('U', 10) +#define TARGET_USBDEVFS_DISCARDURB TARGET_IO('U', 11) +#define TARGET_USBDEVFS_REAPURB TARGET_IOWU('U', 12) +#define TARGET_USBDEVFS_REAPURBNDELAY TARGET_IOWU('U', 13) #define TARGET_USBDEVFS_DISCSIGNAL TARGET_IORU('U', 14) #define TARGET_USBDEVFS_CLAIMINTERFACE TARGET_IORU('U', 15) #define TARGET_USBDEVFS_RELEASEINTERFACE TARGET_IORU('U', 16) diff --git a/linux-user/syscall_types.h b/linux-user/syscall_types.h index 6f64a8bdf7..b98a23b0f1 100644 --- a/linux-user/syscall_types.h +++ b/linux-user/syscall_types.h @@ -300,6 +300,26 @@ STRUCT(usbdevfs_connectinfo, TYPE_INT, /* devnum */ TYPE_CHAR) /* slow */ =20 +STRUCT(usbdevfs_iso_packet_desc, + TYPE_INT, /* length */ + TYPE_INT, /* actual_length */ + TYPE_INT) /* status */ + +STRUCT(usbdevfs_urb, + TYPE_CHAR, /* type */ + TYPE_CHAR, /* endpoint */ + TYPE_INT, /* status */ + TYPE_INT, /* flags */ + TYPE_PTRVOID, /* buffer */ + TYPE_INT, /* buffer_length */ + TYPE_INT, /* actual_length */ + TYPE_INT, /* start_frame */ + TYPE_INT, /* union number_of_packets stream_id */ + TYPE_INT, /* error_count */ + TYPE_INT, /* signr */ + TYPE_PTRVOID, /* usercontext */ + MK_ARRAY(MK_STRUCT(STRUCT_usbdevfs_iso_packet_desc), 0)) /* desc */ + STRUCT(usbdevfs_ioctl, TYPE_INT, /* ifno */ TYPE_INT, /* ioctl_code */ --=20 2.17.2