search
LoginSignup
0

More than 3 years have passed since last update.

posted at

BitVisorでAMD-Vi(IOMMU)隠蔽(失敗)

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は引き続き役に立ちます。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
0