superioのUARTを無効化できなくするパッチを作成してみましたが、効果がありませんでした。 Windows 8.1上でTeraTermを起動しCOM1(UART)に接続すると、VMMもUARTにアクセスできるようになるので、その状態でデバッグログを表示してみると次のようになりました。
Starting a virtual machine. Processor 1 (AP) Processor 2 (AP) Processor 3 (AP) Starting shell. > msr_pass: microcode updates cannot be loaded. msr_pass: microcode updates cannot be loaded. SUPERIO: write LDNR 0x8 SUPERIO: write reg 0xf0 0xb0 SUPERIO: write LDNR 0xa SUPERIO: write LDNR 0xa SUPERIO: write reg 0xf2 0x5c SUPERIO: write reg 0x30 0x0 SUPERIO: write LDNR 0xa SUPERIO: write reg 0xe0 0x1 SUPERIO: write reg 0xf6 0x0 SUPERIO: write reg 0xf2 0x5c SUPERIO: write LDNR 0xb SUPERIO: write reg 0x30 0xe1 SUPERIO: write LDNR 0x3 SUPERIO: write LDNR 0x6 SUPERIO: write LDNR 0x3 SUPERIO: write LDNR 0x6 SUPERIO: write LDNR 0x3 SUPERIO: write LDNR 0x6 SUPERIO: write LDNR 0x2 SUPERIO: write reg 0x61 0xf8 SUPERIO: write reg 0x60 0x3 SUPERIO: write reg 0x70 0x4 SUPERIO: write reg 0x74 0x4 SUPERIO: write LDNR 0x2 SUPERIO: write ACTR 0x1 0x1 SUPERIO: write LDNR 0x2 SUPERIO: write ACTR 0x0 0x1 <-- ここでOSはUARTをinactiveにしようとするが、VMMはactiveのままにするはずなのに、、、。 SUPERIO: write LDNR 0x2 SUPERIO: write reg 0x61 0xf8 SUPERIO: write reg 0x60 0x3 SUPERIO: write reg 0x70 0x4 SUPERIO: write reg 0x74 0x4 SUPERIO: write LDNR 0x2 SUPERIO: write ACTR 0x1 0x1
OSがUARTをinactiveにしようとしたあとにアクセスしたioportを、デバッグメッセージで出力してみました。 420h-42fhにアクセスしているようです。
SUPERIO: write LDNR 0x2 SUPERIO: write reg 0x61 0xf8 SUPERIO: write reg 0x60 0x3 SUPERIO: write reg 0x70 0x4 SUPERIO: write reg 0x74 0x4 SUPERIO: write LDNR 0x2 SUPERIO: write ACTR 0x1 0x1 SUPERIO: write LDNR 0x2 SUPERIO: write ACTR 0x0 0x1 <-- ここでOSはUARTをinactiveにしようとしている。 IOPASS: outb 0x2f 0x1 IOPASS: outb 0x2e 0x60 IOPASS: inb 0x2f 0x3 IOPASS: outb 0x2e 0x61 IOPASS: inb 0x2f 0xf8 IOPASS: outb 0x2e 0xaa IOPASS: outb 0x428 0x0 IOPASS: outb 0x429 0x0 IOPASS: outb 0x42a 0x0 IOPASS: outb 0x42b 0x0 IOPASS: outb 0x42c 0x0 IOPASS: outb 0x42d 0x0 IOPASS: outb 0x42e 0x0 IOPASS: outb 0x42f 0x0 IOPASS: inb 0x420 0x0 IOPASS: outb 0x420 0x0 IOPASS: inb 0x421 0x0 IOPASS: outb 0x421 0x0 IOPASS: inb 0x422 0x83 IOPASS: outb 0x422 0x0 IOPASS: inb 0x423 0x4e IOPASS: outb 0x423 0x0 IOPASS: inb 0x424 0x0 IOPASS: outb 0x424 0x0 IOPASS: inb 0x425 0x0 IOPASS: outb 0x425 0x0 IOPASS: inb 0x426 0x0 IOPASS: outb 0x426 0x0 IOPASS: inb 0x427 0x0 IOPASS: outb 0x427 0x0 IOPASS: outb 0x428 0xfe IOPASS: outb 0x429 0x7b IOPASS: outb 0x42a 0x0 IOPASS: outb 0x42b 0x20 IOPASS: outb 0x42c 0x21 IOPASS: outb 0x42d 0x0 IOPASS: outb 0x42e 0x0 IOPASS: outb 0x42f 0x0 IOPASS: outb 0x2e 0x87 IOPASS: outb 0x2e 0x87 IOPASS: outb 0x2e 0x7 SUPERIO: write LDNR 0x3
yuichi_xy への返信
OSがUARTをinactiveにしようとしたあとにアクセスしたioportを、デバッグメッセージで出力してみました。 420h-42fhにアクセスしているようです。
420h-42fhへのアクセスを無効化してみても、効果がありませんでした。
UEFI環境において、VM0でWindows 8.1を起動すると、シリアルコンソールへVMMのメッセージが出力されなくなる。
BIOS環境で発生した同様の問題(#33013)は、_DIS メソッドを無効化することで対策済み。
障害発生リビジョン: r301