From 48c3156500077c687b8fd3e6477218c048e2c529 Mon Sep 17 00:00:00 2001 From: Alexey Dokuchaev Date: Sat, 6 Feb 2021 11:50:32 +0000 Subject: Forward-port ``extra-patch-src-nvidia_ctl.c'' patch to 460.xx branch, I somehow missed it when rebasing other changes. While here, flatten and rename 460-* patches, they do not need %%NVSRC%% substitution. Pointy hat to: danfe --- x11/nvidia-driver/Makefile | 7 ++- .../files/460-patch-src-nvidia-nvidia_ctl.c | 72 ++++++++++++++++++++++ .../files/460-patch-src-nvidia-nvidia_linux.c | 33 ++++++++++ .../files/460-patch-src-nvidia_linux.c.in | 33 ---------- 4 files changed, 109 insertions(+), 36 deletions(-) create mode 100644 x11/nvidia-driver/files/460-patch-src-nvidia-nvidia_ctl.c create mode 100644 x11/nvidia-driver/files/460-patch-src-nvidia-nvidia_linux.c delete mode 100644 x11/nvidia-driver/files/460-patch-src-nvidia_linux.c.in diff --git a/x11/nvidia-driver/Makefile b/x11/nvidia-driver/Makefile index 57f9fbc2c1fa..2f8a05196b36 100644 --- a/x11/nvidia-driver/Makefile +++ b/x11/nvidia-driver/Makefile @@ -13,7 +13,7 @@ PORTNAME= nvidia-driver DISTVERSION?= 460.39 # Always try to set PORTREVISION as it can be overridden by the slave ports -PORTREVISION?= 0 +PORTREVISION?= 1 CATEGORIES= x11 MASTER_SITES= NVIDIA/XFree86/FreeBSD-${ARCH_SUFX}/${DISTVERSION} DISTNAME= NVIDIA-FreeBSD-${ARCH_SUFX}-${DISTVERSION} @@ -72,8 +72,9 @@ EXTRA_PATCHES+= ${FILESDIR}/extra-patch-src_nvidia-modeset_nvidia-modeset-freebs SUB_PATCHES+= extra-patch-src-nvidia_ctl.c \ extra-patch-src-nvidia_linux.c .else -EXTRA_PATCHES+= ${FILESDIR}/460-patch-lib-libGLX_nvidia-Makefile -SUB_PATCHES+= 460-patch-src-nvidia_linux.c +EXTRA_PATCHES+= ${FILESDIR}/460-patch-lib-libGLX_nvidia-Makefile \ + ${FILESDIR}/460-patch-src-nvidia-nvidia_ctl.c \ + ${FILESDIR}/460-patch-src-nvidia-nvidia_linux.c .endif OPTIONS_DEFINE= ACPI_PM LINUX WBINVD DOCS diff --git a/x11/nvidia-driver/files/460-patch-src-nvidia-nvidia_ctl.c b/x11/nvidia-driver/files/460-patch-src-nvidia-nvidia_ctl.c new file mode 100644 index 000000000000..0c48a955d02e --- /dev/null +++ b/x11/nvidia-driver/files/460-patch-src-nvidia-nvidia_ctl.c @@ -0,0 +1,72 @@ +--- src/nvidia/nvidia_ctl.c.orig 2021-01-21 21:50:34 UTC ++++ src/nvidia/nvidia_ctl.c +@@ -13,6 +13,12 @@ + #include "nv.h" + #include "nv-freebsd.h" + ++#ifdef NV_SUPPORT_LINUX_COMPAT /* (COMPAT_LINUX || COMPAT_LINUX32) */ ++#include ++ ++const char nvidia_driver_name[] = "nvidia"; ++#endif ++ + static d_open_t nvidia_ctl_open; + static void nvidia_ctl_dtor(void *arg); + static d_ioctl_t nvidia_ctl_ioctl; +@@ -138,6 +144,18 @@ static int nvidia_ctl_poll( + + int nvidia_ctl_attach(void) + { ++#ifdef NV_SUPPORT_LINUX_COMPAT ++ struct linux_device_handler nvidia_ctl_linux_handler = { ++ .bsd_driver_name = __DECONST(char *, nvidia_driver_name), ++ .linux_driver_name = __DECONST(char *, nvidia_driver_name), ++ .bsd_device_name = __DECONST(char *, nvidia_ctl_cdevsw.d_name), ++ .linux_device_name = __DECONST(char *, nvidia_ctl_cdevsw.d_name), ++ .linux_major = NV_MAJOR_DEVICE_NUMBER, ++ .linux_minor = 255, ++ .linux_char_device = 1 ++ }; ++#endif ++ + if (nvidia_count == 0) { + nvidia_ctl_cdev = make_dev(&nvidia_ctl_cdevsw, + CDEV_CTL_MINOR, +@@ -145,6 +163,10 @@ int nvidia_ctl_attach(void) + "%s", nvidia_ctl_cdevsw.d_name); + if (nvidia_ctl_cdev == NULL) + return ENOMEM; ++ ++#ifdef NV_SUPPORT_LINUX_COMPAT ++ (void)linux_device_register_handler(&nvidia_ctl_linux_handler); ++#endif + } + + nvidia_count++; +@@ -153,10 +175,25 @@ int nvidia_ctl_attach(void) + + int nvidia_ctl_detach(void) + { ++#ifdef NV_SUPPORT_LINUX_COMPAT ++ struct linux_device_handler nvidia_ctl_linux_handler = { ++ .bsd_driver_name = __DECONST(char *, nvidia_driver_name), ++ .linux_driver_name = __DECONST(char *, nvidia_driver_name), ++ .bsd_device_name = __DECONST(char *, nvidia_ctl_cdevsw.d_name), ++ .linux_device_name = __DECONST(char *, nvidia_ctl_cdevsw.d_name), ++ .linux_major = NV_MAJOR_DEVICE_NUMBER, ++ .linux_minor = 255, ++ .linux_char_device = 1 ++ }; ++#endif + nvidia_count--; + +- if (nvidia_count == 0) ++ if (nvidia_count == 0) { ++#ifdef NV_SUPPORT_LINUX_COMPAT ++ (void)linux_device_unregister_handler(&nvidia_ctl_linux_handler); ++#endif + destroy_dev(nvidia_ctl_cdev); ++ } + + return 0; + } diff --git a/x11/nvidia-driver/files/460-patch-src-nvidia-nvidia_linux.c b/x11/nvidia-driver/files/460-patch-src-nvidia-nvidia_linux.c new file mode 100644 index 000000000000..eedc3001c708 --- /dev/null +++ b/x11/nvidia-driver/files/460-patch-src-nvidia-nvidia_linux.c @@ -0,0 +1,33 @@ +--- src/nvidia/nvidia_linux.c.orig 2021-01-21 21:50:34 UTC ++++ src/nvidia/nvidia_linux.c +@@ -35,21 +35,16 @@ int linux_ioctl_nvidia( + struct linux_ioctl_args *args + ) + { +- struct file *fp; +- int error; +- cap_rights_t rights; +- u_long cmd; ++ static const uint32_t dir[4] = { IOC_VOID, IOC_IN, IOC_OUT, IOC_INOUT }; + +- error = fget(td, args->fd, cap_rights_init(&rights, CAP_IOCTL), &fp); +- if (error != 0) +- return error; +- +- cmd = args->cmd; +- +- error = fo_ioctl(fp, cmd, (caddr_t)args->arg, td->td_ucred, td); +- fdrop(fp, td); +- +- return error; ++ if ((args->cmd & (1<<29)) != 0) { ++ /* FreeBSD has only 13 bits to encode the size. */ ++ printf("nvidia: pid %d (%s): ioctl cmd=0x%x size too large\n", ++ (int)td->td_proc->p_pid, td->td_proc->p_comm, args->cmd); ++ return (EINVAL); ++ } ++ args->cmd = (args->cmd & ~IOC_DIRMASK) | dir[args->cmd >> 30]; ++ return (sys_ioctl(td, (struct ioctl_args *)args)); + } + + struct linux_ioctl_handler nvidia_handler = { diff --git a/x11/nvidia-driver/files/460-patch-src-nvidia_linux.c.in b/x11/nvidia-driver/files/460-patch-src-nvidia_linux.c.in deleted file mode 100644 index 083c7a1c1642..000000000000 --- a/x11/nvidia-driver/files/460-patch-src-nvidia_linux.c.in +++ /dev/null @@ -1,33 +0,0 @@ ---- src/%%NVSRC%%/nvidia_linux.c.orig 2017-09-14 20:46:30 UTC -+++ src/%%NVSRC%%/nvidia_linux.c -@@ -35,21 +35,16 @@ int linux_ioctl_nvidia( - struct linux_ioctl_args *args - ) - { -- struct file *fp; -- int error; -- cap_rights_t rights; -- u_long cmd; -+ static const uint32_t dir[4] = { IOC_VOID, IOC_IN, IOC_OUT, IOC_INOUT }; - -- error = fget(td, args->fd, cap_rights_init(&rights, CAP_IOCTL), &fp); -- if (error != 0) -- return error; -- -- cmd = args->cmd; -- -- error = fo_ioctl(fp, cmd, (caddr_t)args->arg, td->td_ucred, td); -- fdrop(fp, td); -- -- return error; -+ if ((args->cmd & (1<<29)) != 0) { -+ /* FreeBSD has only 13 bits to encode the size. */ -+ printf("nvidia: pid %d (%s): ioctl cmd=0x%x size too large\n", -+ (int)td->td_proc->p_pid, td->td_proc->p_comm, args->cmd); -+ return (EINVAL); -+ } -+ args->cmd = (args->cmd & ~IOC_DIRMASK) | dir[args->cmd >> 30]; -+ return (sys_ioctl(td, (struct ioctl_args *)args)); - } - - struct linux_ioctl_handler nvidia_handler = { -- cgit