WinRing0 1.2/1.5 について

某 CPU ベンダの方から指摘を受けて、WinRing0 の API を再確認したのですが、ReadPciConfig* を始め、エラーの通知方法に問題があるということを再認識しました。現在は、エラーが発生した場合 0xFF, 0xFFFF, 0xFFFFFFFF を返す(実は、マニュアルに書いてません…)ため、実際にその値が読み込めたのかエラーが発生したかを区別することができません。この仕様は、PCI Debug Library for Win32 と合せたのですが、改めて PCI BIOS などの資料を読み返してみると問題ありな感じです。

これから他の API も含めて一貫性のあるエラーコードの返し方を検討したいと思います。既存のコードとの互換性を確保するため、エラーコードの取得に対応した API には Ex を末尾につける等の方針で対処したいと思います。

また、InitializeDll と UninitializeDll は API 名が不適切なため変更する予定です。InitializeOls と UninitializeOls かな。

一応、今年度内のリリースを予定しています。

【2008/3/13 7:30 追記】

  • 寝ながら考えたのですが、エラーが発生したときに 0xFF, 0xFFFF, 0xFFFFFFFF を返すこと自体は何も問題がありませんね。エラーが発生した場合不定値が返るよりはすっきりします。問題は、エラーが発生しているかどうかを判断する手段がないことでした。
  • 基本的に、PCI デバイスが存在し、適切なコンフィギュレーション空間へのアクセスであれば、(根拠はありませんが)失敗することはあまりないと思うので問題が発生することは少ないとは思います。
  • 返り値はひとつの値しか返せませんが、PCI BIOS は複数のレジスタを活用して、取得した値やエラーコードを同時に通知しているので、このような問題が起こるのは仕方のないことかもしれません。
  • 実際、エラーコードが引数経由で取得できるよう変更したところで value = PciConfigRead(); な使い方が多くなりそう。

おすすめ

2件のフィードバック

  1. say より:

    ご無沙汰しています。
    多少古いネタですが、コメントを書きたく思ったもので。
    私が普段仕事で作っているライブラリにでは基本的に戻り値はエラーか正常かのみを返すbool型としています。
    そうすると安易な記述がしにくく、エラーコードを引数で返すようにした上で敢えてエラー値が幾つなのか関知したくなくても
    type value;
    if (PciConfigRead(value)) {
    }
    と書かざるを得なくなりますので。

    エラーが発生せず引数を伴わないもののみ値を直接返すようにしています。

    C++なら戻り値をclassにして、
    type value(PciConfigRead());
    if (value) {
    }
    と記述できるようにしています。

  2. hiyohiyo より:

    > say さん
    コメントありがとうございます。
    更新が遅れていますが、次回は多少の仕様変更を行う予定です。
    ※いつになるかわかりませんが…

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です