Lions' 本読み (57)

朝はなんとも不調だった。夜はどうか。
10 章ではサンプルということで

の例が列挙されてます。これらについてポイントを列挙して最後の nofault 云々について整理をしている例の参考書籍すばら。
例えば gword な手続きの mfpi な命令呼び出しで例外キャッチして云々しようとしているのであれば以下な形で

0854    mov    $err, nofault
0855    mfpi   (r1)

先に例外ハンドラ的なラベルのアドレスを nofault に入れておいて例外トラップにおいて

0755 trap:
0756    mov    PS,-4(sp)
0757    tst    nofault
0758    bne    1f

で nofault が非ゼロだった場合、以下に jmp します。

0764 1:
0767    mov    $1,SSR0
0768    mov    nofault,(sp)
0769    rtt

例の参考書籍によれば rtt で err にリターン、とありますね。おそらくスタックの先頭には PC があって、次に PS が格納されているので nofault を (sp) に mov しているのですね。
例外ハンドラを仕掛けないとアレな場所でハンドラなアドレスを nofault に格納しておけば trap が何とかしてくれる、という作りになっている、という理解で良いのかな。
あ、あと例の参考書籍に nofault をセットできるのはカーネルモードのみ、という指摘があります。成程。

もう一つ

call1 の解説の中で_前モードがカーネルモードであるならば (Lions' Commentary on UNIX より引用)_、runrun のチェックをしてないですね。
てことはシステムコール呼び出し以外には runrun のチェックは入らないの? て思ったら割り込み時の前モードはカーネルモードだけではなくてユーザーモードもあり得るみたいですね。割り込みなので当たり前なのか。
ここはさくっと流し気味で、と思ったんですが、C の trap 手続きに渡される引数に関するナニは確認しておいた方が良いですね。一旦エントリ投入してから確認して、何かあれば追記の方向で。