備忘録

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