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 にある_その他メモ_なあたりも確認しておきたいかも。