Windiows上でteratermを起動してCOM1に接続してキーボードを押しても、シリアルへ出力されない。
一方で、teratermを起動してCOM1に接続している間は、VMMのshellを操作できる。 teratermを終了すると、shellの操作もできなくなる。
Windowsが3f8h-3ffhのIO port以外を使ってシリアルコントローラの有効、無効を制御している可能性が考えられる。
Super I/Oのデータシートによると、2Eh/2Fhか4Eh/4FhのI/Oポートを使ってコンフィグレーションレジスタへアクセスできるようです。 コンフィグレーションレジスタにはUARTの有効、無効を切り替えるレジスタもあります。
そこで、これらのI/OポートへのOSによるアクセスを無効化するようVMMを改造してみました。 しかし、Windowsを起動した時にシリアルコンソールが使えなくなる事象は発生しました。
teratermを閉じると、コンフィグレーションレジスタでUARTが無効化されています。 しかし、VMMでアクセスを無視するようにしているので、なぜ、本当に無効になってしまうのか分かりません。
> outb 0x2e 0x87 outb 0x2e 0x87 outb 0x2e 0x7 outb 0x2f 0x2 outb 0x2e 0x74 inb 0x2f outb 0x2e 0x74 inb 0x2f outb 0x2e 0x30 outb 0x2f 0x0 outb 0x2e 0x60 inb 0x2f outb 0x2e 0x61 inb 0x2f
「\\_SB_.PCI0.LPCB.UAR1._DIS」を無効化するパッチを作成したところ、Windows 8.1の起動後も、シリアルコンソールへVMMのメッセージが出力されるようになった。
私のPCでは、シリアルコントローラの_HIDは、数値ではなく、メソッドになっていました。
TinyVisorはBitVisorのAMLパーサを使っていますが、メソッドの実行ができないため、シリアルコントローラに対応するデバイスオブジェクトを見つけることはできません。
Device (UAR1) { Name (_UID, One) Method (_HID, 0, NotSerialized) { Return (^^SIO1.UHID (Zero)) }
r169で、NetBSD 6.1.3 の AML インタープリタを移植しました。 そのインタープリタを使用して、シリアルコントローラのデバイスオブジェクトを特定し、その _DIS メソッドを無効化するようにしました。
その結果、VM0 で Windows 8.1 を起動しても、シリアルコンソールへ VMM のメッセージが表示されるようになりました。
VM0でWindows 8.1を起動すると、シリアルコンソールへVMMのメッセージが出力されなくなる。