[Mona] PCIデバイス2

PCIコンフィギュレーション情報の読み取りコードを書いた。
PCI HEADER TYPEがゼロで返って来る。(QEMU, Virtual PC, Vmware)。
これが正解なのかが分からないのが困りものだ。


HEADER TYPEから、I/O BASEを求めようと思ったのだが、よく考えたらその対応表もまだ探してなかった。
核心部分はちょっと長いので貼れないが↓の感じで情報を列挙するのだ。

int MonaMain(List<char*>* pekoe)
{
   /* ユーザーモードI/O */
   syscall_get_io();

   /* bus0 のデバイス探索 */
   for (int i = 0; i < 32; i++)
   {
       word vendor = ReadConfig(0, i, 0, PCI_VENDOR_ID, 2);

       /* no device */
       if (vendor == 0xFFFF) continue;

       printf("**** device(%d)*****************************************************************************\n",i);
       printf("vendor    = %x  ", vendor);
       printf("device    = %x  ", ReadConfig(0, i, 0, PCI_DEVICE_ID, 2));
       printf("revision  = %x  ", ReadConfig(0, i, 0, PCI_REVISION , 1));
       printf("status    = %x\n", ReadConfig(0, i, 0, PCI_STATUS   , 2));
       printf("header    = %x  ", ReadConfig(0, i, 0, PCI_HEADER   , 1));
       printf("api       = %x  ", ReadConfig(0, i, 0, PCI_API      , 1));
       printf("subclass  = %x  ", ReadConfig(0, i, 0, PCI_SUBCLASS , 1));
       printf("baseclass = %x\n", ReadConfig(0, i, 0, PCI_BASECLASS, 1));
   }
   return 0;
}

I/O BASEが分からないとドライバが書けないな。