diff options
-rw-r--r-- | .SRCINFO | 57 | ||||
-rw-r--r-- | 99-nvidia-ignoreabi.conf | 3 | ||||
-rw-r--r-- | PKGBUILD | 385 | ||||
-rw-r--r-- | fourteen.patch | 322 | ||||
-rw-r--r-- | nv-kernel.patch | bin | 0 -> 17800 bytes | |||
-rw-r--r-- | nvidia-utils.sysusers | 1 | ||||
-rw-r--r-- | nvidia-vgpu-vfio.patch | 12 | ||||
-rw-r--r-- | nvidia.rules | 6 | ||||
-rw-r--r-- | sixteen.patch | 93 | ||||
-rw-r--r-- | twelve.patch | 260 | ||||
-rw-r--r-- | vgpu_unlock.patch | 1409 |
11 files changed, 1660 insertions, 888 deletions
@@ -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 @@ -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 Binary files differnew file mode 100644 index 000000000000..9023ebbc6505 --- /dev/null +++ b/nv-kernel.patch 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 |