aboutsummarylogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.SRCINFO57
-rw-r--r--99-nvidia-ignoreabi.conf3
-rw-r--r--PKGBUILD385
-rw-r--r--fourteen.patch322
-rw-r--r--nv-kernel.patchbin0 -> 17800 bytes
-rw-r--r--nvidia-utils.sysusers1
-rw-r--r--nvidia-vgpu-vfio.patch12
-rw-r--r--nvidia.rules6
-rw-r--r--sixteen.patch93
-rw-r--r--twelve.patch260
-rw-r--r--vgpu_unlock.patch1409
11 files changed, 1660 insertions, 888 deletions
diff --git a/.SRCINFO b/.SRCINFO
index 7150f0298aed..d1596e09f5c1 100644
--- a/.SRCINFO
+++ b/.SRCINFO
@@ -1,6 +1,6 @@
pkgbase = nvidia-merged
- pkgver = 460.73.01
- pkgrel = 18
+ pkgver = 510.47.03
+ pkgrel = 1
url = https://krutavshah.github.io/GPU_Virtualization-Wiki/
arch = x86_64
groups = nvidia-merged
@@ -12,38 +12,34 @@ pkgbase = nvidia-merged
source = nvidia-smi
source = nvidia-vgpu.conf
source = vgpu_unlock-rs.conf
- source = twelve.patch
- source = fourteen.patch
- source = sixteen.patch
- source = 99-nvidia-ignoreabi.conf
- source = NVIDIA-Linux-x86_64-460.73.01-grid-vgpu-kvm-v5.run::gdrive://1dCyUteA2MqJaemRKqqTu5oed5mINu9Bw
- source = git+https://github.com/mbilker/vgpu_unlock-rs.git#commit=6541af7
+ source = nv-kernel.patch
+ source = nvidia.rules
+ source = nvidia-utils.sysusers
+ source = nvidia-vgpu-vfio.patch
+ source = vgpu_unlock.patch
+ source = file://NVIDIA-Linux-x86_64-510.47.03-grid.run
+ source = file://NVIDIA-Linux-x86_64-510.47.03-vgpu-kvm.run
+ source = git+https://github.com/mbilker/vgpu_unlock-rs.git#commit=3858f2c
sha256sums = be99ff3def641bb900c2486cce96530394c5dc60548fc4642f19d3a4c784134d
sha256sums = 20676096714ac00d9fc993901ab275e4b0fa3f2eddc937dae395c8f4e8cb543e
sha256sums = 5ea0d9edfcf282cea9b204291716a9a4d6d522ba3a6bc28d78edf505b6dc7949
sha256sums = c85ae100a6c87c12906fd0057b77c0c4190f68434de4bc3bc89348ffc19aed61
- sha256sums = 8c374e9e6053c20b0bcf71faf33adfa2659c1020ce1f38d469b42dd2bbda9749
- sha256sums = affb0b2fde720ee7963746bc7a4eda459b1dd1a8a5650b4ae2de64c9e6cf54f1
- sha256sums = fafcd708e1b0013969ddaaf945ed9ab1878d3e40c00780e77f23f2e7b32f0962
- sha256sums = a5caf3ce59fea2f99643be73412224cf27846bc10f09ba3a4758b05bbbf5fb1d
- sha256sums = 0bc28cf13c1a4d8845c7f8987974e04bd52734321bb8db526c6938530ad12c71
+ sha256sums = 7f6c7ab8bdcff47589306c465906bf950c93a721cb1c01792ca8150530566316
+ sha256sums = 4fbfd461f939f18786e79f8dba5fdb48be9f00f2ff4b1bb2f184dbce42dd6fc3
+ sha256sums = d8d1caa5d72c71c6430c2a0d9ce1a674787e9272ccce28b9d5898ca24e60a167
+ sha256sums = 35bb29a3ea181ceadc6e27e88af863f10a6ba94ea16d9394cea4b50d384d3c47
+ sha256sums = f77f26f609bb6f1eb69d3dc7e84ba704e5c065e424a619ab1460accb8247143f
+ sha256sums = 10f7873893ff558f92bbf0d2e7ec208d652f43f2829e7a307a83d46ac6cb61df
+ sha256sums = 8656a261902e6569a71fbb55229dde8f03383772b6be50044102f250520d846f
sha256sums = SKIP
-pkgname = nvidia-merged
- pkgdesc = NVIDIA drivers for linux; patched for vGPU support w/ Rust unlock
- depends = nvidia-merged-dkms=460.73.01
- depends = nvidia-merged-utils=460.73.01
- optdepends = lib32-nvidia-merged-utils=460.73.01
- optdepends = lib32-opencl-nvidia-merged=460.73.01
- provides = nvidia
-
pkgname = lib32-nvidia-merged-utils
- pkgdesc = NVIDIA drivers utilities; patched for vGPU support w/ Rust unlock (32-bit)
+ pkgdesc = NVIDIA drivers utilities; patched for vGPU support w/ Rust unlock & host DRM output (32-bit)
depends = lib32-zlib
depends = lib32-gcc-libs
depends = lib32-libglvnd
- depends = nvidia-merged-utils=460.73.01
- optdepends = lib32-opencl-nvidia=460.73.01
+ depends = nvidia-merged-utils=510.47.03
+ optdepends = lib32-opencl-nvidia=510.47.03
provides = lib32-vulkan-driver
provides = lib32-opengl-driver
provides = lib32-nvidia-libgl
@@ -60,9 +56,9 @@ pkgname = lib32-opencl-nvidia-merged
conflicts = lib32-opencl-nvidia
pkgname = nvidia-merged-dkms
- pkgdesc = NVIDIA drivers - module sources; patched for vGPU support w/ Rust unlock
+ pkgdesc = NVIDIA drivers - module sources; patched for vGPU support w/ Rust unlock & host DRM output
depends = dkms
- depends = nvidia-merged-utils=460.73.01
+ depends = nvidia-merged-utils=510.47.03
depends = libglvnd
provides = NVIDIA-MODULE
provides = nvidia-dkms
@@ -73,17 +69,17 @@ pkgname = nvidia-merged-settings
depends = gtk3
depends = libxv
depends = libvdpau
- depends = nvidia-merged-utils=460.73.01
+ depends = nvidia-merged-utils=510.47.03
provides = nvidia-settings
pkgname = nvidia-merged-utils
- pkgdesc = NVIDIA drivers utilities; patched for vGPU support w/ Rust unlock
+ pkgdesc = NVIDIA drivers utilities; patched for vGPU support w/ Rust unlock & host DRM output
depends = xorg-server
depends = libglvnd
depends = egl-wayland
- optdepends = nvidia-merged-settings=460.73.01: configuration tool
+ optdepends = nvidia-merged-settings=510.47.03: configuration tool
optdepends = xorg-server-devel: nvidia-xconfig
- optdepends = opencl-nvidia-merged=460.73.01: OpenCL support
+ optdepends = opencl-nvidia-merged=510.47.03: OpenCL support
optdepends = mdevctl: mediated device contfiguration tool
optdepends = libvirt: virtualization engine control interface
provides = vulkan-driver
@@ -92,7 +88,6 @@ pkgname = nvidia-merged-utils
provides = nvidia-utils
provides = vgpu_unlock
conflicts = nvidia-libgl
- replaces = nvidia-libgl
replaces = vgpu_unlock
pkgname = opencl-nvidia-merged
diff --git a/99-nvidia-ignoreabi.conf b/99-nvidia-ignoreabi.conf
deleted file mode 100644
index fdd6fbd4373e..000000000000
--- a/99-nvidia-ignoreabi.conf
+++ /dev/null
@@ -1,3 +0,0 @@
-Section "ServerFlags"
- Option "IgnoreABI" "1"
-EndSection
diff --git a/PKGBUILD b/PKGBUILD
index 1d3c78f3a025..87b5562600ff 100644
--- a/PKGBUILD
+++ b/PKGBUILD
@@ -1,73 +1,91 @@
# Maintainer: Erin Allison <erin@eallison.us>
+# BUILD INSTRUCTIONS:
+# -------------------
+#
+# Please note that distribution of the driver files used in this
+# package may be prohibited by NVIDIA's EULA.
+# Please consult any applicable license agreements prior to
+# usage of this script.
+#
+# You will need to acquire both NVIDIA-Linux-...-grid.run
+# and ...-vgpu-kvm.run, place them in the same directory
+# as this PKGBUILD file, and then run makepkg.
+
+
pkgbase='nvidia-merged'
-pkgname=('nvidia-merged' 'lib32-nvidia-merged-utils' 'lib32-opencl-nvidia-merged' 'nvidia-merged-dkms' 'nvidia-merged-settings' 'nvidia-merged-utils' 'opencl-nvidia-merged')
-pkgver=460.73.01
-pkgrel=18
+pkgname=('lib32-nvidia-merged-utils' 'lib32-opencl-nvidia-merged' 'nvidia-merged-dkms' 'nvidia-merged-settings' 'nvidia-merged-utils' 'opencl-nvidia-merged')
+pkgver=510.47.03
+pkgrel=1
arch=('x86_64')
makedepends=('git' 'rust')
url='https://krutavshah.github.io/GPU_Virtualization-Wiki/'
license=('custom')
options=('!strip')
groups=('nvidia-merged')
-_pkg="NVIDIA-Linux-${CARCH}-${pkgver}-grid-vgpu-kvm-v5"
-_vgpuver=460.73.02
-source=('nvidia-drm-outputclass.conf' 'nvidia-smi' 'nvidia-vgpu.conf' 'vgpu_unlock-rs.conf' 'twelve.patch' 'fourteen.patch' 'sixteen.patch' '99-nvidia-ignoreabi.conf'
- "${_pkg}.run::gdrive://1dCyUteA2MqJaemRKqqTu5oed5mINu9Bw"
- 'git+https://github.com/mbilker/vgpu_unlock-rs.git#commit=6541af7')
+_gridpkg="NVIDIA-Linux-${CARCH}-${pkgver}-grid"
+_vgpupkg="NVIDIA-Linux-${CARCH}-${pkgver}-vgpu-kvm"
+
+DLAGENTS=("file::/usr/bin/echo ${BOLD}${RED} Unable to find %u, please read the PKGBUILD ${ALL_OFF}" $DLAGENTS[@])
+
+source=(
+ 'nvidia-drm-outputclass.conf'
+ 'nvidia-smi'
+ 'nvidia-vgpu.conf'
+ 'vgpu_unlock-rs.conf'
+ 'nv-kernel.patch'
+ 'nvidia.rules'
+ 'nvidia-utils.sysusers'
+ 'nvidia-vgpu-vfio.patch'
+ 'vgpu_unlock.patch'
+ "file://${_gridpkg}.run"
+ "file://${_vgpupkg}.run"
+ 'git+https://github.com/mbilker/vgpu_unlock-rs.git#commit=3858f2c')
sha256sums=('be99ff3def641bb900c2486cce96530394c5dc60548fc4642f19d3a4c784134d'
'20676096714ac00d9fc993901ab275e4b0fa3f2eddc937dae395c8f4e8cb543e'
'5ea0d9edfcf282cea9b204291716a9a4d6d522ba3a6bc28d78edf505b6dc7949'
'c85ae100a6c87c12906fd0057b77c0c4190f68434de4bc3bc89348ffc19aed61'
- '8c374e9e6053c20b0bcf71faf33adfa2659c1020ce1f38d469b42dd2bbda9749'
- 'affb0b2fde720ee7963746bc7a4eda459b1dd1a8a5650b4ae2de64c9e6cf54f1'
- 'fafcd708e1b0013969ddaaf945ed9ab1878d3e40c00780e77f23f2e7b32f0962'
- 'a5caf3ce59fea2f99643be73412224cf27846bc10f09ba3a4758b05bbbf5fb1d'
- '0bc28cf13c1a4d8845c7f8987974e04bd52734321bb8db526c6938530ad12c71'
+ '7f6c7ab8bdcff47589306c465906bf950c93a721cb1c01792ca8150530566316'
+ '4fbfd461f939f18786e79f8dba5fdb48be9f00f2ff4b1bb2f184dbce42dd6fc3'
+ 'd8d1caa5d72c71c6430c2a0d9ce1a674787e9272ccce28b9d5898ca24e60a167'
+ '35bb29a3ea181ceadc6e27e88af863f10a6ba94ea16d9394cea4b50d384d3c47'
+ 'f77f26f609bb6f1eb69d3dc7e84ba704e5c065e424a619ab1460accb8247143f'
+ '10f7873893ff558f92bbf0d2e7ec208d652f43f2829e7a307a83d46ac6cb61df'
+ '8656a261902e6569a71fbb55229dde8f03383772b6be50044102f250520d846f'
'SKIP')
-DLAGENTS=("gdrive::/usr/bin/bash -c cookie=\$(mktemp);id=\$(echo\ %u\ |cut\ -f3\ -d'/');curl\ -qgb\ \"\$cookie\"\ -c\ \"\$cookie\"\ -fLC\ -\ --retry\ 3\ --retry-delay\ 3\ https://drive.google.com/uc?export=download\\\&id=\$id\ -o\ /dev/null;curl\ -qgb\ \"\$cookie\"\ -c\ \"\$cookie\"\ -fLC\ -\ --retry\ 3\ --retry-delay\ 3\ https://drive.google.com/uc?export=download\\\&confirm=\`egrep\ download.+\$id\ \"\$cookie\"|cut\ -f7\`\\\&id=\$id\ -o\ %o")
-
create_links() {
# create soname links
find "$pkgdir" -type f -name '*.so*' ! -path '*xorg/*' -print0 | while read -d $'\0' _lib; do
_soname=$(dirname "${_lib}")/$(readelf -d "${_lib}" | grep -Po 'SONAME.*: \[\K[^]]*' || true)
- _base=$(echo ${_soname} | sed -r 's/(.*).so.*/\1.so/')
+ _base=$(echo ${_soname} | sed -r 's/(.*)\.so.*/\1.so/')
[[ -e "${_soname}" ]] || ln -s $(basename "${_lib}") "${_soname}"
[[ -e "${_base}" ]] || ln -s $(basename "${_soname}") "${_base}"
done
}
prepare() {
- sh "${_pkg}.run" -x
-
- cd "${_pkg}"
-
- sed -i '/Environment=LD_PRELOAD.*/D' init-scripts/systemd/nvidia-vgpud.service
- sed -i '/Environment=LD_PRELOAD.*/D' init-scripts/systemd/nvidia-vgpu-mgr.service
-
- sed -i 's|/usr/bin/vgpu_unlock ||' init-scripts/systemd/nvidia-vgpud.service
- sed -i 's|/usr/bin/vgpu_unlock ||' init-scripts/systemd/nvidia-vgpu-mgr.service
-
- sed -i 's|__UTILS_PATH__|/usr/bin|' nvidia-settings.desktop
- sed -i 's|__PIXMAP_PATH__|/usr/share/pixmaps|' nvidia-settings.desktop
-
- gunzip nvidia-{cuda-mps-control,modprobe,settings,smi,xconfig}.1.gz
-
- cd kernel
-
- mkdir patches
-
- cp "${srcdir}/twelve.patch" patches/
- cp "${srcdir}/fourteen.patch" patches/
- cp "${srcdir}/sixteen.patch" patches/
-
- patch -R -p1 < patches/twelve.patch
-
- sed -i "s/__VERSION_STRING/${pkgver}/" dkms.conf
- sed -i 's/__JOBS/`nproc`/' dkms.conf
- sed -i 's/__DKMS_MODULES//' dkms.conf
- sed -i '$iBUILT_MODULE_NAME[0]="nvidia"\
+ rm -rf "${_gridpkg}" "${_vgpupkg}"
+ sh "${_gridpkg}.run" -x
+ sh "${_vgpupkg}.run" -x
+
+ sed \
+ -e 's|__UTILS_PATH__|/usr/bin|' \
+ -e 's|Icon=.*|Icon=nvidia-settings|' \
+ -i "${_gridpkg}/nvidia-settings.desktop"
+
+ bsdtar -C "${_gridpkg}" -xf "${_gridpkg}/nvidia-persistenced-init.tar.bz2"
+ gunzip "${_gridpkg}"/nvidia-{cuda-mps-control,modprobe,persistenced,settings,smi,xconfig}.1.gz
+
+ sed \
+ -e 's/# VGX_KVM_BUILD parameter.*/\0 \nVGX_KVM_BUILD=1/' \
+ -i "${_gridpkg}/kernel/conftest.sh"
+
+ sed \
+ -e "s/__VERSION_STRING/${pkgver}/" \
+ -e 's/__JOBS/`nproc`/' \
+ -e 's/__DKMS_MODULES//' \
+ -e '$iBUILT_MODULE_NAME[0]="nvidia"\
DEST_MODULE_LOCATION[0]="/kernel/drivers/video"\
BUILT_MODULE_NAME[1]="nvidia-uvm"\
DEST_MODULE_LOCATION[1]="/kernel/drivers/video"\
@@ -76,20 +94,26 @@ DEST_MODULE_LOCATION[2]="/kernel/drivers/video"\
BUILT_MODULE_NAME[3]="nvidia-drm"\
DEST_MODULE_LOCATION[3]="/kernel/drivers/video"\
BUILT_MODULE_NAME[4]="nvidia-vgpu-vfio"\
-DEST_MODULE_LOCATION[4]="/kernel/drivers/video"\
-\
-PATCH[0]="twelve.patch"\
-PATCH_MATCH[0]="^5.1[0123456].*$"\
-PATCH[1]="fourteen.patch"\
-PATCH_MATCH[1]="^5\.1[456].*$"\
-PATCH[2]="sixteen.patch"\
-PATCH_MATCH[2]="^5\.16.*$"' dkms.conf
+DEST_MODULE_LOCATION[4]="/kernel/drivers/video" \
+BUILT_MODULE_NAME[5]="nvidia-peermem"\
+DEST_MODULE_LOCATION[5]="/kernel/drivers/video"' \
+ -e 's/NV_EXCLUDE_BUILD_MODULES/IGNORE_PREEMPT_RT_PRESENCE=1 NV_EXCLUDE_BUILD_MODULES/' \
+ -i "${_gridpkg}/kernel/dkms.conf"
+
+ pushd "${_vgpupkg}"
+ patch -p1 < "${srcdir}/nvidia-vgpu-vfio.patch"
+ popd
+
+ pushd "${_gridpkg}"
+ patch -p1 < "${srcdir}/nv-kernel.patch"
+ patch -p1 < "${srcdir}/vgpu_unlock.patch"
+ popd
}
build() {
cd "${srcdir}/vgpu_unlock-rs"
- cargo build --release
+ cargo build -j `nproc` --release
}
package_opencl-nvidia-merged() {
@@ -99,32 +123,35 @@ package_opencl-nvidia-merged() {
provides=('opencl-driver' 'opencl-nvidia')
conflicts=('opencl-nvidia')
- cd "${_pkg}"
-
# OpenCL
- install -D -m644 nvidia.icd "${pkgdir}/etc/OpenCL/vendors/nvidia.icd"
- install -D -m755 "libnvidia-compiler.so.${pkgver}" "${pkgdir}/usr/lib/libnvidia-compiler.so.${pkgver}"
- install -D -m755 "libnvidia-opencl.so.${pkgver}" "${pkgdir}/usr/lib/libnvidia-opencl.so.${pkgver}"
+ install -D -m644 "${_gridpkg}/nvidia.icd" "${pkgdir}/etc/OpenCL/vendors/nvidia.icd"
+ install -D -m755 "${_gridpkg}/libnvidia-compiler-next.so.${pkgver}" "${pkgdir}/usr/lib/libnvidia-compiler-next.so.${pkgver}"
+ install -D -m755 "${_gridpkg}/libnvidia-compiler.so.${pkgver}" "${pkgdir}/usr/lib/libnvidia-compiler.so.${pkgver}"
+ install -D -m755 "${_gridpkg}/libnvidia-opencl.so.${pkgver}" "${pkgdir}/usr/lib/libnvidia-opencl.so.${pkgver}"
create_links
- install -D -m644 "${srcdir}/${_pkg}/LICENSE" "${pkgdir}/usr/share/licenses/opencl-nvidia"
+ install -D -m644 "${_gridpkg}/LICENSE" "${pkgdir}/usr/share/licenses/$pkgname/LICENSE"
}
package_nvidia-merged-dkms() {
- pkgdesc="NVIDIA drivers - module sources; patched for vGPU support w/ Rust unlock"
+ pkgdesc="NVIDIA drivers - module sources; patched for vGPU support w/ Rust unlock & host DRM output"
depends=('dkms' "nvidia-merged-utils=${pkgver}" 'libglvnd')
provides=('NVIDIA-MODULE' 'nvidia-dkms')
- cd "${_pkg}"
+ install -d -m755 "${pkgdir}/usr/src"
+ cp -dr --no-preserve='ownership' "${_gridpkg}/kernel" "${pkgdir}/usr/src/nvidia-${pkgver}"
- install -dm 755 "${pkgdir}"/usr/src
- cp -dr --no-preserve='ownership' kernel "${pkgdir}/usr/src/nvidia-${pkgver}"
+ install -D -m644 "${_vgpupkg}/kernel/common/inc/nv-vgpu-vfio-interface.h" "${pkgdir}/usr/src/nvidia-${pkgver}/common/inc/nv-vgpu-vfio-interface.h"
+ install -D -m644 "${_vgpupkg}/kernel/nvidia/nv-vgpu-vfio-interface.c" "${pkgdir}/usr/src/nvidia-${pkgver}/nvidia/nv-vgpu-vfio-interface.c"
+ install -D -m644 "${_vgpupkg}/kernel/nvidia/nvidia-sources.Kbuild" "${pkgdir}/usr/src/nvidia-${pkgver}/nvidia/nvidia-sources.Kbuild"
+ cp -dr --no-preserve='ownership' "${_vgpupkg}/kernel/nvidia-vgpu-vfio" "${pkgdir}/usr/src/nvidia-${pkgver}/nvidia-vgpu-vfio"
- echo "blacklist nouveau" |
- install -Dm644 /dev/stdin "${pkgdir}/usr/lib/modprobe.d/nvidia-dkms.conf"
+ echo "blacklist nouveau" | install -D -m644 /dev/stdin "${pkgdir}/usr/lib/modprobe.d/${pkgname}.conf"
+ echo "nvidia-uvm" | install -D -m644 /dev/stdin "${pkgdir}/usr/lib/modules-load.d/${pkgname}.conf"
- install -D -m644 "${srcdir}/${_pkg}/LICENSE" "${pkgdir}/usr/share/licenses/nvidia-dkms"
+ install -D -m644 "${_gridpkg}/LICENSE" "${pkgdir}/usr/share/licenses/$pkgname/LICENSE"
+ install -D -m644 "${_vgpupkg}/LICENSE" "${pkgdir}/usr/share/licenses/$pkgname/VGPU_LICENSE"
}
package_nvidia-merged-settings() {
@@ -132,33 +159,19 @@ package_nvidia-merged-settings() {
depends=('jansson' 'gtk3' 'libxv' 'libvdpau' "nvidia-merged-utils=${pkgver}")
provides=('nvidia-settings')
- cd "${_pkg}"
-
-
- install -D -m755 nvidia-settings "${pkgdir}/usr/bin/nvidia-settings"
- install -D -m644 "libnvidia-gtk3.so.${pkgver}" "${pkgdir}/usr/lib/libnvidia-gtk3.so.${pkgver}"
- install -D -m644 nvidia-settings.1 "${pkgdir}/usr/share/man/man1/nvidia-settings.1"
- install -D -m644 nvidia-settings.png "${pkgdir}/usr/share/pixmaps/nvidia-settings.png"
- install -D -m644 nvidia-settings.desktop "${pkgdir}/usr/share/applications/nvidia-settings.desktop"
+ install -D -m755 "${_gridpkg}/nvidia-settings" "${pkgdir}/usr/bin/nvidia-settings"
+ install -D -m644 "${_gridpkg}/libnvidia-gtk3.so.${pkgver}" "${pkgdir}/usr/lib/libnvidia-gtk3.so.${pkgver}"
+ install -D -m644 "${_gridpkg}/nvidia-settings.1" "${pkgdir}/usr/share/man/man1/nvidia-settings.1"
+ install -D -m644 "${_gridpkg}/nvidia-settings.png" "${pkgdir}/usr/share/pixmaps/nvidia-settings.png"
+ install -D -m644 "${_gridpkg}/nvidia-settings.desktop" "${pkgdir}/usr/share/applications/nvidia-settings.desktop"
create_links
- mkdir -p "${pkgdir}/usr/share/licenses"
- ln -s nvidia-utils "${pkgdir}/usr/share/licenses/nvidia-settings"
-}
-
-package_nvidia-merged() {
- pkgdesc='NVIDIA drivers for linux; patched for vGPU support w/ Rust unlock'
- depends=("nvidia-merged-dkms=${pkgver}" "nvidia-merged-utils=${pkgver}")
- optdepends=("lib32-nvidia-merged-utils=${pkgver}" "lib32-opencl-nvidia-merged=${pkgver}")
- provides=('nvidia')
-
- mkdir -p "${pkgdir}/usr/share/licenses"
- ln -s nvidia-utils "${pkgdir}/usr/share/licenses/nvidia"
+ install -D -m644 "${_gridpkg}/LICENSE" "${pkgdir}/usr/share/licenses/$pkgname/LICENSE"
}
package_nvidia-merged-utils() {
- pkgdesc="NVIDIA drivers utilities; patched for vGPU support w/ Rust unlock"
+ pkgdesc="NVIDIA drivers utilities; patched for vGPU support w/ Rust unlock & host DRM output"
depends=('xorg-server' 'libglvnd' 'egl-wayland')
optdepends=("nvidia-merged-settings=${pkgver}: configuration tool"
'xorg-server-devel: nvidia-xconfig'
@@ -167,116 +180,135 @@ package_nvidia-merged-utils() {
'libvirt: virtualization engine control interface')
conflicts=('nvidia-libgl')
provides=('vulkan-driver' 'opengl-driver' 'nvidia-libgl' 'nvidia-utils' 'vgpu_unlock')
- replaces=('nvidia-libgl' 'vgpu_unlock')
-
- cd "${_pkg}"
+ replaces=('vgpu_unlock')
# X driver
- install -D -m755 nvidia_drv.so "${pkgdir}/usr/lib/xorg/modules/drivers/nvidia_drv.so"
+ install -D -m755 "${_gridpkg}/nvidia_drv.so" "${pkgdir}/usr/lib/xorg/modules/drivers/nvidia_drv.so"
+
+ # Wayland/GBM
+ install -D -m755 "${_gridpkg}/libnvidia-egl-gbm.so.1.1.0" "${pkgdir}/usr/lib/libnvidia-egl-gbm.so.1.1.0"
+ install -D -m644 "${_gridpkg}/15_nvidia_gbm.json" "${pkgdir}/usr/share/egl/egl_external_platform.d/15_nvidia_gbm.json"
+
+ mkdir -p "${pkgdir}/usr/lib/gbm"
+ ln -s "/usr/lib/libnvidia-allocator.so.${pkgver}" "${pkgdir}/usr/lib/gbm/nvidia-drm_gbm.so"
+
+ # firmware
+ install -D -m644 "${_gridpkg}/firmware/gsp.bin" "${pkgdir}/usr/lib/firmware/nvidia/${pkgver}/gsp.bin"
# GLX extension module for X
- install -D -m755 "libglxserver_nvidia.so.${pkgver}" "${pkgdir}/usr/lib/nvidia/xorg/libglxserver_nvidia.so.${pkgver}"
+ install -D -m755 "${_gridpkg}/libglxserver_nvidia.so.${pkgver}" "${pkgdir}/usr/lib/nvidia/xorg/libglxserver_nvidia.so.${pkgver}"
+
# Ensure that X finds glx
ln -s "libglxserver_nvidia.so.${pkgver}" "${pkgdir}/usr/lib/nvidia/xorg/libglxserver_nvidia.so.1"
ln -s "libglxserver_nvidia.so.${pkgver}" "${pkgdir}/usr/lib/nvidia/xorg/libglxserver_nvidia.so"
- install -D -m755 "libGLX_nvidia.so.${pkgver}" "${pkgdir}/usr/lib/libGLX_nvidia.so.${pkgver}"
-
- install -D -m 644 "${srcdir}/99-nvidia-ignoreabi.conf" "${pkgdir}/usr/share/X11/xorg.conf.d/99-nvidia-ignoreabi.conf"
+ install -D -m755 "${_gridpkg}/libGLX_nvidia.so.${pkgver}" "${pkgdir}/usr/lib/libGLX_nvidia.so.${pkgver}"
# OpenGL libraries
- install -D -m755 "libEGL_nvidia.so.${pkgver}" "${pkgdir}/usr/lib/libEGL_nvidia.so.${pkgver}"
- install -D -m755 "libGLESv1_CM_nvidia.so.${pkgver}" "${pkgdir}/usr/lib/libGLESv1_CM_nvidia.so.${pkgver}"
- install -D -m755 "libGLESv2_nvidia.so.${pkgver}" "${pkgdir}/usr/lib/libGLESv2_nvidia.so.${pkgver}"
- install -D -m644 "10_nvidia.json" "${pkgdir}/usr/share/glvnd/egl_vendor.d/10_nvidia.json"
+ install -D -m755 "${_gridpkg}/libEGL_nvidia.so.${pkgver}" "${pkgdir}/usr/lib/libEGL_nvidia.so.${pkgver}"
+ install -D -m755 "${_gridpkg}/libGLESv1_CM_nvidia.so.${pkgver}" "${pkgdir}/usr/lib/libGLESv1_CM_nvidia.so.${pkgver}"
+ install -D -m755 "${_gridpkg}/libGLESv2_nvidia.so.${pkgver}" "${pkgdir}/usr/lib/libGLESv2_nvidia.so.${pkgver}"
+ install -D -m644 "${_gridpkg}/10_nvidia.json" "${pkgdir}/usr/share/glvnd/egl_vendor.d/10_nvidia.json"
# OpenGL core library
- install -D -m755 "libnvidia-glcore.so.${pkgver}" "${pkgdir}/usr/lib/libnvidia-glcore.so.${pkgver}"
- install -D -m755 "libnvidia-eglcore.so.${pkgver}" "${pkgdir}/usr/lib/libnvidia-eglcore.so.${pkgver}"
- install -D -m755 "libnvidia-glsi.so.${pkgver}" "${pkgdir}/usr/lib/libnvidia-glsi.so.${pkgver}"
+ install -D -m755 "${_gridpkg}/libnvidia-glcore.so.${pkgver}" "${pkgdir}/usr/lib/libnvidia-glcore.so.${pkgver}"
+ install -D -m755 "${_gridpkg}/libnvidia-eglcore.so.${pkgver}" "${pkgdir}/usr/lib/libnvidia-eglcore.so.${pkgver}"
+ install -D -m755 "${_gridpkg}/libnvidia-glsi.so.${pkgver}" "${pkgdir}/usr/lib/libnvidia-glsi.so.${pkgver}"
# misc
- install -D -m755 "libnvidia-ifr.so.${pkgver}" "${pkgdir}/usr/lib/libnvidia-ifr.so.${pkgver}"
- install -D -m755 "libnvidia-fbc.so.${pkgver}" "${pkgdir}/usr/lib/libnvidia-fbc.so.${pkgver}"
- install -D -m755 "libnvidia-encode.so.${pkgver}" "${pkgdir}/usr/lib/libnvidia-encode.so.${pkgver}"
- install -D -m755 "libnvidia-cfg.so.${pkgver}" "${pkgdir}/usr/lib/libnvidia-cfg.so.${pkgver}"
- install -D -m755 "libnvidia-ml.so.${pkgver}" "${pkgdir}/usr/lib/libnvidia-ml.so.${pkgver}"
- install -D -m755 "libnvidia-ngx.so.${pkgver}" "${pkgdir}/usr/lib/libnvidia-ngx.so.${pkgver}"
- install -D -m755 "libnvidia-glvkspirv.so.${pkgver}" "${pkgdir}/usr/lib/libnvidia-glvkspirv.so.${pkgver}"
- install -D -m755 "libnvidia-allocator.so.${pkgver}" "${pkgdir}/usr/lib/libnvidia-allocator.so.${pkgver}"
+ install -D -m755 "${_gridpkg}/libnvidia-fbc.so.${pkgver}" "${pkgdir}/usr/lib/libnvidia-fbc.so.${pkgver}"
+ install -D -m755 "${_gridpkg}/libnvidia-encode.so.${pkgver}" "${pkgdir}/usr/lib/libnvidia-encode.so.${pkgver}"
+ install -D -m755 "${_gridpkg}/libnvidia-cfg.so.${pkgver}" "${pkgdir}/usr/lib/libnvidia-cfg.so.${pkgver}"
+ install -D -m755 "${_gridpkg}/libnvidia-ml.so.${pkgver}" "${pkgdir}/usr/lib/libnvidia-ml.so.${pkgver}"
+ install -D -m755 "${_gridpkg}/libnvidia-glvkspirv.so.${pkgver}" "${pkgdir}/usr/lib/libnvidia-glvkspirv.so.${pkgver}"
+ install -D -m755 "${_gridpkg}/libnvidia-allocator.so.${pkgver}" "${pkgdir}/usr/lib/libnvidia-allocator.so.${pkgver}"
+ install -D -m755 "${_gridpkg}/libnvidia-vulkan-producer.so.${pkgver}" "${pkgdir}/usr/lib/libnvidia-vulkan-producer.so.${pkgver}"
+ # Sigh libnvidia-vulkan-producer.so has no SONAME set so create_links doesn't catch it. NVIDIA please fix!
+ ln -s "libnvidia-vulkan-producer.so.${pkgver}" "${pkgdir}/usr/lib/libnvidia-vulkan-producer.so.1"
+ ln -s "libnvidia-vulkan-producer.so.${pkgver}" "${pkgdir}/usr/lib/libnvidia-vulkan-producer.so"
# Vulkan ICD
- install -D -m644 "nvidia_icd.json" "${pkgdir}/usr/share/vulkan/icd.d/nvidia_icd.json"
- install -D -m644 "nvidia_layers.json" "${pkgdir}/usr/share/vulkan/implicit_layer.d/nvidia_layers.json"
+ install -D -m644 "${_gridpkg}/nvidia_icd.json" "${pkgdir}/usr/share/vulkan/icd.d/nvidia_icd.json"
+ install -D -m644 "${_gridpkg}/nvidia_layers.json" "${pkgdir}/usr/share/vulkan/implicit_layer.d/nvidia_layers.json"
# VDPAU
- install -D -m755 "libvdpau_nvidia.so.${pkgver}" "${pkgdir}/usr/lib/vdpau/libvdpau_nvidia.so.${pkgver}"
+ install -D -m755 "${_gridpkg}/libvdpau_nvidia.so.${pkgver}" "${pkgdir}/usr/lib/vdpau/libvdpau_nvidia.so.${pkgver}"
# nvidia-tls library
- install -D -m755 "libnvidia-tls.so.${pkgver}" "${pkgdir}/usr/lib/libnvidia-tls.so.${pkgver}"
+ install -D -m755 "${_gridpkg}/libnvidia-tls.so.${pkgver}" "${pkgdir}/usr/lib/libnvidia-tls.so.${pkgver}"
# CUDA
- install -D -m755 "libcuda.so.${pkgver}" "${pkgdir}/usr/lib/libcuda.so.${pkgver}"
- install -D -m755 "libnvcuvid.so.${pkgver}" "${pkgdir}/usr/lib/libnvcuvid.so.${pkgver}"
+ install -D -m755 "${_gridpkg}/libcuda.so.${pkgver}" "${pkgdir}/usr/lib/libcuda.so.${pkgver}"
+ install -D -m755 "${_gridpkg}/libnvcuvid.so.${pkgver}" "${pkgdir}/usr/lib/libnvcuvid.so.${pkgver}"
# PTX JIT Compiler (Parallel Thread Execution (PTX) is a pseudo-assembly language for CUDA)
- install -D -m755 "libnvidia-ptxjitcompiler.so.${pkgver}" "${pkgdir}/usr/lib/libnvidia-ptxjitcompiler.so.${pkgver}"
+ install -D -m755 "${_gridpkg}/libnvidia-ptxjitcompiler.so.${pkgver}" "${pkgdir}/usr/lib/libnvidia-ptxjitcompiler.so.${pkgver}"
# raytracing
- install -D -m755 "libnvoptix.so.${pkgver}" "${pkgdir}/usr/lib/libnvoptix.so.${pkgver}"
- install -D -m755 "libnvidia-rtcore.so.${pkgver}" "${pkgdir}/usr/lib/libnvidia-rtcore.so.${pkgver}"
- install -D -m755 "libnvidia-cbl.so.${pkgver}" "${pkgdir}/usr/lib/libnvidia-cbl.so.${pkgver}"
+ install -D -m755 "${_gridpkg}/libnvoptix.so.${pkgver}" "${pkgdir}/usr/lib/libnvoptix.so.${pkgver}"
+ install -D -m755 "${_gridpkg}/libnvidia-rtcore.so.${pkgver}" "${pkgdir}/usr/lib/libnvidia-rtcore.so.${pkgver}"
+
+ # NGX
+ install -D -m755 "${_gridpkg}/libnvidia-ngx.so.${pkgver}" "${pkgdir}/usr/lib/libnvidia-ngx.so.${pkgver}"
+ install -D -m755 "${_gridpkg}/nvidia-ngx-updater" "${pkgdir}/usr/bin/nvidia-ngx-updater"
+ install -D -m755 "${_gridpkg}/_nvngx.dll" "${pkgdir}/usr/lib/nvidia/wine/_nvngx.dll"
+ install -D -m755 "${_gridpkg}/nvngx.dll" "${pkgdir}/usr/lib/nvidia/wine/nvngx.dll"
# Optical flow
- install -D -m755 "libnvidia-opticalflow.so.${pkgver}" "${pkgdir}/usr/lib/libnvidia-opticalflow.so.${pkgver}"
+ install -D -m755 "${_gridpkg}/libnvidia-opticalflow.so.${pkgver}" "${pkgdir}/usr/lib/libnvidia-opticalflow.so.${pkgver}"
# vGPU
- install -D -m755 "libnvidia-vgpu.so.${_vgpuver}" "${pkgdir}/usr/lib/libnvidia-vgpu.so.${_vgpuver}"
- install -D -m755 "libnvidia-vgxcfg.so.${_vgpuver}" "${pkgdir}/usr/lib/libnvidia-vgxcfg.so.${_vgpuver}"
+ install -D -m755 "${_vgpupkg}/libnvidia-vgpu.so.${pkgver}" "${pkgdir}/usr/lib/libnvidia-vgpu.so.${pkgver}"
+ install -D -m755 "${_vgpupkg}/libnvidia-vgxcfg.so.${pkgver}" "${pkgdir}/usr/lib/libnvidia-vgxcfg.so.${pkgver}"
# DEBUG
- install -D -m755 nvidia-debugdump "${pkgdir}/usr/bin/nvidia-debugdump"
+ install -D -m755 "${_gridpkg}/nvidia-debugdump" "${pkgdir}/usr/bin/nvidia-debugdump"
# nvidia-xconfig
- install -D -m755 nvidia-xconfig "${pkgdir}/usr/bin/nvidia-xconfig"
- install -D -m644 nvidia-xconfig.1 "${pkgdir}/usr/share/man/man1/nvidia-xconfig.1"
+ install -D -m755 "${_gridpkg}/nvidia-xconfig" "${pkgdir}/usr/bin/nvidia-xconfig"
+ install -D -m644 "${_gridpkg}/nvidia-xconfig.1" "${pkgdir}/usr/share/man/man1/nvidia-xconfig.1"
# nvidia-bug-report
- install -D -m755 nvidia-bug-report.sh "${pkgdir}/usr/bin/nvidia-bug-report.sh"
+ install -D -m755 "${_vgpupkg}/nvidia-bug-report.sh" "${pkgdir}/usr/bin/nvidia-bug-report.sh"
# nvidia-smi
- install -D -m755 nvidia-smi "${pkgdir}/usr/lib/nvidia/nvidia-smi.orig"
- install -D -m644 nvidia-smi.1 "${pkgdir}/usr/share/man/man1/nvidia-smi.1"
+ install -D -m755 "${_gridpkg}/nvidia-smi" "${pkgdir}/usr/lib/nvidia/nvidia-smi.orig"
+ install -D -m644 "${_gridpkg}/nvidia-smi.1" "${pkgdir}/usr/share/man/man1/nvidia-smi.1"
install -D -m755 "${srcdir}/nvidia-smi" "${pkgdir}/usr/bin/nvidia-smi"
# nvidia-vgpu
- install -D -m755 nvidia-vgpud "${pkgdir}/usr/bin/nvidia-vgpud"
- install -D -m755 nvidia-vgpu-mgr "${pkgdir}/usr/bin/nvidia-vgpu-mgr"
- install -D -m644 vgpuConfig.xml "${pkgdir}/usr/share/nvidia/vgpu/vgpuConfig.xml"
- install -D -m644 init-scripts/systemd/nvidia-vgpud.service "${pkgdir}/usr/lib/systemd/system/nvidia-vgpud.service"
- install -D -m644 init-scripts/systemd/nvidia-vgpu-mgr.service "${pkgdir}/usr/lib/systemd/system/nvidia-vgpu-mgr.service"
+ install -D -m755 "${_vgpupkg}/nvidia-vgpud" "${pkgdir}/usr/bin/nvidia-vgpud"
+ install -D -m755 "${_vgpupkg}/nvidia-vgpu-mgr" "${pkgdir}/usr/bin/nvidia-vgpu-mgr"
+ install -D -m644 "${_vgpupkg}/vgpuConfig.xml" "${pkgdir}/usr/share/nvidia/vgpu/vgpuConfig.xml"
+ install -D -m644 "${_vgpupkg}/init-scripts/systemd/nvidia-vgpud.service" "${pkgdir}/usr/lib/systemd/system/nvidia-vgpud.service"
+ install -D -m644 "${_vgpupkg}/init-scripts/systemd/nvidia-vgpu-mgr.service" "${pkgdir}/usr/lib/systemd/system/nvidia-vgpu-mgr.service"
install -D -m644 "${srcdir}/vgpu_unlock-rs.conf" "${pkgdir}/usr/lib/systemd/system/nvidia-vgpud.service.d/30-vgpu_unlock-rs.conf"
install -D -m644 "${srcdir}/vgpu_unlock-rs.conf" "${pkgdir}/usr/lib/systemd/system/nvidia-vgpu-mgr.service.d/30-vgpu_unlock-rs.conf"
install -D -m644 "${srcdir}/nvidia-vgpu.conf" "${pkgdir}/usr/lib/systemd/system/libvirtd.service.d/20-nvidia-vgpu.conf"
# nvidia-cuda-mps
- install -D -m755 nvidia-cuda-mps-server "${pkgdir}/usr/bin/nvidia-cuda-mps-server"
- install -D -m755 nvidia-cuda-mps-control "${pkgdir}/usr/bin/nvidia-cuda-mps-control"
- install -D -m644 nvidia-cuda-mps-control.1 "${pkgdir}/usr/share/man/man1/nvidia-cuda-mps-control.1"
+ install -D -m755 "${_gridpkg}/nvidia-cuda-mps-server" "${pkgdir}/usr/bin/nvidia-cuda-mps-server"
+ install -D -m755 "${_gridpkg}/nvidia-cuda-mps-control" "${pkgdir}/usr/bin/nvidia-cuda-mps-control"
+ install -D -m644 "${_gridpkg}/nvidia-cuda-mps-control.1" "${pkgdir}/usr/share/man/man1/nvidia-cuda-mps-control.1"
# nvidia-modprobe
# This should be removed if nvidia fixed their uvm module!
- install -D -m4755 nvidia-modprobe "${pkgdir}/usr/bin/nvidia-modprobe"
- install -D -m644 nvidia-modprobe.1 "${pkgdir}/usr/share/man/man1/nvidia-modprobe.1"
+ install -D -m4755 "${_gridpkg}/nvidia-modprobe" "${pkgdir}/usr/bin/nvidia-modprobe"
+ install -D -m644 "${_gridpkg}/nvidia-modprobe.1" "${pkgdir}/usr/share/man/man1/nvidia-modprobe.1"
+
+ # nvidia-persistenced
+ install -D -m755 "${_gridpkg}/nvidia-persistenced" "${pkgdir}/usr/bin/nvidia-persistenced"
+ install -D -m644 "${_gridpkg}/nvidia-persistenced.1" "${pkgdir}/usr/share/man/man1/nvidia-persistenced.1"
+ install -D -m644 "${_gridpkg}/nvidia-persistenced-init/systemd/nvidia-persistenced.service.template" "${pkgdir}/usr/lib/systemd/system/nvidia-persistenced.service"
+ sed -i 's/__USER__/nvidia-persistenced/' "${pkgdir}/usr/lib/systemd/system/nvidia-persistenced.service"
# application profiles
- install -D -m644 nvidia-application-profiles-${pkgver}-rc "${pkgdir}/usr/share/nvidia/nvidia-application-profiles-${pkgver}-rc"
- install -D -m644 nvidia-application-profiles-${pkgver}-key-documentation "${pkgdir}/usr/share/nvidia/nvidia-application-profiles-${pkgver}-key-documentation"
+ install -D -m644 "${_gridpkg}/nvidia-application-profiles-${pkgver}-rc" "${pkgdir}/usr/share/nvidia/nvidia-application-profiles-${pkgver}-rc"
+ install -D -m644 "${_gridpkg}/nvidia-application-profiles-${pkgver}-key-documentation" "${pkgdir}/usr/share/nvidia/nvidia-application-profiles-${pkgver}-key-documentation"
- install -D -m644 LICENSE "${pkgdir}/usr/share/licenses/nvidia-utils/LICENSE"
- install -D -m644 README.txt "${pkgdir}/usr/share/doc/nvidia/README"
- install -D -m644 NVIDIA_Changelog "${pkgdir}/usr/share/doc/nvidia/NVIDIA_Changelog"
- cp -r html "${pkgdir}/usr/share/doc/nvidia/"
+ install -D -m644 "${_gridpkg}/README.txt" "${pkgdir}/usr/share/doc/nvidia/README"
+ install -D -m644 "${_gridpkg}/NVIDIA_Changelog" "${pkgdir}/usr/share/doc/nvidia/NVIDIA_Changelog"
+ cp -r "${_gridpkg}/html" "${pkgdir}/usr/share/doc/nvidia/"
ln -s nvidia "${pkgdir}/usr/share/doc/nvidia-utils"
# distro specific files must be installed in /usr/share/X11/xorg.conf.d
@@ -285,60 +317,58 @@ package_nvidia-merged-utils() {
create_links
# vgpu_unlock-rs
- install -D -m755 "${srcdir}/vgpu_unlock-rs/target/release/libvgpu_unlock_rs.so" "${pkgdir}/usr/lib/nvidia/libvgpu_unlock_rs.so"
- install -D -m644 /dev/null "${pkgdir}/etc/vgpu_unlock/profile_override.toml"
+ install -D -m755 "vgpu_unlock-rs/target/release/libvgpu_unlock_rs.so" "${pkgdir}/usr/lib/nvidia/libvgpu_unlock_rs.so"
+
+ install -D -m644 "${_gridpkg}/LICENSE" "${pkgdir}/usr/share/licenses/$pkgname/LICENSE"
+ install -D -m644 "${_vgpupkg}/LICENSE" "${pkgdir}/usr/share/licenses/$pkgname/VGPU_LICENSE"
+ install -D -m644 "vgpu_unlock-rs/LICENSE" "${pkgdir}/usr/share/licenses/$pkgname/VGPU_UNLOCK-RS_LICENSE"
}
package_lib32-nvidia-merged-utils() {
- pkgdesc="NVIDIA drivers utilities; patched for vGPU support w/ Rust unlock (32-bit)"
+ pkgdesc="NVIDIA drivers utilities; patched for vGPU support w/ Rust unlock & host DRM output (32-bit)"
depends=('lib32-zlib' 'lib32-gcc-libs' 'lib32-libglvnd' "nvidia-merged-utils=${pkgver}")
optdepends=("lib32-opencl-nvidia=${pkgver}")
provides=('lib32-vulkan-driver' 'lib32-opengl-driver' 'lib32-nvidia-libgl' 'lib32-nvidia-utils')
replaces=('lib32-nvidia-libgl')
- cd "${_pkg}/32"
-
- install -D -m755 "libGLX_nvidia.so.${pkgver}" "${pkgdir}/usr/lib32/libGLX_nvidia.so.${pkgver}"
+ install -D -m755 "${_gridpkg}/32/libGLX_nvidia.so.${pkgver}" "${pkgdir}/usr/lib32/libGLX_nvidia.so.${pkgver}"
# OpenGL libraries
- install -D -m755 "libEGL_nvidia.so.${pkgver}" "${pkgdir}/usr/lib32/libEGL_nvidia.so.${pkgver}"
- install -D -m755 "libGLESv1_CM_nvidia.so.${pkgver}" "${pkgdir}/usr/lib32/libGLESv1_CM_nvidia.so.${pkgver}"
- install -D -m755 "libGLESv2_nvidia.so.${pkgver}" "${pkgdir}/usr/lib32/libGLESv2_nvidia.so.${pkgver}"
+ install -D -m755 "${_gridpkg}/32/libEGL_nvidia.so.${pkgver}" "${pkgdir}/usr/lib32/libEGL_nvidia.so.${pkgver}"
+ install -D -m755 "${_gridpkg}/32/libGLESv1_CM_nvidia.so.${pkgver}" "${pkgdir}/usr/lib32/libGLESv1_CM_nvidia.so.${pkgver}"
+ install -D -m755 "${_gridpkg}/32/libGLESv2_nvidia.so.${pkgver}" "${pkgdir}/usr/lib32/libGLESv2_nvidia.so.${pkgver}"
# OpenGL core library
- install -D -m755 "libnvidia-glcore.so.${pkgver}" "${pkgdir}/usr/lib32/libnvidia-glcore.so.${pkgver}"
- install -D -m755 "libnvidia-eglcore.so.${pkgver}" "${pkgdir}/usr/lib32/libnvidia-eglcore.so.${pkgver}"
- install -D -m755 "libnvidia-glsi.so.${pkgver}" "${pkgdir}/usr/lib32/libnvidia-glsi.so.${pkgver}"
+ install -D -m755 "${_gridpkg}/32/libnvidia-glcore.so.${pkgver}" "${pkgdir}/usr/lib32/libnvidia-glcore.so.${pkgver}"
+ install -D -m755 "${_gridpkg}/32/libnvidia-eglcore.so.${pkgver}" "${pkgdir}/usr/lib32/libnvidia-eglcore.so.${pkgver}"
+ install -D -m755 "${_gridpkg}/32/libnvidia-glsi.so.${pkgver}" "${pkgdir}/usr/lib32/libnvidia-glsi.so.${pkgver}"
# misc
- install -D -m755 "libnvidia-fbc.so.${pkgver}" "${pkgdir}/usr/lib32/libnvidia-fbc.so.${pkgver}"
- install -D -m755 "libnvidia-ifr.so.${pkgver}" "${pkgdir}/usr/lib32/libnvidia-ifr.so.${pkgver}"
- install -D -m755 "libnvidia-encode.so.${pkgver}" "${pkgdir}/usr/lib32/libnvidia-encode.so.${pkgver}"
- install -D -m755 "libnvidia-ml.so.${pkgver}" "${pkgdir}/usr/lib32/libnvidia-ml.so.${pkgver}"
- install -D -m755 "libnvidia-glvkspirv.so.${pkgver}" "${pkgdir}/usr/lib32/libnvidia-glvkspirv.so.${pkgver}"
- install -D -m755 "libnvidia-allocator.so.${pkgver}" "${pkgdir}/usr/lib32/libnvidia-allocator.so.${pkgver}"
+ install -D -m755 "${_gridpkg}/32/libnvidia-fbc.so.${pkgver}" "${pkgdir}/usr/lib32/libnvidia-fbc.so.${pkgver}"
+ install -D -m755 "${_gridpkg}/32/libnvidia-encode.so.${pkgver}" "${pkgdir}/usr/lib32/libnvidia-encode.so.${pkgver}"
+ install -D -m755 "${_gridpkg}/32/libnvidia-ml.so.${pkgver}" "${pkgdir}/usr/lib32/libnvidia-ml.so.${pkgver}"
+ install -D -m755 "${_gridpkg}/32/libnvidia-glvkspirv.so.${pkgver}" "${pkgdir}/usr/lib32/libnvidia-glvkspirv.so.${pkgver}"
+ install -D -m755 "${_gridpkg}/32/libnvidia-allocator.so.${pkgver}" "${pkgdir}/usr/lib32/libnvidia-allocator.so.${pkgver}"
# VDPAU
- install -D -m755 "libvdpau_nvidia.so.${pkgver}" "${pkgdir}/usr/lib32/vdpau/libvdpau_nvidia.so.${pkgver}"
+ install -D -m755 "${_gridpkg}/32/libvdpau_nvidia.so.${pkgver}" "${pkgdir}/usr/lib32/vdpau/libvdpau_nvidia.so.${pkgver}"
# nvidia-tls library
- install -D -m755 "libnvidia-tls.so.${pkgver}" "${pkgdir}/usr/lib32/libnvidia-tls.so.${pkgver}"
+ install -D -m755 "${_gridpkg}/32/libnvidia-tls.so.${pkgver}" "${pkgdir}/usr/lib32/libnvidia-tls.so.${pkgver}"
# CUDA
- install -D -m755 "libcuda.so.${pkgver}" "${pkgdir}/usr/lib32/libcuda.so.${pkgver}"
- install -D -m755 "libnvcuvid.so.${pkgver}" "${pkgdir}/usr/lib32/libnvcuvid.so.${pkgver}"
+ install -D -m755 "${_gridpkg}/32/libcuda.so.${pkgver}" "${pkgdir}/usr/lib32/libcuda.so.${pkgver}"
+ install -D -m755 "${_gridpkg}/32/libnvcuvid.so.${pkgver}" "${pkgdir}/usr/lib32/libnvcuvid.so.${pkgver}"
# PTX JIT Compiler (Parallel Thread Execution (PTX) is a pseudo-assembly language for CUDA)
- install -D -m755 "libnvidia-ptxjitcompiler.so.${pkgver}" "${pkgdir}/usr/lib32/libnvidia-ptxjitcompiler.so.${pkgver}"
+ install -D -m755 "${_gridpkg}/32/libnvidia-ptxjitcompiler.so.${pkgver}" "${pkgdir}/usr/lib32/libnvidia-ptxjitcompiler.so.${pkgver}"
# Optical flow
- install -D -m755 "libnvidia-opticalflow.so.${pkgver}" "${pkgdir}/usr/lib32/libnvidia-opticalflow.so.${pkgver}"
+ install -D -m755 "${_gridpkg}/32/libnvidia-opticalflow.so.${pkgver}" "${pkgdir}/usr/lib32/libnvidia-opticalflow.so.${pkgver}"
create_links
- rm -rf "${pkgdir}"/usr/{include,share,bin}
- mkdir -p "${pkgdir}/usr/share/licenses"
- ln -s nvidia-utils "${pkgdir}/usr/share/licenses/lib32-nvidia-utils"
+ install -D -m644 "${_gridpkg}/LICENSE" "${pkgdir}/usr/share/licenses/$pkgname/LICENSE"
}
package_lib32-opencl-nvidia-merged() {
@@ -348,14 +378,11 @@ package_lib32-opencl-nvidia-merged() {
provides=('lib32-opencl-driver' 'lib32-opencl-nvidia')
conflicts=('lib32-opencl-nvidia')
- cd "${_pkg}/32"
-
# OpenCL
- install -D -m755 "libnvidia-compiler.so.${pkgver}" "${pkgdir}/usr/lib32/libnvidia-compiler.so.${pkgver}"
- install -D -m755 "libnvidia-opencl.so.${pkgver}" "${pkgdir}/usr/lib32/libnvidia-opencl.so.${pkgver}"
+ install -D -m755 "${_gridpkg}/32/libnvidia-compiler.so.${pkgver}" "${pkgdir}/usr/lib32/libnvidia-compiler.so.${pkgver}"
+ install -D -m755 "${_gridpkg}/32/libnvidia-opencl.so.${pkgver}" "${pkgdir}/usr/lib32/libnvidia-opencl.so.${pkgver}"
create_links
- mkdir -p "${pkgdir}/usr/share/licenses"
- install -D -m644 "${srcdir}/${_pkg}/LICENSE" "${pkgdir}/usr/share/licenses/lib32-opencl-nvidia"
+ install -D -m644 "${_gridpkg}/LICENSE" "${pkgdir}/usr/share/licenses/$pkgname/LICENSE"
}
diff --git a/fourteen.patch b/fourteen.patch
deleted file mode 100644
index 8c20985ad941..000000000000
--- a/fourteen.patch
+++ /dev/null
@@ -1,322 +0,0 @@
---- ./common/inc/nv-time.h
-+++ ./common/inc/nv-time.h
-@@ -205,7 +205,7 @@
- // the requested timeout has expired, loop until less
- // than a jiffie of the desired delay remains.
- //
-- current->state = TASK_INTERRUPTIBLE;
-+ current->__state = TASK_INTERRUPTIBLE;
- do
- {
- schedule_timeout(jiffies);
-
---- ./conftest.sh
-+++ ./conftest.sh
-@@ -4736,17 +4736,47 @@
- #
- VERBOSE=$6
- iommu=CONFIG_VFIO_IOMMU_TYPE1
-- mdev=CONFIG_VFIO_MDEV_DEVICE
-+ mdev=CONFIG_VFIO_MDEV
- kvm=CONFIG_KVM_VFIO
-+ VFIO_IOMMU_PRESENT=0
-+ VFIO_MDEV_DEVICE_PRESENT=0
-+ KVM_PRESENT=0
-
- if [ -n "$VGX_KVM_BUILD" ]; then
-- if (test_configuration_option ${iommu} || test_configuration_option ${iommu}_MODULE) &&
-- (test_configuration_option ${mdev} || test_configuration_option ${mdev}_MODULE) &&
-- (test_configuration_option ${kvm} || test_configuration_option ${kvm}_MODULE); then
-+ if (test_configuration_option ${iommu} || test_configuration_option ${iommu}_MODULE); then
-+ VFIO_IOMMU_PRESENT=1
-+ fi
-+
-+ if (test_configuration_option ${mdev} || test_configuration_option ${mdev}_MODULE); then
-+ VFIO_MDEV_DEVICE_PRESENT=1
-+ fi
-+
-+ if (test_configuration_option ${kvm} || test_configuration_option ${kvm}_MODULE); then
-+ KVM_PRESENT=1
-+ fi
-+
-+ if [ "$VFIO_IOMMU_PRESENT" != "0" ] &&
-+ [ "$VFIO_MDEV_DEVICE_PRESENT" != "0" ] &&
-+ [ "$KVM_PRESENT" != "0" ] ; then
- exit 0
- else
-- echo "The kernel is not running a vGPU on KVM host.";
-+ echo "Below CONFIG options are missing on the kernel for installing";
-+ echo "NVIDIA vGPU driver on KVM host";
-+ if [ "$VFIO_IOMMU_PRESENT" = "0" ]; then
-+ echo "CONFIG_VFIO_IOMMU_TYPE1";
-+ fi
-+
-+ if [ "$VFIO_MDEV_DEVICE_PRESENT" = "0" ]; then
-+ echo "CONFIG_VFIO_MDEV_DEVICE";
-+ fi
-+
-+ if [ "$KVM_PRESENT" = "0" ]; then
-+ echo "CONFIG_KVM";
-+ fi
-+ echo "Please install the kernel with above CONFIG options set, then";
-+ echo "try installing again";
- echo "";
-+
- if [ "$VERBOSE" = "full_output" ]; then
- echo "*** Failed vGPU on KVM sanity check. Bailing out! ***";
- echo "";
-
---- ./Kbuild
-+++ ./Kbuild
-@@ -75,7 +75,7 @@
- EXTRA_CFLAGS += -D__KERNEL__ -DMODULE -DNVRM -DNV_VERSION_STRING=\"460.73.01\" -Wno-unused-function -Wuninitialized -fno-strict-aliasing -mno-red-zone -mcmodel=kernel -DNV_UVM_ENABLE
- EXTRA_CFLAGS += $(call cc-option,-Werror=undef,)
- EXTRA_CFLAGS += -DNV_SPECTRE_V2=$(NV_SPECTRE_V2)
--EXTRA_CFLAGS += -DNV_KERNEL_INTERFACE_LAYER
-+EXTRA_CFLAGS += -DNV_KERNEL_INTERFACE_LAYER -Wfatal-errors
-
- #
- # Detect SGI UV systems and apply system-specific optimizations.
-
---- ./nvidia-drm/nvidia-drm-crtc.c
-+++ ./nvidia-drm/nvidia-drm-crtc.c
-@@ -227,7 +227,7 @@
- }
-
- static int nv_drm_plane_atomic_check(struct drm_plane *plane,
-- struct drm_plane_state *plane_state)
-+ struct drm_atomic_state *plane_state)
- {
- int i;
- struct drm_crtc *crtc;
-@@ -238,7 +238,7 @@
- goto done;
- }
-
-- nv_drm_for_each_crtc_in_state(plane_state->state, crtc, crtc_state, i) {
-+ nv_drm_for_each_crtc_in_state(plane_state, crtc, crtc_state, i) {
- struct nv_drm_crtc_state *nv_crtc_state = to_nv_crtc_state(crtc_state);
- struct NvKmsKapiHeadRequestedConfig *head_req_config =
- &nv_crtc_state->req_config;
-@@ -246,14 +246,14 @@
- &head_req_config->layerRequestedConfig[type];
-
- if (plane->state->crtc == crtc &&
-- plane->state->crtc != plane_state->crtc) {
-+ plane->state->crtc != plane_state->crtcs->ptr) {
- plane_req_config_disable(plane_requested_config);
- continue;
- }
-
-- if (plane_state->crtc == crtc) {
-+ if (plane_state->crtcs->ptr == crtc) {
- plane_req_config_update(plane,
-- plane_state,
-+ plane_state->planes->state,
- plane_requested_config);
-
- if (__is_async_flip_requested(plane, crtc_state)) {
-@@ -276,12 +276,12 @@
- }
-
- static void nv_drm_plane_atomic_update(struct drm_plane *plane,
-- struct drm_plane_state *old_state)
-+ struct drm_atomic_state *old_state)
- {
- }
-
- static void nv_drm_plane_atomic_disable(struct drm_plane *plane,
-- struct drm_plane_state *old_state)
-+ struct drm_atomic_state *old_state)
- {
- }
-
---- ./nvidia-drm/nvidia-drm-drv.c
-+++ ./nvidia-drm/nvidia-drm-drv.c
-@@ -866,7 +866,7 @@
- dev->dev_private = nv_dev;
- nv_dev->dev = dev;
- if (device->bus == &pci_bus_type) {
-- dev->pdev = to_pci_dev(device);
-+ //dev->pdev = to_pci_dev(device);
- }
-
- /* Register DRM device to DRM sub-system */
-
---- ./nvidia-vgpu-vfio/nvidia-vgpu-vfio.c
-+++ ./nvidia-vgpu-vfio/nvidia-vgpu-vfio.c
-@@ -25,6 +25,9 @@
- #include <linux/init.h>
- #include <linux/err.h>
- #include <linux/eventfd.h>
-+#include <uapi/linux/uuid.h>
-+#include <linux/device.h>
-+#include <linux/mdev.h>
- #include "nvstatus.h"
- #include "nv-misc.h"
- #include "nv-linux.h"
-@@ -38,6 +41,25 @@
- struct vgpu_devs vgpu_devices;
- struct phys_devs phys_devices;
-
-+struct mdev_parent {
-+ struct device *dev;
-+ const struct mdev_parent_ops *ops;
-+ struct kref ref;
-+ struct list_head next;
-+ struct kset *mdev_types_kset;
-+ struct list_head type_list;
-+ /* Synchronize device creation/removal with parent unregistration */
-+ struct rw_semaphore unreg_sem;
-+};
-+
-+struct mdev_type {
-+ struct kobject kobj;
-+ struct kobject *devices_kobj;
-+ struct mdev_parent *parent;
-+ struct list_head next;
-+ unsigned int type_group_id;
-+};
-+
- #define SLEEP_TIME_MILLISECONDS 20
- #define VGPU_EXIT_TIMEOUT_MILLISECONDS 5000
- #define WAITQUEUE_TIMEOUT_SECONDS 25000
-@@ -203,8 +225,8 @@
- .remove = nv_vgpu_vfio_destroy,
- .read = nv_vgpu_vfio_read,
- .write = nv_vgpu_vfio_write,
-- .open = nv_vgpu_vfio_open,
-- .release = nv_vgpu_vfio_close,
-+ .open_device = nv_vgpu_vfio_open,
-+ .close_device = nv_vgpu_vfio_close,
- .ioctl = nv_vgpu_vfio_ioctl,
- .mmap = nv_vgpu_vfio_mmap,
- };
-@@ -412,9 +434,9 @@
- return NV_OK;
- }
-
--static ssize_t name_show(struct kobject *kobj, struct device *dev, char *buf)
-+static ssize_t name_show(struct mdev_type *mtype, struct mdev_type_attribute *attr, char *buf)
- {
-- struct pci_dev *pdev = to_pci_dev(dev);
-+ struct pci_dev *pdev = to_pci_dev(mtype->parent->dev);
- struct pci_dev *parent_device;
- NvU32 vgpu_type_id;
- NV_STATUS status;
-@@ -425,7 +447,7 @@
-
- parent_device = pdev;
-
-- if (nv_get_vgpu_type_id(kobj->name, dev, &vgpu_type_id)
-+ if (nv_get_vgpu_type_id(mtype->kobj.name, mtype->parent->dev, &vgpu_type_id)
- == NV_OK)
- status = rm_vgpu_vfio_ops.get_name(parent_device, vgpu_type_id, buf);
- else
-@@ -438,9 +460,9 @@
- }
- MDEV_TYPE_ATTR_RO(name);
-
--static ssize_t description_show(struct kobject *kobj, struct device *dev, char *buf)
-+static ssize_t description_show(struct mdev_type *mtype, struct mdev_type_attribute *attr, char *buf)
- {
-- struct pci_dev *pdev = to_pci_dev(dev);
-+ struct pci_dev *pdev = to_pci_dev(mtype->parent->dev);
- struct pci_dev *parent_device;
- NvU32 vgpu_type_id;
- NV_STATUS status;
-@@ -451,7 +473,7 @@
-
- parent_device = pdev;
-
-- if (nv_get_vgpu_type_id(kobj->name, dev, &vgpu_type_id)
-+ if (nv_get_vgpu_type_id(mtype->kobj.name, mtype->parent->dev, &vgpu_type_id)
- == NV_OK)
- status = rm_vgpu_vfio_ops.get_description(parent_device, vgpu_type_id, buf);
- else
-@@ -464,13 +486,13 @@
- }
- MDEV_TYPE_ATTR_RO(description);
-
--static ssize_t available_instances_show(struct kobject *kobj, struct device *dev, char *buf)
-+static ssize_t available_instances_show(struct mdev_type *t, struct mdev_type_attribute *ta, char *buf)
- {
-- struct pci_dev *pdev = to_pci_dev(dev);
-+ struct pci_dev *pdev = to_pci_dev(t->parent->dev);
- NvU32 vgpu_type_id;
- NV_STATUS status;
-
-- if ((nv_get_vgpu_type_id(kobj->name, dev, &vgpu_type_id)) == NV_OK)
-+ if ((nv_get_vgpu_type_id(t->kobj.name, t->parent->dev, &vgpu_type_id)) == NV_OK)
- status = rm_vgpu_vfio_ops.get_instances(pdev, vgpu_type_id, buf);
- else
- return -EINVAL;
-@@ -482,8 +504,7 @@
- }
- MDEV_TYPE_ATTR_RO(available_instances);
-
--static ssize_t device_api_show(struct kobject *kobj, struct device *dev,
-- char *buf)
-+static ssize_t device_api_show(struct mdev_type *t, struct mdev_type_attribute *ta, char *buf)
- {
- return sprintf(buf, "%s\n",
- VFIO_DEVICE_API_PCI_STRING);
-@@ -578,7 +599,7 @@
- return ret;
- }
-
--static int nv_vgpu_vfio_create(struct kobject *kobj, struct mdev_device *mdev)
-+static int nv_vgpu_vfio_create(struct mdev_device *mdev)
- {
- NV_STATUS status = NV_OK;
- vgpu_dev_t *vgpu_dev = NULL;
-@@ -600,7 +621,7 @@
- if (!pdev)
- return -EINVAL;
-
-- if (nv_get_vgpu_type_id(kobj->name, NV_GET_MDEV_PARENT(mdev), &vgpu_type_id)
-+ if (nv_get_vgpu_type_id(mdev->type->kobj.name, NV_GET_MDEV_PARENT(mdev), &vgpu_type_id)
- != NV_OK)
- {
- ret = -EINVAL;
-@@ -676,12 +697,7 @@
- if (pdev->is_virtfn)
- {
- #if defined(NV_MDEV_SET_IOMMU_DEVICE_PRESENT)
-- ret = mdev_set_iommu_device(NV_GET_MDEV_DEV(mdev), NV_GET_MDEV_PARENT(mdev));
-- if (ret != 0)
-- {
-- NV_VGPU_DEV_LOG(VGPU_ERR, mdev, "Failed to set IOMMU device. ret: %d \n", ret);
-- goto remove_vgpu;
-- }
-+ mdev_set_iommu_device(mdev, NV_GET_MDEV_PARENT(mdev));
- #endif
- }
-
---- ./nvidia-vgpu-vfio/nvidia-vgpu-vfio.h
-+++ ./nvidia-vgpu-vfio/nvidia-vgpu-vfio.h
-@@ -37,7 +37,6 @@
- #include <linux/list.h>
- #include <linux/pci.h>
- #include <linux/sched.h>
--#include <linux/eventfd.h>
-
- struct vgpu_dev_s;
- struct mapping_node_s;
-@@ -52,7 +51,7 @@
- static NV_STATUS nv_vgpu_vfio_validate_map_request(struct mdev_device *, loff_t, NvU64 *,
- NvU64 *, NvU64 *, pgprot_t *, NvBool *);
- static void nv_vgpu_remove(struct pci_dev *);
--static int nv_vgpu_vfio_create(struct kobject *, struct mdev_device *);
-+static int nv_vgpu_vfio_create(struct mdev_device *);
- static int nv_vgpu_vfio_destroy(struct mdev_device *mdev);
- static int nv_vgpu_vfio_open(struct mdev_device *);
- static void nv_vgpu_vfio_close(struct mdev_device *);
-@@ -307,6 +306,7 @@
-
- } intr_info_t;
-
-+
- typedef struct
- {
- NvU64 pending;
diff --git a/nv-kernel.patch b/nv-kernel.patch
new file mode 100644
index 000000000000..9023ebbc6505
--- /dev/null
+++ b/nv-kernel.patch
Binary files differ
diff --git a/nvidia-utils.sysusers b/nvidia-utils.sysusers
new file mode 100644
index 000000000000..71c0608911c2
--- /dev/null
+++ b/nvidia-utils.sysusers
@@ -0,0 +1 @@
+u nvidia-persistenced 143 'NVIDIA Persistence Daemon'
diff --git a/nvidia-vgpu-vfio.patch b/nvidia-vgpu-vfio.patch
new file mode 100644
index 000000000000..0e90986aa30a
--- /dev/null
+++ b/nvidia-vgpu-vfio.patch
@@ -0,0 +1,12 @@
+--- ./kernel/nvidia-vgpu-vfio/nvidia-vgpu-vfio.c 2022-01-24 17:56:30.000000000 -0600
++++ ./kernel/nvidia-vgpu-vfio/nvidia-vgpu-vfio.c 2022-03-24 16:55:31.344084760 -0500
+@@ -206,4 +206,9 @@ struct parent_ops vgpu_fops = {
+ .write = nv_vgpu_vfio_write,
++#if LINUX_VERSION_CODE >= KERNEL_VERSION(5,15,0)
++ .open_device = nv_vgpu_vfio_open,
++ .close_device = nv_vgpu_vfio_close,
++#else
+ .open = nv_vgpu_vfio_open,
+ .release = nv_vgpu_vfio_close,
++#endif
+ .ioctl = nv_vgpu_vfio_ioctl,
diff --git a/nvidia.rules b/nvidia.rules
new file mode 100644
index 000000000000..97218dfd31f7
--- /dev/null
+++ b/nvidia.rules
@@ -0,0 +1,6 @@
+# Make sure device nodes are present even when the DDX is not started for the Wayland/EGLStream case
+KERNEL=="nvidia", RUN+="/usr/bin/bash -c '/usr/bin/mknod -Z -m 666 /dev/nvidiactl c $$(grep nvidia-frontend /proc/devices | cut -d \ -f 1) 255'"
+KERNEL=="nvidia", RUN+="/usr/bin/bash -c 'for i in $$(cat /proc/driver/nvidia/gpus/*/information | grep Minor | cut -d \ -f 4); do /usr/bin/mknod -Z -m 666 /dev/nvidia$${i} c $$(grep nvidia-frontend /proc/devices | cut -d \ -f 1) $${i}; done'"
+KERNEL=="nvidia_modeset", RUN+="/usr/bin/bash -c '/usr/bin/mknod -Z -m 666 /dev/nvidia-modeset c $$(grep nvidia-frontend /proc/devices | cut -d \ -f 1) 254'"
+KERNEL=="nvidia_uvm", RUN+="/usr/bin/bash -c '/usr/bin/mknod -Z -m 666 /dev/nvidia-uvm c $$(grep nvidia-uvm /proc/devices | cut -d \ -f 1) 0'"
+KERNEL=="nvidia_uvm", RUN+="/usr/bin/bash -c '/usr/bin/mknod -Z -m 666 /dev/nvidia-uvm-tools c $$(grep nvidia-uvm /proc/devices | cut -d \ -f 1) 1'"
diff --git a/sixteen.patch b/sixteen.patch
deleted file mode 100644
index 1062ba6af980..000000000000
--- a/sixteen.patch
+++ /dev/null
@@ -1,93 +0,0 @@
-diff --git a/common/inc/nv-misc.h b/common/inc/nv-misc.h
-index cd5ffb9..9e0bf38 100644
---- a/common/inc/nv-misc.h
-+++ b/common/inc/nv-misc.h
-@@ -17,7 +17,7 @@
- #if defined(NV_KERNEL_INTERFACE_LAYER) && defined(__FreeBSD__)
- #include <sys/stddef.h> // NULL
- #else
-- #include <stddef.h> // NULL
-+ #include <linux/stddef.h> // NULL
- #endif
-
- #endif /* _NV_MISC_H_ */
-diff --git a/common/inc/nv.h b/common/inc/nv.h
-index d56e97d..fcd2d2d 100644
---- a/common/inc/nv.h
-+++ b/common/inc/nv.h
-@@ -22,7 +22,7 @@
-
- #include <nvtypes.h>
- #include <nvCpuUuid.h>
--#include <stdarg.h>
-+#include <linux/stdarg.h>
- #include <nv-caps.h>
- #include <nv-ioctl.h>
- #include <nvmisc.h>
-diff --git a/common/inc/os-interface.h b/common/inc/os-interface.h
-index 4d7383b..398fdc8 100644
---- a/common/inc/os-interface.h
-+++ b/common/inc/os-interface.h
-@@ -24,7 +24,7 @@
- * *
- \***************************************************************************/
-
--#include <stdarg.h>
-+#include <linux/stdarg.h>
- #include <nv-kernel-interface-api.h>
- #include <os/nv_memory_type.h>
-
-diff --git a/nvidia-modeset/nvidia-modeset-os-interface.h b/nvidia-modeset/nvidia-modeset-os-interface.h
-index 6e6bfcb..21b5635 100644
---- a/nvidia-modeset/nvidia-modeset-os-interface.h
-+++ b/nvidia-modeset/nvidia-modeset-os-interface.h
-@@ -16,8 +16,8 @@
- #if !defined(_NVIDIA_MODESET_OS_INTERFACE_H_)
- #define _NVIDIA_MODESET_OS_INTERFACE_H_
-
--#include <stddef.h> /* size_t */
--#include <stdarg.h> /* va_list */
-+#include <linux/stddef.h> /* size_t */
-+#include <linux/stdarg.h> /* va_list */
-
- #include "nvtypes.h" /* NvU8 */
-
-diff --git a/nvidia-modeset/nvkms.h b/nvidia-modeset/nvkms.h
-index ff49fdf..aa368a0 100644
---- a/nvidia-modeset/nvkms.h
-+++ b/nvidia-modeset/nvkms.h
-@@ -9,7 +9,7 @@
- #define __NV_KMS_H__
-
- #include "nvtypes.h"
--#include <stddef.h> /* size_t */
-+#include <linux/stddef.h> /* size_t */
-
- #include "nvkms-kapi.h"
-
-diff --git a/nvidia-uvm/uvm_mmu.c b/nvidia-uvm/uvm_mmu.c
-index d7351f0..fcd54bf 100644
---- a/nvidia-uvm/uvm_mmu.c
-+++ b/nvidia-uvm/uvm_mmu.c
-@@ -32,7 +32,7 @@
- #include "uvm_push.h"
- #include "uvm_mem.h"
- #include "uvm_va_space.h"
--#include <stdarg.h>
-+#include <linux/stdarg.h>
-
- // The page tree has 5 levels on pascal, and the root is never freed by a normal 'put' operation
- // which leaves a maximum of 4 levels
-diff --git a/nvidia/export_nvswitch.h b/nvidia/export_nvswitch.h
-index 8902fa0..253e272 100644
---- a/nvidia/export_nvswitch.h
-+++ b/nvidia/export_nvswitch.h
-@@ -28,7 +28,7 @@
- extern "C" {
- #endif
-
--#include <stdarg.h>
-+#include <linux/stdarg.h>
- #include "nvlink_common.h"
- #include "ioctl_common_nvswitch.h"
-
diff --git a/twelve.patch b/twelve.patch
deleted file mode 100644
index 3a268f2f7170..000000000000
--- a/twelve.patch
+++ /dev/null
@@ -1,260 +0,0 @@
---- ./nvidia-vgpu-vfio/nvidia-vgpu-vfio.c
-+++ ./nvidia-vgpu-vfio/nvidia-vgpu-vfio.c
-@@ -24,6 +24,7 @@
- #include <linux/kernel.h>
- #include <linux/init.h>
- #include <linux/err.h>
-+#include <linux/eventfd.h>
- #include "nvstatus.h"
- #include "nv-misc.h"
- #include "nv-linux.h"
-@@ -2666,19 +2667,18 @@
-
- static int vgpu_save_fd(vgpu_dev_t *vgpu_dev, int fd, NvU32 index)
- {
-- struct fd irqfd;
-+ struct eventfd_ctx *evt;
-
-- irqfd = fdget(fd);
-- if (!irqfd.file)
-- return -EBADF;
-+ evt = eventfd_ctx_fdget(fd);
-+ if (IS_ERR(evt))
-+ return PTR_ERR(evt);
-
- if (index == VFIO_PCI_INTX_IRQ_INDEX)
-- vgpu_dev->intr_info.intx_file = irqfd.file;
-- else if (index == VFIO_PCI_MSI_IRQ_INDEX)
-- vgpu_dev->intr_info.msi_file = irqfd.file;
-+ vgpu_dev->intr_info.intx_evtfd = evt;
-+ else if (index == VFIO_PCI_MSI_IRQ_INDEX)
-+ vgpu_dev->intr_info.msi_evtfd = evt;
-
- vgpu_dev->intr_info.index = index;
-- fdput(irqfd);
-
- return 0;
- }
-@@ -2687,11 +2687,8 @@
- static irqreturn_t vgpu_msix_handler(int irq, void *arg)
- {
- vgpu_dev_t *vgpu_dev = (vgpu_dev_t *)arg;
-- struct file *pfile = NULL;
-- mm_segment_t old_fs;
-- NvU64 val = 1;
-+ struct eventfd_ctx *evt = NULL;
- int ret = 0;
-- loff_t offset = 0;
- int i;
- unsigned long eflags;
-
-@@ -2699,21 +2696,16 @@
- {
- if (vgpu_dev->intr_info.allocated_irq[i] == irq)
- {
-- pfile = vgpu_dev->intr_info.msix_fd[i].file;
-+ evt = vgpu_dev->intr_info.msix_evtfd[i];
- break;
- }
- }
-
-- if (pfile && pfile->f_op && pfile->f_op->write)
-+ if (evt)
- {
-- old_fs = get_fs();
-- set_fs(KERNEL_DS);
--
- NV_SAVE_FLAGS(eflags);
-- ret = pfile->f_op->write(pfile, (char *)&val, sizeof(val), &offset);
-+ ret = eventfd_signal(evt, 1);
- NV_RESTORE_FLAGS(eflags);
--
-- set_fs(old_fs);
- }
-
- return IRQ_HANDLED;
-@@ -2724,23 +2716,24 @@
- {
- struct pci_dev *pdev;
- int irq = INVALID_IRQ, ret;
-- struct fd irqfd;
-+ struct eventfd_ctx *evt;
-
- pdev = to_pci_dev(NV_GET_MDEV_PARENT(vgpu_dev->mdev));
-
-- if (vgpu_dev->intr_info.msix_fd[vector].file)
-+ if (vgpu_dev->intr_info.msix_evtfd[vector])
- {
- free_irq(vgpu_dev->intr_info.allocated_irq[vector], vgpu_dev);
-- vgpu_dev->intr_info.msix_fd[vector].file = NULL;
-+ eventfd_ctx_put(vgpu_dev->intr_info.msix_evtfd[vector]);
-+ vgpu_dev->intr_info.msix_evtfd[vector] = NULL;
- vgpu_dev->intr_info.allocated_irq[vector] = INVALID_IRQ;
- }
-
- if (fd < 0)
- return 0;
-
-- irqfd = fdget(fd);
-- if (!irqfd.file)
-- return -EBADF;
-+ evt = eventfd_ctx_fdget(fd);
-+ if (IS_ERR(evt))
-+ return PTR_ERR(evt);
-
- if (vector < 0 || vector >= vgpu_dev->intr_info.num_ctx)
- return -EINVAL;
-@@ -2756,7 +2749,7 @@
-
- vgpu_dev->intr_info.allocated_irq[vector] = irq;
-
-- vgpu_dev->intr_info.msix_fd[vector]= irqfd;
-+ vgpu_dev->intr_info.msix_evtfd[vector]= evt;
-
- return 0;
- }
-@@ -2773,7 +2766,12 @@
- if (vgpu_dev->intr_info.allocated_irq[i] != INVALID_IRQ)
- {
- free_irq(vgpu_dev->intr_info.allocated_irq[i], vgpu_dev);
-- vgpu_dev->intr_info.msix_fd[i].file = NULL;
-+
-+ if (vgpu_dev->intr_info.msix_evtfd[i]) {
-+ eventfd_ctx_put(vgpu_dev->intr_info.msix_evtfd[i]);
-+ vgpu_dev->intr_info.msix_evtfd[i] = NULL;
-+ }
-+
- vgpu_dev->intr_info.allocated_irq[i] = INVALID_IRQ;
- }
- }
-@@ -2862,7 +2860,10 @@
- {
- if (flags & VFIO_IRQ_SET_DATA_NONE)
- {
-- vgpu_dev->intr_info.intx_file = NULL;
-+ if (vgpu_dev->intr_info.intx_evtfd) {
-+ eventfd_ctx_put(vgpu_dev->intr_info.intx_evtfd);
-+ vgpu_dev->intr_info.intx_evtfd = NULL;
-+ }
- break;
- }
-
-@@ -2887,7 +2888,10 @@
- {
- if (flags & VFIO_IRQ_SET_DATA_NONE)
- {
-- vgpu_dev->intr_info.msi_file = NULL;
-+ if (vgpu_dev->intr_info.msi_evtfd) {
-+ eventfd_ctx_put(vgpu_dev->intr_info.msi_evtfd);
-+ vgpu_dev->intr_info.msi_evtfd = NULL;
-+ }
- vgpu_dev->intr_info.index = VFIO_PCI_INTX_IRQ_INDEX;
- break;
- }
-@@ -2895,10 +2899,9 @@
- if (flags & VFIO_IRQ_SET_DATA_EVENTFD)
- {
- int fd = *(int *)data;
-- if (fd > 0)
-+ if (fd > 0 && !vgpu_dev->intr_info.msi_evtfd)
- {
-- if (vgpu_dev->intr_info.msi_file == NULL)
-- ret = vgpu_save_fd(vgpu_dev, fd, index);
-+ ret = vgpu_save_fd(vgpu_dev, fd, index);
- }
- }
- break;
-@@ -2953,12 +2956,9 @@
-
- NV_STATUS nv_vgpu_inject_interrupt(void *vgpuRef)
- {
-- mm_segment_t old_fs;
-- NvU64 val = 1;
- int ret = 0;
-- loff_t offset = 0;
- NV_STATUS status = NV_OK;
-- struct file *pfile = NULL;
-+ struct eventfd_ctx *evt = NULL;
- vgpu_dev_t *vgpu_dev = vgpuRef;
- unsigned long eflags;
-
-@@ -2967,12 +2967,12 @@
-
- NV_SPIN_LOCK_IRQSAVE(&vgpu_dev->intr_info_lock, eflags);
-
-- if ((vgpu_dev->intr_info.index == VFIO_PCI_MSI_IRQ_INDEX) && (vgpu_dev->intr_info.msi_file == NULL))
-+ if ((vgpu_dev->intr_info.index == VFIO_PCI_MSI_IRQ_INDEX) && (!vgpu_dev->intr_info.msi_evtfd))
- {
- NV_SPIN_UNLOCK_IRQRESTORE(&vgpu_dev->intr_info_lock, eflags);
- return NV_ERR_INVALID_REQUEST;
- }
-- else if ((vgpu_dev->intr_info.index == VFIO_PCI_INTX_IRQ_INDEX) && (vgpu_dev->intr_info.intx_file == NULL))
-+ else if ((vgpu_dev->intr_info.index == VFIO_PCI_INTX_IRQ_INDEX) && (!vgpu_dev->intr_info.intx_evtfd))
- {
- NV_SPIN_UNLOCK_IRQRESTORE(&vgpu_dev->intr_info_lock, eflags);
- return NV_ERR_INVALID_REQUEST;
-@@ -2984,9 +2984,9 @@
- }
-
- if (vgpu_dev->intr_info.index == VFIO_PCI_MSI_IRQ_INDEX)
-- pfile = vgpu_dev->intr_info.msi_file;
-+ evt = vgpu_dev->intr_info.msi_evtfd;
- else
-- pfile = vgpu_dev->intr_info.intx_file;
-+ evt = vgpu_dev->intr_info.intx_evtfd;
-
- // QEMU has exited. So, safe to ignore interrupts.
- if (vgpu_dev->intr_info.ignore_interrupts == NV_TRUE)
-@@ -2996,19 +2996,14 @@
- }
- NV_SPIN_UNLOCK_IRQRESTORE(&vgpu_dev->intr_info_lock, eflags);
-
-- old_fs = get_fs();
-- set_fs(KERNEL_DS);
--
-- if (pfile->f_op && pfile->f_op->write)
-- ret = pfile->f_op->write(pfile, (char *)&val, sizeof(val), &offset);
-- else
-- status = NV_ERR_INVALID_REQUEST;
-+ if (evt)
-+ ret = eventfd_signal(evt, 1);
-+ else
-+ status = NV_ERR_INVALID_REQUEST;
-
- if (ret < 0)
- status = NV_ERR_INVALID_STATE;
-
-- set_fs(old_fs);
--
- return status;
- }
-
---- ./nvidia-vgpu-vfio/nvidia-vgpu-vfio.h
-+++ ./nvidia-vgpu-vfio/nvidia-vgpu-vfio.h
-@@ -37,6 +37,7 @@
- #include <linux/list.h>
- #include <linux/pci.h>
- #include <linux/sched.h>
-+#include <linux/eventfd.h>
-
- struct vgpu_dev_s;
- struct mapping_node_s;
-@@ -293,15 +294,15 @@
-
- typedef struct
- {
-- struct file *intx_file;
-- struct file *msi_file;
-+ struct eventfd_ctx *intx_evtfd;
-+ struct eventfd_ctx *msi_evtfd;
- int index;
- NvBool ignore_interrupts;
-
- NvU32 allocated_irq[MAX_NUM_VECTORS];
- NvU32 num_ctx;
- #if defined(NV_VGPU_KVM_BUILD)
-- struct fd msix_fd[MAX_NUM_VECTORS];
-+ struct eventfd_ctx *msix_evtfd[MAX_NUM_VECTORS];
- #endif
-
- } intr_info_t;
diff --git a/vgpu_unlock.patch b/vgpu_unlock.patch
new file mode 100644
index 000000000000..cf6aa528979a
--- /dev/null
+++ b/vgpu_unlock.patch
@@ -0,0 +1,1409 @@
+--- ./kernel/nvidia/kern.ld 1969-12-31 18:00:00.000000000 -0600
++++ ./kernel/nvidia/kern.ld 2022-03-24 11:51:18.776835647 -0500
+@@ -0,0 +1,162 @@
++/* Script for ld -r: link without relocation */
++/* Copyright (C) 2014-2018 Free Software Foundation, Inc.
++ Copying and distribution of this script, with or without modification,
++ are permitted in any medium without royalty provided the copyright
++ notice and this notice are preserved. */
++OUTPUT_FORMAT("elf64-x86-64", "elf64-x86-64",
++ "elf64-x86-64")
++OUTPUT_ARCH(i386:x86-64)
++ /* For some reason, the Solaris linker makes bad executables
++ if gld -r is used and the intermediate file has sections starting
++ at non-zero addresses. Could be a Solaris ld bug, could be a GNU ld
++ bug. But for now assigning the zero vmas works. */
++SECTIONS
++{
++ /* Read-only sections, merged into text segment: */
++ .interp 0 : { *(.interp) }
++ .note.gnu.build-id : { *(.note.gnu.build-id) }
++ .hash 0 : { *(.hash) }
++ .gnu.hash 0 : { *(.gnu.hash) }
++ .dynsym 0 : { *(.dynsym) }
++ .dynstr 0 : { *(.dynstr) }
++ .gnu.version 0 : { *(.gnu.version) }
++ .gnu.version_d 0: { *(.gnu.version_d) }
++ .gnu.version_r 0: { *(.gnu.version_r) }
++ .rela.init 0 : { *(.rela.init) }
++ .rela.text 0 : { *(.rela.text) }
++ .rela.fini 0 : { *(.rela.fini) }
++ .rela.rodata 0 : { *(.rela.rodata) }
++ .rela.data.rel.ro 0 : { *(.rela.data.rel.ro) }
++ .rela.data 0 : { *(.rela.data) }
++ .rela.tdata 0 : { *(.rela.tdata) }
++ .rela.tbss 0 : { *(.rela.tbss) }
++ .rela.ctors 0 : { *(.rela.ctors) }
++ .rela.dtors 0 : { *(.rela.dtors) }
++ .rela.got 0 : { *(.rela.got) }
++ .rela.bss 0 : { *(.rela.bss) }
++ .rela.ldata 0 : { *(.rela.ldata) }
++ .rela.lbss 0 : { *(.rela.lbss) }
++ .rela.lrodata 0 : { *(.rela.lrodata) }
++ .rela.ifunc 0 : { *(.rela.ifunc) }
++ .rela.plt 0 :
++ {
++ *(.rela.plt)
++ }
++ .init 0 :
++ {
++ KEEP (*(SORT_NONE(.init)))
++ }
++ .plt 0 : { *(.plt) *(.iplt) }
++.plt.got 0 : { *(.plt.got) }
++.plt.sec 0 : { *(.plt.sec) }
++ .text 0 :
++ {
++ *(.text .stub)
++ /* .gnu.warning sections are handled specially by elf32.em. */
++ *(.gnu.warning)
++ }
++ .fini 0 :
++ {
++ KEEP (*(SORT_NONE(.fini)))
++ }
++ .rodata 0 : { *(EXCLUDE_FILE (*nv-kernel.o) .rodata) }
++ .rodata1 0 : { *(.rodata1) }
++ .eh_frame_hdr : { *(.eh_frame_hdr) }
++ .eh_frame 0 : ONLY_IF_RO { KEEP (*(.eh_frame)) }
++ .gcc_except_table 0 : ONLY_IF_RO { *(.gcc_except_table
++ .gcc_except_table.*) }
++ .gnu_extab 0 : ONLY_IF_RO { *(.gnu_extab*) }
++ /* These sections are generated by the Sun/Oracle C++ compiler. */
++ .exception_ranges 0 : ONLY_IF_RO { *(.exception_ranges
++ .exception_ranges*) }
++ /* Adjust the address for the data segment. We want to adjust up to
++ the same address within the page on the next page up. */
++ /* Exception handling */
++ .eh_frame 0 : ONLY_IF_RW { KEEP (*(.eh_frame)) }
++ .gnu_extab 0 : ONLY_IF_RW { *(.gnu_extab) }
++ .gcc_except_table 0 : ONLY_IF_RW { *(.gcc_except_table .gcc_except_table.*) }
++ .exception_ranges 0 : ONLY_IF_RW { *(.exception_ranges .exception_ranges*) }
++ /* Thread Local Storage sections */
++ .tdata 0 :
++ {
++ *(.tdata)
++ }
++ .tbss 0 : { *(.tbss) }
++ .jcr 0 : { KEEP (*(.jcr)) }
++ .dynamic 0 : { *(.dynamic) }
++ .got 0 : { *(.got) *(.igot) }
++ .got.plt 0 : { *(.got.plt) *(.igot.plt) }
++ .data 0 :
++ {
++ *(.data)
++ vgpu_unlock_nv_kern_rodata_beg = .;
++ *nv-kernel.o(.rodata*)
++ vgpu_unlock_nv_kern_rodata_end = .;
++ }
++ .data1 0 : { *(.data1) }
++ .bss 0 :
++ {
++ *(.bss)
++ *(COMMON)
++ /* Align here to ensure that the .bss section occupies space up to
++ _end. Align after .bss to ensure correct alignment even if the
++ .bss section disappears because there are no input sections.
++ FIXME: Why do we need it? When there is no .bss section, we don't
++ pad the .data section. */
++ }
++ .lbss 0 :
++ {
++ *(.dynlbss)
++ *(.lbss)
++ *(LARGE_COMMON)
++ }
++ .lrodata 0 :
++ {
++ *(.lrodata)
++ }
++ .ldata 0 :
++ {
++ *(.ldata)
++ }
++ /* Stabs debugging sections. */
++ .stab 0 : { *(.stab) }
++ .stabstr 0 : { *(.stabstr) }
++ .stab.excl 0 : { *(.stab.excl) }
++ .stab.exclstr 0 : { *(.stab.exclstr) }
++ .stab.index 0 : { *(.stab.index) }
++ .stab.indexstr 0 : { *(.stab.indexstr) }
++ .comment 0 : { *(.comment) }
++ /* DWARF debug sections.
++ Symbols in the DWARF debugging sections are relative to the beginning
++ of the section so we begin them at 0. */
++ /* DWARF 1 */
++ .debug 0 : { *(.debug) }
++ .line 0 : { *(.line) }
++ /* GNU DWARF 1 extensions */
++ .debug_srcinfo 0 : { *(.debug_srcinfo) }
++ .debug_sfnames 0 : { *(.debug_sfnames) }
++ /* DWARF 1.1 and DWARF 2 */
++ .debug_aranges 0 : { *(.debug_aranges) }
++ .debug_pubnames 0 : { *(.debug_pubnames) }
++ /* DWARF 2 */
++ .debug_info 0 : { *(.debug_info) }
++ .debug_abbrev 0 : { *(.debug_abbrev) }
++ .debug_line 0 : { *(.debug_line .debug_line.* .debug_line_end ) }
++ .debug_frame 0 : { *(.debug_frame) }
++ .debug_str 0 : { *(.debug_str) }
++ .debug_loc 0 : { *(.debug_loc) }
++ .debug_macinfo 0 : { *(.debug_macinfo) }
++ /* SGI/MIPS DWARF 2 extensions */
++ .debug_weaknames 0 : { *(.debug_weaknames) }
++ .debug_funcnames 0 : { *(.debug_funcnames) }
++ .debug_typenames 0 : { *(.debug_typenames) }
++ .debug_varnames 0 : { *(.debug_varnames) }
++ /* DWARF 3 */
++ .debug_pubtypes 0 : { *(.debug_pubtypes) }
++ .debug_ranges 0 : { *(.debug_ranges) }
++ /* DWARF Extension. */
++ .debug_macro 0 : { *(.debug_macro) }
++ .debug_addr 0 : { *(.debug_addr) }
++ .gnu.attributes 0 : { KEEP (*(.gnu.attributes)) }
++}
++
+--- ./kernel/nvidia/nvidia.Kbuild 2022-01-24 17:56:29.000000000 -0600
++++ ./kernel/nvidia/nvidia.Kbuild 2022-03-24 17:02:20.143988135 -0500
+@@ -245 +245,2 @@ NV_CONFTEST_GENERIC_COMPILE_TESTS += pci
+ NV_CONFTEST_GENERIC_COMPILE_TESTS += drm_available
++ldflags-y += -T $(src)/nvidia/kern.ld
+--- ./kernel/nvidia/os-interface.c 2022-01-24 17:56:29.000000000 -0600
++++ ./kernel/nvidia/os-interface.c 2022-03-24 17:02:36.087708543 -0500
+@@ -30,2 +30,3 @@
+
++#include "vgpu_unlock_hooks.c"
+
+--- ./kernel/nvidia/vgpu_unlock_hooks.c 1969-12-31 18:00:00.000000000 -0600
++++ ./kernel/nvidia/vgpu_unlock_hooks.c 2022-03-24 11:51:18.775835663 -0500
+@@ -0,0 +1,1230 @@
++/*
++ * vGPU unlock hooks.
++ *
++ * This file is designed to be included into a single translation unit of the
++ * vGPU driver's kernel module. It hooks the nv_ioremap_* functions and memcpy
++ * for that translation unit and applies the vgpu_unlock patch when the magic
++ * and key values has been accessed by the driver.
++ *
++ * Copyright 2021 Jonathan Johansson
++ * This file is part of the "vgpu_unlock" project, and is distributed under the
++ * MIT License. See the LICENSE file for more details.
++ *
++ * Contributions from Krutav Shah and the vGPU Unlocking community included :)
++ *
++ */
++
++/*------------------------------------------------------------------------------
++ * Implementation of AES128-ECB.
++ *------------------------------------------------------------------------------
++ */
++
++typedef struct
++{
++ uint8_t round_key[176];
++}
++vgpu_unlock_aes128_ctx;
++
++typedef uint8_t vgpu_unlock_aes128_state[4][4];
++
++#define Nb 4
++#define Nk 4
++#define Nr 10
++#define getSBoxValue(num) (vgpu_unlock_aes128_sbox[(num)])
++#define getSBoxInvert(num) (vgpu_unlock_aes128_rsbox[(num)])
++#define Multiply(x, y) \
++ ( ((y & 1) * x) ^ \
++ ((y>>1 & 1) * vgpu_unlock_aes128_xtime(x)) ^ \
++ ((y>>2 & 1) * vgpu_unlock_aes128_xtime(vgpu_unlock_aes128_xtime(x))) ^ \
++ ((y>>3 & 1) * vgpu_unlock_aes128_xtime(vgpu_unlock_aes128_xtime(vgpu_unlock_aes128_xtime(x)))) ^ \
++ ((y>>4 & 1) * vgpu_unlock_aes128_xtime(vgpu_unlock_aes128_xtime(vgpu_unlock_aes128_xtime(vgpu_unlock_aes128_xtime(x)))))) \
++
++static const uint8_t vgpu_unlock_aes128_sbox[256] = {
++ //0 1 2 3 4 5 6 7 8 9 A B C D E F
++ 0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76,
++ 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0,
++ 0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15,
++ 0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75,
++ 0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84,
++ 0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf,
++ 0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8,
++ 0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2,
++ 0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73,
++ 0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb,
++ 0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c, 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79,
++ 0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08,
++ 0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a,
++ 0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e, 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e,
++ 0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf,
++ 0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16 };
++
++static const uint8_t vgpu_unlock_aes128_rsbox[256] = {
++ 0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38, 0xbf, 0x40, 0xa3, 0x9e, 0x81, 0xf3, 0xd7, 0xfb,
++ 0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87, 0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb,
++ 0x54, 0x7b, 0x94, 0x32, 0xa6, 0xc2, 0x23, 0x3d, 0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e,
++ 0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2, 0x76, 0x5b, 0xa2, 0x49, 0x6d, 0x8b, 0xd1, 0x25,
++ 0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16, 0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92,
++ 0x6c, 0x70, 0x48, 0x50, 0xfd, 0xed, 0xb9, 0xda, 0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84,
++ 0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a, 0xf7, 0xe4, 0x58, 0x05, 0xb8, 0xb3, 0x45, 0x06,
++ 0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02, 0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b,
++ 0x3a, 0x91, 0x11, 0x41, 0x4f, 0x67, 0xdc, 0xea, 0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73,
++ 0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85, 0xe2, 0xf9, 0x37, 0xe8, 0x1c, 0x75, 0xdf, 0x6e,
++ 0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89, 0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b,
++ 0xfc, 0x56, 0x3e, 0x4b, 0xc6, 0xd2, 0x79, 0x20, 0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4,
++ 0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31, 0xb1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xec, 0x5f,
++ 0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d, 0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef,
++ 0xa0, 0xe0, 0x3b, 0x4d, 0xae, 0x2a, 0xf5, 0xb0, 0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61,
++ 0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26, 0xe1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0c, 0x7d };
++
++static const uint8_t vgpu_unlock_aes128_rcon[11] = {
++ 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36 };
++
++static void vgpu_unlock_aes128_key_expansion(uint8_t *round_key,
++ const uint8_t *Key)
++{
++ unsigned i, j, k;
++ uint8_t tempa[4];
++
++ for (i = 0; i < Nk; ++i)
++ {
++ round_key[(i * 4) + 0] = Key[(i * 4) + 0];
++ round_key[(i * 4) + 1] = Key[(i * 4) + 1];
++ round_key[(i * 4) + 2] = Key[(i * 4) + 2];
++ round_key[(i * 4) + 3] = Key[(i * 4) + 3];
++ }
++
++ for (i = Nk; i < Nb * (Nr + 1); ++i)
++ {
++ k = (i - 1) * 4;
++ tempa[0] = round_key[k + 0];
++ tempa[1] = round_key[k + 1];
++ tempa[2] = round_key[k + 2];
++ tempa[3] = round_key[k + 3];
++
++ if (i % Nk == 0)
++ {
++ const uint8_t u8tmp = tempa[0];
++ tempa[0] = tempa[1];
++ tempa[1] = tempa[2];
++ tempa[2] = tempa[3];
++ tempa[3] = u8tmp;
++ tempa[0] = getSBoxValue(tempa[0]);
++ tempa[1] = getSBoxValue(tempa[1]);
++ tempa[2] = getSBoxValue(tempa[2]);
++ tempa[3] = getSBoxValue(tempa[3]);
++ tempa[0] = tempa[0] ^ vgpu_unlock_aes128_rcon[i/Nk];
++ }
++
++ j = i * 4; k=(i - Nk) * 4;
++ round_key[j + 0] = round_key[k + 0] ^ tempa[0];
++ round_key[j + 1] = round_key[k + 1] ^ tempa[1];
++ round_key[j + 2] = round_key[k + 2] ^ tempa[2];
++ round_key[j + 3] = round_key[k + 3] ^ tempa[3];
++ }
++}
++
++static void vgpu_unlock_aes128_add_round_key(uint8_t round,
++ vgpu_unlock_aes128_state *state,
++ const uint8_t *round_key)
++{
++ uint8_t i,j;
++
++ for (i = 0; i < 4; ++i)
++ {
++ for (j = 0; j < 4; ++j)
++ {
++ (*state)[i][j] ^= round_key[(round * Nb * 4) + (i * Nb) + j];
++ }
++ }
++}
++
++static void vgpu_unlock_aes128_sub_bytes(vgpu_unlock_aes128_state *state)
++{
++ uint8_t i, j;
++
++ for (i = 0; i < 4; ++i)
++ {
++ for (j = 0; j < 4; ++j)
++ {
++ (*state)[j][i] = getSBoxValue((*state)[j][i]);
++ }
++ }
++}
++
++static void vgpu_unlock_aes128_shift_rows(vgpu_unlock_aes128_state *state)
++{
++ uint8_t temp;
++
++ temp = (*state)[0][1];
++ (*state)[0][1] = (*state)[1][1];
++ (*state)[1][1] = (*state)[2][1];
++ (*state)[2][1] = (*state)[3][1];
++ (*state)[3][1] = temp;
++
++ temp = (*state)[0][2];
++ (*state)[0][2] = (*state)[2][2];
++ (*state)[2][2] = temp;
++
++ temp = (*state)[1][2];
++ (*state)[1][2] = (*state)[3][2];
++ (*state)[3][2] = temp;
++
++ temp = (*state)[0][3];
++ (*state)[0][3] = (*state)[3][3];
++ (*state)[3][3] = (*state)[2][3];
++ (*state)[2][3] = (*state)[1][3];
++ (*state)[1][3] = temp;
++}
++
++static uint8_t vgpu_unlock_aes128_xtime(uint8_t x)
++{
++ return ((x<<1) ^ (((x>>7) & 1) * 0x1b));
++}
++
++static void vgpu_unlock_aes128_mix_columns(vgpu_unlock_aes128_state *state)
++{
++ uint8_t i;
++ uint8_t tmp, tm, t;
++
++ for (i = 0; i < 4; ++i)
++ {
++ t = (*state)[i][0];
++ tmp = (*state)[i][0] ^ (*state)[i][1] ^ (*state)[i][2] ^ (*state)[i][3];
++ tm = (*state)[i][0] ^ (*state)[i][1];
++ tm = vgpu_unlock_aes128_xtime(tm); (*state)[i][0] ^= tm ^ tmp;
++ tm = (*state)[i][1] ^ (*state)[i][2];
++ tm = vgpu_unlock_aes128_xtime(tm); (*state)[i][1] ^= tm ^ tmp;
++ tm = (*state)[i][2] ^ (*state)[i][3];
++ tm = vgpu_unlock_aes128_xtime(tm); (*state)[i][2] ^= tm ^ tmp;
++ tm = (*state)[i][3] ^ t;
++ tm = vgpu_unlock_aes128_xtime(tm); (*state)[i][3] ^= tm ^ tmp;
++ }
++}
++
++static void vgpu_unlock_aes128_inv_mix_columns(vgpu_unlock_aes128_state *state)
++{
++ int i;
++ uint8_t a, b, c, d;
++
++ for (i = 0; i < 4; ++i)
++ {
++ a = (*state)[i][0];
++ b = (*state)[i][1];
++ c = (*state)[i][2];
++ d = (*state)[i][3];
++
++ (*state)[i][0] = Multiply(a, 0x0e) ^ Multiply(b, 0x0b) ^ Multiply(c, 0x0d) ^ Multiply(d, 0x09);
++ (*state)[i][1] = Multiply(a, 0x09) ^ Multiply(b, 0x0e) ^ Multiply(c, 0x0b) ^ Multiply(d, 0x0d);
++ (*state)[i][2] = Multiply(a, 0x0d) ^ Multiply(b, 0x09) ^ Multiply(c, 0x0e) ^ Multiply(d, 0x0b);
++ (*state)[i][3] = Multiply(a, 0x0b) ^ Multiply(b, 0x0d) ^ Multiply(c, 0x09) ^ Multiply(d, 0x0e);
++ }
++}
++
++static void vgpu_unlock_aes128_inv_sub_bytes(vgpu_unlock_aes128_state *state)
++{
++ uint8_t i, j;
++
++ for (i = 0; i < 4; ++i)
++ {
++ for (j = 0; j < 4; ++j)
++ {
++ (*state)[j][i] = getSBoxInvert((*state)[j][i]);
++ }
++ }
++}
++
++static void vgpu_unlock_aes128_inv_shift_rows(vgpu_unlock_aes128_state *state)
++{
++ uint8_t temp;
++
++ temp = (*state)[3][1];
++ (*state)[3][1] = (*state)[2][1];
++ (*state)[2][1] = (*state)[1][1];
++ (*state)[1][1] = (*state)[0][1];
++ (*state)[0][1] = temp;
++
++ temp = (*state)[0][2];
++ (*state)[0][2] = (*state)[2][2];
++ (*state)[2][2] = temp;
++
++ temp = (*state)[1][2];
++ (*state)[1][2] = (*state)[3][2];
++ (*state)[3][2] = temp;
++
++ temp = (*state)[0][3];
++ (*state)[0][3] = (*state)[1][3];
++ (*state)[1][3] = (*state)[2][3];
++ (*state)[2][3] = (*state)[3][3];
++ (*state)[3][3] = temp;
++}
++
++static void vgpu_unlock_aes128_cipher(vgpu_unlock_aes128_state *state,
++ const uint8_t* round_key)
++{
++ uint8_t round = 0;
++
++ vgpu_unlock_aes128_add_round_key(0, state, round_key);
++
++ for (round = 1; ; ++round)
++ {
++ vgpu_unlock_aes128_sub_bytes(state);
++ vgpu_unlock_aes128_shift_rows(state);
++
++ if (round == Nr)
++ {
++ break;
++ }
++
++ vgpu_unlock_aes128_mix_columns(state);
++ vgpu_unlock_aes128_add_round_key(round, state, round_key);
++ }
++
++ vgpu_unlock_aes128_add_round_key(Nr, state, round_key);
++}
++
++static void vgpu_unlock_aes128_inv_cipher(vgpu_unlock_aes128_state *state,
++ const uint8_t* round_key)
++{
++ uint8_t round = 0;
++
++ vgpu_unlock_aes128_add_round_key(Nr, state, round_key);
++
++ for (round = (Nr - 1); ; --round)
++ {
++ vgpu_unlock_aes128_inv_shift_rows(state);
++ vgpu_unlock_aes128_inv_sub_bytes(state);
++ vgpu_unlock_aes128_add_round_key(round, state, round_key);
++
++ if (round == 0)
++ {
++ break;
++ }
++
++ vgpu_unlock_aes128_inv_mix_columns(state);
++ }
++}
++
++static void vgpu_unlock_aes128_init(vgpu_unlock_aes128_ctx *ctx,
++ const uint8_t *key)
++{
++ vgpu_unlock_aes128_key_expansion(ctx->round_key, key);
++}
++
++static void vgpu_unlock_aes128_encrypt(const vgpu_unlock_aes128_ctx *ctx,
++ uint8_t *buf)
++{
++ vgpu_unlock_aes128_cipher((vgpu_unlock_aes128_state*)buf,
++ ctx->round_key);
++}
++
++static void vgpu_unlock_aes128_decrypt(const vgpu_unlock_aes128_ctx *ctx,
++ uint8_t* buf)
++{
++ vgpu_unlock_aes128_inv_cipher((vgpu_unlock_aes128_state*)buf,
++ ctx->round_key);
++}
++
++#undef Nb
++#undef Nk
++#undef Nr
++#undef getSBoxValue
++#undef getSBoxInvert
++#undef Multiply
++
++/*------------------------------------------------------------------------------
++ * End of AES128-ECB implementation.
++ *------------------------------------------------------------------------------
++ */
++
++/*------------------------------------------------------------------------------
++ * Implementation of SHA256.
++ * Original author: Brad Conte (brad AT bradconte.com)
++ *------------------------------------------------------------------------------
++ */
++
++typedef struct {
++ uint8_t data[64];
++ uint32_t datalen;
++ uint64_t bitlen;
++ uint32_t state[8];
++}
++vgpu_unlock_sha256_ctx;
++
++#define ROTLEFT(a,b) (((a) << (b)) | ((a) >> (32-(b))))
++#define ROTRIGHT(a,b) (((a) >> (b)) | ((a) << (32-(b))))
++
++#define CH(x,y,z) (((x) & (y)) ^ (~(x) & (z)))
++#define MAJ(x,y,z) (((x) & (y)) ^ ((x) & (z)) ^ ((y) & (z)))
++#define EP0(x) (ROTRIGHT(x,2) ^ ROTRIGHT(x,13) ^ ROTRIGHT(x,22))
++#define EP1(x) (ROTRIGHT(x,6) ^ ROTRIGHT(x,11) ^ ROTRIGHT(x,25))
++#define SIG0(x) (ROTRIGHT(x,7) ^ ROTRIGHT(x,18) ^ ((x) >> 3))
++#define SIG1(x) (ROTRIGHT(x,17) ^ ROTRIGHT(x,19) ^ ((x) >> 10))
++
++static void vgpu_unlock_sha256_transform(vgpu_unlock_sha256_ctx *ctx,
++ const uint8_t data[])
++{
++ static const uint32_t k[64] = {
++ 0x428a2f98,0x71374491,0xb5c0fbcf,0xe9b5dba5,0x3956c25b,0x59f111f1,0x923f82a4,0xab1c5ed5,
++ 0xd807aa98,0x12835b01,0x243185be,0x550c7dc3,0x72be5d74,0x80deb1fe,0x9bdc06a7,0xc19bf174,
++ 0xe49b69c1,0xefbe4786,0x0fc19dc6,0x240ca1cc,0x2de92c6f,0x4a7484aa,0x5cb0a9dc,0x76f988da,
++ 0x983e5152,0xa831c66d,0xb00327c8,0xbf597fc7,0xc6e00bf3,0xd5a79147,0x06ca6351,0x14292967,
++ 0x27b70a85,0x2e1b2138,0x4d2c6dfc,0x53380d13,0x650a7354,0x766a0abb,0x81c2c92e,0x92722c85,
++ 0xa2bfe8a1,0xa81a664b,0xc24b8b70,0xc76c51a3,0xd192e819,0xd6990624,0xf40e3585,0x106aa070,
++ 0x19a4c116,0x1e376c08,0x2748774c,0x34b0bcb5,0x391c0cb3,0x4ed8aa4a,0x5b9cca4f,0x682e6ff3,
++ 0x748f82ee,0x78a5636f,0x84c87814,0x8cc70208,0x90befffa,0xa4506ceb,0xbef9a3f7,0xc67178f2
++ };
++
++ uint32_t a, b, c, d, e, f, g, h, i, j, t1, t2, m[64];
++
++ for (i = 0, j = 0; i < 16; ++i, j += 4)
++ m[i] = (data[j] << 24) | (data[j + 1] << 16) | (data[j + 2] << 8) | (data[j + 3]);
++ for ( ; i < 64; ++i)
++ m[i] = SIG1(m[i - 2]) + m[i - 7] + SIG0(m[i - 15]) + m[i - 16];
++
++ a = ctx->state[0];
++ b = ctx->state[1];
++ c = ctx->state[2];
++ d = ctx->state[3];
++ e = ctx->state[4];
++ f = ctx->state[5];
++ g = ctx->state[6];
++ h = ctx->state[7];
++
++ for (i = 0; i < 64; ++i) {
++ t1 = h + EP1(e) + CH(e,f,g) + k[i] + m[i];
++ t2 = EP0(a) + MAJ(a,b,c);
++ h = g;
++ g = f;
++ f = e;
++ e = d + t1;
++ d = c;
++ c = b;
++ b = a;
++ a = t1 + t2;
++ }
++
++ ctx->state[0] += a;
++ ctx->state[1] += b;
++ ctx->state[2] += c;
++ ctx->state[3] += d;
++ ctx->state[4] += e;
++ ctx->state[5] += f;
++ ctx->state[6] += g;
++ ctx->state[7] += h;
++}
++
++static void vgpu_unlock_sha256_init(vgpu_unlock_sha256_ctx *ctx)
++{
++ ctx->datalen = 0;
++ ctx->bitlen = 0;
++ ctx->state[0] = 0x6a09e667;
++ ctx->state[1] = 0xbb67ae85;
++ ctx->state[2] = 0x3c6ef372;
++ ctx->state[3] = 0xa54ff53a;
++ ctx->state[4] = 0x510e527f;
++ ctx->state[5] = 0x9b05688c;
++ ctx->state[6] = 0x1f83d9ab;
++ ctx->state[7] = 0x5be0cd19;
++}
++
++static void vgpu_unlock_sha256_update(vgpu_unlock_sha256_ctx *ctx,
++ const uint8_t data[],
++ size_t len)
++{
++ uint32_t i;
++
++ for (i = 0; i < len; ++i) {
++ ctx->data[ctx->datalen] = data[i];
++ ctx->datalen++;
++ if (ctx->datalen == 64) {
++ vgpu_unlock_sha256_transform(ctx, ctx->data);
++ ctx->bitlen += 512;
++ ctx->datalen = 0;
++ }
++ }
++}
++
++static void vgpu_unlock_sha256_final(vgpu_unlock_sha256_ctx *ctx,
++ uint8_t hash[])
++{
++ uint32_t i;
++
++ i = ctx->datalen;
++
++ /* Pad whatever data is left in the buffer. */
++ if (ctx->datalen < 56) {
++ ctx->data[i++] = 0x80;
++ while (i < 56)
++ ctx->data[i++] = 0x00;
++ }
++ else {
++ ctx->data[i++] = 0x80;
++ while (i < 64)
++ ctx->data[i++] = 0x00;
++ vgpu_unlock_sha256_transform(ctx, ctx->data);
++ memset(ctx->data, 0, 56);
++ }
++
++ /*
++ * Append to the padding the total message's length in bits and
++ * transform.
++ */
++ ctx->bitlen += ctx->datalen * 8;
++ ctx->data[63] = ctx->bitlen;
++ ctx->data[62] = ctx->bitlen >> 8;
++ ctx->data[61] = ctx->bitlen >> 16;
++ ctx->data[60] = ctx->bitlen >> 24;
++ ctx->data[59] = ctx->bitlen >> 32;
++ ctx->data[58] = ctx->bitlen >> 40;
++ ctx->data[57] = ctx->bitlen >> 48;
++ ctx->data[56] = ctx->bitlen >> 56;
++ vgpu_unlock_sha256_transform(ctx, ctx->data);
++
++ /*
++ * Since this implementation uses little endian byte ordering and SHA
++ * uses big endian, reverse all the bytes when copying the final state
++ * to the output hash.
++ */
++ for (i = 0; i < 4; ++i) {
++ hash[i] = (ctx->state[0] >> (24 - i * 8)) & 0x000000ff;
++ hash[i + 4] = (ctx->state[1] >> (24 - i * 8)) & 0x000000ff;
++ hash[i + 8] = (ctx->state[2] >> (24 - i * 8)) & 0x000000ff;
++ hash[i + 12] = (ctx->state[3] >> (24 - i * 8)) & 0x000000ff;
++ hash[i + 16] = (ctx->state[4] >> (24 - i * 8)) & 0x000000ff;
++ hash[i + 20] = (ctx->state[5] >> (24 - i * 8)) & 0x000000ff;
++ hash[i + 24] = (ctx->state[6] >> (24 - i * 8)) & 0x000000ff;
++ hash[i + 28] = (ctx->state[7] >> (24 - i * 8)) & 0x000000ff;
++ }
++}
++
++#undef ROTLEFT
++#undef ROTRIGHT
++
++#undef CH
++#undef MAJ
++#undef EP0
++#undef EP1
++#undef SIG0
++#undef SIG1
++
++/*------------------------------------------------------------------------------
++ * End of SHA256 implementation.
++ *------------------------------------------------------------------------------
++ */
++
++
++/*------------------------------------------------------------------------------
++ * Implementation of HMAC-SHA256.
++ *------------------------------------------------------------------------------
++ */
++
++static void vgpu_unlock_hmac_sha256(void* dst,
++ const void *msg,
++ size_t msg_size,
++ const void *key,
++ size_t key_size)
++{
++ vgpu_unlock_sha256_ctx ctx;
++ uint8_t o_key[96];
++ uint8_t i_key_pad[64];
++ uint8_t i;
++
++ for (i = 0; i < 64; i++)
++ {
++ if (i < key_size)
++ {
++ o_key[i] = ((uint8_t*)key)[i] ^ 0x5c;
++ i_key_pad[i] = ((uint8_t*)key)[i] ^ 0x36;
++ }
++ else
++ {
++ o_key[i] = 0x5c;
++ i_key_pad[i] = 0x36;
++ }
++ }
++
++ vgpu_unlock_sha256_init(&ctx);
++ vgpu_unlock_sha256_update(&ctx, i_key_pad, sizeof(i_key_pad));
++ vgpu_unlock_sha256_update(&ctx, msg, msg_size);
++ vgpu_unlock_sha256_final(&ctx, &o_key[64]);
++
++ vgpu_unlock_sha256_init(&ctx);
++ vgpu_unlock_sha256_update(&ctx, o_key, sizeof(o_key));
++ vgpu_unlock_sha256_final(&ctx, dst);
++}
++
++/*------------------------------------------------------------------------------
++ * End of HMAC-SHA256 implementation.
++ *------------------------------------------------------------------------------
++ */
++
++/*------------------------------------------------------------------------------
++ * Implementation of vgpu_unlock hooks.
++ *------------------------------------------------------------------------------
++ */
++
++/* Debug logs can be enabled here. To enable it, change 0 to 1. */
++#if 0
++ #define LOG(...) printk(__VA_ARGS__)
++#else
++ #define LOG(...)
++#endif
++
++typedef struct {
++ uint8_t num_blocks; /* Number of 16 byte blocks up to 'sign'. */
++ uint8_t name1_len; /* Length of first name (unused?) */
++ uint8_t name2_len; /* Length of second name (used by VM) */
++ uint16_t dev_id;
++ uint16_t vend_id; /* Check skipped if zero. */
++ uint16_t subsys_id;
++ uint16_t subsys_vend_id; /* Check skipped if zero. */
++ char name1_2[38]; /* First and second name, no separation. */
++ uint8_t sign[0x20];
++}
++__attribute__((packed))
++vgpu_unlock_vgpu_t;
++
++/* Helper macro to initialize the structure above. */
++#define VGPU(dev_id, subsys_id, name) \
++ { (10 + 2 * strlen(name) + 15) / 16, /* num_blocks */ \
++ strlen(name), /* name1_len */ \
++ strlen(name), /* name2_len */ \
++ (dev_id), /* dev_id */ \
++ 0, /* vend_id */ \
++ (subsys_id), /* subsys_id */ \
++ 0, /* subsys_vend_id */ \
++ { name name } } /* name1_2 */
++
++static vgpu_unlock_vgpu_t vgpu_unlock_vgpu[] =
++{
++ /* Tesla M10 (Maxwell) */
++ VGPU(0x13bd, 0x11cc, "GRID M10-0B"),
++ VGPU(0x13bd, 0x11cd, "GRID M10-1B"),
++ VGPU(0x13bd, 0x1339, "GRID M10-1B4"),
++ VGPU(0x13bd, 0x1286, "GRID M10-2B"),
++ VGPU(0x13bd, 0x12ee, "GRID M10-2B4"),
++ VGPU(0x13bd, 0x11ce, "GRID M10-0Q"),
++ VGPU(0x13bd, 0x11cf, "GRID M10-1Q"),
++ VGPU(0x13bd, 0x11d0, "GRID M10-2Q"),
++ VGPU(0x13bd, 0x11d1, "GRID M10-4Q"),
++ VGPU(0x13bd, 0x11d2, "GRID M10-8Q"),
++ VGPU(0x13bd, 0x11d3, "GRID M10-1A"),
++ VGPU(0x13bd, 0x11d4, "GRID M10-2A"),
++ VGPU(0x13bd, 0x11d5, "GRID M10-4A"),
++ VGPU(0x13bd, 0x11d6, "GRID M10-8A"),
++
++ /* Tesla M60 (Maxwell 2.0) */
++ VGPU(0x13f2, 0x114c, "GRID M60-0Q"),
++ VGPU(0x13f2, 0x114d, "GRID M60-1Q"),
++ VGPU(0x13f2, 0x114e, "GRID M60-2Q"),
++ VGPU(0x13f2, 0x114f, "GRID M60-4Q"),
++ VGPU(0x13f2, 0x1150, "GRID M60-8Q"),
++ VGPU(0x13f2, 0x1176, "GRID M60-0B"),
++ VGPU(0x13f2, 0x1177, "GRID M60-1B"),
++ VGPU(0x13f2, 0x117D, "GRID M60-2B"),
++ VGPU(0x13f2, 0x1337, "GRID M60-1B4"),
++ VGPU(0x13f2, 0x12ec, "GRID M60-2B4"),
++ VGPU(0x13f2, 0x11ae, "GRID M60-1A"),
++ VGPU(0x13f2, 0x11aF, "GRID M60-2A"),
++ VGPU(0x13f2, 0x11b0, "GRID M60-4A"),
++ VGPU(0x13f2, 0x11b1, "GRID M60-8A"),
++
++ /* Tesla P4 (Pascal) */
++ VGPU(0x1bb3, 0x1203, "GRID P4-1B"),
++ VGPU(0x1bb3, 0x1204, "GRID P4-1Q"),
++ VGPU(0x1bb3, 0x1205, "GRID P4-2Q"),
++ VGPU(0x1bb3, 0x1206, "GRID P4-4Q"),
++ VGPU(0x1bb3, 0x1207, "GRID P4-8Q"),
++ VGPU(0x1bb3, 0x1208, "GRID P4-1A"),
++ VGPU(0x1bb3, 0x1209, "GRID P4-2A"),
++ VGPU(0x1bb3, 0x120a, "GRID P4-4A"),
++ VGPU(0x1bb3, 0x120b, "GRID P4-8A"),
++ VGPU(0x1bb3, 0x1288, "GRID P4-2B"),
++ VGPU(0x1bb3, 0x12f1, "GRID P4-2B4"),
++ VGPU(0x1bb3, 0x133c, "GRID P4-1B4"),
++ VGPU(0x1bb3, 0x1380, "GRID P4-8C"),
++ VGPU(0x1bb3, 0x1385, "GRID P4-4C"),
++
++ /* Tesla P40 (Pascal) */
++ VGPU(0x1b38, 0x11e7, "GRID P40-1B"),
++ VGPU(0x1b38, 0x11e8, "GRID P40-1Q"),
++ VGPU(0x1b38, 0x11e9, "GRID P40-2Q"),
++ VGPU(0x1b38, 0x11ea, "GRID P40-3Q"),
++ VGPU(0x1b38, 0x11eb, "GRID P40-4Q"),
++ VGPU(0x1b38, 0x11ec, "GRID P40-6Q"),
++ VGPU(0x1b38, 0x11ed, "GRID P40-8Q"),
++ VGPU(0x1b38, 0x11ee, "GRID P40-12Q"),
++ VGPU(0x1b38, 0x11ef, "GRID P40-24Q"),
++ VGPU(0x1b38, 0x11f0, "GRID P40-1A"),
++ VGPU(0x1b38, 0x11f1, "GRID P40-2A"),
++ VGPU(0x1b38, 0x11f2, "GRID P40-3A"),
++ VGPU(0x1b38, 0x11f3, "GRID P40-4A"),
++ VGPU(0x1b38, 0x11f4, "GRID P40-6A"),
++ VGPU(0x1b38, 0x11f5, "GRID P40-8A"),
++ VGPU(0x1b38, 0x11f6, "GRID P40-12A"),
++ VGPU(0x1b38, 0x11f7, "GRID P40-24A"),
++ VGPU(0x1b38, 0x1287, "GRID P40-2B"),
++ VGPU(0x1b38, 0x12ef, "GRID P40-2B4"),
++ VGPU(0x1b38, 0x133a, "GRID P40-1B4"),
++ VGPU(0x1b38, 0x137e, "GRID P40-24C"),
++ VGPU(0x1b38, 0x1381, "GRID P40-4C"),
++ VGPU(0x1b38, 0x1382, "GRID P40-6C"),
++ VGPU(0x1b38, 0x1383, "GRID P40-8C"),
++ VGPU(0x1b38, 0x1384, "GRID P40-12C"),
++
++ /* Tesla V100 32GB PCIE (Volta) */
++ VGPU(0x1db6, 0x12bd, "GRID V100D-1B"),
++ VGPU(0x1db6, 0x12be, "GRID V100D-2B"),
++ VGPU(0x1db6, 0x12f7, "GRID V100D-2B4"),
++ VGPU(0x1db6, 0x1342, "GRID V100D-1B4"),
++ VGPU(0x1db6, 0x12bf, "GRID V100D-1Q"),
++ VGPU(0x1db6, 0x12c0, "GRID V100D-2Q"),
++ VGPU(0x1db6, 0x12c1, "GRID V100D-4Q"),
++ VGPU(0x1db6, 0x12c2, "GRID V100D-8Q"),
++ VGPU(0x1db6, 0x12c3, "GRID V100D-16Q"),
++ VGPU(0x1db6, 0x12c4, "GRID V100D-32Q"),
++ VGPU(0x1db6, 0x12c5, "GRID V100D-1A"),
++ VGPU(0x1db6, 0x12c6, "GRID V100D-2A"),
++ VGPU(0x1db6, 0x12c7, "GRID V100D-4A"),
++ VGPU(0x1db6, 0x12c8, "GRID V100D-8A"),
++ VGPU(0x1db6, 0x12c9, "GRID V100D-16A"),
++ VGPU(0x1db6, 0x12ca, "GRID V100D-32A"),
++ VGPU(0x1db6, 0x1395, "GRID V100D-4C"),
++ VGPU(0x1db6, 0x1396, "GRID V100D-8C"),
++ VGPU(0x1db6, 0x1397, "GRID V100D-16C"),
++ VGPU(0x1db6, 0x1377, "GRID V100D-32C"),
++
++ /* Tesla T4 (Turing) */
++ VGPU(0x1eb8, 0x1309, "GRID T4-1B"),
++ VGPU(0x1eb8, 0x130a, "GRID T4-2B"),
++ VGPU(0x1eb8, 0x130b, "GRID T4-2B4"),
++ VGPU(0x1eb8, 0x130c, "GRID T4-1Q"),
++ VGPU(0x1eb8, 0x130d, "GRID T4-2Q"),
++ VGPU(0x1eb8, 0x130e, "GRID T4-4Q"),
++ VGPU(0x1eb8, 0x130f, "GRID T4-8Q"),
++ VGPU(0x1eb8, 0x1310, "GRID T4-16Q"),
++ VGPU(0x1eb8, 0x1311, "GRID T4-1A"),
++ VGPU(0x1eb8, 0x1312, "GRID T4-2A"),
++ VGPU(0x1eb8, 0x1313, "GRID T4-4A"),
++ VGPU(0x1eb8, 0x1314, "GRID T4-8A"),
++ VGPU(0x1eb8, 0x1315, "GRID T4-16A"),
++ VGPU(0x1eb8, 0x1345, "GRID T4-1B4"),
++ VGPU(0x1eb8, 0x1375, "GRID T4-16C"),
++ VGPU(0x1eb8, 0x139a, "GRID T4-4C"),
++ VGPU(0x1eb8, 0x139b, "GRID T4-8C"),
++
++ /* Quadro RTX 6000 (Turing) */
++ VGPU(0x1e30, 0x1325, "GRID RTX6000-1Q"),
++ VGPU(0x1e30, 0x1326, "GRID RTX6000-2Q"),
++ VGPU(0x1e30, 0x1327, "GRID RTX6000-3Q"),
++ VGPU(0x1e30, 0x1328, "GRID RTX6000-4Q"),
++ VGPU(0x1e30, 0x1329, "GRID RTX6000-6Q"),
++ VGPU(0x1e30, 0x132a, "GRID RTX6000-8Q"),
++ VGPU(0x1e30, 0x132b, "GRID RTX6000-12Q"),
++ VGPU(0x1e30, 0x132c, "GRID RTX6000-24Q"),
++ VGPU(0x1e30, 0x13bf, "GRID RTX6000-4C"),
++ VGPU(0x1e30, 0x13c0, "GRID RTX6000-6C"),
++ VGPU(0x1e30, 0x13c1, "GRID RTX6000-8C"),
++ VGPU(0x1e30, 0x13c2, "GRID RTX6000-12C"),
++ VGPU(0x1e30, 0x13c3, "GRID RTX6000-24C"),
++ VGPU(0x1e30, 0x1437, "GRID RTX6000-1B"),
++ VGPU(0x1e30, 0x1438, "GRID RTX6000-2B"),
++ VGPU(0x1e30, 0x1439, "GRID RTX6000-1A"),
++ VGPU(0x1e30, 0x143a, "GRID RTX6000-2A"),
++ VGPU(0x1e30, 0x143b, "GRID RTX6000-3A"),
++ VGPU(0x1e30, 0x143c, "GRID RTX6000-4A"),
++ VGPU(0x1e30, 0x143d, "GRID RTX6000-6A"),
++ VGPU(0x1e30, 0x143e, "GRID RTX6000-8A"),
++ VGPU(0x1e30, 0x143f, "GRID RTX6000-12A"),
++ VGPU(0x1e30, 0x1440, "GRID RTX6000-24A"),
++
++ /* RTX A6000 (Ampere) */
++ VGPU(0x2230, 0x14fa, "NVIDIA RTXA6000-1B"),
++ VGPU(0x2230, 0x14fb, "NVIDIA RTXA6000-2B"),
++ VGPU(0x2230, 0x14fc, "NVIDIA RTXA6000-1Q"),
++ VGPU(0x2230, 0x14fd, "NVIDIA RTXA6000-2Q"),
++ VGPU(0x2230, 0x14fe, "NVIDIA RTXA6000-3Q"),
++ VGPU(0x2230, 0x14ff, "NVIDIA RTXA6000-4Q"),
++ VGPU(0x2230, 0x1500, "NVIDIA RTXA6000-6Q"),
++ VGPU(0x2230, 0x1501, "NVIDIA RTXA6000-8Q"),
++ VGPU(0x2230, 0x1502, "NVIDIA RTXA6000-12Q"),
++ VGPU(0x2230, 0x1503, "NVIDIA RTXA6000-16Q"),
++ VGPU(0x2230, 0x1504, "NVIDIA RTXA6000-24Q"),
++ VGPU(0x2230, 0x1505, "NVIDIA RTXA6000-48Q"),
++ VGPU(0x2230, 0x1506, "NVIDIA RTXA6000-1A"),
++ VGPU(0x2230, 0x1507, "NVIDIA RTXA6000-2A"),
++ VGPU(0x2230, 0x1508, "NVIDIA RTXA6000-3A"),
++ VGPU(0x2230, 0x1509, "NVIDIA RTXA6000-4A"),
++ VGPU(0x2230, 0x150a, "NVIDIA RTXA6000-6A"),
++ VGPU(0x2230, 0x150b, "NVIDIA RTXA6000-8A"),
++ VGPU(0x2230, 0x150c, "NVIDIA RTXA6000-12A"),
++ VGPU(0x2230, 0x150d, "NVIDIA RTXA6000-16A"),
++ VGPU(0x2230, 0x150e, "NVIDIA RTXA6000-24A"),
++ VGPU(0x2230, 0x150f, "NVIDIA RTXA6000-48A"),
++ VGPU(0x2230, 0x1514, "NVIDIA RTXA6000-4C"),
++ VGPU(0x2230, 0x1515, "NVIDIA RTXA6000-6C"),
++ VGPU(0x2230, 0x1516, "NVIDIA RTXA6000-8C"),
++ VGPU(0x2230, 0x1517, "NVIDIA RTXA6000-12C"),
++ VGPU(0x2230, 0x1518, "NVIDIA RTXA6000-16C"),
++ VGPU(0x2230, 0x1519, "NVIDIA RTXA6000-24C"),
++ VGPU(0x2230, 0x151a, "NVIDIA RTXA6000-48C"),
++
++ { 0 } /* Sentinel */
++};
++
++#undef VGPU
++
++static const uint8_t vgpu_unlock_magic_start[0x10] = {
++ 0xf3, 0xf5, 0x9e, 0x3d, 0x13, 0x91, 0x75, 0x18,
++ 0x6a, 0x7b, 0x55, 0xed, 0xce, 0x5d, 0x84, 0x67
++};
++
++static const uint8_t vgpu_unlock_magic_sacrifice[0x10] = {
++ 0x46, 0x4f, 0x39, 0x49, 0x74, 0x91, 0xd7, 0x0f,
++ 0xbc, 0x65, 0xc2, 0x70, 0xdd, 0xdd, 0x11, 0x54
++};
++
++static bool vgpu_unlock_patch_applied = FALSE;
++
++static bool vgpu_unlock_bar3_mapped = FALSE;
++static uint64_t vgpu_unlock_bar3_beg;
++static uint64_t vgpu_unlock_bar3_end;
++
++static uint8_t vgpu_unlock_magic[0x10];
++static bool vgpu_unlock_magic_found = FALSE;
++
++static uint8_t vgpu_unlock_key[0x10];
++static bool vgpu_unlock_key_found = FALSE;
++
++/* These need to be added to the linker script. */
++extern uint8_t vgpu_unlock_nv_kern_rodata_beg;
++extern uint8_t vgpu_unlock_nv_kern_rodata_end;
++
++static uint16_t vgpu_unlock_pci_devid_to_vgpu_capable(uint16_t pci_devid)
++{
++ switch (pci_devid)
++ {
++ /* Maxwell */
++ case 0x1340 ... 0x13bd:
++ case 0x174d ... 0x179c:
++ return 0x13bd; /* Tesla M10 */
++
++ /* Maxwell 2.0 */
++ case 0x13c0 ... 0x1436:
++ case 0x1617 ... 0x1667: /* GM204 */
++ case 0x17c2 ... 0x17fd: /* GM200 */
++ return 0x13f2; /* Tesla M60 */
++
++ /* Pascal */
++ case 0x15f0 ... 0x15f1: /* GP100GL */
++ case 0x1b00 ... 0x1d56:
++ case 0x1725 ... 0x172f: /* GP100 */
++ return 0x1b38; /* Tesla P40 */
++
++ /* Volta GV100 */
++ case 0x1d81: /* Titan V 16GB */
++ case 0x1dba: /* Quadro GV100 32GB */
++ return 0x1db6; /* Tesla V100 32GB PCIE */
++
++ /* Turing */
++ case 0x1e02 ... 0x1ff9:
++ case 0x2182 ... 0x21d1: /* TU116 */
++ return 0x1e30; /* Quadro RTX 6000 */
++
++ /* Ampere */
++ case 0x2200 ... 0x2600:
++ return 0x2230; /* RTX A6000 */
++ }
++
++ return pci_devid;
++}
++
++/* Our own memcmp that will bypass buffer overflow checks. */
++static int vgpu_unlock_memcmp(const void *a, const void *b, size_t size)
++{
++ uint8_t *pa = (uint8_t*)a;
++ uint8_t *pb = (uint8_t*)b;
++
++ while (size--)
++ {
++ if (*pa != *pb)
++ {
++ return *pa - *pb;
++ }
++
++ pa++;
++ pb++;
++ }
++
++ return 0;
++}
++
++/* Search for a certain pattern in the .rodata section of nv-kern.o_binary. */
++static void *vgpu_unlock_find_in_rodata(const void *val, size_t size)
++{
++ uint8_t *i;
++
++ for (i = &vgpu_unlock_nv_kern_rodata_beg;
++ i < &vgpu_unlock_nv_kern_rodata_end - size;
++ i++)
++ {
++ if (vgpu_unlock_memcmp(val, i, size) == 0)
++ {
++ return i;
++ }
++ }
++
++ return NULL;
++}
++
++/* Check if a value is within a range. */
++static bool vgpu_unlock_in_range(uint64_t val, uint64_t beg, uint64_t end)
++{
++ return (val >= beg) && (val <= end);
++}
++
++/* Check if range a is completely contained within range b. */
++static bool vgpu_unlock_range_contained_in(uint64_t a_beg,
++ uint64_t a_end,
++ uint64_t b_beg,
++ uint64_t b_end)
++{
++ return vgpu_unlock_in_range(a_beg, b_beg, b_end) &&
++ vgpu_unlock_in_range(a_end, b_beg, b_end);
++}
++
++/* Check if an address points into a specific BAR of an NVIDIA GPU. */
++static bool vgpu_unlock_in_bar(uint64_t addr, int bar)
++{
++ struct pci_dev *dev = NULL;
++
++ while (1)
++ {
++ dev = pci_get_device(0x10de, PCI_ANY_ID, dev);
++
++ if (dev)
++ {
++ if (vgpu_unlock_in_range(addr,
++ pci_resource_start(dev, bar),
++ pci_resource_end(dev, bar)))
++ {
++ return TRUE;
++ }
++ }
++ else
++ {
++ return FALSE;
++ }
++ }
++}
++
++/* Check if a potential magic value is valid. */
++static bool vgpu_unlock_magic_valid(const uint8_t *magic)
++{
++ void **gpu_list_item;
++
++ static void **gpu_list_start = NULL;
++
++ if (!gpu_list_start)
++ {
++ void *magic_start = vgpu_unlock_find_in_rodata(vgpu_unlock_magic_start,
++ sizeof(vgpu_unlock_magic_start));
++
++ if (!magic_start)
++ {
++ LOG(KERN_ERR "Failed to find start of gpu list in .rodata\n");
++ return NULL;
++ }
++
++ gpu_list_start = (void**)vgpu_unlock_find_in_rodata(&magic_start,
++ sizeof(magic_start));
++
++ if (!gpu_list_start)
++ {
++ LOG(KERN_ERR "Failed to find pointer to start of gpu list in .rodata\n");
++ return NULL;
++ }
++ }
++
++ for (gpu_list_item = gpu_list_start;
++ vgpu_unlock_in_range((uint64_t)*gpu_list_item,
++ (uint64_t)&vgpu_unlock_nv_kern_rodata_beg,
++ (uint64_t)&vgpu_unlock_nv_kern_rodata_end);
++ gpu_list_item += 3)
++ {
++ if (memcmp(magic, *gpu_list_item, 0x10) == 0)
++ {
++ return TRUE;
++ }
++ }
++
++ return FALSE;
++}
++
++static void vgpu_unlock_apply_patch(void)
++{
++ uint8_t i;
++ void *magic;
++ void **magic_ptr;
++ void **blocks_ptr;
++ void **sign_ptr;
++ uint8_t sign[0x20];
++ uint8_t num_blocks;
++ void *sac_magic;
++ void **sac_magic_ptr;
++ void **sac_blocks_ptr;
++ void **sac_sign_ptr;
++ vgpu_unlock_aes128_ctx aes_ctx;
++ vgpu_unlock_vgpu_t* vgpu;
++ uint8_t first_block[0x10];
++ uint16_t device_id;
++
++ magic = vgpu_unlock_find_in_rodata(vgpu_unlock_magic,
++ sizeof(vgpu_unlock_magic));
++ if (!magic)
++ {
++ LOG(KERN_ERR "Failed to find magic in .rodata.\n");
++ goto failed;
++ }
++
++ LOG(KERN_WARNING "Magic is at: %px\n", magic);
++
++ magic_ptr = (void**)vgpu_unlock_find_in_rodata(&magic,
++ sizeof(magic));
++
++ if (!magic_ptr)
++ {
++ LOG(KERN_ERR "Failed to find pointer to magic in .rodata.\n");
++ goto failed;
++ }
++
++ blocks_ptr = magic_ptr + 1;
++ sign_ptr = magic_ptr + 2;
++
++ LOG(KERN_WARNING "Pointers found, magic: %px blocks: %px sign: %px\n",
++ magic_ptr, blocks_ptr, sign_ptr);
++
++ if (!vgpu_unlock_in_range((uint64_t)*blocks_ptr,
++ (uint64_t)&vgpu_unlock_nv_kern_rodata_beg,
++ (uint64_t)&vgpu_unlock_nv_kern_rodata_end) ||
++ !vgpu_unlock_in_range((uint64_t)*sign_ptr,
++ (uint64_t)&vgpu_unlock_nv_kern_rodata_beg,
++ (uint64_t)&vgpu_unlock_nv_kern_rodata_end))
++ {
++ LOG(KERN_ERR "Invalid sign or blocks pointer.\n");
++ goto failed;
++ }
++
++ num_blocks = *(uint8_t*)*blocks_ptr;
++
++ vgpu_unlock_hmac_sha256(sign,
++ *blocks_ptr,
++ 1 + num_blocks * 0x10,
++ vgpu_unlock_key,
++ sizeof(vgpu_unlock_key));
++
++ LOG(KERN_WARNING "Generate signature is: %32ph\n", sign);
++
++ if (memcmp(sign, *sign_ptr, sizeof(sign)) != 0)
++ {
++ LOG(KERN_ERR "Signatures does not match.\n");
++ goto failed;
++ }
++
++ sac_magic = vgpu_unlock_find_in_rodata(vgpu_unlock_magic_sacrifice,
++ sizeof(vgpu_unlock_magic_sacrifice));
++
++ if (!sac_magic)
++ {
++ LOG(KERN_ERR "Failed to find sacrificial magic.\n");
++ goto failed;
++ }
++
++ LOG(KERN_WARNING "Sacrificial magic is at: %px\n", sac_magic);
++
++ sac_magic_ptr = (void**) vgpu_unlock_find_in_rodata(&sac_magic,
++ sizeof(sac_magic));
++
++ if (!sac_magic_ptr)
++ {
++ LOG(KERN_ERR "Failed to find pointer to sacrificial magic.\n");
++ goto failed;
++ }
++
++ sac_blocks_ptr = sac_magic_ptr + 1;
++ sac_sign_ptr = sac_magic_ptr + 2;
++
++ LOG(KERN_WARNING "Pointers found, sac_magic: %px sac_blocks: %px sac_sign: %px\n",
++ sac_magic_ptr, sac_blocks_ptr, sac_sign_ptr);
++
++ if (!vgpu_unlock_in_range((uint64_t)*sac_blocks_ptr,
++ (uint64_t)&vgpu_unlock_nv_kern_rodata_beg,
++ (uint64_t)&vgpu_unlock_nv_kern_rodata_end) ||
++ !vgpu_unlock_in_range((uint64_t)*sac_sign_ptr,
++ (uint64_t)&vgpu_unlock_nv_kern_rodata_beg,
++ (uint64_t)&vgpu_unlock_nv_kern_rodata_end))
++ {
++ LOG(KERN_ERR "Invalid sacrificial sign or blocks pointer.\n");
++ goto failed;
++ }
++
++ /* Decrypt the first block so we can access the PCI device ID. */
++ memcpy(first_block, (uint8_t*)*blocks_ptr + 1, sizeof(first_block));
++ vgpu_unlock_aes128_init(&aes_ctx, vgpu_unlock_key);
++ vgpu_unlock_aes128_decrypt(&aes_ctx, first_block);
++ LOG(KERN_WARNING "Decrypted first block is: %16ph.\n",
++ first_block);
++
++ device_id = *((uint16_t*)first_block + 1);
++ device_id = vgpu_unlock_pci_devid_to_vgpu_capable(device_id);
++
++ /* Loop over all vGPUs and add the ones that match our device ID. */
++ vgpu = vgpu_unlock_vgpu;
++
++ while (vgpu->num_blocks != 0)
++ {
++ if (vgpu->dev_id != device_id)
++ {
++ vgpu++;
++ continue;
++ }
++
++ num_blocks = vgpu->num_blocks;
++
++ *sac_magic_ptr = vgpu_unlock_magic;
++ *sac_blocks_ptr = vgpu;
++ *sac_sign_ptr = &vgpu->sign;
++
++ vgpu_unlock_aes128_init(&aes_ctx, vgpu_unlock_key);
++
++ for (i = 0; i < num_blocks; i++)
++ {
++ vgpu_unlock_aes128_encrypt(&aes_ctx,
++ (uint8_t*)vgpu + 1 + i * 0x10);
++ }
++
++ vgpu_unlock_hmac_sha256(&vgpu->sign,
++ vgpu,
++ 1 + num_blocks * 0x10,
++ vgpu_unlock_key,
++ sizeof(vgpu_unlock_key));
++
++ sac_magic_ptr += 3;
++ sac_blocks_ptr = sac_magic_ptr + 1;
++ sac_sign_ptr = sac_magic_ptr + 2;
++ vgpu++;
++ }
++
++ vgpu_unlock_patch_applied = TRUE;
++
++ LOG(KERN_WARNING "vGPU unlock patch applied.\n");
++
++ return;
++
++failed:
++ vgpu_unlock_magic_found = FALSE;
++ vgpu_unlock_key_found = FALSE;
++}
++
++static void *vgpu_unlock_memcpy_hook(void *dst, const void *src, size_t count)
++{
++ bool src_in_bar3 = vgpu_unlock_bar3_mapped &&
++ vgpu_unlock_in_range((uint64_t)src,
++ vgpu_unlock_bar3_beg,
++ vgpu_unlock_bar3_end);
++
++ void *result = memcpy(dst, src, count);
++
++ if (src_in_bar3 &&
++ count == sizeof(vgpu_unlock_magic) &&
++ !vgpu_unlock_magic_found &&
++ vgpu_unlock_magic_valid(dst))
++ {
++ memcpy(vgpu_unlock_magic, dst, count);
++ vgpu_unlock_magic_found = TRUE;
++
++ LOG(KERN_WARNING "Magic found: %16ph\n",
++ vgpu_unlock_magic);
++
++ }
++ else if (src_in_bar3 &&
++ count == sizeof(vgpu_unlock_key) &&
++ vgpu_unlock_magic_found &&
++ !vgpu_unlock_key_found)
++ {
++ memcpy(vgpu_unlock_key, dst, count);
++ vgpu_unlock_key_found = TRUE;
++
++ LOG(KERN_WARNING "Key found: %16ph\n",
++ vgpu_unlock_key);
++ }
++
++ if (!vgpu_unlock_patch_applied &&
++ vgpu_unlock_magic_found &&
++ vgpu_unlock_key_found)
++ {
++ vgpu_unlock_apply_patch();
++ }
++
++ return result;
++}
++
++/* Check if the new IO mapping contains the magic or key. */
++static void vgpu_unlock_check_map(uint64_t phys_addr,
++ size_t size,
++ void *virt_addr)
++{
++ LOG(KERN_WARNING "Remap called.\n");
++
++ if (virt_addr &&
++ !vgpu_unlock_bar3_mapped &&
++ vgpu_unlock_in_bar(phys_addr, 3))
++ {
++ vgpu_unlock_bar3_beg = (uint64_t)virt_addr;
++ vgpu_unlock_bar3_end = (uint64_t)virt_addr + size;
++ vgpu_unlock_bar3_mapped = TRUE;
++ LOG(KERN_WARNING "BAR3 mapped at: 0x%llX\n",
++ vgpu_unlock_bar3_beg);
++ }
++}
++
++static void *vgpu_unlock_nv_ioremap_hook(uint64_t phys,
++ uint64_t size)
++{
++ void *virt_addr = nv_ioremap(phys, size);
++ vgpu_unlock_check_map(phys, size, virt_addr);
++ return virt_addr;
++}
++
++static void *vgpu_unlock_nv_ioremap_nocache_hook(uint64_t phys,
++ uint64_t size)
++{
++ void *virt_addr = nv_ioremap_nocache(phys, size);
++ vgpu_unlock_check_map(phys, size, virt_addr);
++ return virt_addr;
++}
++
++static void *vgpu_unlock_nv_ioremap_cache_hook(uint64_t phys,
++ uint64_t size)
++{
++ void *virt_addr = nv_ioremap_cache(phys, size);
++ vgpu_unlock_check_map(phys, size, virt_addr);
++ return virt_addr;
++}
++
++static void *vgpu_unlock_nv_ioremap_wc_hook(uint64_t phys,
++ uint64_t size)
++{
++ void *virt_addr = nv_ioremap_wc(phys, size);
++ vgpu_unlock_check_map(phys, size, virt_addr);
++ return virt_addr;
++}
++
++#undef LOG
++
++/* Redirect future callers to our hooks. */
++#define memcpy vgpu_unlock_memcpy_hook
++#define nv_ioremap vgpu_unlock_nv_ioremap_hook
++#define nv_ioremap_nocache vgpu_unlock_nv_ioremap_nocache_hook
++#define nv_ioremap_cache vgpu_unlock_nv_ioremap_cache_hook
++#define nv_ioremap_wc vgpu_unlock_nv_ioremap_wc_hook