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