[15090]  のびえもん
投稿者:のびえもん さん   2008-05-18 03:37:24
 Ra300〜Ra43ではおそらく下記に類するコードの所があるはずです。
アドレスは機種や出荷時期によって違っているので同じではありません。
しかしBANK4の前半の比較的後のほうにあるはずです。
場所を探すには、バイナリダンプして "_L2_"という 文字列を探すと
よいでしょう。ずばりL2キャッシュ関連の処理がそこから始まっています。

380E 5F4C325F26 ; "_L2_&" 文字列
; "Genuine Intel" check
3813 6633C0 xor eax,eax
3816 0FA2 cpuid
3818 6681FB47656E75 cmp ebx,756E6547
381F 0F850402 jnz [3A27_set_carry]
3823 6681FA696E6549 cmp edx,49656E69
382A 0F85F901 jnz [3A27_set_carry]
382E 6681F96E74656C cmp ecx,6C65746E
3835 0F85EE01 jnz [3A27_set_carry]

; CPUID number check
3839 66B801000000 mov eax,00000001
383F 0FA2 cpuid
3841 25F0FF and ax,FFF0
3844 A90010 test ax,1000 ; ODP flag check
3847 0F85D801 jnz [3A23_cache_OK]
384B 3D3006 cmp ax,0630
384E 0F8CD101 jl [3A23_cache_OK] ; PenProはOK
3852 8BD8 mov bx,ax
3854 3D7006 cmp ax,0670 ; Katmai
3857 0F8C1200 jl 386D

; Intel trap for SECC2 CPU ID 68x,6Bx
385B 66B92A000000 mov ecx,0000002A
3861 0F32 rdmsr
3863 A90008 test ax,0800 ; MSR_002A bit 11 チェック
3866 0F840300 jz 386D ; ★
; JMP 386D に変更するかすべて nop で埋めて 386Dに繋げる
386A FA cli
386B EBFE jmp 386B ; 無限ループで停止

; すべてのCPU
386D 66B91E010000 mov ecx,0000011E ;
3873 0F32 rdmsr
3875 662500008000 and eax,00800000
387B 0F85A401 jnz [3A23_cache_OK]
387F 81FB8006 cmp bx,0680 ; Coppermine !
3883 0F849C01 jz [3A23_cache_OK] ;★★
;    この命令を jae [3A23_cache_OK] に変更する

3887 81FB3006 cmp bx,0630
388B 0F8F3B00 jg 38CA ; ID= 65x, 66x,
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
 途 中 省 略
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
[3A23_cache_OK]
3A23 F8 clc
3A24 EB02 jmp 3A28
3A26 90 nop
[3A27_set_carry]
3A27 F9 stc
3A28 6661 popad
3A2A C3 ret

書き換えのポイントは★、および★★印の箇所です。

[MSR 2A bit11チェック回避]
★のところは、Coppermine CPUを 66MHzで起動させないというIntelの方針に
基づいたコードです。PC-98ではなんら意味無いと思われますが、そのまま
入れられています。MSR 2Ahというレジスタは非常に多くの種類の情報が
入っていいます。そのひとつに、CPUのBF0,BF1ピンの状態というのがあり
ます。それがbit11に読み出され、66MHz設定の組み合わせのときに
無限ループで停止するというコードになっています。
ここをnopで埋めるか次にジャンプするかさせる必要があります。
なお、ここが問題になるのは、SECC2のCPUを使うときです。
Slot1アダプタを使う場合は、BFピンをだますジャンパピンで100MHzなどの
設定にすれば、回避できます。

[CPU ID 680 チェックに追加]
★★のところは、直前でCPUIDが 0680hかどうかを比較し、等しい(JZ)
場合にキャッシュOKのルーチンに飛ぶようになっています。Ra300以降
では、Coppermine CPUは既知のCPUということになっていて、載せても
問題なく動作するのは、ここの部分があるからです。しかしTualatin
については、飛び先がなく、古いCPUと同じ所に飛び込んでしまいます。
CoppermineもTualatinもL2キャッシュに関して全く設定の必要がない点では
同一ですので、★★のところは、JZ命令を JAE命令に置き換えて、どちらの
CPUでも(IDが 680以上なら全て)正常に処理終了となるようにします。
これで、L2キャッシュが切れて起動するという問題はなくなるはずです。

  1. 教祖様 さん   2009-04-15 07:10:37
    改変できました
    書き込みにPC/AT互換機を使用する方法があると聞いたことがあります。
    詳細お願いいたします。