| 日本−日本語 |
|
|
|
![]() |
HP-UX リファレンス: セクション 3 : ライブラリ (N~Z) > u_UNW_currentContext(3X)Itanium(R) ベース システム専用HP-UX 11i Version 2: September 2004 |
|
名称_UNW_currentContext(), _UNW_clear(), _UNW_jmpbufContext(), _UNW_setAR(), _UNW_setBR(), _UNW_setCFM(), _UNW_setFR(), _UNW_setGR(), _UNW_setGR_NaT(), _UNW_setIP(), _UNW_setPR(), _UNW_setPreds(), _UNW_GR_PhysicalNumber(), _UNW_FR_PhysicalNumber(), _UNW_PR_PhysicalNumber(), _UNW_step() ― アンワインドライブラリ データ構造体の値の操作 構文#include <unwind.h> 説明_UNW_currentContext() は、 _UNW_currentContext を呼び出しているプロシージャのプロセッサ状態 (言い換えれば「自身」のプロセッサ状態) を記述するためのオブジェクト _Unwind_Context を初期化します。 _UNW_jmpbufContext() setjmp(3C) を呼び出して jmp_buf に取得したプロセッサ状態を記述するための _Unwind_Context オブジェクトを初期化します。 _UNW_clear() は、 _Unwind_Context オブジェクトを「作成直後」の状態にリセットします。 _Unwind_Context のすべてのレジスタの値は無効になります。 アンワインドライブラリは Init 状態になるため、クライアントは _UNW_set ルーチンを使用して _Unwind_Context 内の値を初期化できるようになります。 Init 状態については unwind(5) で詳細に説明しています。 _UNW_setGR() は、パラメータ p が指す _Unwind_Context 内の番号 num の汎用レジスタの値を value で初期化します。 該当レジスタの NaT ビットには _UNW_FALSE がセットされます。 _UNW_setGR_NaT() は、パラメータ p が指す _Unwind_Context 内の番号 num の汎用レジスタの値を value で初期化します。 該当レジスタの NaT ビットには NaTval がセットされます。 _UNW_setFR() は、パラメータ p が指す _Unwind_Context 内の番号 num の浮動小数点レジスタの値を、パラメータ first_container および second_container で示される値のイメージで初期化します。 これらの 2 つのコンテナーは浮動小数点レジスタ (スピル/フィル メモリー形式) の連続するダブルワードを表します。 『『Intel IA-64 アーキテクチャ・ソフトウェア・デベロッパーズ・マニュアル』, 『第 1 巻: IA-64 アプリケーション・アーキテクチャ』』の 『第 5.3 項「浮動小数点命令」』 を参照してください。 _UNW_setBR() は、パラメータ p が指す _Unwind_Context 内の番号 num の分岐レジスタの値を value で初期化します。 _UNW_setAR() は、パラメータ p が指す _Unwind_Context 内の、列挙型項目 num で示されるアプリケーションレジスタの値を value で初期化します。 アプリケーションレジスタにアクセスするために、列挙型 _UNW_AppReg を使用します。 _UNW_setPR() は、パラメータ p が指す _Unwind_Context 内の番号 num のプレディケートレジスタの値を value (_UNW_TRUE または _UNW_FALSE) で初期化します。 _UNW_setPreds() は、パラメータ p が指す _Unwind_Context 内のすべてのプレディケートレジスタの値を value で渡される内容で初期化します。 value は、プレディケートレジスタの番号に対応するビット位置に各プレディケートレジスタの値を持っています。 たとえば、ビット 63 にはプレディケートレジスタ 63 用の値 (1 または 0) が入っています。 _UNW_setIP() は、パラメータ p が指す _Unwind_Context 内の命令ポインターの値を value で初期化します。 value は、完全な 64 ビットアドレスである必要があります。 つまり、32 ビットアドレス空間の 32 ビットポインター値は _UNW_setIP() に渡す前に 64 ビットポインターに拡張 (swizzle) しておく必要があります。 『『Itanium Processor Family Runtime Architecture Supplement:』 『32-Bit Runtime Architecture for HP-UX』』の 『Section 1: Memory Model』 を参照してください。 _UNW_setCFM() は、パラメータ p が指す _Unwind_Context 内の カレントフレームマーカー (CFM) の値を value で初期化します。 『『Intel IA-64 アーキテクチャ・ソフトウェア・デベロッパーズ・マニュアル』, 『第 1 巻: IA-64 アプリケーション・アーキテクチャ』』の 『第 3.1.7 項「現在のフレーム・マーカ」』 を参照してください。 カレントフレームマーカーはスタックフレームの各部分のサイズを保持しています。 これはまた、3 つのレジスタリネームベース値 (レジスタローテーションに使用) を指定します。 カレントフレームマーカーは、アーキテクチャ上で目に見える値ではありません。 これは、アンワインドライブラリが、アンワインドのために _Unwind_Context を初期化する際に使用するもので、初期化後の _Unwind_Context での RSE (Register Stack Engine) の状態 (具体的には現在のフレームで GR32 〜 GR127 の範囲からいくつの汎用レジスタがスタック用に使用されるか) およびレジスタベースローテーションが有効状態かどうかを示します。 クライアントプログラムは、以下に示すようないくつかの手段によりカレントフレームマーカーの値を設定できます。
_UNW_GR_PhysicalNumber()、 _UNW_FR_PhysicalNumber()、 _UNW_PR_PhysicalNumber() は、パラメータ p が指す _Unwind_Context について、論理レジスタ番号 logical_num に対応する物理レジスタ番号を返します。 論理レジスタ番号と物理レジスタ番号の違いについては、下記の 『「初期化関数間の相互作用」』 の項で説明します。 初期化関数間の相互作用スタックアンワインドライブラリでは、上記の設定関数 (setter function) は、 Init 状態のとき (ANSI C++ 標準に準拠した例外割り込みを処理する場合は Pre-install 状態のとき) のみ呼び出すことができます。 状態の制約については unwind(5) で説明しています。 Init 状態への遷移は、 _UNW_clear()、 _UNW_createContextForSelf()、 または _UNW_createContext() が呼び出された時に発生します。 Init 状態では、 _Unwind_Context 内の汎用レジスタ 1-31、スクラッチおよび保存用の浮動小数点レジスタ、スクラッチおよび保存用のプレディケートレジスタ、分岐レジスタ 0-7、 IP、 CFM、 およびアプリケーションレジスタのセット RSC, BSP, BSPSTORE, RNAT, CCV, UNAT, FPSR, ITC, PFS, LC) の値を初期化するために _UNW_set... を呼び出すことができます。 _Unwind_Context 内の特定のレジスタに書き込むことにより、その値が有効になります。 _UNW_setCFM を呼び出すと、 _Unwind_Context の GR32 〜 GR127 の汎用レジスタの値が無効になり、 _Unwind_Context のカレントフレームマーカー (CFM) の値が有効になります。 一旦 CFM の値が有効になると、(現在のプロシージャの RSE フレーム内で RSE がスタックした汎用レジスタを初期化するために) 汎用レジスタ GR32 から GR32 + CFM.sof までの書き込みができるようになります。 _UNW_step() の呼び出しを成功させるためには、 unwind(5) の 『「初期化」』 の項にリストされているレジスタのセットを有効にしておく必要があります。 上記のパラグラフで述べた特定のレジスタ以外のレジスタを初期化してはいけません。 たとえば、定数レジスタ GR0, FR0, FR1, PR0) は初期化してはいけません。 この規則に違反すると、 _Unwind_Context のアラートコードに _UNW_INITIALIZATION_RANGE_ERROR が設定され、 _UNW_set... 関数は _UNW_INITIALIZATION_RANGE_ERROR を返します。 値の初期化が許されない状態にある _Unwind_Context オブジェクトを初期化しようとしても、 _Unwind_Context 内の値は変化しません。 アラートコード _UNW_SET_NOT_ALLOWED_IN_STATE が返されます。 unwind(5) も参照してください。 アンワインドライブラリのレジスタ値初期化関数は、レジスタの指定に物理番号を使用します。 CFM.sor、 CFM.rrb.gr、 CFM.rrb.pr、 CFM.rrb.fr で示されるローテーションによってマップされた (論理) 番号は使用しません。 スタックアンワインドライブラリは、レジスタの種類に対応する CFM.rrb フィールドの値が 0 のときのレジスタ番号を、物理番号として定義します。 マップ関数 _UNW_GR_PhysicalNumber、 _UNW_FR_PhysicalNumber、 および _UNW_PR_PhysicalNumber は、特定の論理レジスタにアクセスするために _UNW_get... 初期化関数に渡す情報として、レジスタの物理番号を返します。 マップ関数に、マップされた論理番号の範囲外の論理番号を与えると、マップ関数は _UNW_QUERY_RANGE_ERROR アラート状態をセットし、戻り値 0 を返します。 たとえば、 CFM.sor が 0 のときに _UNW_GR_PhysicalNumber(uc,42) を呼び出すと、この関数はアラート状態をセットします。 _Unwind_Context オブジェクトの CFM の内容は、マップ関数を使用する前に初期化しておく必要があります。 _UNW_step は、パラメータ p が指す _Unwind_Context を修正して、 先行の (predecessor's) プロセッサ状態を表すようにします。 戻り値_UNW_set... は、 _Unwind_Context が値の初期化を許さない状態にあるとき、 _UNW_SET_NOT_ALLOWED_IN_STATE を返します。 値の初期化を許す状態とは Init と Pre_Install です。 マンページ unwind(5) の 『「エラー状態と復旧」』 の項を参照してください。 _UNW_set... は、初期化が許されていないレジスタに対する初期化要求があった場合 _UNW_INITIALIZATION_RANGE_ERROR を返します。 前述の 『「初期化関数間の相互作用」』 の項を参照してください。 それ以外の場合は、 _UNW_set... は、正常終了時に _UNW_OK を返します。 _UNW_clear は、正常終了時に _UNW_OK を返します。 それ以外の場合で、 _Unwind_Context の状態が Init、 User_Interrupted_Frame、 User_Sendsig_Frame、 Kernel_Bottom_Frame、 Frame のいずれでもないときには、 _UNW_clear は _UNW_CLEAR_NOT_ALLOWED_IN_STATE を返します。 unwind(5) を参照してください。 _UNW_GR_PhysicalNumber、 _UNW_FR_PhysicalNumber、 および _UNW_PR_PhysicalNumber は、それぞれレジスタ番号を返します。 各レジスタクラス用のマップされた論理番号の範囲にない論理番号を渡すと、これらの関数は、 _Unwind_Context のアラートコードに _UNW_QUERY_RANGE_ERROR をセットし、0 を返します。 _UNW_step は、以下の戻り値を返します。
_UNW_currentContext は、以下の戻り値を返します。
エラー_UNW_currentContext は、初期化を実行するためのメモリーが充分にない場合、またはライブラリの対話上の問題 (たとえば、サービスマネージャや dlmodinfo の呼び出し) により unwindlib が初期化を実行できない場合は、対応するエラーを返します。 例汎用レジスタ 5 〜 400 を初期化します。 #include <unwind.h> |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||