git: da309ed47603 - main - pci_iov: Use native types for status ioctl

Kevin Bowling <[email protected]>
Newsgroups gmane.os.freebsd.devel.cvs.src,gmane.os.freebsd.current.scm
Message-ID <[email protected]>
The branch main has been updated by kbowling:

URL: https://cgit.FreeBSD.org/src/commit/?id=da309ed47603a6b55ca75ef392a630c7ea46004f

commit da309ed47603a6b55ca75ef392a630c7ea46004f
Author:     Kevin Bowling <[email protected]>
AuthorDate: 2026-08-09 11:12:04 +0000
Commit:     Kevin Bowling <[email protected]>
CommitDate: 2026-08-09 11:26:58 +0000

    pci_iov: Use native types for status ioctl
    
    IOV_CONFIG and IOV_GET_SCHEMA expose native pointers and size_t
    lengths, and pci_iov has no compat32 ioctl translation.  Using
    fixed-width fields for IOV_GET_STATUS alone does not make the
    interface usable by 32-bit binaries on a 64-bit kernel.  It instead
    complicates otherwise ordinary pointer and length handling.
    
    Use void * and size_t like the existing ioctls.  This also makes the
    %zu diagnostic in iovctl correct on ILP32 and removes the unneeded
    PTRIN conversion.
    
    Fixes:  6f8b3be1fbd6 ("pci: Add SR-IOV status reporting")
---
 sys/dev/pci/pci_iov.c    | 8 ++------
 sys/sys/iov.h            | 8 +++-----
 usr.sbin/iovctl/iovctl.c | 5 ++---
 3 files changed, 7 insertions(+), 14 deletions(-)

diff --git a/sys/dev/pci/pci_iov.c b/sys/dev/pci/pci_iov.c
index 00a9c8e8be72..545d91e372f4 100644
--- a/sys/dev/pci/pci_iov.c
+++ b/sys/dev/pci/pci_iov.c
@@ -27,7 +27,6 @@
 #include <sys/cdefs.h>
 #include "opt_bus.h"
 
-#include <sys/abi_compat.h>
 #include <sys/param.h>
 #include <sys/conf.h>
 #include <sys/kernel.h>
@@ -1109,8 +1108,7 @@ pci_iov_get_schema_ioctl(struct cdev *cdev, struct pci_iov_schema *output)
 {
 	struct pci_devinfo *dinfo;
 	void *packed;
-	size_t size;
-	uint64_t output_len;
+	size_t output_len, size;
 	int error;
 
 	packed = NULL;
@@ -1161,8 +1159,6 @@ pci_iov_get_status_ioctl(struct cdev *cdev, struct pci_iov_status *output)
 
 	status = NULL;
 	packed = NULL;
-	if (output->reserved != 0)
-		return (EINVAL);
 	mtx_lock(&Giant);
 	dinfo = cdev->si_drv1;
 	error = pci_iov_build_status(dinfo, &status);
@@ -1179,7 +1175,7 @@ pci_iov_get_status_ioctl(struct cdev *cdev, struct pci_iov_status *output)
 	output_len = output->len;
 	output->len = size;
 	if (size <= output_len) {
-		error = copyout(packed, PTRIN(output->status), size);
+		error = copyout(packed, output->status, size);
 		if (error != 0)
 			goto out;
 		output->error = 0;
diff --git a/sys/sys/iov.h b/sys/sys/iov.h
index 67a890bba66f..04545c99dec2 100644
--- a/sys/sys/iov.h
+++ b/sys/sys/iov.h
@@ -200,13 +200,11 @@ struct pci_iov_schema
 #define	IOV_STATUS_BOUND_DRIVER_NAME	"bound-driver"
 #define	IOV_STATUS_PASSTHROUGH_NAME	"passthrough"
 
-/* Fixed-width fields keep the ioctl ABI identical for 32-bit callers. */
 struct pci_iov_status
 {
-	uint64_t status;	/* User pointer to the packed nvlist. */
-	uint64_t len;
-	int32_t error;
-	uint32_t reserved;	/* Must be zero. */
+	void *status;		/* Packed nvlist. */
+	size_t len;
+	int error;
 };
 
 /*
diff --git a/usr.sbin/iovctl/iovctl.c b/usr.sbin/iovctl/iovctl.c
index 8938607a61e5..735b30340903 100644
--- a/usr.sbin/iovctl/iovctl.c
+++ b/usr.sbin/iovctl/iovctl.c
@@ -100,15 +100,14 @@ get_status(int fd)
 	buflen = 0;
 	for (;;) {
 		memset(&arg, 0, sizeof(arg));
-		arg.status = (uintptr_t)buf;
+		arg.status = buf;
 		arg.len = buflen;
 		error = ioctl(fd, IOV_GET_STATUS, &arg);
 		if (error != 0)
 			err(1, "Could not fetch SR-IOV status");
 		if (arg.error == 0)
 			break;
-		if (arg.error != EMSGSIZE || arg.len <= buflen ||
-		    arg.len > SIZE_MAX) {
+		if (arg.error != EMSGSIZE || arg.len <= buflen) {
 			errno = arg.error;
 			err(1, "Could not fetch SR-IOV status");
 		}
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.