GPU Passthrough in Bhyve (2)

接着昨天继续折腾,目前并没有什么进展……

Windows 这边还是错误43。经常看某些视频的可能知道普通情况是显卡坏了,然而我这个显卡直接用是没问题的,所以还是 passthrough 有啥问题。

首先,说 NVidia 从某个版本开始,在驱动里面做了限制。如果检测到 VM,那就报43。围绕这个有很多办法,比如 KVM 那边可以设置一个 kvm=off (或者 libvirt 里面 hidden=on),隐藏 hypervisor 的存在。我看了眼那个 patch,照着改了几次 bhyve 里面的 CPUID 处理,另外还改了系统的 vendor 之类,然而依然没用。后来看见还有另一个办法:直接 patch 掉驱动里面的检测代码。我 patch 了一波,结果还是 43,那看来根本就不是这个检测的问题了……

那看来应该还是某种硬件上的问题。鉴于 Nouveau 跑得好好的,看来是某些不是那么关键的东西没有模拟对。Linux 虚拟机里面一开始有一堆错误,主要是 PCI BAR 分配的问题。

Bhyve 的 PCI BAR 分配很基础,就是从 0xC0000000 开始一路往上填。对于64位的 BAR,从64位的基础地址开始填。然而 Bhyve 的64位基础地址太高,所以其实搞下来一点就行。我为了尽可能模拟真实环境(我看我真机上64位 BAR 也是在32位地址空间里),hack 了一波分配逻辑,把显卡最大的那个64位 BAR 给塞到了 0xC0000000 – 0xD0000000,然后其他的直接从0xD0000000开始填。这么搞完之后,这部分错误就没有了。另一部分错误是因为 Bhyve 不关心 PCI ROM 那块的空间,所以 PCI Bridge 上面的资源窗口不包括 ROM 那块。因为 ROM 默认在 0xDF000000 – 0xDF00FFFF,我直接把窗口开到了 0xE0000000,那么这个错误也解决了。

所以现在就很尴尬,Linux 那边没啥错误,Nouveau 跑得挺好,官方驱动起不来,报RmInitAdapter Failed (0x31:0xffff:834),Windows下面错误43,也不清楚到底是哪里有问题……

剩下的疑点有几个:

  1. Linux那边的guide一般提到需要 VBIOS 支持 EFI。我看我 Windows 里面 VBIOS 访问并没有问题(GPU-Z还可以dump,结果和真机一样),所以VBIOS访问应该正常。然而是不是需要真的去跑这个VBIOS呢?比如说在OVMF固件里面?我也不知道……
  2. 中断可能有点问题,Linux有个错误说无法找到中断路径啥的,然而理论上不用MSI应该也能跑?比较奇怪……
  3. 貌似有些 PCI capability 没有传进去,两边的 lspci 结果有区别。

只能接着折腾了……

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.