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 をセットできるのはカーネルモードのみ、という指摘があります。成程。