CSMWrap https://github.com/FlyGoat/CSMWrap 作者さま想定の使い方は efiしか準備されていない機種で古い(古いのか…)OSを起動させることだと思います。 ですのでこれを使ってWindowsXPやWindows9xを動作させているレポートがある程度存在します。 私は違う目的で利用させてもらいました。 とても感動しているので文章を残します。 PCIカードのBIOSは電源投入時に条件を満たしていると必ず実行されます。 最近の私は自作プログラムを書き込んだROMを実行させようと遊んでいるわけです。 で、無限ループしちゃうようなものを書き込んでしまいました。そのこと自体は私がおろかなので仕方ありません。 そんな場合もPCIカードにROM石が載っているようなものだとはがして、汎用のツールで読み書きできます。 しかし直近で遊んでいるもの(PDC20271)はLSI内部にBIOSROM空間を持っている独自石です。 普通のものは使えません。 ということで電源投入時のROM実行をせずにパソコンでROM書込プログラムを動作させる必要がでてきました。 そのときにeFI環境だと大昔のタイプのPCIBOOTROMは実行されません。 その状態でCSMWrapを使ってPC-DOSを起動させるところまでたどり着けば書込プログラムが動作させられるのでは? という目論見でした。 結果としては成功していますが、かなりなやんだので書き残します。 実験環境 マザーボード Z68 Extreme4 Gen3 CPU Sandy Bridge 2700K メモリ DDR3 4GB 1枚(どうもメモリスロット側が壊れてそう) ビデオ オンボードVGA PCIカード TX2000のROMを起動条件を満たした上で無限ループするようにしてしまったもの CSM無効設定はFASTBOOT設定をdisableにするとACPIのオプションの欄に生えてきます。 CPUの設定でセキュリティ関連の機能を無効、Hyperthreadingも無効、有効コア数を1にする必要がありました。 コア数を複数にしているとFreeDOSはkernel起動直後にリセットがかかりました。 先頭efi領域にCSMwrapのローダファイルを書き込んだUSBメモリを準備します。 この状態で、オンボードSATA(一応IDEモードにしておきましたが不要かも?)にはMBRなDOS起動領域を含むもの(事前に準備する必要があります。)をつなぎます。 電源を入れるとPCIBOOTROMを無視してDOSが起動してきます。 CSM有効にしていると無限ループですからこの時点で目的の半分は達成したと思っていました。 DOS起動時点での状態 PCIカードは完全な初期化はされていません。PCI config spaceの06hのCOMMANDが0のままです。 まずは07hにしてIO制御、メモリ制御をCPUに許可する必要があります。 IOやメモリ範囲は多段ブリッジ環境でもうちの環境ではきちんとされていました。 もしそれすら省略されるようでしたらOSがしてくれないので全部手動でやる必要はあります。 A20もDOS=LOWの状態ですが最初からつながっているようです。 公式書込プログラムPTIFLASH.EXE いろいろプロテクトがありますが、それは突破したという前提で unrealモードで1Mより上のメモリにアクセスを行って、MMIOとの会話をやっています。 ROM書込も読み出しもMMIO経由です。ROM読み出しも直接アドレスでやっていません。(手動でそれは可能でした。) で、それが問題でした。 ROM読み出しすらフリーズします。(CSMモードで起動して、通常に動作した場合はきちんと動作するプログラムです。) どうやらunrealモードでlimitを64kBから拡張してもlimitが64kBに抑えられてしまうようです。 (完全にプロテクトモードの中ではそんなことはないはず、Windowsが動いているレポートがあるので) 実際にROMを読み出している部分はこのようなコードです。 mov si,[bp+4] push esi and esi,0ffffh add esi,[0d66h] mov ax,[0d72h] mov ds,ax mov ax,[esi] 書込の場合も方向が逆なだけで同じようなものです。 bp+04はROM内アドレス(バンクみたいなもの?) 0D66hにはMMIOのアドレスが32bitで入っています。 0D72hはプロテクトモード用のlimit4GBのセレクタ番号ですが、リアルモード中になぜこれで動くのか私はわかっていません。 そしてそのセレクタを相手にして1Mより上のメモリをaxに読み出します。 この瞬間にフリーズします。(おそらくlimit制限のエラーを吐いてそう) もちろん通常のCSMから起動してきたときには問題なく読み出してきます。 解決したのであれこれ言えますが私は基底をMMIOのアドレスにしたlimit64kbなセレクタを準備してFSにあてがうようにパッチして そこを相手にアクセスすることによって暴走せずに読み書きできたことを確認しています。 書き込めたのでCSMモード起動で無限ループしなくなりました。直後にCSMで起動した状態でまともな内容のROMに書き直せました。 CSMWrapのバグかはわかりません、がunrealモードを使うようなプログラムでどうなるか色々テストしてみるとわかるかもしれません。 2026-2-1 初版 実験がうまく行ったのは1-31時点 バグ報告のつもりではありません、うまく行ってうれしいな、の感想文です。 drachen6jp リウ