Lions' 本読み (60)

clock 手続きあたりを勝手気儘に掘削中。以下な部分が気になりはじめたので確認してみました。

3824            if((ps&UMODE) == UMODE) {
3825                    u.u_ar0 = &r0;
3826                    if(issig())
3827                            psig();
3828                    setpri(u.u_procp);
3829            }

r0 ってのは引数で

3725 clock(dev, sp, r1, nps, r0, pc, ps)

ちょっと行儀悪すぎじゃないですか、と。

とりあえず

u.u_ar0 の定義を確認。

0452  int *u_ar0; /* ユーザー退避R0のアドレス */

何ですかこれは、と言いつつ xref 見てみたら一発で答えに出会った次第。上記の次に出てくるのが以下。

2701    u.u_ar0 = &r0;

あら、同じことしてるな、と前の頁を見てみたら trap 手続き (C の) でした。12 章の 350p 見てみたら 2701 な解説が。

r0 が格納されているスタックアドレスは将来の参照のために u.u_ar0 に記録する (以後さまざまなレジスタ値を u.u_ar0[Rn] として参照することができる)。

Lions' Commentary on UNIX より引用
なるほど。例えば trap 経由で呼び出されるシステムコールなんかがこれを使うんですかね。exec なシステムコールにも以下な記述があります。

3155    u.u_ar0[R6] = ap;

これ、古い sp の場所を指しているはずなんですが、この後どこでこの値を使うのだろう、とか思ってしまいます。とりあえず exec はこの後で出てくるはずなので、別途確認、ということで。
あと、clock 手続きで u.u_ar0 に r0 を代入してますが、これはその後呼び出されるかもしれない psig() 手続きで云々してますね。例えば以下。

4059            u.u_ar0[R6] = n;
4060            u.u_ar0[RPS] =& ~TBIT;
4061            u.u_ar0[R7] = p;

ここ、鉛筆で丸で囲んであって ? って書いてます。書いた記憶は無いんですが、意味不明だなぁ、と思いつつスルーしたんでしょうね。
このあたりも後で、ということにしたいと思います。