2021-03-06 17:09 — asano
カテゴリー:
今回はブレーク処理についての予定でしたが、MC68010の判別で書き足らなかったことがいくつかありますのでそちらを書くことにします。
MC68008の判別
MC68008の判別もできないか考えたのですが...
- ソフトウェア的にはMC68000からの命令等の追加・変更はありません
- 最初MC68008は8ビットバスなので奇数番地からのワードアクセスで判別できるのではないかと思ったのですが、データシートによると奇数アドレスからのワード・ロングワードアクセスはアドレスエラー例外を発生するとあるのでこれで判別はできません。
- プリフェッチキューあたりに相違があるかもしれませんがデータシートからはよくわかりませんでした。実機が試せるようになったら見てみたいところではあります。
MC68010の判別は例外処理に必要なのに対し、MC68008の判別はどうしても必要というわけではありません。3.を試すにしても優先度はかなり低いですね。
MC68020以降の判別
前回のコードではMC68020以降についてはMC68010として判定されるはずです。それ以上の判別が必要なら(アドレスエラー・バスエラー例外をハンドリングするには必要です)以下のような方法で判定できるはずです。
- MC68020は奇数番地からのワードアクセスが可能になっているのでアドレスエラー例外が発生するかどうか
- 追加された命令で不当命令例外が発生するかどうか
- ステータスレジスタなどの追加されたビットが書き換えられるかどうか
- 例外を発生させスタックフレームのフォーマット・コード・フィールドを参照
1.で得られる情報では足りないので他と組み合わせる必要がありますが、2.,4.を使うなら1.は要らないように思います。これはあまり現実的ではないでしょう。
2.はMC68010の判別に用いた方法です。プロセッサの判別方法としては一般的なものでしょう。逆にCALLM
のように途中で削除された命令をチェックすることも有効です。
3.はMC68020からT0ビット, Mビットが追加されているので、これを1に書き換えられるか確認します。あるいはT0を立ててトレース例外が発生するか確認しても良いかもしれません。MC68020以降がわかってからキャッシュ制御レジスタで同様のチェックを行なえばもう少し絞り込めるでしょう。
4.はMC68000ファミリらしい方法です。MC68010以降では例外発生時にスタックに積まれるスタックフレームの形式がプロセッサの種類・例外の種類・発生の状況によって異なります。これを正しくハンドリングするためにどの形式が使われたか識別するため4ビットのフォーマット・コード・フィールドが含まれています。
Format | Length | Processor | Note |
---|---|---|---|
0000 | 4 words | MC68010 MC68020 MC68030 MC68040 MC68060 |
|
0001 | 4 words | MC68020 MC68030 MC68040 |
割り込み |
0010 | 6 words | MC68020 MC68030 MC68040 MC68060 |
CHK, TRAP, トレース, ゼロ除算など MC68040,MC68060ではアドレスエラーも |
0011 | 6 words | MC68040 MC68060 |
浮動小数点関係? |
0100 | 8 words | MC68060 | アドレス変換エラー, バスエラーなど |
0111 | 30 words | MC68040 | アドレス変換エラー, バスエラー |
1000 | 29 words | MC68010 | アドレスエラー, バスエラー |
1001 | 10 words | MC68020 MC68030 |
コプロセッサ命令の実行中? |
1010 | 16 words | MC68020 MC68030 |
アドレスエラー, バスエラー(命令境界) |
1011 | 46 words | MC68020 MC68030 |
アドレスエラー, バスエラー(命令実行中) |
この表からアドレスエラーを起こせば(バスエラーでも良いのですがハードウェア依存なので)良さそうなのがわかります。あれっ、1.で奇数番地のワードアクセスできるとあるからアドレスエラー発生できないのではと思うかもしれませんが、命令フェッチは偶数アドレスでないといけないので大丈夫です。これでMC68020とMC68030を区別できない以外は判別できます。
バージョンの判別
実はマニュアルにちょっと面白い記述があります。
- 『M68000マイクロプロセッサ ユーザーズ・マニュアル 4th edition』(MC68010についての記述から)
(2) データの妥当性の判定 ロング・スタック・フォーマットでは,MC68010は残りのスタック・データの読み込みを開始し,データの妥当性をチェックします.妥当性は図4.8に示す16の内部情報ワードの最初のワードについてのみチェックします.このワードには固有の内部情報の他にそのデータを読み込もうとしているMC68010のバージョン番号に合致するプロセッサのバージョン番号があります.
- "MC68020 32-Bit Microprocessor User's Manual"
In addition to the format value, one word in the frame is checked for value that indicates whether or not this frame can be used by this processor.
- "MC68030 Enhanced 32-Bit Microprocessor User's Manual third edition"
In addition, for the long stack frame, the processor compares the version number in the stack with its own version number. The version number is located in the most significant nibble (bits 15-12) of the word at location SP+$36 in the stack frame.
これ本来はマルチプロセッサシステムで異なるバージョンが混在した時の対策のようですが、このバージョンを調べてみるのも面白いかもしれません。私は残念ながら調べるほど数を持っていないですが...
マニュアル流し読みした範囲ではMC68040以降は命令の再開を諦めたように読めます。命令の準備段階でのエラーなら最初からやり直し、結果の書き込み段階なら例外ハンドラに書き込みを委ねると。これなら内部状態の復帰の必要はなくバージョンを確認する必要もないでしょう。
2022-11-26 追記:
アドレスエラー・バスエラー例外の処理に必要と書きましたが、MC68010以上であることがわかっていればあとはスタックを見れば処理できるから必須というわけではありませんね。
コメントを追加