変更の始まり

シスコールの出口点の定義

z/OS UNIX では、カーネルの初期設定時に、動的出口機能に対して 2 つの出口点 (BPX_PRE_SYSCALL と BPX_POST_SYSCALL) を定義します。どちらの出口点も、以下の属性で定義されます。
  • AMODE(31)
  • REENTRANT(REQ)
  • PERSIST(IPL)
  • ABENDNUM(5)
  • ABENDCONSEC(NO)
  • FASTPATH(NO)
  • LOADAPF(YES)
  • EXITTYPE(INSTALLATION)
  • KEY(0)

BPX_PRE_SYSCALL 出口点は、その名前が示すように、シスコール・サービスが呼び出される前に呼び出される出口ルーチン用の出口点です。BPX_POST_SYSCALL 出口点は、シスコール・サービスが完了した後に呼び出される出口ルーチン用の出口点です。

出口点の属性について詳しくは、「z/OS MVS Programming: Authorized Assembler Services Reference ALE-DYN」の CSVDYNEX のセクションを参照してください。

出口ルーチンの管理

動的出口機能を使用して出口ルーチンを管理します。動的出口を管理するには、CSVYDNEX マクロ、SETPROG EXIT コマンド、および SYS1.PARMLIB の PROG parmlib メンバーを使用できます。

出口ルーチン環境

出口ルーチンへのエントリー時の環境:
表 1. 出口ルーチンへのエントリー時の環境
操作 環境
権限 監視プログラム状態、PSW キー・ゼロ。
ディスパッチ可能単位モード タスク。
仮想記憶間モード PASN=HASN。
AMODE 31 ビット。
ASC モード 1 次。
アドレス・スペース 呼び出し元のアドレス・スペース。
出口ルーチンへのエントリー時のレジスター:
表 2. 出口ルーチンへのエントリー時のレジスター
エントリー時のレジストリー
R0 出口ルーチンで使用する情報は含まれない。
R1 BPXYSXIB のアドレス。
R2-12 出口ルーチンで使用する情報は含まれない。
R13 72 バイトの保管域のアドレス (2 GB 境界より下、キー 0)。
R14 戻りアドレス。
R15 出口ルーチンのアドレス。
注: BPXYSXIB は、シスコール情報ブロックです。これにより、z/OS UNIX カーネルと出口ルーチンの間の入出力情報がマップされます。z/OS UNIX スレッドごとに 1 つの SXIB があります。SXIB は、出口点に到達したときに呼び出されるすべての出口ルーチンで共用されます。
出口ルーチンから戻るときのレジスター:
表 3. 出口ルーチンから戻るときのレジスター
戻るときのレジストリー
R0-R1 特定の値を含む必要はない。
R2-R14 エントリー時の内容に復元される。
R15 戻りコード (シスコール前の出口のみ)。それ以外の場合は、特定の値を含む必要はない。

出口ルーチンによるシスコールの拒否

シスコール前 (BPX_PRE_SYSCALL) の出口ルーチンには、シスコール・サービス・ルーチンを実行しないようにするオプションがあります。シスコール前の出口ルーチンは、ゼロ以外の戻りコードをレジスター 15 に戻すことで、シスコールを拒否できます。出口ルーチンがゼロ以外の戻りコードを戻すと、z/OS UNIX カーネルによってシスコール・サービス・ルーチンの実行が妨げられ、呼び出し元の戻りパラメーターに以下の値が設定されます。
表 4. ゼロ以外の戻りコードの値
戻り値の状況
Return_value -1 (マイナス 1)
Return_code EAGAIN。
Reason_code JrFailedBySyscallExit (x'0663')。
シスコールを拒否する出口ルーチンは、レジスター 15 の戻りコードの設定の他に、SXIB に追加の情報を保管する必要があります。この情報は、シスコールを拒否した出口ルーチンの識別と、シスコールの拒否理由の識別に役立ちます。こうした目的で、SXIB には以下のフィールドが提供されています。
  • SxibPreScID (アプリケーションまたは出口ルーチンを識別する 16 バイト・フィールド)。
  • SxibPreScRC (アプリケーション定義の戻りコードを入れる 4 バイト・フィールド)。
  • SxibPreScRS (アプリケーション定義の理由コードを入れる 4 バイト・フィールド)。
シスコールの呼び出し元に戻る前に、z/OS UNIX によってこれらのフィールドは THLI 制御ブロックにコピーされます。これにより、シスコールの呼び出し元は THLI を調べてシスコールの拒否理由を判別できるようになります。これらの THLI フィールドは、事前に指定された対応する SXIB フィールドと同じサイズおよび目的を持つように定義されています。
  • ThliRejectSCXProduct (アプリケーションまたは出口ルーチンを識別する 12 バイト・フィールド)
  • ThliReject SCXReturnCode (アプリケーション定義の戻りコードを入れる 4 バイト・フィールド)
  • ThliRejectSCXReasonCode (アプリケーション定義の理由コードを入れる 4 バイト・フィールド)

シスコール前の出口ルーチンによって拒否されているシスコールに対する、シスコール後の出口ルーチンは実行されます。呼び出し元の戻りパラメーター (rv/rc/rs) は前述の値に設定され、シスコール後の出口ルーチンで検査のために使用できるようになります。

シスコール前の出口ルーチンは、最後の 3 つのパラメーターが return_value、return_code、および reason_code であるシスコールのみを拒否できます。障害 (BPX1GPI – getpid()) により異常終了するシスコールは拒否できません。シスコール前の出口ルーチンからの戻りコード値は、これらのシスコールにおいては無視されます。

制約事項

  1. シスコール出口は、SRB モードの呼び出し元ではサポートされていません。SRB 呼び出し元に対しては、シスコール出口ルーチン (シスコール前またはシスコール後) は呼び出されません。
  2. BPX_PRE_SYSCALL および BPX_POST_SYSCALL の各出口点は、それぞれ 5 つの出口ルーチンに制限されます。動的出口機能を使用すると 6 つ以上の出口ルーチンを出口点に追加することができますが、最初の 5 つの出口ルーチンのみが呼び出されます。出口ルーチンが呼び出される順序は動的出口機能によって制御されます。出口ルーチンの呼び出し順序については、「z/OS MVS Programming: Authorized Assembler Services Reference ALE-DYN」の CSVDYNEX のセクションを参照してください。
  3. シスコール出口ルーチンからの、以下の z/OS UNIX 呼び出し可能サービスの使用は許可されていません。z/OS UNIX では、呼び出し元環境が原因で、シスコール出口ルーチンの実行中に以下の呼び出し可能サービスがシステムに悪影響を及ぼすおそれがあると判断しました。これらの呼び出し可能サービスがシスコール出口ルーチンから呼び出された場合、失敗します。シスコールが戻り値 -1 または 0 で失敗する場合、戻りコードは EMVSERR に設定され、理由コードは JrSyscallExit に設定されます。シスコールがエラーで異常終了する場合、完了コード EC6、理由コード 'xxxxC056'x で異常終了します。
    表 5. シスコール出口ルーチンから使用できない呼び出し可能サービス
    シスコール名 スタブ名 シスコール名 スタブ名
    istty() BPX1ITY cond_timed_wait() BPX1CTW、BPX4CTW
    ttyname() BPX1TYN cond_wait() BPX1CWA、BPX4CWA
    tcflush() BPX1TFH、BPX4TFH MVSpauseinit() BPX1MPI
    tcdrain() BPX1TDR、BPX4TDR MVSpause() BPX1MP、BPX4MP
    tcflow() BPX1TFW、BPX4TFW nice() BPX1NIC、BPX4NIC
    tcgetattr() BPX1TGA、BPX4TGA getitimer() BPX1GTR、BPX4GTR
    tcgetpgrp() BPX1TGP、BPX4TGP setitimer() BPX1STR、BPX4STR
    tcsetattr() BPX1TSA、BPX4TSA spawn() BPX1SPN、BPX4SPN
    tcsendbreak() BPX1TSB、BPX4TSB chpriority() BPX1CHP
    tcsetpgrp() BPX1TSP、BPX4TSP password() BPX1SGE、BPX4SGE
    alarm() BPX1ALR、BPX4ALR setgroups() BPX1SPE、BPX4SPE
    exec() BPX1EXC、BPX4EXC mmap() BPX1PWD、BPX4PWD
    exit() BPX1EXI、BPX4EXI mprotect() BPX1SGR、BPX4SGR
    execmvs() BPX1EXM、BPX4EXM msync() BPX1MMP、BPX4MMP
    fork() BPX1FRK、BPX4FRK munmap() BPX1MPR、BPX4MPR
    setdubdefault() BPX1SDD、BPX4SDD waitid()/wait3() BPX1MSY
    mvssigsetup() BPX1MSS、BPX4MSS loadhfs() BPX1MUM
    pause() BPX1PAS、BPX4PAS deletehfs() BPX1WTE、BPX4WTE
    ptrace() BPX1PTR、BPX4PTR setreuid() BPX1LOD、BPX4LOD
    sigaction() BPX1SIA、BPX4SIA setregid() BPX1DEL、BPX4DEL
    setgid() BPX1SGI、BPX4SGI pthread_security_np() BPX1SRU、BPX4SRU
    mvsunsigsetup() BPX1MSD、BPX4MSD convert_id_np() BPX1SRG、BPX4SRG
    sigpending() BPX1SIP、BPX4SIP auth_check_rsrc_np() BPX1TLS、BPX4TLS
    sleep() BPX1SLP、BPX4SLP server_init() BPX1CID、BPX4CID
    setpgid() BPX1SPG、BPX4SPG server_pwu() BPX1ACK、BPX4ACK
    sigprocmask() BPX1SPM、BPX4SPM __security() BPX1SIN、BPX4SIN
    setsid() BPX1SSI、BPX4SSI __wlm() BPX1SPW、BPX4SPW
    sigsuspend() BPX1SSU、BPX4SSU send_filePC-only() BPX1SEC、BPX4SEC
    setuid() BPX1SUI、BPX4SUI __shm_lock() BPX1WLM、BPX4WLM
    wait() BPX1WAT、BPX4WAT __pid_affinity() BPX1SF、BPX4SF
    quiesce() BPX1QSE、BPX4QSE set_timer_event() BPX1SLK、BPX4SLK
    unquiesce() BPX1UQS、BPX4UQS srx_np BPX1PAF、BPX4PAF
    MVSIptAffinity BPX1IPT、BPX4IPT __sigactionset() BPX1STE、BPX4STE
    mvsprocclp() BPX1MPC、BPX4MPC aio_suspend() BPX1SRX、BPX4SRX
    pthread_quiesce() BPX1PTQ、BPX4PTQ sigtimedwait() BPX1SA2、BPX4SA2
    sigputback() BPX1SPB、BPX4SPB __osenv() BPX1ASP、BPX4ASP
    seteuid() BPX1SEU、BPX4SEU __map_init() BPX1STW、BPX4STW
    setegid() BPX1SEG、BPX4SEG __map_service() BPX1OSE、BPX4OSE
    w_getpsent() BPX1GPS、BPX4GPS MvsThreadAffinity() BPX1MMI、BPX4MMI
    pthread_xandg() BPX1PTX、BPX4PTX

    pthread_quiesce

    _and_get_np()
    BPX1MMS、BPX4MMS
    sigwait() BPX1SWT、BPX4SWT __poe() BPX1TAF、BPX4TAF
    pthread_setintrtype() BPX1PST、BPX4PST extended_loadhfs() BPX1PQG、BPX4PQG
    pthread_testintr() BPX1PSI、BPX4PSI   BPX1POE、BPX4POE
    cond_cancel() BPX1CCA、BPX4CCA   BPX1LDX、BPX4LDX
    cond_setup() BPX1CSE、BPX4CSE    

使用上の注意

  1. すべてのシスコール出口ルーチンは、z/OS UNIX 非スペース切り替え PC リンケージ・スタックを使用して呼び出されます。この PC は、シスコール出口用に z/OS UNIX カーネルで使用するために予約されています。このリンケージ・スタックは通常の z/OS UNIX シスコール・リンケージ・スタックではないため、シグナルによって変更することはできません。また、呼び出し元に戻る前にデキュー (PR) する必要があります。こうした理由から、シスコール出口ルーチン実行中のシグナル送達は無効です。出口ルーチンは、再開されるシグナルのみに依存する呼び出し可能サービスを呼び出すことはできません。戻りコード EINTR を受け取ることができる許可されたシスコールを使用する際には、無制限の待機状態が発生するおそれがあることから、注意が必要です。
  2. 出口ルーチンは、取得したすべてのリソースを終了前に解放する必要があります。
  3. シスコール前およびシスコール後の出口点に追加されたすべての出口ルーチン (最初の 5 つまで) は、関連する出口ポイントに到達するたびに実行されます。すべての出口ルーチン間で SXIB を共用するため、これは特にシスコール前の出口点に当てはまります。複数の出口ルーチンがシスコールの拒否を選択した場合は、シスコールを拒否した最後の出口ルーチンの情報のみが SXIB で使用可能になります。シスコールを拒否しないことを選択した出口は、シスコールを拒否した出口ルーチンを識別する SXIB フィールドや、関連する戻りコードおよび理由コードのフィールドを変更してはいけません。
  4. シスコール後の出口ルーチンは、呼び出し元に戻らないシスコールや、呼び出し元がダブ解除される原因となるシスコールに対しては呼び出されません。例えば、exec と execMVS は呼び出し元に戻りません。また、mvsprocclp と exit は呼び出し元がダブ解除される原因となることがあります
  5. IBM では、SC_EXITTABLE ステートメントで指定されている z/OS UNIX ファイルを '/etc' ディレクトリーに配置することを推奨しています。これは、他の構成関連データの場所と整合しています。許可されていないユーザーによってファイルが変更されないように、ファイルのアクセス権限を適切に定義する必要があります。
変更の終わり