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 クラスタを増やしてこのスピードを加速させたいなぁ。無論、遅れ気味な方々におかれましては力一杯フォローな機会を用意したいと思っています。