PC-9821シリーズの BIOS ROM域における P6 CPU のMTRRの設定状態を表示・変更するツール

P6MTRR 1.30

Copyright(C)2003,2024 まりも(DOSsoft)

ここをクリックしてダウンロードする

【1.このプログラムの目的】

 Pentium Pro,PentiumII〜IIIおよびCeleron などのCPU ファミリ IDが"6" のものにはCPU内にL1,L2キャッシュがあります。キャッシュの領域は、CPU の MSR(モデル固有レジスタ)のうちMTRR_4K(メモリタイプ範囲レジスタ4KB版)というものを操作することで、キャッシュの可否が設定されます。本プログラムは アドレスC0000h 番地以降の拡張ROM域の MTRR の設定状態を表示するものです。ソフトウェア開発もできるような上級者向けです。

【2.使い方】

使い方1

 MS-DOSコマンドラインから実行、またはIPLwareアプリケーションとして実行します。仮想86モード下では実行できません。オフセット100hから始まるメモリ上にロードするプログラムを付加すれば、ROMアプリケーションとしても動作します。

使い方2

 MS-DOSコマンドラインから実行した場合に、コマンドラインオプションをつけると指定のセグメントアドレス帯のMTRRの設定を指定の値(00,01,04,05,06のいずれか)に変更できます(3・を参照)。

 例 物理アドレス C0000h からの16KB を 05 にするとき

P6MTRR C0 05

と打ちます。C1,C2,C3 のように 16KBの端数を指定すると丸められ、 C0 と同じとなります。MTRRの値が不適切な場合はエラーとなります。空白文字だけの引数がある場合もエラー表示します。

 パラメータのエラーの際は黄色の文字で
" No arguments, or invalid arguments."
と表示されてbeepも鳴りますが、引数が異常であるときは変更をしないだけであり、MTRRの表示は行います。

【3.表示内容】

 本プログラムでは C0000h番地から16KBずつのブロックで MTRRの内容を表示します。C0000h,C1000h,C2000h,C3000hの4KBずつがMTRRの1バイトずつと対応します。例えば 06060606h となっていれば、それぞれの4KBが全て06hということです。1バイトの意味は次の通りです。
00 UC:キャッシュ不可(読み書きはできる)
01 WC:ライトコンバイン(読み込みキャッシュ不可)
04 WT:読み込みキャッシュ可能、書き込み可能(ライトバック不可)
05 WP:読み込みキャッシュ可能、書き込みプロテクト
06 WB:読み書きともキャッシュ可能、ライトバック可能(一般的なメモリ属性)

 05のときは書き込みプロテクトとなっていますが,どうやらチップセット操作で出現させたメモリ領域の書き込み可否のほうが優先されるように見えます。05でもRAM BIOSエリアへの書き込みはできます。いっぽうチップセットの設定ではRAMの出現がないにもかかわらず06にすると、一時的に書き込めたかのような動作になります。CPU内のキャッシュメモリに書かれただけと考えられますが、実際にはメインメモリには書き込まれていません。

 チップセット(PCIホストブリッジ・メモリコントローラ)がintel製のものについては、そのPAM(Programmable Attribute Map)で設定されるメインメモリの出現状態も2bitで表示します。

 bit1は書き込み、bit0は読み込みのメモリアクセスが、値1のときには可能であることを示します。値が0 のときはPCIバスに接続されている状態です。

 PC-9821St以外の機種では、PCIバスで応答するものがなければCバスに接続されますので、0であれば システムROMやCバスのROM/RAMボードにアクセスするという意味になります。PC-9821Stでは、メインメモリに接続されないということだけを意味します(Cバスに接続されているかどうかは別のPCIレジスタの状態を参照・変更しないとわからない)。

 いっぽうServerWorks/NECチップセット機(RvII)ではbit1が読み込み、bit0が書き込みのようです。intelと逆ですのでご注意ください。

表示例
ADDR   MSR +3+2+1+0 PAM
C0000 0268 06060606 11b WC,メインメモリ出現(UMBとして使用中)、EMSではUCにする
C4000 0268 06060606 11b         //
C8000 0269 06060606 11b         //
CC000 0269 06060606 11b         //
D0000 026A 00000000 00b UC,メインメモリは出現していない(CバスROMの有無は不明)
D4000 026A 00000000 00b UC,メインメモリは出現していない(CバスROMの有無は不明)
D8000 026B 00000000 01b UC, RaedOnlyメインメモリが出現(RAM IDE BIOS), UC必須
DC000 026B 04040404 11b WT,メインメモリが出現(RAM SCSI BIOS)
E0000 026C 00000000 00b UC,キャッシュ不可、PCIに接続(実体はG-VRAM)
E4000 026C 00000000 00b          //
E8000 026D 05050505 10b WP,メインメモリが出現(RAM SYSTEM BIOS,N88)
EC000 026D 05050505 11b          //
F0000 026E 05050505 11b WP,メインメモリが出現(RAM SYSTEM BIOS)
F4000 026E 05050505 ↑           //
F8000 026F 05050505 ↑           //
FC000 026F 05050505 ↑           //
A0000 0259 00000000     UC, Text VRAM(A0000h〜) , Graphic VRAM(A8000h〜) 

【4.注意】

 F0000 以降は 通常、MSRは同じ値に設定されているはずです。しかし意図的に F8000h〜のITFをおもてに出したいという場合は、026FhのMTRR_4Kを 00000000hに設定しなければならないはずで、実際そうなっている可能性があります。

 F0000 以降FFFFFh までの全域で PAMの設定はひとつだけです。そのためF4000以降はF0000を参照せよという矢印で表示しています。いっぽうServerWorks/NEC chipset機では F0,F4が同一,F8,FCが同一の2セットとなります。

 このプログラムはCOM実行形式となっています。IPLwareアプリケーション兼用でもあり、DOS環境判定の必要上、EXE形式に変更して使うことはできません。

 MTRRの変更をした際にハングアップすることがあるかもしれません。キャッシュ無効→MTRR変更→キャッシュ有効 という手順を踏んでいないためです。しかし経験上はこれを行わなくても問題なく動作していました。

 FDLoaderアプリケーションあるいはシステム起動のかなり早期(ブートROMキャンより前)に実行するROMアプリケーションとするためには、キーボードルーチン(シフトキー押し保持)を、ソフトウェア割込int 18hを使用しないものに変更する必要があります。そのままでは動作しません。

 A0000h〜BFFFFhのVRAMにもMTRR_16Kというものが存在します。参考までに最下行にA0000hからの64KBの設定値を表示します。しかし 値を 00 (Uncache)以外に設定する必要性はないと考えられるため、変更ルーチンを実装していません。VRAM領域は01(WC)にすると描画が異常になることがあるようですし、キャッシュ可にするとGDCやEGCによる描画とCPUが把握する状態との辻褄が合わなくなります。基本的にグラフィックアプリケーションまたはOSのグラフィックドライバが必要とあらば自力でWCにし、終了後にUCに戻すという使い方が正しく、BIOSなどが事前に設定すべきものではないと考えられます。しかしDOS時代のものでWCを想定したグラフィックアプリケーションはおそらく存在しないでしょう。

 ソースプログラムはsorce.zipにあります。ただし文字列描画ルーチンの_putc サブルーチンのが付属していません。必要があれば DOS環境では _putDC で置き換えてください(文字列終端コードがNULLでなく$であることに注意のうえ)。

 MTRRのよい参考文献は、intelがかつて掲載していたP6 family CPU解説書(PDF)です。

【5.お約束】

  本プログラムを用いた事による動作不具合や、派生する業務不能などの損害にかんして、私は一切の責任を負わないものとします。これに同意できない方は、使用してはいけません。

まりも(DOSsoft) (連絡先メールアドレスはWebページ上で)

[履歴]

日付    版  内容
2024-8-17 1.00 新規公開
2024-8-20 1.10 RvIIのServerWorks/NECチップセットのPAM表示に対応
2024-8-23 1.20 P6 CPU以外の機種でIPLware実行時にハングアップしないようにした…(動作せず)
2024-8-24 1.30 CPU判定を誤ってP6で動作しなかった致命的バグを修正
←戻る