現在地

アドレスエラー・バスエラー


カテゴリー:

Universal Monitor 68000は自分のボードで動かせるMC68000, MC68010まで対応し、MC68020以降は動かす人もいないだろうから後回し、と思っていたのですが...

なんとMC68030で動かした方がおられます(リンク参照)。

これは判別やら例外処理やら対応しなくてはと思いソースを見たところ、MC68010のアドレスエラー・バスエラーの表示を作りかけたままになっておりました。これを放置したまま他の変更を行なうのは混乱の元(一応 Subversion で管理してはいますが...)なのでまずこれを完了させることにしました。

MC68000系では割り込みの他、ゼロ除算や未定義命令の実行などが発生したときにあらかじめ用意したルーチンを実行する機能があります。これを例外処理といいます。

原則として(復帰できるように)発生時のPCとSRをスタックに積んでから実行するのですが、アドレスエラーとバスエラーの場合はさらに多くの情報がスタックに積まれます。

アドレスエラーは奇数番地に対してワード以上のサイズでアクセスしようとした時、バスエラーはハードウェアからアクセスに失敗したと報告されたときに発生します。

この中にはアクセスしようとしたアドレスやファンクションコード、読み書きの別などが含まれています。これは原因究明に有用なので表示しようというわけです。

MC68000 / MC68008

MC68010以降とフォーマットが異なるので、プロセッサの判別が出来ていることが前提になります。

これらのプロセッサでアドレスエラーまたはバスエラーが発生し例外ハンドラに制御が渡ったときスタックには以下の情報が積まれています。

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
SP R/W I/N Function Code
SP+2 Access Address (H)
Access Address (L)
SP+6 Instruction Register
SP+8 Status Register
SP+10 Program Counter (H)
Program Counter (L)

SPからのワードにはエラーの原因となったアクセスの情報が入っています。R/Wは書き込みなら0読み出しなら1、I/Nはフェッチなら0それ以外なら1が入ります。

SP+2からのロングワードにはアクセス先のアドレスが入ります。

SP+6にはエラー発生時に実行していた命令の第1ワードがが入ります。

SP+8以降には他の例外と同様にSRとPCの値が入っていますが、プリフェッチのためエラーを起こした命令から先行しているなどずれがあるので注意が必要です。

これだけの情報ではエラーになったところから再開することはできません。これらの情報を表示してからモニタに戻しています。


これは試しにDコマンドでメモリの無い(バスエラーになる)アドレスをダンプしてみたものです。

実はこのアドレス、MC68881の領域でした。本来ワードアクセスしなくてはならないのですが、バイトアクセスしたために偶数の$00200000は読めて奇数の$00200001でバスエラーが発生するという変なことになっています。

スーパバイザ・データ空間(FC=5)の$00200001をリードしてバスエラーが発生したこと、その命令が$1019であったことがわかります。

このままGコマンドを入力するとPCから実行しますが、エラーになった命令やプリフェッチした命令は未実行のままなので正常な実行継続ではありません。

ハードウェアによってアクセスの再実行は可能ですが、その間はプロセッサは停止状態(他のコードは実行できない)です。これでは仮想記憶を作るうえで支障があるので、ソフトウェアによる再実行が可能なMC68010に繋がっていきます。

ここまでの処理は去年書いていたのですが、MC68010用のコードが書きかけになっていたのでした。

次回、MC68010について書く予定です。

参考文献・関連図書: 
『M68000マイクロプロセッサ ユーザーズ・マニュアル 4th edition』, CQ出版社.
関連項目: 

コメントを追加

Plain text

  • HTMLタグは利用できません。
  • ウェブページアドレスとメールアドレスは、自動的にハイパーリンクに変換されます。
  • 行と段落は自動的に折り返されます。
※ コメントは原則公開です。個別のご相談などは「ご意見・ご要望」からお願いします。