2000/04/03 [月]
PCI バスに繋がっているデバイスの一覧を作成するときには、バス番号、デバイス番号、ファンクション番号を指定して、そのデバイスが存在しているかを検出します。したがって、取りうるすべてのバス番号、デバイス番号、ファンクション番号の値を指定して、それがエラーになるかどうかを調べればいいことになります。しかし、この方法には問題があります。それは、実際にはファンクションが一つしか存在していないのに、ファンクション番号すべてに応答してしまうデバイスがあるのです。
実は、これはファンクションの列挙の仕方が間違っているのでこのようなことが発生するのです。まずすべてのデバイスにはファンクション番号 0 は存在するというお約束になっているので、そこでそのファンクション番号を使って、デバイスがマルチファンクションデバイスかどうかを調べます。もしそうであればファンクション番号 0 以外にも存在しているので、他のファンクション番号を指定して存在を調べます。もしそうでないのならば、そのデバイスはその一つのファンクションしかありません。
結局のところ、前述した一つしかファンクションが存在していないのに、すべてのファンクション番号に応答するデバイスは、PCI の仕様には一応準拠していることになります。
実は、これはファンクションの列挙の仕方が間違っているのでこのようなことが発生するのです。まずすべてのデバイスにはファンクション番号 0 は存在するというお約束になっているので、そこでそのファンクション番号を使って、デバイスがマルチファンクションデバイスかどうかを調べます。もしそうであればファンクション番号 0 以外にも存在しているので、他のファンクション番号を指定して存在を調べます。もしそうでないのならば、そのデバイスはその一つのファンクションしかありません。
結局のところ、前述した一つしかファンクションが存在していないのに、すべてのファンクション番号に応答するデバイスは、PCI の仕様には一応準拠していることになります。
by seclan