[リストへもどる]
一括表示
タイトルWin95マシンで不正な命令
記事No234
投稿日: 2002/03/02(Sat) 13:14
投稿者もと
よその掲示板で話題になったんですが、Pentium3が載った
Win95マシンにおいて Mingw-gccでコンパイルしたgogo.dllを
使用すると不正な命令の例外が発生するようです。

ちょっと調べてみたのですが、Win95ではSSEサポートされていな
いのに setPIII_round()が呼び出され、そこで例外となっている
みたいです。

エラー時の情報
---------------
WINGOGO が無効な命令を実行しました。
モジュール : GOGO.DLL、アドレス : 019f:10021926
Registers:
EAX=00009f80 CS=019f EIP=10021926 EFLGS=00010202
EBX=ffffffff SS=01a7 ESP=007af48c EBP=007af4ac
ECX=007afd80 DS=01a7 ESI=00000000 FS=67b7
EDX=00000000 ES=01a7 EDI=1003bcb0 GS=0000
Bytes at CS:EIP:
0f ae 14 24 58 c3 90 90 90 90 90 90 90 90 90 90
Stack dump:
00009f80 10021996 00000004 10021a40 ffffffff 10021965
bff74277 1003bcb0 007af4cc 1000bc27 0043a348 bff76e28
ffffffff 00407639 10000000 004357d0

dllコンパイル時のMap(該当部分のみ)
--------------------
.text 0x100214c0 0x120 dllinst.o
0x10021500 DllMain@12
.text 0x100215e0 0xb0 thread.o
0x100215e0 gogo_create_thread
0x10021630 gogo_get_cpu_count
*fill* 0x10021690 0x10
.text 0x100216a0 0x92 clka.o
0x100216a0 clkbegin
0x100216e0 clkput
0x100216c0 clkend
*fill* 0x10021732 0xe
.text 0x10021740 0x20f cpua.o
0x10021920 setPIII_round
0x10021740 haveUNITa
0x10021940 maskFPU_exception
0x100218e0 haveFPU
*fill* 0x1002194f 0x1
.text 0x10021950 0x120 cpu.o
0x100219c0 initCPU
0x10021950 haveUNIT
0x100219d0 setupUNIT
*fill* 0x10021a70 0x10

タイトル Win95マシンで不正な命令
記事No239
投稿日: 2002/03/03(Sun) 18:26
投稿者
> ちょっと調べてみたのですが、Win95ではSSEサポートされていな
> いのに setPIII_round()が呼び出され、そこで例外となっている
> みたいです。

setPIII_round を呼んでいるのはへるみさんがおっしゃったような事情なんです
が,mingw でコンパイルしたバイナリから SSE サポート OS 上かどうかってど
うすればチェックできるものか,どなたかご存知ないですか?

もちろん,Win95 がどうかをチェックするという方法はあるけど,他のコンパイ
ラ/OS では例外やシグナルで SSE サポート OS かどうかを捕捉できているわけ
で,mingw/win95 のためだけに,win95 チェックをするのは個人的には美しくな
いように思うし,何より,手元に Win95 がないんで,動作チェックできないし^^;;


タイトル Win95マシンで不正な命令
記事No240
投稿日: 2002/03/03(Sun) 22:33
投稿者もと
Mingw32-gcc(cygwinもかな?)では __try 〜 __except が
きちんと実装されてないですからねぇ・・・

Mingw32版は Win95には非対応ってことにしたほうがいいかも。

> いように思うし,何より,手元に Win95 がないんで,動作チェックできないし^^;;

Win98があれば、うるりさん作の ssectl.exe 使ってやれば Win95
と同様のエラーは再現できますけど(^^;) うちもWin95環境がない
んで、それを使って現象を再現させました。

タイトル Win95マシンで不正な命令
記事No247
投稿日: 2002/03/05(Tue) 01:21
投稿者PEN@海猫
> Mingw32-gcc(cygwinもかな?)では __try 〜 __except が
> きちんと実装されてないですからねぇ・・・

VisualC(以下VC)の__try/__exceptionはANSI-Cの範疇ではないので
実装されていなくて当然といえば当然です。
サポートされていないプラットフォーム向けにsignal/setjmpを利用して
不正命令(SSEがサポートされていない環境でのSSE命令の実行を含む)の検出を
行っているのですが(事実Linux/FreeBSDでは正しく動作しているようです)、
signalの実装すら正しくないためプログラムが落ちてしまうようです。

Mingwのruntimeでのsignalの実装を調べてみたのですが、どうやらそのまま
VCのMSVCRT.DLLのexportに対して処理を流すようにしてある様でして…。
予想からするに、VCでsignalを用いても正しくハンドリングできないのではないかなと。

# ユーザーモードでRDMSRができればなぁ...というか なんで
# サポート状態をCPUIDで取れないようにしてあるのかなぁ。


タイトル Win95マシンで不正な命令
記事No249
投稿日: 2002/03/07(Thu) 00:02
投稿者
> # ユーザーモードでRDMSRができればなぁ...というか なんで
> # サポート状態をCPUIDで取れないようにしてあるのかなぁ。

「なんでサポート状態をCPUIDで取れないようにしてあるのかなぁ」に関しては
まったくもって御意.無条件に同意.
この点に関してはそれしか言いようがない.