(続)Linux KVMでPCIパススルー。・・・残念(斬りっ!)

あれから、進展(後退?)したので、ご報告します。
えー、まだうまくいってません。というか、今現在対応不能になってます。

ここで、ホストマシンの接続構成をあげて起きます。

# lspci -vt
-+-[0000:ff]-+-00.0  Intel Corporation Xeon 5500/Core i7 QuickPath Architecture Generic Non-Core Registers
 |           +-00.1  Intel Corporation Xeon 5500/Core i7 QuickPath Architecture System Address Decoder
 |           +-02.0  Intel Corporation Xeon 5500/Core i7 QPI Link 0
 |           +-02.1  Intel Corporation Xeon 5500/Core i7 QPI Physical 0
 |           +-03.0  Intel Corporation Xeon 5500/Core i7 Integrated Memory Controller
 |           +-03.1  Intel Corporation Xeon 5500/Core i7 Integrated Memory Controller Target Address Decoder
 |           +-03.4  Intel Corporation Xeon 5500/Core i7 Integrated Memory Controller Test Registers
 |           +-04.0  Intel Corporation Xeon 5500/Core i7 Integrated Memory Controller Channel 0 Control Registers
 |           +-04.1  Intel Corporation Xeon 5500/Core i7 Integrated Memory Controller Channel 0 Address Registers
 |           +-04.2  Intel Corporation Xeon 5500/Core i7 Integrated Memory Controller Channel 0 Rank Registers
 |           +-04.3  Intel Corporation Xeon 5500/Core i7 Integrated Memory Controller Channel 0 Thermal Control Registers
 |           +-05.0  Intel Corporation Xeon 5500/Core i7 Integrated Memory Controller Channel 1 Control Registers
 |           +-05.1  Intel Corporation Xeon 5500/Core i7 Integrated Memory Controller Channel 1 Address Registers
 |           +-05.2  Intel Corporation Xeon 5500/Core i7 Integrated Memory Controller Channel 1 Rank Registers
 |           +-05.3  Intel Corporation Xeon 5500/Core i7 Integrated Memory Controller Channel 1 Thermal Control Registers
 |           +-06.0  Intel Corporation Xeon 5500/Core i7 Integrated Memory Controller Channel 2 Control Registers
 |           +-06.1  Intel Corporation Xeon 5500/Core i7 Integrated Memory Controller Channel 2 Address Registers
 |           +-06.2  Intel Corporation Xeon 5500/Core i7 Integrated Memory Controller Channel 2 Rank Registers
 |           \-06.3  Intel Corporation Xeon 5500/Core i7 Integrated Memory Controller Channel 2 Thermal Control Registers
 \-[0000:00]-+-00.0  Intel Corporation 5520/5500/X58 I/O Hub to ESI Port
             +-01.0-[01]--
             +-02.0-[02]----00.0  NEC Corporation uPD720200 USB 3.0 Host Controller
             +-03.0-[03]----00.0  NVIDIA Corporation G86 [GeForce 8400 GS]
             +-07.0-[04]--
             +-14.0  Intel Corporation 5520/5500/X58 I/O Hub System Management Registers
             +-14.1  Intel Corporation 5520/5500/X58 I/O Hub GPIO and Scratch Pad Registers
             +-14.2  Intel Corporation 5520/5500/X58 I/O Hub Control Status and RAS Registers
             +-14.3  Intel Corporation 5520/5500/X58 I/O Hub Throttle Registers
             +-1a.0  Intel Corporation 82801JI (ICH10 Family) USB UHCI Controller #4
             +-1a.1  Intel Corporation 82801JI (ICH10 Family) USB UHCI Controller #5
             +-1a.2  Intel Corporation 82801JI (ICH10 Family) USB UHCI Controller #6
             +-1a.7  Intel Corporation 82801JI (ICH10 Family) USB2 EHCI Controller #2
             +-1c.0-[06]--
             +-1c.2-[05]----00.0  Marvell Technology Group Ltd. 88E8056 PCI-E Gigabit Ethernet Controller
             +-1d.0  Intel Corporation 82801JI (ICH10 Family) USB UHCI Controller #1
             +-1d.1  Intel Corporation 82801JI (ICH10 Family) USB UHCI Controller #2
             +-1d.2  Intel Corporation 82801JI (ICH10 Family) USB UHCI Controller #3
             +-1d.7  Intel Corporation 82801JI (ICH10 Family) USB2 EHCI Controller #1
             +-1e.0-[07]--+-00.0  Oxford Semiconductor Ltd OX16PCI954 (Quad 16950 UART) function 0 (Uart)
             |            +-00.1  Oxford Semiconductor Ltd OX16PCI954 (Quad 16950 UART) function 1 (Disabled)
             |            +-01.0  Oxford Semiconductor Ltd OX16PCI954 (Quad 16950 UART) function 0 (Uart)
             |            \-01.1  Oxford Semiconductor Ltd OX16PCI954 (Quad 16950 UART) function 1 (Disabled)
             +-1f.0  Intel Corporation 82801JIR (ICH10R) LPC Interface Controller
             +-1f.2  Intel Corporation 82801JI (ICH10 Family) SATA AHCI Controller
             \-1f.3  Intel Corporation 82801JI (ICH10 Family) SMBus Controller

こんな感じでつながっているわけです。マザーボードは、「ASUS P6X58D-E」です。

ポイントなのが、07:00.0と07:01.0の「Oxford Semiconductor Ltd OX16PCI954」というやつ。
これは、PCI版のRS232C 4ポートカードです。2枚入ってます。I/O DATAの「RSA-PCI2/P4」です。
最近のマザーボードなので、PCIバスがPCIe to PCIブリッジ下にいるわけです。

で、これを2枚をPCIパススルーしたいわけなので、

# qemu-kvm -device pci-assign,host=07:00.0 -device pci-assign,host=07:01.0

と、QEMUに pci-assign オプションを加えて起動すると、

Failed to assign irq for "????": Operation not permitted
Perhaps you are assigning a device that shares an IRQ with another device?
Failed to initialize assigned device host=07:00.0

とQEMUに起こられてそもそも起動しない、という状況でした。
もんもんとすごしていたのですが、ふと

# qemu-kvm -device pci-assign,host=07:01.0

としたところ、なぜか起動(笑)。
WindowsXPが起動できました。もしかすると、2枚挿すと調子が悪いかもしれません(未検証)。

が、しかし起動後、ハードウェアウイザードで、RSA-PCI2/P4のドライバをインストールすると、

落ちた!!!

そう、QEMUが落ちてしまいます。で、logには、

Apr 16 01:01:05 eve kernel: device tap0 entered promiscuous mode
Apr 16 01:01:05 eve kernel: br0: new device tap0 does not support netpoll (disabling)
Apr 16 01:01:05 eve kernel: br0: port 2(tap0) entering learning state
Apr 16 01:01:05 eve kernel: br0: port 2(tap0) entering learning state
Apr 16 01:01:05 eve kernel: pci-stub 0000:07:01.0: PCI INT A -> GSI 17 (level, low) -> IRQ
 17
Apr 16 01:01:20 eve kernel: br0: port 2(tap0) entering forwarding state
Apr 16 01:01:55 eve kernel: qemu-kvm[13433] general protection ip:7ffee654f659 sp:4085dd80
 error:0 in qemu-system-x86_64_1_0[7ffee63b4000+2ff000]

Apr 16 01:01:55 eve kernel: qemu-kvm[13433] general protection

ってなんだー(泣)。

qemu-kvm 1.0が出ていたので、こっちも試しましたがまったくダメ(T_T)。
なんとなく、マザーボードのIOMMU対応に問題があるような気がしてきた・・・。
「ASUS P6X58D-E」の問題なのかも。IOMMUとMarvell 9128問題もあるし、RTCが認識できないとか、結構問題あり。

もうドツボデス(T_T)。

で、じつはなぜPCIパススルーをやることになった経緯は?というと、tel2comホストとパソ通ホストをRS-232Cでクロス接続したとき、XMODEM/YMODEMなどのバイナリ送受信がうまくいかなかったこと、がそもそもの原因です。仮想化によるデバイスのカプセル化による影響かと。
PCIパススルーすれば、仮想化の影響から開放されるかと思ったのですが、あまかった(笑)。
これはしばらくお預けです。

で、本当に問題なのかということで、下記の検証をしてみました。

仮想環境下のWindowsXP+tel2com < -> パソ通ホスト(物理マシン)

としてみました。パソ通ホストは物理的にあるマシンです。
で、やってみたところ、なんとXMODEM/YMODEMが使えるのです!!!。

え?どういうこと?

どうやら、パソ通ホストがMS-DOSで動いているわけですが、RS232CドライバにMCDPC.EXEを使っています。
QEMUのシリアルが、ISAで16550A互換ということなのですが、どうやら完全互換ではないようです。
FIFOの関係かなーとか考えていますが、まだよくわかりません。

hw/serial.c のソースプログラムと格闘中です(泣)。

夜寝られるかな・・・ww。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

*