V850E系のdbtrapと未定義命令例外

元祖V850には,デバッグ例外という概念そのものがなかったようで,後付けの常であるベクタアドレスの共有があります.
具体的には,未定義命令例外とのベクタアドレス共有となっています.
デバッガでも作るのでなければこんな例外使わないわけだけれど,今回の対象は,正にそのデバッガ.
上手く裁いてくれてるよね?
(ブチ切れつつコード読む)

__ilgop_dbtrap_exception:
	/* GDBに返すレジスタ領域にレジスタを退避するため
	epを退避する*/
	di
	add	-4, sp
	st.w	ep, 0[sp]
(中略)	
	sst.w	r4 , 4[ep]

	jarl    __illegalinst_func, r31

	mov	hilo(_registers), ep

	sld.w	0[ep], r0
(後略)

…ダメだorz.
DIRレジスタ見て振り分ける.4行コード,端折るなんて信じられない.これホントにデバッガのコードか? 誰か嘘だと言ってくれ….

デバッギーが返すシグナルに依るGDBの処理内容の違い

gdbstubの場合,この振り分けは割とクリティカルだったりします.
POSIXシグナル的に言うと,両者はSIGTRAPとSIGILLなわけですが,GDBは両者をはっきり区別します.
ブレイクポイントの管理が絡むため,SIGILLで止めたりすると,最初の1回目のブレイクは上手く行き,そのあと撃沈します.
GDBのソース読めとまではいわなくても,

set debug remote 1

とかして眺めるだけで何が起きているかは想像つくはずです.

これって組込み系GDBハッカーの常識だとおもっていたのですがねぇ….コードを見つつ,溜息.