summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeroen Roovers <jer@gentoo.org>2016-03-25 04:25:26 +0100
committerJeroen Roovers <jer@gentoo.org>2016-03-25 04:25:26 +0100
commit86f03a27b3472a36119caa56cbfba98f498175dd (patch)
treeb7155348ee7f9366b2f191ab9ee38d15f93677e6 /x11-drivers
parentx11-misc/dmenu: Old. (diff)
downloadgentoo-86f03a27b3472a36119caa56cbfba98f498175dd.tar.gz
gentoo-86f03a27b3472a36119caa56cbfba98f498175dd.tar.bz2
gentoo-86f03a27b3472a36119caa56cbfba98f498175dd.zip
x11-drivers/nvidia-drivers: Add 364 PaX patch.
Package-Manager: portage-2.2.28
Diffstat (limited to 'x11-drivers')
-rw-r--r--x11-drivers/nvidia-drivers/files/nvidia-drivers-364.12-pax.patch398
-rw-r--r--x11-drivers/nvidia-drivers/nvidia-drivers-364.12-r1.ebuild2
2 files changed, 399 insertions, 1 deletions
diff --git a/x11-drivers/nvidia-drivers/files/nvidia-drivers-364.12-pax.patch b/x11-drivers/nvidia-drivers/files/nvidia-drivers-364.12-pax.patch
new file mode 100644
index 000000000000..18c316282bc7
--- /dev/null
+++ b/x11-drivers/nvidia-drivers/files/nvidia-drivers-364.12-pax.patch
@@ -0,0 +1,398 @@
+diff -urp work.orig/kernel/common/inc/nv-linux.h work/kernel/common/inc/nv-linux.h
+--- work.orig/kernel/common/inc/nv-linux.h 2016-03-17 03:58:29.000000000 +0100
++++ work/kernel/common/inc/nv-linux.h 2016-03-22 13:51:58.637292065 +0100
+@@ -1307,6 +1307,9 @@ extern void *nvidia_stack_t_cache;
+ #define NV_KMEM_CACHE_CREATE(name, type) \
+ NV_KMEM_CACHE_CREATE_FULL(name, sizeof(type), 0, 0, NULL)
+
++#define NV_KMEM_CACHE_CREATE_USERCOPY(name, type) \
++ NV_KMEM_CACHE_CREATE_FULL(name, sizeof(type), 0, SLAB_USERCOPY, NULL)
++
+ #define NV_KMEM_CACHE_DESTROY(kmem_cache) \
+ kmem_cache_destroy(kmem_cache)
+
+diff -urp work.orig/kernel/common/inc/nv-modeset-interface.h work/kernel/common/inc/nv-modeset-interface.h
+--- work.orig/kernel/common/inc/nv-modeset-interface.h 2016-03-17 03:58:29.000000000 +0100
++++ work/kernel/common/inc/nv-modeset-interface.h 2016-03-22 13:51:58.637292065 +0100
+@@ -72,7 +72,7 @@ typedef struct {
+ * mix nvidia and nvidia-modeset kernel modules from different
+ * releases.
+ */
+- const char *version_string;
++// const char *version_string;
+
+ /*
+ * Allocate and free an nvidia_stack_t to pass into
+@@ -115,6 +115,6 @@ typedef struct {
+
+ } nvidia_modeset_rm_ops_t;
+
+-NV_STATUS nvidia_get_rm_ops(nvidia_modeset_rm_ops_t *rm_ops);
++NV_STATUS nvidia_get_rm_ops(const nvidia_modeset_rm_ops_t **rm_ops, const char **version_string);
+
+ #endif /* _NV_MODESET_INTERFACE_H_ */
+diff -urp work.orig/kernel/common/inc/nv-register-module.h work/kernel/common/inc/nv-register-module.h
+--- work.orig/kernel/common/inc/nv-register-module.h 2016-03-17 03:58:29.000000000 +0100
++++ work/kernel/common/inc/nv-register-module.h 2016-03-22 13:51:58.637292065 +0100
+@@ -34,7 +34,7 @@ typedef struct nvidia_module_s {
+ int (*ioctl)(struct inode *, struct file * file, unsigned int cmd, unsigned long arg);
+ unsigned int (*poll)(struct file * file, poll_table *wait);
+
+-} nvidia_module_t;
++} __do_const nvidia_module_t;
+
+ int nvidia_register_module(nvidia_module_t *);
+ int nvidia_unregister_module(nvidia_module_t *);
+diff -urp work.orig/kernel/nvidia/nv.c work/kernel/nvidia/nv.c
+--- work.orig/kernel/nvidia/nv.c 2016-03-17 03:58:29.000000000 +0100
++++ work/kernel/nvidia/nv.c 2016-03-22 13:51:58.637292065 +0100
+@@ -654,7 +654,7 @@ int __init nvidia_init_module(void)
+ NV_SPIN_LOCK_INIT(&km_lock);
+ #endif
+
+- nvidia_stack_t_cache = NV_KMEM_CACHE_CREATE(nvidia_stack_cache_name,
++ nvidia_stack_t_cache = NV_KMEM_CACHE_CREATE_USERCOPY(nvidia_stack_cache_name,
+ nvidia_stack_t);
+ if (nvidia_stack_t_cache == NULL)
+ {
+diff -urp work.orig/kernel/nvidia/nv-chrdev.c work/kernel/nvidia/nv-chrdev.c
+--- work.orig/kernel/nvidia/nv-chrdev.c 2016-03-17 03:58:29.000000000 +0100
++++ work/kernel/nvidia/nv-chrdev.c 2016-03-22 13:51:58.637292065 +0100
+@@ -20,8 +20,6 @@ int nv_register_chrdev(void *param)
+ {
+ nvidia_module_t *module = (nvidia_module_t *)param;
+
+- module->instance = nv_module_instance;
+-
+ return (nvidia_register_module(module));
+ }
+
+diff -urp work.orig/kernel/nvidia/nv-instance.c work/kernel/nvidia/nv-instance.c
+--- work.orig/kernel/nvidia/nv-instance.c 2016-03-17 03:58:29.000000000 +0100
++++ work/kernel/nvidia/nv-instance.c 2016-03-22 13:51:58.637292065 +0100
+@@ -51,6 +51,7 @@ struct pci_driver nv_pci_driver = {
+ nvidia_module_t nv_fops = {
+ .owner = THIS_MODULE,
+ .module_name = MODULE_NAME,
++ .instance = MODULE_INSTANCE_NUMBER,
+ .open = nvidia_open,
+ .close = nvidia_close,
+ .ioctl = nvidia_ioctl,
+diff -urp work.orig/kernel/nvidia/nv-mmap.c work/kernel/nvidia/nv-mmap.c
+--- work.orig/kernel/nvidia/nv-mmap.c 2016-03-17 03:58:29.000000000 +0100
++++ work/kernel/nvidia/nv-mmap.c 2016-03-22 13:51:58.637292065 +0100
+@@ -113,12 +113,12 @@ nvidia_vma_release(struct vm_area_struct
+ }
+
+ #if defined(NV_VM_OPERATIONS_STRUCT_HAS_ACCESS)
+-static int
++static ssize_t
+ nvidia_vma_access(
+ struct vm_area_struct *vma,
+ unsigned long addr,
+ void *buffer,
+- int length,
++ size_t length,
+ int write
+ )
+ {
+diff -urp work.orig/kernel/nvidia/nv-modeset-interface.c work/kernel/nvidia/nv-modeset-interface.c
+--- work.orig/kernel/nvidia/nv-modeset-interface.c 2016-03-17 03:58:29.000000000 +0100
++++ work/kernel/nvidia/nv-modeset-interface.c 2016-03-22 13:56:37.019870910 +0100
+@@ -100,10 +100,9 @@ static NvU32 nvidia_modeset_enumerate_gp
+ return count;
+ }
+
+-NV_STATUS nvidia_get_rm_ops(nvidia_modeset_rm_ops_t *rm_ops)
++NV_STATUS nvidia_get_rm_ops(const nvidia_modeset_rm_ops_t **rm_ops, const char **version_string)
+ {
+- const nvidia_modeset_rm_ops_t local_rm_ops = {
+- .version_string = NV_VERSION_STRING,
++ static const nvidia_modeset_rm_ops_t local_rm_ops = {
+ .alloc_stack = nvidia_modeset_rm_ops_alloc_stack,
+ .free_stack = nvidia_modeset_rm_ops_free_stack,
+ .get_gpuid_list = nvidia_get_gpuid_list,
+@@ -114,13 +113,13 @@ NV_STATUS nvidia_get_rm_ops(nvidia_modes
+ .set_callbacks = nvidia_modeset_set_callbacks,
+ };
+
+- if (strcmp(rm_ops->version_string, NV_VERSION_STRING) != 0)
++ if (strcmp(*version_string, NV_VERSION_STRING) != 0)
+ {
+- rm_ops->version_string = NV_VERSION_STRING;
++ *version_string = NV_VERSION_STRING;
+ return NV_ERR_GENERIC;
+ }
+
+- *rm_ops = local_rm_ops;
++ *rm_ops = &local_rm_ops;
+
+ return NV_OK;
+ }
+diff -urp work.orig/kernel/nvidia-drm/nvidia-drm-drv.c work/kernel/nvidia-drm/nvidia-drm-drv.c
+--- work.orig/kernel/nvidia-drm/nvidia-drm-drv.c 2016-03-17 03:57:24.000000000 +0100
++++ work/kernel/nvidia-drm/nvidia-drm-drv.c 2016-03-22 14:23:07.084230003 +0100
+@@ -586,7 +586,7 @@ static const struct drm_ioctl_desc nv_dr
+ DRM_CONTROL_ALLOW|DRM_RENDER_ALLOW|DRM_UNLOCKED),
+ };
+
+-static struct drm_driver nv_drm_driver = {
++static drm_driver_no_const nv_drm_driver __read_only = {
+
+ .driver_features = DRIVER_GEM | DRIVER_PRIME | DRIVER_RENDER,
+
+@@ -643,6 +643,7 @@ static void nvidia_update_drm_driver_fea
+ return;
+ }
+
++ pax_open_kernel();
+ nv_drm_driver.driver_features |= DRIVER_MODESET | DRIVER_ATOMIC;
+
+ nv_drm_driver.master_set = nvidia_drm_master_set;
+@@ -651,6 +652,7 @@ static void nvidia_update_drm_driver_fea
+ nv_drm_driver.dumb_create = nvidia_drm_dumb_create;
+ nv_drm_driver.dumb_map_offset = nvidia_drm_dumb_map_offset;
+ nv_drm_driver.dumb_destroy = drm_gem_dumb_destroy;
++ pax_close_kernel();
+
+ #endif /* NV_DRM_ATOMIC_MODESET_AVAILABLE */
+ }
+diff -urp work.orig/kernel/nvidia-modeset/nvidia-modeset-linux.c work/kernel/nvidia-modeset/nvidia-modeset-linux.c
+--- work.orig/kernel/nvidia-modeset/nvidia-modeset-linux.c 2016-03-17 03:57:25.000000000 +0100
++++ work/kernel/nvidia-modeset/nvidia-modeset-linux.c 2016-03-22 13:55:05.208148788 +0100
+@@ -317,29 +317,28 @@ static void nvkms_resume(NvU32 gpuId)
+ * Interface with resman.
+ *************************************************************************/
+
+-static nvidia_modeset_rm_ops_t __rm_ops = { 0 };
++static const nvidia_modeset_rm_ops_t *__rm_ops;
+ static nvidia_modeset_callbacks_t nvkms_rm_callbacks = {
+- nvkms_suspend,
+- nvkms_resume
++ .suspend = nvkms_suspend,
++ .resume = nvkms_resume
+ };
+
+ static int nvkms_alloc_rm(void)
+ {
+ NV_STATUS nvstatus;
+ int ret;
++ const char *version_string = NV_VERSION_STRING;
+
+- __rm_ops.version_string = NV_VERSION_STRING;
+-
+- nvstatus = nvidia_get_rm_ops(&__rm_ops);
++ nvstatus = nvidia_get_rm_ops(&__rm_ops, &version_string);
+
+ if (nvstatus != NV_OK) {
+ printk(KERN_ERR NVKMS_LOG_PREFIX "Version mismatch: "
+ "nvidia.ko(%s) nvidia-modeset.ko(%s)\n",
+- __rm_ops.version_string, NV_VERSION_STRING);
++ version_string, NV_VERSION_STRING);
+ return -EINVAL;
+ }
+
+- ret = __rm_ops.set_callbacks(&nvkms_rm_callbacks);
++ ret = __rm_ops->set_callbacks(&nvkms_rm_callbacks);
+ if (ret < 0) {
+ printk(KERN_ERR NVKMS_LOG_PREFIX "Failed to register callbacks\n");
+ return ret;
+@@ -350,20 +349,20 @@ static int nvkms_alloc_rm(void)
+
+ static void nvkms_free_rm(void)
+ {
+- __rm_ops.set_callbacks(NULL);
++ __rm_ops->set_callbacks(NULL);
+ }
+
+ void NVKMS_API_CALL nvkms_call_rm(void *ops)
+ {
+ nvidia_modeset_stack_ptr stack = NULL;
+
+- if (__rm_ops.alloc_stack(&stack) != 0) {
++ if (__rm_ops->alloc_stack(&stack) != 0) {
+ return;
+ }
+
+- __rm_ops.op(stack, ops);
++ __rm_ops->op(stack, ops);
+
+- __rm_ops.free_stack(stack);
++ __rm_ops->free_stack(stack);
+ }
+
+ /*************************************************************************
+@@ -685,13 +684,13 @@ NvBool NVKMS_API_CALL nvkms_open_gpu(NvU
+ nvidia_modeset_stack_ptr stack = NULL;
+ NvBool ret;
+
+- if (__rm_ops.alloc_stack(&stack) != 0) {
++ if (__rm_ops->alloc_stack(&stack) != 0) {
+ return NV_FALSE;
+ }
+
+- ret = __rm_ops.open_gpu(gpuId, stack) == 0;
++ ret = __rm_ops->open_gpu(gpuId, stack) == 0;
+
+- __rm_ops.free_stack(stack);
++ __rm_ops->free_stack(stack);
+
+ return ret;
+ }
+@@ -700,18 +699,18 @@ void NVKMS_API_CALL nvkms_close_gpu(NvU3
+ {
+ nvidia_modeset_stack_ptr stack = NULL;
+
+- if (__rm_ops.alloc_stack(&stack) != 0) {
++ if (__rm_ops->alloc_stack(&stack) != 0) {
+ return;
+ }
+
+- __rm_ops.close_gpu(gpuId, stack);
++ __rm_ops->close_gpu(gpuId, stack);
+
+- __rm_ops.free_stack(stack);
++ __rm_ops->free_stack(stack);
+ }
+
+ NvU32 NVKMS_API_CALL nvkms_enumerate_gpus(nv_gpu_info_t *gpu_info)
+ {
+- return __rm_ops.enumerate_gpus(gpu_info);
++ return __rm_ops->enumerate_gpus(gpu_info);
+ }
+
+ /*************************************************************************
+diff -urp work.orig/kernel/nvidia-uvm/uvm8_global.c work/kernel/nvidia-uvm/uvm8_global.c
+--- work.orig/kernel/nvidia-uvm/uvm8_global.c 2016-03-17 03:59:59.000000000 +0100
++++ work/kernel/nvidia-uvm/uvm8_global.c 2016-03-22 14:00:03.852089935 +0100
+@@ -33,17 +33,17 @@
+ #include "nv_uvm_interface.h"
+
+ uvm_global_t g_uvm_global;
+-static struct UvmOpsUvmEvents g_exported_uvm8_ops;
++static struct UvmOpsUvmEvents g_exported_uvm8_ops = {
++ .startDevice = NULL,
++ .stopDevice = NULL,
++ .isrTopHalf = uvm8_isr_top_half,
++};
+ static bool g_ops_registered = false;
+
+ static NV_STATUS uvm8_register_callbacks(void)
+ {
+ NV_STATUS status = NV_OK;
+
+- g_exported_uvm8_ops.startDevice = NULL;
+- g_exported_uvm8_ops.stopDevice = NULL;
+- g_exported_uvm8_ops.isrTopHalf = uvm8_isr_top_half;
+-
+ // Register the UVM callbacks with the main GPU driver:
+ status = uvm_rm_locked_call(nvUvmInterfaceRegisterUvmCallbacks(&g_exported_uvm8_ops));
+ if (status != NV_OK)
+diff -urp work.orig/kernel/nvidia-uvm/uvm8_gpu_semaphore.c work/kernel/nvidia-uvm/uvm8_gpu_semaphore.c
+--- work.orig/kernel/nvidia-uvm/uvm8_gpu_semaphore.c 2016-03-17 03:59:59.000000000 +0100
++++ work/kernel/nvidia-uvm/uvm8_gpu_semaphore.c 2016-03-22 13:51:58.641294799 +0100
+@@ -285,7 +285,7 @@ NvU64 uvm_gpu_semaphore_get_gpu_va(uvm_g
+
+ NvU32 uvm_gpu_semaphore_get_payload(uvm_gpu_semaphore_t *semaphore)
+ {
+- return ACCESS_ONCE(*semaphore->payload);
++ return ACCESS_ONCE_RW(*semaphore->payload);
+ }
+
+ void uvm_gpu_semaphore_set_payload(uvm_gpu_semaphore_t *semaphore, NvU32 payload)
+@@ -301,7 +301,7 @@ void uvm_gpu_semaphore_set_payload(uvm_g
+ // being optimized out on non-SMP configs (we need them for interacting with
+ // the GPU correctly even on non-SMP).
+ mb();
+- ACCESS_ONCE(*semaphore->payload) = payload;
++ ACCESS_ONCE_RW(*semaphore->payload) = payload;
+ }
+
+ NV_STATUS uvm_gpu_tracking_semaphore_alloc(uvm_gpu_semaphore_pool_t *pool, uvm_gpu_tracking_semaphore_t *tracking_sem)
+diff -urp work.orig/kernel/nvidia-uvm/uvm8_hal.h work/kernel/nvidia-uvm/uvm8_hal.h
+--- work.orig/kernel/nvidia-uvm/uvm8_hal.h 2016-03-17 03:59:59.000000000 +0100
++++ work/kernel/nvidia-uvm/uvm8_hal.h 2016-03-22 13:55:38.620347598 +0100
+@@ -293,7 +293,7 @@ typedef struct
+ // fault_buffer_ops: id is a hardware class
+ uvm_fault_buffer_hal_t fault_buffer_ops;
+ } u;
+-} uvm_hal_class_ops_t;
++} __do_const uvm_hal_class_ops_t;
+
+ // When UVM next support is enabled support for future chips in the hal is
+ // enabled by providing additional hal table entries below.
+diff -urp work.orig/kernel/nvidia-uvm/uvm8_mmu.h work/kernel/nvidia-uvm/uvm8_mmu.h
+--- work.orig/kernel/nvidia-uvm/uvm8_mmu.h 2016-03-17 03:59:59.000000000 +0100
++++ work/kernel/nvidia-uvm/uvm8_mmu.h 2016-03-22 13:57:44.255581049 +0100
+@@ -24,7 +24,6 @@
+ #ifndef __UVM8_MMU_H__
+ #define __UVM8_MMU_H__
+
+-#include "uvm8_forward_decl.h"
+ #include "uvm8_hal_types.h"
+ #include "uvm8_pmm_gpu.h"
+ #include "uvmtypes.h"
+diff -urp work.orig/kernel/nvidia-uvm/uvm_common.c work/kernel/nvidia-uvm/uvm_common.c
+--- work.orig/kernel/nvidia-uvm/uvm_common.c 2016-03-17 03:59:59.000000000 +0100
++++ work/kernel/nvidia-uvm/uvm_common.c 2016-03-22 13:59:20.045675359 +0100
+@@ -54,7 +54,6 @@
+ #include "uvm8_forward_decl.h"
+
+ static dev_t g_uvmBaseDev;
+-struct UvmOpsUvmEvents g_exportedUvmOps;
+
+ static char* uvm_driver_mode = "lite";
+
+@@ -171,10 +170,16 @@ static NV_STATUS uvmSetupGpuProvider(voi
+ {
+ NV_STATUS status = NV_OK;
+
+- g_exportedUvmOps.startDevice = uvm_gpu_event_start_device;
+- g_exportedUvmOps.stopDevice = uvm_gpu_event_stop_device;
+- if (uvmfull_activated())
+- g_exportedUvmOps.isrTopHalf = uvmfull_isr_top_half;
++ static struct UvmOpsUvmEvents g_exportedUvmOps = {
++ .startDevice = uvm_gpu_event_start_device,
++ .stopDevice = uvm_gpu_event_stop_device,
++ };
++
++ if (uvmfull_activated()) {
++ pax_open_kernel();
++ *(void **)&g_exportedUvmOps.isrTopHalf = uvmfull_isr_top_half;
++ pax_close_kernel();
++ }
+
+ // call RM to exchange the function pointers.
+ status = nvUvmInterfaceRegisterUvmCallbacks(&g_exportedUvmOps);
+diff -urp work.orig/kernel/nvidia-uvm/uvm_full_fault_buffer.h work/kernel/nvidia-uvm/uvm_full_fault_buffer.h
+--- work.orig/kernel/nvidia-uvm/uvm_full_fault_buffer.h 2016-03-17 03:59:59.000000000 +0100
++++ work/kernel/nvidia-uvm/uvm_full_fault_buffer.h 2016-03-22 13:51:58.645297533 +0100
+@@ -31,6 +31,7 @@
+ #define _UVM_FULL_FAULT_BUFFER_H_
+
+ #include "uvmtypes.h"
++#include "linux/compiler.h"
+
+ #define MAXWELL_FAULT_BUFFER_A (0xb069)
+ #define MEM_RD32(a) (*(const volatile NvU32 *)(a))
+@@ -303,7 +304,7 @@ typedef struct
+ NvUvmControlPrefetch_t controlPrefetch;
+ NvUvmTestFaultBufferOverflow_t testFaultBufferOverflow;
+ NvUvmClearFaultBufferOverflow_t clearFaultBufferOverflow;
+-} UvmFaultBufferOps;
++} __no_const UvmFaultBufferOps;
+
+ /******************************************************************************
+ uvmfull_fault_buffer_init
+diff -urp work.orig/kernel/nvidia-uvm/uvm_linux.h work/kernel/nvidia-uvm/uvm_linux.h
+--- work.orig/kernel/nvidia-uvm/uvm_linux.h 2016-03-17 03:59:59.000000000 +0100
++++ work/kernel/nvidia-uvm/uvm_linux.h 2016-03-22 14:09:14.810534336 +0100
+@@ -485,7 +485,7 @@ static inline NvU64 NV_GETTIME(void)
+
+ // WRITE_ONCE/READ_ONCE have incompatible definitions across versions, which produces warnings.
+ // Therefore, we define our own macros
+-#define UVM_WRITE_ONCE(x, val) (ACCESS_ONCE(x) = (val))
++#define UVM_WRITE_ONCE(x, val) (ACCESS_ONCE_RW(x) = (val))
+ #define UVM_READ_ONCE(x) ACCESS_ONCE(x)
+
+ // Added in 3.11
diff --git a/x11-drivers/nvidia-drivers/nvidia-drivers-364.12-r1.ebuild b/x11-drivers/nvidia-drivers/nvidia-drivers-364.12-r1.ebuild
index fa7716c76551..d71ecbfbe309 100644
--- a/x11-drivers/nvidia-drivers/nvidia-drivers-364.12-r1.ebuild
+++ b/x11-drivers/nvidia-drivers/nvidia-drivers-364.12-r1.ebuild
@@ -172,7 +172,7 @@ src_prepare() {
ewarn "Using PAX patches is not supported. You will be asked to"
ewarn "use a standard kernel should you have issues. Should you"
ewarn "need support with these patches, contact the PaX team."
- epatch "${FILESDIR}"/${PN}-361.26-pax.patch
+ epatch "${FILESDIR}"/${PN}-364.12-pax.patch
fi
# Allow user patches so they can support RC kernels and whatever else