備忘録
- bochs の rombios の bios32_entry_point あたりから。PCI の 32bit bios エントリ取り出すとき ecx に 0 入れてるけどこれはいいのだろうか。ここってセグメントの limit 値入れるんじゃなくって? あれ?(あとで BIOS32 の仕様書を見てみよう。たしか phoenix のサイトに pdf があったはず…)
とはいえ過去の経験では、Win95、Win98SE、OS/2 は(すくなくともこれが原因で)落ちることはなかったはず。とすると のいずれかということになる。たぶん 3. だと思う。
- PCI BIOS 呼び出し時、eax, ebx, ecx, edx の内容は保証されない。戻り値として使われている部分以外の内容は破壊されている可能性がある(32 ビットレジスタの上位 16 ビット部分は注意から漏れやすいので気をつける)。これも Interrupt List 参照(レジスタの保存性について、PCI BIOS の仕様書に記述があるのだろうか…)。
- ax=b10eh (Get PCI Interrupt Routing Options) の呼び出しかた:
- まず呼び出し側データ構造体のバッファサイズ部分に 0 をブチ込んで、int 1ah, ax=b10eh 呼び出し。
- ファンクションがサポートされていれば ah=89h(バッファ不足)が返され、データ構造体のバッファサイズエントリに必要なバッファサイズが返される。
- バッファサイズ分のメモリを確保し、データ構造体のバッファアドレス部に先頭ポインタを格納する。セグメントとオフセットの格納位置に注意する(通常の FAR ポインタとは逆)。
- もう一度 int 1ah, ax=b10eh 呼び出し。ah が 00h なら正常終了。バッファ上にルーティングテーブルの配列が格納される。
- ELCR ってワード単位で in/out していいんスかねえ。もしかして byte 単位のアクセス以外は保証されてない?