{"body":"{ lib, config, pkgs, ... }: let\n\n  gtx1050ti-rom' = builtins.fetchurl {\n    url = \"https://www.techpowerup.com/vgabios/194754/EVGA.GTX1050Ti.4096.170714.rom\";\n    sha256 = \"1qhhn3zvaghlynmh4iy0pdv4vgc447cn870m3q1vmpgr5xgf1lzp\";\n  };\n\n  nvidia_vbios_vfio_patcher = builtins.fetchurl {\n    url = https://raw.githubusercontent.com/Matoking/NVIDIA-vBIOS-VFIO-Patcher/2cbf953f4e61e766201a62bfc542cb6b23d336b8/nvidia_vbios_vfio_patcher.py;\n    sha256 = \"1wk1xpvzvr67kz8xgmlw37hs90dzv1crjsm6j244pdc0qw4qd9hx\";\n  };\n\n  gtx1050ti-rom = pkgs.runCommand \"gtx1050ti-rom\" { nativeBuildInputs = [pkgs.python]; } ''\n    echo \"I agree to be careful\" | python ${nvidia_vbios_vfio_patcher} -i ${gtx1050ti-rom'} -o $out\n  '';\n\n  devices = [\n    { device = \"10de 1c82\"; slot = \"42:00.0\"; driver = \"nvidia\"; romfile = gtx1050ti-rom; } # GPU\n    { device = \"10de 0fb9\"; slot = \"42:00.1\"; driver = \"snd_hda_intel\"; } # GPU audio controller\n  ];\n\n  usbDevices = [\n    # \"05ac:024f\" # Keyboard\n    # \"062a:4102\" # Mouse\n\n    { vendorid = \"0x05ac\"; productid = \"0x024f\"; } # Keyboard\n    { vendorid = \"0x062a\"; productid = \"0x4102\"; } # Mouse\n  ];\n\n  qemuDevices =\n    let\n      f = { slot, romfile ? null, ... }: \"-device \" + lib.concatStringsSep \",\" (\n        [\n          \"vfio-pci\"\n          \"host=${slot}\"\n        ]\n        ++ lib.optional (romfile != null) \"romfile=${romfile}\"\n      );\n      pciArgs = lib.concatMapStringsSep \" \" f devices;\n      usbArgs = lib.concatMapStringsSep \" \" ({ vendorid, productid }: \"-usb -device usb-host,vendorid=${vendorid},productid=${productid}\") usbDevices;\n    in pciArgs + \" \" + usbArgs;\n\n  efivars = \"/var/lib/mentor-guest/efivars\";\n  disk = \"/dev/zvol/pyromancer/mentor/disk\";\n  inherit (pkgs) OVMF qemu;\n\n  cores = 8;\n  threads = 1;\n  sockets = 1;\n\nin {\n  boot.kernelModules = [\"vfio-pci\"];\n  boot.kernelParams = [\n    \"amd_iommu=on\"\n    \"amd_iommu=pt\"\n    \"iommu=pt\"\n    \"kvm.ignore_msrs=1\"\n    \"kvm.report_ignored_msrs=0\"\n  ];\n\n  systemd.services.mentor-guest = {\n    restartIfChanged = false;\n    unitConfig.Conflicts = \"display-manager.service\";\n    serviceConfig.Type = \"simple\";\n    after = [\"display-manager.service\"];\n    preStart = ''\n      set +e\n      set -xuo pipefail\n\n      echo 0 > /sys/class/vtconsole/vtcon0/bind\n      echo 0 > /sys/class/vtconsole/vtcon1/bind\n      echo efi-framebuffer.0 > /sys/bus/platform/drivers/efi-framebuffer/unbind\n\n      ${lib.concatMapStringsSep \"\\n\" ({ slot, driver, ... }: ''\n        echo -n \"0000:${slot}\" > /sys/bus/pci/drivers/${driver}/unbind\n      '') devices}\n\n      ${lib.concatMapStringsSep \"\\n\" ({ device, ... }: ''\n        echo -n \"${device}\" > /sys/bus/pci/drivers/vfio-pci/new_id\n      '') devices}\n\n      if ! [ -f \"${efivars}\" ]; then\n        mkdir -p $(dirname ${efivars})\n        cp --no-preserve=all ${OVMF.fd}/FV/OVMF_VARS.fd \"${efivars}\"\n      fi\n    '';\n    serviceConfig.ExecStart = ''\n      ${qemu}/bin/qemu-system-x86_64 \\\n        -cpu host,kvm=off,hv_time,hv_relaxed,hv_vapic,hv_spinlocks=0x1fff,hv_vendor_id=Nvidia43FIX \\\n        -smp cpus=${toString (cores * threads * sockets)},cores=${toString cores},threads=${toString threads},sockets=${toString sockets} \\\n        -enable-kvm \\\n        -m 16G \\\n        -nodefaults \\\n        -nic user \\\n        -drive if=pflash,format=raw,readonly,file=${OVMF.fd}/FV/OVMF_CODE.fd \\\n        -drive if=pflash,format=raw,file=\"${efivars}\" \\\n        -smbios type=2 \\\n        -vga none \\\n        -nographic \\\n        -serial none \\\n        -monitor telnet:127.0.0.1:55555,server,nowait \\\n        -device nec-usb-xhci \\\n        ${qemuDevices} \\\n        -device ich9-intel-hda -device hda-duplex \\\n        -device ide-drive,bus=ide.1,drive=mentor_disk \\\n        -drive id=mentor_disk,cache=unsafe,if=none,file=\"${disk}\",format=raw,discard=unmap,detect-zeroes=unmap\n    '';\n    serviceConfig.ExecStop = \"${pkgs.bash}/bin/bash -c 'echo systemd_powerdown | telnet 127.0.0.1 55555; while echo | telnet 127.0.0.1 55555; do sleep 1; done'\";\n    postStop = ''\n      set +e\n      set -xuo pipefail\n      ${lib.concatMapStringsSep \"\\n\" ({ slot, driver, ... }: ''\n        echo -n \"0000:${slot}\" > /sys/bus/pci/drivers/vfio-pci/unbind\n      '') devices}\n\n      ${lib.concatMapStringsSep \"\\n\" ({ device, ... }: ''\n        echo -n \"${device}\" > /sys/bus/pci/drivers/vfio-pci/remove_id\n      '') devices}\n\n      ${lib.concatMapStringsSep \"\\n\" ({ slot, driver, ... }: ''\n        echo -n \"0000:${slot}\" > /sys/bus/pci/drivers/${driver}/bind\n      '') devices}\n\n      echo 1 > /sys/class/vtconsole/vtcon0/bind\n      echo 1 > /sys/class/vtconsole/vtcon1/bind\n      echo efi-framebuffer.0 > /sys/bus/platform/drivers/efi-framebuffer/bind\n\n      ${config.systemd.package}/bin/systemctl start display-manager.service --no-block\n\n    '';\n  };\n}\n","name":"","extension":"txt","url":"https://www.irccloud.com/pastebin/GK8oE03p","modified":1610528386,"id":"GK8oE03p","size":4747,"lines":132,"own_paste":false,"theme":"","date":1610528386}