From nobody Wed Nov 29 23:16:10 2023 X-Original-To: dev-commits-src-main@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 4SgZvG2RSMz52Pdw; Wed, 29 Nov 2023 23:16:10 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "R3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4SgZvG1rCBz3CVk; Wed, 29 Nov 2023 23:16:10 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1701299770; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=BbJwe0bUx7u/tfVzowhNYUiHpok2Lde25+HO6hiBDCA=; b=HpfO5J0cZthE0VmYxSZu5145SM2eK0pOMkPSkcneVhem4r0z69igHdpX4MYFFJUl58uDWY T684WrB14+fi0jKVBCHrLRR28lr4QKyzKfTMgvheERY4S/bHdfPrUQfavdtBqQ4dP1vKgs Oe7LM92nBVfvHL+N7tA0kds8Wi+nEX8mQ4dIltJySvZ/UuGA2E/A2bSef2I+IT4+JPSOxL tVK47USFdMzYScYee+rZauSTtT4a3xZH12ZpoGAPDzVdXq2EO/S4G9z/egS83Qk3XgNTe+ KWPtMsKSFV80skyEnT/cnhNQ13lZoH9FlVfPIsjOJ0UQlqOi2MKtSZykyKLK2g== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1701299770; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=BbJwe0bUx7u/tfVzowhNYUiHpok2Lde25+HO6hiBDCA=; b=k9suXVfO0r8sbf9+aFm1aXw9pEtyoOdSwTI/GSnfsFDd81PK+Zc8ypUqyEip+nbKFFqj9P 1oIwynt/+b03FVwAkWMUlqvYtDl2Y0GPJ3Fre5adMniCtj8eZbMSxBmWjFzRAbX6sYYyNS 9OGCJXo3OFeQ2ApF8Atr0OitX6KhfIvQr/s52FmzztFGIEA+b5QNM1WPHjdxAzIHzBr8ZQ XcLhEb2NB9IfO7NM41/lBQZNkkCaHz7OTGRehpm1oo6PfbFN5B1ihBUk8BT1BFeya+ZyhA QMeYk8/X1MEZaIZWFWfbbHuRPK22FSOJEFoWdHSMv2DFn1MQeihMDOM4JXZ/Hg== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1701299770; a=rsa-sha256; cv=none; b=A6IvRt/McOh32Wsg+V9UqULUIi+Js+Rpp0jD3SDYXpEsKqBGOiP4GuBWK5l/EukMAhPvR+ 9WYj10E0AzlkuXkz/Gn6vcKnaRSGQ7hD43qRV1HxDYPGO1M0Rf+Vz7o840E2mUV2bGoYcV WgDzEAG8ZkOtY6UioWx3tv/izQD1KsmQa6x0PWIAR7Jc9LAwba1sxAHxAnOsor7udge8bF 1rsytgrg+YXobrvo2VU2UPXeMnA9cBXCBMz52gkTurg5o9iHikyFF+5BC5Gecrvn++Mrbx LJI980GVvaf6mi81e5xQriSetqFCiGcRVtta173m0fa7fyPWDutktfy1ixNJnQ== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 4SgZvG0vdGz9np; Wed, 29 Nov 2023 23:16:10 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.17.1/8.17.1) with ESMTP id 3ATNGAfw017748; Wed, 29 Nov 2023 23:16:10 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.17.1/8.17.1/Submit) id 3ATNGAwd017745; Wed, 29 Nov 2023 23:16:10 GMT (envelope-from git) Date: Wed, 29 Nov 2023 23:16:10 GMT Message-Id: <202311292316.3ATNGAwd017745@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: "Stephen J. Kiernan" Subject: git: 376330aca184 - main - smbus: add compat32 support for SMB ioctls List-Id: Commit messages for the main branch of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-main List-Help: List-Post: List-Subscribe: List-Unsubscribe: Sender: owner-dev-commits-src-main@freebsd.org X-BeenThere: dev-commits-src-main@freebsd.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: stevek X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: 376330aca1846d0f7771c16604b41bd7f6f1f14c Auto-Submitted: auto-generated The branch main has been updated by stevek: URL: https://cgit.FreeBSD.org/src/commit/?id=376330aca1846d0f7771c16604b41bd7f6f1f14c commit 376330aca1846d0f7771c16604b41bd7f6f1f14c Author: Stephen J. Kiernan AuthorDate: 2023-11-29 19:33:59 +0000 Commit: Stephen J. Kiernan CommitDate: 2023-11-29 23:15:09 +0000 smbus: add compat32 support for SMB ioctls Some of the SMB ioctl request structures contain pointers and need to handle requests from 32-bit applications on 64-bit kernels. Obtained from: Juniper Networks, Inc. Reviewed by: kib Differential Revision: https://reviews.freebsd.org/D42837 --- sys/dev/smbus/smb.c | 142 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 142 insertions(+) diff --git a/sys/dev/smbus/smb.c b/sys/dev/smbus/smb.c index f47fc753bbdc..ee323c835f10 100644 --- a/sys/dev/smbus/smb.c +++ b/sys/dev/smbus/smb.c @@ -2,6 +2,7 @@ * SPDX-License-Identifier: BSD-2-Clause * * Copyright (c) 1998, 2001 Nicolas Souchu + * Copyright (c) 2023 Juniper Networks, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -29,6 +30,7 @@ #include #include #include +#include #include #include #include @@ -41,6 +43,44 @@ #include "smbus_if.h" +#ifdef COMPAT_FREEBSD32 +struct smbcmd32 { + u_char cmd; + u_char reserved; + u_short op; + union { + char byte; + char buf[2]; + short word; + } wdata; + union { + char byte; + char buf[2]; + short word; + } rdata; + int slave; + uint32_t wbuf; + int wcount; + uint32_t rbuf; + int rcount; +}; + +#define SMB_QUICK_WRITE32 _IOW('i', 1, struct smbcmd32) +#define SMB_QUICK_READ32 _IOW('i', 2, struct smbcmd32) +#define SMB_SENDB32 _IOW('i', 3, struct smbcmd32) +#define SMB_RECVB32 _IOWR('i', 4, struct smbcmd32) +#define SMB_WRITEB32 _IOW('i', 5, struct smbcmd32) +#define SMB_WRITEW32 _IOW('i', 6, struct smbcmd32) +#define SMB_READB32 _IOWR('i', 7, struct smbcmd32) +#define SMB_READW32 _IOWR('i', 8, struct smbcmd32) +#define SMB_PCALL32 _IOWR('i', 9, struct smbcmd32) +#define SMB_BWRITE32 _IOW('i', 10, struct smbcmd32) +#define SMB_BREAD32 _IOWR('i', 11, struct smbcmd32) +#define SMB_OLD_READB32 _IOW('i', 7, struct smbcmd32) +#define SMB_OLD_READW32 _IOW('i', 8, struct smbcmd32) +#define SMB_OLD_PCALL32 _IOW('i', 9, struct smbcmd32) +#endif + #define SMB_OLD_READB _IOW('i', 7, struct smbcmd) #define SMB_OLD_READW _IOW('i', 8, struct smbcmd) #define SMB_OLD_PCALL _IOW('i', 9, struct smbcmd) @@ -131,11 +171,30 @@ smb_detach(device_t dev) return (0); } +#ifdef COMPAT_FREEBSD32 +static void +smbcopyincmd32(struct smbcmd32 *uaddr, struct smbcmd *kaddr) +{ + CP(*uaddr, *kaddr, cmd); + CP(*uaddr, *kaddr, op); + CP(*uaddr, *kaddr, wdata.word); + CP(*uaddr, *kaddr, slave); + PTRIN_CP(*uaddr, *kaddr, wbuf); + CP(*uaddr, *kaddr, wcount); + PTRIN_CP(*uaddr, *kaddr, rbuf); + CP(*uaddr, *kaddr, rcount); +} +#endif + static int smbioctl(struct cdev *dev, u_long cmd, caddr_t data, int flags, struct thread *td) { char buf[SMB_MAXBLOCKSIZE]; device_t parent; +#ifdef COMPAT_FREEBSD32 + struct smbcmd sswab; + struct smbcmd32 *s32 = (struct smbcmd32 *)data; +#endif struct smbcmd *s = (struct smbcmd *)data; struct smb_softc *sc = dev->si_drv1; device_t smbdev = sc->sc_dev; @@ -162,35 +221,81 @@ smbioctl(struct cdev *dev, u_long cmd, caddr_t data, int flags, struct thread *t (flags & O_NONBLOCK) ? SMB_DONTWAIT : (SMB_WAIT | SMB_INTR)))) return (error); +#ifdef COMPAT_FREEBSD32 + switch (cmd) { + case SMB_QUICK_WRITE32: + case SMB_QUICK_READ32: + case SMB_SENDB32: + case SMB_RECVB32: + case SMB_WRITEB32: + case SMB_WRITEW32: + case SMB_OLD_READB32: + case SMB_READB32: + case SMB_OLD_READW32: + case SMB_READW32: + case SMB_OLD_PCALL32: + case SMB_PCALL32: + case SMB_BWRITE32: + case SMB_BREAD32: + smbcopyincmd32(s32, &sswab); + s = &sswab; + break; + default: + break; + } +#endif + switch (cmd) { case SMB_QUICK_WRITE: +#ifdef COMPAT_FREEBSD32 + case SMB_QUICK_WRITE32: +#endif error = smbus_error(smbus_quick(parent, s->slave, SMB_QWRITE)); break; case SMB_QUICK_READ: +#ifdef COMPAT_FREEBSD32 + case SMB_QUICK_READ32: +#endif error = smbus_error(smbus_quick(parent, s->slave, SMB_QREAD)); break; case SMB_SENDB: +#ifdef COMPAT_FREEBSD32 + case SMB_SENDB32: +#endif error = smbus_error(smbus_sendb(parent, s->slave, s->cmd)); break; case SMB_RECVB: +#ifdef COMPAT_FREEBSD32 + case SMB_RECVB32: +#endif error = smbus_error(smbus_recvb(parent, s->slave, &s->cmd)); break; case SMB_WRITEB: +#ifdef COMPAT_FREEBSD32 + case SMB_WRITEB32: +#endif error = smbus_error(smbus_writeb(parent, s->slave, s->cmd, s->wdata.byte)); break; case SMB_WRITEW: +#ifdef COMPAT_FREEBSD32 + case SMB_WRITEW32: +#endif error = smbus_error(smbus_writew(parent, s->slave, s->cmd, s->wdata.word)); break; case SMB_OLD_READB: case SMB_READB: +#ifdef COMPAT_FREEBSD32 + case SMB_OLD_READB32: + case SMB_READB32: +#endif /* NB: for SMB_OLD_READB the read data goes to rbuf only. */ error = smbus_error(smbus_readb(parent, s->slave, s->cmd, &s->rdata.byte)); @@ -204,6 +309,10 @@ smbioctl(struct cdev *dev, u_long cmd, caddr_t data, int flags, struct thread *t case SMB_OLD_READW: case SMB_READW: +#ifdef COMPAT_FREEBSD32 + case SMB_OLD_READW32: + case SMB_READW32: +#endif /* NB: for SMB_OLD_READW the read data goes to rbuf only. */ error = smbus_error(smbus_readw(parent, s->slave, s->cmd, &s->rdata.word)); @@ -219,6 +328,10 @@ smbioctl(struct cdev *dev, u_long cmd, caddr_t data, int flags, struct thread *t case SMB_OLD_PCALL: case SMB_PCALL: +#ifdef COMPAT_FREEBSD32 + case SMB_OLD_PCALL32: + case SMB_PCALL32: +#endif /* NB: for SMB_OLD_PCALL the read data goes to rbuf only. */ error = smbus_error(smbus_pcall(parent, s->slave, s->cmd, s->wdata.word, &s->rdata.word)); @@ -234,6 +347,9 @@ smbioctl(struct cdev *dev, u_long cmd, caddr_t data, int flags, struct thread *t break; case SMB_BWRITE: +#ifdef COMPAT_FREEBSD32 + case SMB_BWRITE32: +#endif if (s->wcount < 0) { error = EINVAL; break; @@ -249,6 +365,9 @@ smbioctl(struct cdev *dev, u_long cmd, caddr_t data, int flags, struct thread *t break; case SMB_BREAD: +#ifdef COMPAT_FREEBSD32 + case SMB_BREAD32: +#endif if (s->rcount < 0) { error = EINVAL; break; @@ -268,6 +387,29 @@ smbioctl(struct cdev *dev, u_long cmd, caddr_t data, int flags, struct thread *t error = ENOTTY; } +#ifdef COMPAT_FREEBSD32 + switch (cmd) { + case SMB_RECVB32: + CP(*s, *s32, cmd); + break; + case SMB_OLD_READB32: + case SMB_READB32: + case SMB_OLD_READW32: + case SMB_READW32: + case SMB_OLD_PCALL32: + case SMB_PCALL32: + CP(*s, *s32, rdata.word); + break; + case SMB_BREAD32: + if (s->rbuf == NULL) + CP(*s, *s32, rdata.word); + CP(*s, *s32, rcount); + break; + default: + break; + } +#endif + smbus_release_bus(parent, smbdev); return (error);