あれから、進展(後退?)したので、ご報告します。
えー、まだうまくいってません。というか、今現在対応不能になってます。
ここで、ホストマシンの接続構成をあげて起きます。
# 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。