スタックポインタが壊れる

Bug#8269 カーネル管理外割込みがかかるとスタック・ポインタが壊れるという問題があることがわかりました。問題があったのは、cpu_support.asm (1.13)の98行目です。

dispatcher_1:
	LOAD( sp, ldf_stack_end)	// イベントスタックポインタを設定
	LOAD( p4, _reqflg )

上のコードの2行目がそれです。spにマクロを使ってラベルをロードしていますが、これは2命令に分割され、16ビットずつロードされます。その結果、命令間で割り込みがかかるとSPの値が半分更新されたままハンドラに飛んでいきます。飛んだ先でスタックにプッシュするとスタックが壊れます。
この部分は1月のコード整理で変更した部分です。このスタックポインタの変更は、割り込み待ちを行うためのものです。もともとスタック・ポインタの変更はIVG14のハンドラの中で行っていましたが、ループを小さくするためにこの部分に持ってきました。IVG14ハンドラの中はIPENDのGIDビットが立っており、割り込みが禁止されていました。しかし、新しく持ってきた場所はGIDビットが降りており、管理外割込みは入るためこの問題が表面に出てきたものです。
もともとの場所でもSPは16bitずつロードされており、その状態でNMIがかかればやはり同じ問題が発生したはずです。
同様の問題をはらんだコードはstart.asm (1.31)の199行目と335行目にもあります。いずれもNMIがかかれば問題が表面化します。
コードは修正し、CVSにアップロードしました。近々1.3.1としてリリースします。