Lions' 本読み (58)
割り込み (例えば clock 割り込み) とシステムコール呼び出しな trap の場合の違い、というか C の trap に渡される引数なスタックの組み立てなあたりの理解が若干微妙。
clock割り込みの場合
こちらはある意味分かりやすいカンジ。入口は以下な形になってて
0570 kwlp: jsr r0,call; _clock
上記、r0 がスタックに push されて PC に call なアドレスが格納されて r0 に _clock なアドレスが格納される模様。この時点でスタックの状態は
+------+---------+ | PS | 古い PS | +------+---------+ | PC | 古い PC | +------+---------+ | r0 | 古い r0 | +------+---------+
下に伸びる形で上記なカンジになっているはず。割り込みもトラップも PC と PS をスタックに push して、jsr で古い r0 がスタックに push されて、という形。
で、call に jmp して以下。
0776 call: 0777 mov PS,-(sp) /* PS を push */ 0778 1: 0779 mov r1,-(sp) /* r1 を push */ 0780 mfpi sp /* sp を push */ 0781 mov 4(sp),-(sp) /* PS を push */ 0782 bic $!37,(sp) /* push した PS の末端 5bit 保存? */
この時点でスタックは以下な状態か。
+------+-------------------------+ | PS | 古い PS | +------+-------------------------+ | PC | 古い PC | +------+-------------------------+ | r0 | 古い r0 | +------+-------------------------+ | nps | トラップ後の新しい PS | <- 0777 +------+-------------------------+ | r1 | 古い r1 | <- 0779 +------+-------------------------+ | sp | 前モードに対する古い SP | <- 0780 +------+-------------------------+ | dev | マスクされた新しい PS | <- 0781, 0782 +------+-------------------------+
で最後の pc をスタックに push して (ここでは) _clock が呼び出されるのでスタックの状態は 344p のような形になるのは理解できます。
trap の場合
システムコールの場合入口は以下。
0518 trap; br7+6.
で、入口の以下なナニがポイントなのか。
0756 mov PS,-4(sp)
ここで状態がこうなるのか。
+------+-------------------------+ | PS | 古い PS | +------+-------------------------+ | PC | 古い PC | +------+-------------------------+ | | | +------+-------------------------+ | nps | トラップ後の新しい PS | <- 0756 +------+-------------------------+
で、
0762 jsr r0,call1; _trap
上記でスタックが以下になり
+------+-------------------------+ | PS | 古い PS | +------+-------------------------+ | PC | 古い PC | +------+-------------------------+ | r0 | 古い r0 | <- 0762 +------+-------------------------+ | nps | トラップ後の新しい PS | <- 0756 +------+-------------------------+
r0 には _trap の入口アドレスがセットされて call1 に jmp するのか。成程。そして sp は先頭の一つ前を指してるので
0772 tst -(sp)
で調整してるのか。なので
0774 br 1f 0775 0776 call: 0777 mov PS,-(sp) 0778 1: 0779 mov r1,-(sp)
0777 をスキップする形で trap に渡す引数なスタックを作りにいくんですね。もの凄い変化球だ。なんでこんな微妙なことしてるのか、なあたりはテキストの 343p あたりに記述があります。
例の参考書籍の 39p にある_その他メモ_なあたりも確認しておきたいかも。