Lions' 本読み (93)
昨日実施された #geektable にてユーザモードのスタックポインタはアセンブラの call1 手続きで更新されている、という解を @mgwsuzuki さんから伺うも今一つ納得できず。というか、このあたりの処理における具体的な副作用 (?) について完全に忘却の彼方だったので、ということもあり、だったので #台風そん で確認を。
つうか
昨晩お伺いしたところでは
0795 mtpi sp
が超アヤシいっしょ、という事でした。で、テキストの 71p あたりから確認開始。もうひとつ、このあたりの解説はテキストの 342p です。ちなみに 342p に以下な記述があります。0780 行の mfpi 命令に関する記述。
スタック上に以前のアドレス空間に対するスタックポインタをコピーする (これは前モードがユーザモードであった場合にだけ重要である)。
これは mfpi 命令の特別な場合を示している。「PDP11 Processor Handbook」のページ 6-20 を参照してほしい。
Lions' Commentary on UNIX より引用
むむ。これはやっぱすずきさんビンゴなカンジですね。そりゃ良いのですが、手元にある pdf な資料に 6-20 ってソレが無いか全然違うナニだったりして微妙。
あった?
以下?
うーん違う模様。資料を探すのは止めます。つうか、simh のソース読めば云々な解がありそげ、という微妙なナニがあるな、とか思いはじめてたりして。
とりあえず
整理してみます。つうかやっぱそうじゃん。前モードがユーザモードの時は
0793 2: 0794 tst (sp)+ 0795 mtpi sp 0796 br 2f
で、以下に jmp しますね。
0801 2: 0802 mov (sp)+,r1 0803 tst (sp)+ 0804 mov (sp)+,r0 0805 rtt
逆にカーネルモードの場合は
0797 1: 0798 bis $30000,PS 0799 jsr pc,*(r0)+
で _trap に飛んで
0800 cmp (sp)+,(sp)+
で push したスタックポインタをステてます。やはり psig で設定した
4059 u.u_ar0[R6] = n;
を 0795 の mtpi で復帰している、はビンゴですね。成程。
結論として
すずきさんすばら、という事で。つうかやはり同じあたりを掘削してくれてるヒトが居る、というのはお互いにとって良い影響があるのだな、ということを痛感してます。もっと沖縄に v6 クラスタを増やしてこのスピードを加速させたいなぁ。無論、遅れ気味な方々におかれましては力一杯フォローな機会を用意したいと思っています。