09.1プログラムをスーパーバイザー・モードに切り替える(MODESET)
一般のアプリケーション・プログラムではほとんど必要ありませんが、システム・プログラムでは処理によっては監視プログラム(スーパーバイザー)モードに切り替える必要が生じます。例えば監視プログラム状態を要求するAPIの使用(MGCRなど)、特権命令の使用などです。
このような場合、プログラムはAPIによって自分自身の走行モードを問題プログラム状態から監視プログラム状態に変更することができます。
スーパーバイザー・モードとAPF許可を混同しないで下さい。スーパーバイザー・モードは特権命令が利用できるCPU上の特別な実行モードですが、APF許可はMVSにシステム・プログラム用機能の利用が許可されたプログラムであって、PSWの走行モードとは関係ありません。APF許可プログラムであっても特別な設定(PPT登録)がされない限り、MVSは問題プログラム状態でプログラムを実行します。なおシステム・プログラミング用機能であってもほとんどのAPIはAPF許可さえあれば良く、監視プログラム状態を要求するものはごく1部です。マニュアルをよく読んで不必要なモードチェンジをしないようにします。
プログラムを監視プログラムモード(スーパーバイザーモード)に切り替える
----+----1----+----2----+----3----+----4----+----5----+----6----+----7-- MODESET MODE=SUP CHANGE US TO SUPERVISOR STATE : : MODESET MODE=PROB BACK US TO PROBLEM STATE MODESET MODE=SUP, CHANGE US TO SUPERVISOR STATE + KEY=ZERO WITH PSWKEY=0 : : MODESET MODE=PROB, BACK US TO PROBLEM STATE + KEY=NZERO WITH SAFE KEY
MODESETマクロはプログラムの走行モードを切り替えます。当然APF許可されたプログラムでなければ使用できません。MODEパラメーターで走行モードを、KEYパラメーターでPSWキーを変更できます。MODE=SUPは監視プログラム・モードへ切り替え、MODE=PROBで元の問題プログラム・モードに戻します。同時にPSWキーを変更する時は、KEY=ZEROでPSWキーを0に、KEY=NZEROでPSWキーを元のキーに戻します。キーを変更する必要がなければモードのみを変更しましょう。スーパーバイザーモードだからキーも0にする、と理解しているプログラマーもいますが、それは正しいことではありません。元のPSWキーのままで問題ないロジックは無用にキーを変えてはなりません。
PSWの記憶保護キーを変更する
----+----1----+----2----+----3----+----4----+----5----+----6----+----7-- SPKA 0 CHANGE PSWKEY TO ZERO SPKA X'10' CHANGE PSWKEY TO 1 SPKA X'80' CHANGE PSWKEY TO 8 LA R7,X'A0' LOAD NEW KEY = A SPKA 0(R7) CHANEG PSWKEY IN GPR VALUE IPK , EXTRACT CURRENT PSWKEY INTO GR2 SPKA X'60' CHANGE PSWKEY TO 6 SPKA 0(R2) BACK TO ORIGIN PSWKEY
OSの出口ルーチンなどではその多くが監視プログラム状態のまま呼び出されます。このようなプログラムでは特権命令を使わないからと言ってわざわざ問題プログラム状態に変える必要はありません。むしろモードの不用意な変更は致命的なエラーを引き起こします。ただし処理によってはPSWキーを変更する場合もあり得ます。このような時KEYパラメーターを指定したMODESETマクロを使ってはなりません。最初から監視プログラム状態で動くプログラムの場合はSPKA命令を使用してPSWキーを変更します。
オペランドに新しいキーを即値またはキー値を格納したレジスターで指定し、サンプルのようにコーディングします。出口ルーチンなどでは最初に制御が渡されたときのキーはマニュアルに明記されていますから、その値に戻してもいいですし、IPK命令で現在のPSWキー値を保存してもいいでしょう。IPK命令は無条件にGR2の下位バイトにキーの値をセットしてしまいます。そのレジスターを使ってSPKA命令を出せば元のキーに戻せます。GR0でなければGR2以外のレジスターにコピーして使ってもかまいません。