[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が分からないとドライバが書けないな。