BitVisorにはIntel VT-dの隠蔽機能(ACPI DMARテーブルを潰すだけの簡単なもの、CONFIG_DISABLE_VTD)はあるのですが、AMD-Viの隠蔽機能がありません。それをやってみたら失敗した話です。
環境
- ASUS B350M-A
- AMD Ryzen 7 2700
- Debian GNU/Linux 10
IOMMUデバイスを隠蔽してみる
AMD-Viでは、PCIデバイスとして以下のようにIOMMUのデバイスが見えています。
# lspci -nnv -s 00:00.2
00:00.2 IOMMU [0806]: Advanced Micro Devices, Inc. [AMD] Family 17h (Models 00h-0fh) I/O Memory Management Unit [1022:1451]
Subsystem: ASUSTeK Computer Inc. Family 17h (Models 00h-0fh) I/O Memory Management Unit [1043:8747]
Flags: fast devsel, IRQ 27
Capabilities: [40] Secure device <?>
Capabilities: [64] MSI: Enable+ Count=1/4 Maskable- 64bit+
Capabilities: [74] HyperTransport: MSI Mapping Enable+ Fixed+
これをBitVisorで隠蔽してしまえば、ゲストオペレーティングシステムから見えなくなるのではないかと思ったわけです。そこで以下のような設定で試しました:
vmm.driver.pci=class=0806, driver=conceal
その結果、GNU GRUBまでは動いていましたが、Linuxは起動しませんでした。
ACPI IVRSテーブルを隠蔽してみる
AMD-Viでも、ACPIにも関連するテーブル、IVRSがあります。DMARと同様に、IVRSを消してしまえばいいのではないかと思ったわけです。そこで以下のような修正で試しました:
diff --git a/core/acpi.c b/core/acpi.c
--- a/core/acpi.c
+++ b/core/acpi.c
@@ -981,6 +981,13 @@ acpi_init_global (void)
}
pm1a_cnt_found = true;
save_mcfg ();
+ {
+ char*p=find_entry("IVRS");
+ if(p){
+ printf("Found IVRS %p\n",p);
+ memset(p,0,4);
+ }
+ }
}
INITFUNC ("global3", acpi_init_global);
その結果... 上述のIOMMUデバイス隠蔽をしていた場合はLinuxが起動しないのは変わらず、隠蔽していなかった場合は、ゲストオペレーティングシステムが起動すると、 なぜかIVRSテーブルが復活している という結果でした。
まとめ
結局うまくいっていないのですが、幸いUEFI Setup/BIOS Setup画面から、AMD-Vi(IOMMU)を無効にすることはできますので、BitVisorを試す場合はとりあえずはそれでいくことになります。まぁ、Intelでもその点は同様なんですが、Macのようにそのようなオプションがないコンピューターもありますので、CONFIG_DISABLE_VTDは引き続き役に立ちます。