<pre>表示

-

CMPSPF - reiria

2024/06/08 (Sat) 22:01:39

■これは

CMPS 命令で ESI EDI 両方がページフォルトするはずの時、
ESI EDI どちらが先にページフォルトするのか調べる DOS 用プログラムです。

■今まで LEMM の ucgw.doc に

> 補足 ******
> cmps の場合、movs の場合と逆になるようです。(es:di で決まる)

と書いていましたが、CPU によって違うようです。

■動作環境は

98 か PC/AT 互換機のリアルモードか VCPI です。

PC/AT 互換機での文字色変化は ANSI.sys が必要です。

■とりあえず実行すると

>A:\>cmpspf
>
>CMPS PageFault ESI or EDI checker release 0 06-06-24 10:30:59 Pt
>
>CMPS PageFault EDI ←ここの ESI or EDI が調査結果
> ↓ページフォルトの状況
>exception = 0E
>errorcode = 00000000 RSVD:0 U/S:0 W/R:0 P:0
> CR2 = 000A4100
> CS:EIP = 0030:00000104 67 A6 90 90 90 90 90 90 90 90 90 90 90 90 90 90
> DS:ESI = 0020:000A4000 -> 00000000:000A4000
> ES:EDI = 0020:000A4100 -> 00000000:000A4100

というように表示されます。

■つまり

ESI = 000A4000h
EDI = 000A4100h
DS = 0020h (4G flat)
ES = 0020h (4G flat)
CS = 0030h (プロテクトモード use16)

という状況で CMPS を実行し、ページフォルトを発生させています。
(ESI EDI のページを不在ページにして CMPS を実行)

ESI EDI のアドレスを変更したい場合、

|A:\>cmpspf A0000 A2000
↑ESI ↑EDI

というように指定します。

ESI だけ指定した場合、EDI = ESI + 100h になります。

■その他

・MOVS STOS LODS SCAS INS OUTS を指定するとそれを実行します。
(W D を付加すると実行コードは変化しますが表示に B W D は付加されません)

・CS ES FS GS SS REP|E|Z REPNE|Z を指定すると付加します。
(DS ES FS GS は全て同じセレクタで 4G flat)

・REP|E|Z REPNE|Z はデフォルト ECX = 1 で実行します。
(ECX=0 を指定すると ECX = 0 で実行しますが通常何も起きなくなります)

・INS/OUTS はデフォルト DX = 005Ch で実行します。
(EDX=x を指定すると EDX = x で実行)

・DEBUG を指定すると CR0 CR3 EFLAGS SS:ESP Exx 等も表示されます。

Re: CMPSPF - reiria

2024/06/08 (Sat) 22:07:44

現在、当方で確認したものは下記のとおりで、05xx が ESI のようです。MII は見なかったことにしつつ(^^;;;
ucgw.doc を書いた当時は Ra266 か RvII26 でしか確認しなかったような気が・・・ (^^;;;;;;

<?div align="center">
CMPS PageFault <?font color="green">ESI<?/font> or <?font color="red">EDI<?/font>
<?table border="1" style="border-collapse: collapse;">
<?thead>
<?tr>
<?th><?/th>
<?th>CPU<?/th>
<?th>ID<?/th>
<?th>PC<?/th>
<?/tr>
<?/thead>
<?tbody>
<?tr>
<?td><?font color="red">EDI<?/font><?/td>
<?td>TI486SLC/E<?/td>
<?td>0411<?/td>
<?td>VX21<?/td>
<?/tr>
<?tr>
<?td><?font color="red">EDI<?/font><?/td>
<?td>IBM486SLC2<?/td>
<?td>A422<?/td>
<?td>VX21<?/td>
<?/tr>
<?tr>
<?td><?font color="red">EDI<?/font><?/td>
<?td>DX4<?/td>
<?td>0480<?/td>
<?td>486NAV<?/td>
<?/tr>
<?tr>
<?td><?font color="green">ESI<?/font><?/td>
<?td>Pentium<?/td>
<?td>052B<?/td>
<?td>La10<?/td>
<?/tr>
<?tr>
<?td><?font color="green">ESI<?/font><?/td>
<?td>Pentium<?/td>
<?td>052C<?/td>
<?td>Xa16<?/td>
<?/tr>
<?tr>
<?td><?font color="green">ESI<?/font><?/td>
<?td>MMX Pentium<?/td>
<?td>0544<?/td>
<?td>Xa16<?/td>
<?/tr>
<?tr>
<?td><?font color="green">ESI<?/font><?/td>
<?td>K6-2<?/td>
<?td>058C<?/td>
<?td>V166<?/td>
<?/tr>
<?tr>
<?td><?font color="green">ESI<?/font><?/td>
<?td>K6-III<?/td>
<?td>0591<?/td>
<?td>Xa16<?/td>
<?/tr>
<?tr>
<?td><?font color="green">ESI<?/font><?/td>
<?td>MII<?/td>
<?td>0600<?/td>
<?td>Xa16<?/td>
<?/tr>
<?tr>
<?td><?font color="red">EDI<?/font><?/td>
<?td>Pentium Pro<?/td>
<?td>0617<?/td>
<?td>Rv20<?/td>
<?/tr>
<?tr>
<?td><?font color="red">EDI<?/font><?/td>
<?td>Pentium Pro<?/td>
<?td>0619<?/td>
<?td>Rv20<?/td>
<?/tr>
<?tr>
<?td><?font color="red">EDI<?/font><?/td>
<?td>Pentium II<?/td>
<?td>0633<?/td>
<?td>RvII26<?/td>
<?/tr>
<?tr>
<?td><?font color="red">EDI<?/font><?/td>
<?td>Pentium III<?/td>
<?td>0673<?/td>
<?td>Ra266<?/td>
<?/tr>
<?tr>
<?td><?font color="red">EDI<?/font><?/td>
<?td>Pentium III-M<?/td>
<?td>06B1<?/td>
<?td>X24<?/td>
<?/tr>
<?tr>
<?td><?font color="red">EDI<?/font><?/td>
<?td>Pentium M<?/td>
<?td>06D8<?/td>
<?td>T43p<?/td>
<?/tr>
<?tr>
<?td><?font color="red">EDI<?/font><?/td>
<?td>i7-4790S<?/td>
<?td>306C3<?/td>
<?td>G1<?/td>
<?/tr>
<?!--
<?tr>
<?td><?font color="green">ESI<?/font><?/td>
<?td>
Neko Project 21 ver.0.86
T98-Next 13.1th Beta
Anex86 v2.78
Virtual98 Version 0.28
SL9821 beta Version 0.4.0.2
<?/td>
<?td><?/td>
<?td><?/td>
<?/tr>
--?>
<?/tbody>
<?/table>
<?/div>

386 マシンは持ってないので不明ですが、もし 386 が EDI で、それがちゃんと仕様だったとすれば、
Pentium 互換世代(?)だけ何かの間違いだったりするんでしょうかヌ(^^;

Re: CMPSPF - リウ

2024/06/09 (Sun) 00:23:25

とてもおもしろいものをありがとうございます。
さっそく手元の386機でも試してみました。
リアルモードのDOS6環境下です。
PC-9801RA2 リセット時DX=0305h(D0Step?) EDI
PC-386M リセット時DX=2308h(Cstep?) EDI
となりました。

Re: CMPSPF - reiria

2024/06/09 (Sun) 00:54:40

うおお、いきなり 386 の情報ありがとうございます。
386 も EDI であれば、これはほんとに Pentium 互換世代(?)だけが何か妙なことになってるのかもですねえ(^^;

Re: CMPSPF - KAZ.K

2024/06/09 (Sun) 10:07:04

いやだから定義上未定義だってちゃんと書いてあるんだから、妙っていうほど妙なことは無いですよ。未定義が言うほど不定とは限らないってだけで・・・。

どちらかというとP6系のarchで絶対に反転しないのかどうかの方が気になりますけどねぇ。DSとESをセレクタ分けて片方だけTLB missとか、TLB missがcache missを踏んだ場合とか、DSをオーバーライドしても挙動同じなのかとか、そのへん。っても#PFって厳密にはload時点で発生するものではなくて、あくまで「読めなかった値を消費して外部状態に反映するuop」がretireまで達しないと確定しないので (でないと投機実行にならない)、いくら2つのloadがreadyになるタイミングがずれたとしても、結局compareが値を取り込む順序が固定ならどのみち順番は変わらない、で合っているような気もする。


追) 書いてから思い出したけどP6のTLBはページ不在をキャッシュできなかった気がしてきた。spectre的にTLB載せたつもりにしてもだめそう。TLB missからのpage tableのhit/missだけかなぁ分けられるのは。

関係ありそうでないやつ - KAZ.K

2024/06/09 (Sun) 10:51:11

386っていえば INS/MOVS がsi/diの更新に間違って次の命令のアドレスサイズを使っちゃうとかいうバグ、あれってどのくらいの範囲の386なんですかね? 86BUGS.LSTとか見るとsomeって書いているので全部ではないんだろうけど、いったいどのへんでサイレント修正したのやら。ΣΣで表向き大丈夫なのは32bit幅mulだけですよね確か。

自分でx86系を使いだしたのって486からなので、それ以前の話なんて追ってないんですよねぇ。その辺の時代は Spec Update なんてはなからまともに公開されてないですし。

Re: CMPSPF - reiria

2024/06/09 (Sun) 11:10:52

いやあ、うちなんて 286 の次が Pentium II なんで、間の 386 486 Pentium のこととかさっぱりですヌ(^^;;;
ちょっと今から出掛けるんで、ついでにコンビニで 386 とか売ってないか見てみますのん(;_;)

まっかっかー - KAZ.K URL

2024/06/14 (Fri) 08:55:09

いまいちはっきりしないけれど、少なくともWin95が Error B1 で動作拒否したやつ、つまり stepping Bx (DX=0303) 以下は全滅のようだ? ΣΣでMULだけ大丈夫でもダメと。それはそう。


Fault0:
rep movs dword ptr [esi], dword ptr [edi] ; DWORDS first
; THE NEXT INSTRUCTION MUST HAVE ADDRESS SIZE OVERRIDE
db 67h ; CHIP BUG - DO NOT REMOVE
nop ; CHIP BUG - DO NOT REMOVE

↑HIMEM.SYSの謎NOP (XMS20.ARC\OEMSRC.ARC\XM386.ASM) とかはわりかし有名なわけだけど、よく見るとページング中は 1000h より上へのI/OはTLB巻き込んで間違えるだとか、わりとプププなバグが・・・いやでも本当に多いなコレ(@@;

時系列からすると 386SX はようやく修正できた直後くらいっぽいけど、わざわざSX/SL系列に言及してるのは大変に少ない・・・。

Re: CMPSPF - reiria

2024/12/31 (Tue) 23:34:04

当方で確認したものを追加しました。

> Pentium 互換世代(?)だけ何かの間違いだったりするんでしょうかヌ(^^;

WinChip 一族は EDI ぽいヌ(^^;;;

<?div align="center">
CMPS PageFault <?font color="green">ESI<?/font> or <?font color="red">EDI<?/font>
<?table border="1" style="border-collapse: collapse;">
<?thead>
<?tr>
<?th><?/th>
<?th>CPU<?/th>
<?th>ID<?/th>
<?th>PC<?/th>
<?/tr>
<?/thead>
<?tbody>
<?tr>
<?td><?font color="red">EDI<?/font><?/td>
<?td>i386SX<?/td>
<?td>2305<?/td>
<?td>VX21<?/td>
<?/tr>
<?tr>
<?td><?font color="red">EDI<?/font><?/td>
<?td>TI486SLC<?/td>
<?td>0410<?/td>
<?td>VX21<?/td>
<?/tr>
<?tr>
<?td><?font color="red">EDI<?/font><?/td>
<?td>TI486SLC/E<?/td>
<?td>0411<?/td>
<?td>VX21<?/td>
<?/tr>
<?tr>
<?td><?font color="red">EDI<?/font><?/td>
<?td>IBM486SLC2<?/td>
<?td>A422<?/td>
<?td>VX21<?/td>
<?/tr>
<?tr>
<?td><?font color="red">EDI<?/font><?/td>
<?td>DX4<?/td>
<?td>0480<?/td>
<?td>486NAV<?/td>
<?/tr>
<?tr>
<?td><?font color="green">ESI<?/font><?/td>
<?td>6x86<?/td>
<?td>0520<?/td>
<?td>Xa16 改<?/td>
<?/tr>
<?tr>
<?td><?font color="green">ESI<?/font><?/td>
<?td>Pentium<?/td>
<?td>052B<?/td>
<?td>La10<?/td>
<?/tr>
<?tr>
<?td><?font color="green">ESI<?/font><?/td>
<?td>Pentium<?/td>
<?td>052C<?/td>
<?td>Xa16<?/td>
<?/tr>
<?tr>
<?td><?font color="red">EDI<?/font><?/td>
<?td>WinChip C6<?/td>
<?td>0541<?/td>
<?td>Xa16<?/td>
<?/tr>
<?tr>
<?td><?font color="green">ESI<?/font><?/td>
<?td>MMX Pentium<?/td>
<?td>0544<?/td>
<?td>Xa16<?/td>
<?/tr>
<?tr>
<?td>?<?/td>
<?td>WinChip 2 ピポラナイ<?/td>
<?td>?<?/td>
<?td>Xa16<?/td>
<?/tr>
<?tr>
<?td><?font color="red">EDI<?/font><?/td>
<?td>WinChip 2A<?/td>
<?td>0587<?/td>
<?td>Xa16<?/td>
<?/tr>
<?tr>
<?td><?font color="green">ESI<?/font><?/td>
<?td>K6-2<?/td>
<?td>058C<?/td>
<?td>V166<?/td>
<?/tr>
<?tr>
<?td><?font color="green">ESI<?/font><?/td>
<?td>K6-III<?/td>
<?td>0591<?/td>
<?td>Xa16<?/td>
<?/tr>
<?tr>
<?td><?font color="green">ESI<?/font><?/td>
<?td>6x86MX<?/td>
<?td>0600<?/td>
<?td>Xa16<?/td>
<?/tr>
<?tr>
<?td><?font color="green">ESI<?/font><?/td>
<?td>MII<?/td>
<?td>0600<?/td>
<?td>Xa16<?/td>
<?/tr>
<?tr>
<?td><?font color="red">EDI<?/font><?/td>
<?td>Pentium Pro<?/td>
<?td>0617<?/td>
<?td>Rv20<?/td>
<?/tr>
<?tr>
<?td><?font color="red">EDI<?/font><?/td>
<?td>Pentium Pro<?/td>
<?td>0619<?/td>
<?td>Rv20<?/td>
<?/tr>
<?tr>
<?td><?font color="red">EDI<?/font><?/td>
<?td>Pentium II<?/td>
<?td>0633<?/td>
<?td>RvII26<?/td>
<?/tr>
<?tr>
<?td><?font color="red">EDI<?/font><?/td>
<?td>Pentium III<?/td>
<?td>0673<?/td>
<?td>Ra266<?/td>
<?/tr>
<?tr>
<?td><?font color="red">EDI<?/font><?/td>
<?td>Pentium III-M<?/td>
<?td>06B1<?/td>
<?td>X24<?/td>
<?/tr>
<?tr>
<?td><?font color="red">EDI<?/font><?/td>
<?td>Pentium M<?/td>
<?td>06D8<?/td>
<?td>T43p<?/td>
<?/tr>
<?tr>
<?td><?font color="red">EDI<?/font><?/td>
<?td>Core 2 Duo E8500<?/td>
<?td>1067A<?/td>
<?td>G0<?/td>
<?/tr>
<?tr>
<?td><?font color="red">EDI<?/font><?/td>
<?td>i7-4790S<?/td>
<?td>306C3<?/td>
<?td>G1<?/td>
<?/tr>
<?!--
<?tr>
<?td><?font color="green">ESI<?/font><?/td>
<?td>
Neko Project 21 ver.0.86
T98-Next 13.1th Beta
Anex86 v2.78
Virtual98 Version 0.28
SL9821 beta Version 0.4.0.2
DOSBox-X ver.2024.12.04
<?/td>
<?td><?/td>
<?td><?/td>
<?/tr>
--?>
<?/tbody>
<?/table>
<?/div>

今年の目標はピポらない WinChip 2 を何とかしたい(;_;)

Re: CMPSPF - reiria

2025/01/04 (Sat) 12:13:22

LEMM の認識メモリ量自力検出が、Cx486 系で 16MB 以上がキャッシュ有効の場合、
16MB ラップアラウンドの判別に失敗し、間違って 16MB 多く認識する場合があることが判明しました。

当方では今まで長らく VX21 に ABM 製のアクセラレータで動作確認していて、
それ (TI486SLC/E [0411]) では 16MB ラップアラウンドを判別出来ていた(たぶん)のですが、
CMPSPF の確認で IO 製 (TI486SLC [0410]) に変更したところ、判別に失敗する場合があることに気付きました。
他の BUFFALO 製等は所持しておらず不明ですが、むしろ ABM 製が例外的なのやも?(^^;;;
いや、ABM 製や IBM486SLC2 ももっとちゃんと確認せねば・・・ (;_;)

IO の Cx486 系キャッシュドライバ PK486D.com のデフォルトは CCR0 bit0=1 で、
その状態なら IO 製 (TI486SLC [0410]) でも判別は失敗しませんが、/C=00 や /H にすると失敗します。
デフォルトが bit0=1 なのはリアルモード HMA 対策で、16MB 誤認対策ではないはずたぶん(^^;

CPU 自体の違いか、アクセラレータの作りの違いかわかりませんが、
今までの LEMM は全てのバージョンにおいて判別出来ない場合がありそうです。判別処理を改善したいです。

あと、LEMM.exe -ZFFFF と指定して組み込むと判別処理を実行しないようになっていて、
この場合、ラップアラウンドするマシンではキャッシュ無効でも 16MB 多く誤認するようになります。

Re: CMPSPF - reiria

2025/01/05 (Sun) 08:45:28

Cyrix ネタといえば、VHLT や howhlt の CPU 判別が手抜きで、6x86MX,MII を P6 と勘違いして [Y/N] (^^;;;

Re: CMPSPF - KAZ.K

2025/01/07 (Tue) 11:33:31

> リアルモード HMA 対策

これなー。386までのA20マスクは外部回路でCPUからは見えてないから、どうしてもそうなるんですよねぇ。

486以降(とSMM拡張付きの386)はCPUにA20M#が直接入って、これがアーキテクチャ上は両方向エッジトリガの割り込み入力になっていて、ソフト側からは見えないマイクロコードレベルの割り込み処理で、リアル用決め打ちTLBの内部ステートを差し替えているものと思われる。そういう仕組みなのでマスク相当のアドレス変換が入るのはTLBのステージで、マスク相当処理の入る前の物理アドレスが漏れる余地はどこにもないので、キャッシュ不整合が起きる余地は・・・それ自体には無い、んだけど、A20M#「割り込み」の配送は非同期な上にその到着をソフトウェア側から直接的に確認する方法はどこにも無いので、切り替え後には(A20M#配送の外部回路に固有の)ウェイトと(CPU側の)直列化を挟まないと切り替わりの完了を保証できない・・・とはいえそこにウェイトを要するのは386までの外部マスク回路の駆動もそうであったわけで、新しい問題が増えたわけではないんだけど・・・うーんこの。

Re: CMPSPF - reiria

2025/01/08 (Wed) 01:24:44

VX21 の 386 (2305) にも何かやばそうな不具合とかあると嬉しいところでありますヌ(^^;
上で書かれてる rep movs って 2305 では修正済みぽいですかねえ(;_;)

SX - KAZ.K

2025/01/08 (Wed) 09:30:42

SXはstepping名にすると 2304→A0、2305→B、2308→C~E ですけど、むしろA0が04から始まっているのが本質っぽいんですよねぇ。たぶんSX-A0時点で既にDX-B系列よりは後 (というか出荷されてないことになっているDX-C相当) で、DX-D0がSX-B、DX-D1以降がSX-C~E、と。

ぶっちゃけSXってDXのBS16#を潰して出す足を減しただけの代物で、中核の論理構成は同じ物なんじゃないかと。die shot 見ると四辺の足回りが微妙に一致しないので別dieではあるんだろうけれど、そのわりには足回り以外の中央部は全く同じに見えるんですよね。なんか内部データバスも一部半減云々って説明されているのを見るけれど、単に繋がる先の外部バスが上半分無いので内部バスも上半分死んでいるってだけの話で、回路自体はまるっきりそのまま残っていそうな気がする。

傍証というほどでもないけど、QFPなSXとQFP版のDXの足を見比べると一目瞭然で (まだフリップチップじゃないのでQFPの足の順序はdieの四辺のパッド順と概ね対応する)、大雑把に言えばDXから D16~D31 と A24~A31 を切り取って角の位置を調整すればSXになるけど、DXの BE{0~3}# がそのままSXの BLE# BHE# と A1 に化けているので、A1 だけ完全にぼっちでその他全てのアドレスラインはパッケージの反対側(^^;;;


追) POPA[D] bug はintel/AMDの素の386には全部あるのでは? 0308のままのDX-F0時点で未修正のはず(27287403)。修正済の386があるとしてもSMM拡張版とかEXとかだけじゃないかと。

名前
件名
メッセージ
画像
メールアドレス
URL
編集/削除キー (半角英数字のみで4~8文字)
プレビューする (投稿前に、内容をプレビューして確認できます)

Copyright © 1999- FC2, inc All Rights Reserved.