本文に進む 日本−日本語
日本HPホーム 製品とサービス お客様サポート/ ダウンロード ソリューション ご購入の方法
≫ お問い合わせ
詳細検索オプション
日本HPホーム
HP-UX リファレンス: セクション 3 : ライブラリ (N~Z) > u

_UNW_currentContext(3X)

Itanium(R) ベース システム専用
HP-UX 11i Version 2: September 2004
≫ 

テクニカル ドキュメント

PDF版
フィードバック
ここから本文が始まります

 ≫ 目次

 ≫ 索引

名称

_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_ReturnCode _UNW_currentContext(_Unwind_Context* p); 
 
_UNW_ReturnCode _UNW_clear(_Unwind_Context* p); 
 
_UNW_ReturnCode _UNW_jmpbufContext(_Unwind_Context* p, 
                 jmp_buf env); 
 
_UNW_ReturnCode _UNW_setGR(_Unwind_Context* p, 
                 uint32_t num, 
                 uint64_t value); 
 
_UNW_ReturnCode _UNW_setGR_NaT(_Unwind_Context* p, 
                 uint32_t num, 
                 uint64_t value, 
                 _UNW_Boolean NaTval); 
 
_UNW_ReturnCode _UNW_setFR(_Unwind_Context* p, 
                 uint32_t num, 
                 uint64_t first_container, 
                 uint64_t second_container); 
 
_UNW_ReturnCode _UNW_setBR(_Unwind_Context* p, 
                 uint32_t num, 
                 uint64_t value); 
 
_UNW_ReturnCode _UNW_setAR(_Unwind_Context* p, 
                 _UNW_AppReg num, 
                 uint64_t value); 
 
_UNW_ReturnCode _UNW_setPR(_Unwind_Context* p, 
                 uint32_t num, 
                 _UNW_Boolean value); 
 
_UNW_ReturnCode _UNW_setPreds(_Unwind_Context* p, uint64_t value); 
 
_UNW_ReturnCode _UNW_setIP(_Unwind_Context* p, uint64_t value); 
 
_UNW_ReturnCode _UNW_setCFM(_Unwind_Context* p, uint64_t value); 
 
uint32_t _UNW_GR_PhysicalNumber(_Unwind_Context* p, uint32_t logical_num); 
 
uint32_t _UNW_FR_PhysicalNumber(_Unwind_Context* p, uint32_t logical_num); 
 
uint32_t _UNW_PR_PhysicalNumber(_Unwind_Context* p, uint32_t logical_num); 
 
_UNW_ReturnCode _UNW_step(_Unwind_Context* p); 

説明

_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 の範囲からいくつの汎用レジスタがスタック用に使用されるか) およびレジスタベースローテーションが有効状態かどうかを示します。 クライアントプログラムは、以下に示すようないくつかの手段によりカレントフレームマーカーの値を設定できます。

  • 自分自身をアンワインドしようとしているプロシージャは、「現在の状態」収集プロシージャを呼び出すことがあります。 これは、自身の状態を _Unwind_Context 構造体に記録するためです。 このプロシージャは、(アセンブラで記述している場合) カレントフレームマーカーの値を作成するために、自身のレジスタの使用方法についての知識を使用できます。

  • 自分自身以外のプロセスに (たとえばブレークポイントを設定して) 割り込み、アンワインドしようとするツール (たとえばデバッガ) は、割り込みイベントによって生成される割り込みコンテキストから、カレントフレームマーカーの値を作成することができます。 『『Intel IA-64 アーキテクチャ・ソフトウェア・デベロッパーズ・マニュアル』, 『第 2 巻: IA-64 システム・アーキテクチャ』』の 『第 5 章「IA-64 の割り込み」』 を参照してください。

_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、 IPCFM、 およびアプリケーションレジスタのセット 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.sorCFM.rrb.grCFM.rrb.prCFM.rrb.fr で示されるローテーションによってマップされた (論理) 番号は使用しません。 スタックアンワインドライブラリは、レジスタの種類に対応する CFM.rrb フィールドの値が 0 のときのレジスタ番号を、物理番号として定義します。

マップ関数 _UNW_GR_PhysicalNumber_UNW_FR_PhysicalNumber、 および _UNW_PR_PhysicalNumber は、特定の論理レジスタにアクセスするために _UNW_get... 初期化関数に渡す情報として、レジスタの物理番号を返します。 マップ関数に、マップされた論理番号の範囲外の論理番号を与えると、マップ関数は _UNW_QUERY_RANGE_ERROR アラート状態をセットし、戻り値 0 を返します。 たとえば、 CFM.sor0 のときに _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 の状態が InitUser_Interrupted_FrameUser_Sendsig_FrameKernel_Bottom_FrameFrame のいずれでもないときには、 _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_STEP_KERNEL_SAVE_STATE
  

_Unwind_Context が示すフレームが、それを越えてスタックアンワインドライブラリがステップ動作できない内容になっていることを示します。 HP-UX カーネル割り込みフレームに、ユーザーシグナル処理 signal(5) を参照) をサポートする _user_sendsig() に関連するもの以外があると、この戻り値を返します。

_UNW_STEP_BOTTOM 

_Unwind_Context が示すフレームが、それを越えてスタックアンワインドライブラリがステップ動作できない内容になっていることを示します。 この戻り値は、プロシージャのフレームが、スタックの底を示す規約 (保存された戻りリンクの値が 0) でマークされたプロシージャを示す _Unwind_Context に対して _UNW_step を呼び出したときに返されます (『『Itanium Processor Family Software Conventions and Runtime Architecture』』の 『Chapter 11.1 Unwinding the stack』 を参照)。

_UNW_OK 

すべて正常。

_UNW_STEP_ERROR 

ステップ動作中に一般的な問題が発生しました。この戻り値は _Unwind_Context が Bad 状態にあることを示します。 unwind(5) の 『「状態」』 の項を参照してください。

_UNW_INTERNAL_ERROR
  

ステップ動作中にロジック上の問題が発生しました。当社のサポート部門にお問い合わせください。

_UNW_STEP_INVALID_IP
  

_Unwind_Context 内の命令ポインター値が不正と判断されました。 初期化の失敗が原因として考えられます。 この戻り値は _Unwind_Context が Bad 状態にあることを示します。 unwind(5) の 『「状態」』 の項を参照してください。

_UNW_STEP_INVALID_SP
  

_Unwind_Context 内のスタックポインター値が不正と判断されました。 初期化の失敗が原因として考えられます。 この戻り値は _Unwind_Context が Bad 状態にあることを示します。 unwind(5) の 『「状態」』 の項を参照してください。

_UNW_STEP_INVALID_GR
  

ステップ処理中に _Unwind_Context 内の汎用レジスタの値で不正と判断されるものがありました。 初期化の失敗が原因として考えられます。 この戻り値は _Unwind_Context が Bad 状態にあることを示します。 unwind(5) の 『「状態」』 の項を参照してください。

_UNW_STEP_INVALID_PFS
  

_Unwind_Context 内の AR.PFS の値が不正と判断されました。 初期化の失敗が原因として考えられます。 この戻り値は _Unwind_Context が Bad 状態にあることを示します。 unwind(5) の 『「状態」』 の項を参照してください。

_UNW_STEP_INVALID_RSC
  

_Unwind_Context 内の AR.RSC の値が不正と判断されました。 初期化の失敗が原因として考えられます。 この戻り値は _Unwind_Context が Bad 状態にあることを示します。 unwind(5) の 『「状態」』 の項を参照してください。

_UNW_STEP_INVALID_BSP
  

_Unwind_Context 内の AR.BSP の値が不正と判断されました。 初期化の失敗が原因として考えられます。 この戻り値は _Unwind_Context が Bad 状態にあることを示します。 unwind(5) の 『「状態」』 の項を参照してください。

_UNW_STEP_INVALID_BSPSTORE
  

_Unwind_Context 内の AR.BSPSTORE の値が不正と判断されました。 初期化の失敗が原因として考えられます。 この戻り値は _Unwind_Context が Bad 状態にあることを示します。 unwind(5) の 『「状態」』 の項を参照してください。

_UNW_STEP_INVALID_CFM
  

_Unwind_Context 内の AR.CFM の値が不正と判断されました。 初期化の失敗が原因として考えられます。 この戻り値は _Unwind_Context が Bad 状態にあることを示します。 unwind(5) の 『「状態」』 の項を参照してください。

_UNW_STEP_INVALID_BR
  

ステップ処理中に _Unwind_Context 内の分岐レジスタの値で不正と判断されるものがありました。 初期化の失敗が原因として考えられます。 この戻り値は _Unwind_Context が Bad 状態にあることを示します。 unwind(5) の 『「状態」』 の項を参照してください。

_UNW_STEP_BAD_BSP_ALIGNMENT
  

_UNW_currentContext の値 ar.BSP が整列されていません。 この戻り値は _Unwind_Context が Bad 状態にあることを示します。 unwind(5) の 『「状態」』 の項を参照してください。

_UNW_STEP_INVALID_RNAT
  

_Unwind_Context 内の AR.RNAT の値が不正と判断されました。 初期化の失敗が原因として考えられます。 この戻り値は _Unwind_Context が Bad 状態にあることを示します。 unwind(5) の 『「状態」』 の項を参照してください。

_UNW_STEP_NO_DESCRIPTOR_FOR_NON_LEAF
  

スタックアンワインドライブラリが、リーフでないプロシージャで、アンワインド記述子を見つけられませんでした。 リーフプロシージャであれば、アンワインド記述子がなくても、スタックアンワインドライブラリは、処理できます。 すべての、リーフでないプロシージャは、アンワインド記述子を持っている必要があります。 この原因の一部として考えられるのは以下のようなものです。

  • 『Itanium Processor Family Software Conventions and Runtime Architecture』』の 『Chapter 11.3 Coding conventions for reliable unwinding』 で規定しているコーディング規約に準拠していないプログラムコード。

  • _UNW_LoadMapFromIP コールバック関数 unwind(5) 参照) で、アンワインドヘッダーまたはテキストセグメントベースのロケーションを識別できなかった。

  • システムメモリーが壊れている。

  • _Unwind_Context が不正な値で初期化された。

_UNW_STEP_CORRUPT_DESCRIPTOR
  

フレームのアンワインド記述子の形式が不正です。 この戻り値は _Unwind_Context が Bad 状態にあることを示します。 unwind(5) の 『「状態」』 の項を参照してください。

_UNW_STEP_RSE_NOT_FLUSHED
  

レジスタスタックエンジンが起動されていない。 unwind(5) を参照してください。 この戻り値は _Unwind_Context が Bad 状態にあることを示します。 unwind(5) の 『「状態」』 の項を参照してください。

_UNW_currentContext は、以下の戻り値を返します。

_UNW_OK 

すべて正常。

_UNW_CURRENT_CONTEXT_FAILED
  

_UNW_currentContext の呼び出し中に、一般的な問題が発生しました。

_UNW_STEP_CORRUPT_DESCRIPTOR
  

フレームのアンワインド記述子の形式が不正です。 この戻り値は _Unwind_Context が Bad 状態にあることを示します。 unwind(5) の 『「状態」』 の項を参照してください。

_UNW_MEMORY_ALLOCATION_ERROR
  

スタックアンワインドライブラリが、要求された機能を実行するのに必要なメモリーを割り当てることができません。 _Unwind_ContextBad 状態にあります。 unwind(5) を参照してください。

_UNW_INTERNAL_ERROR
  

ステップ動作中にロジック上の問題が発生しました。当社のサポート部門にお問い合わせください。

エラー

_UNW_currentContext は、初期化を実行するためのメモリーが充分にない場合、またはライブラリの対話上の問題 (たとえば、サービスマネージャや dlmodinfo の呼び出し) により unwindlib が初期化を実行できない場合は、対応するエラーを返します。

汎用レジスタ 5 〜 400 を初期化します。

#include <unwind.h> 
main() { 
    _Unwind_Context *uc; 
    _UNW_ReturnCode retcode; 
    uc = _UNW_createContextForSelf(); 
    if ((retcode = _UNW_setGR(uc,5,400)) != _UNW_OK) { 
         /* Notify client: Initialization problem  */ 
    } 
} 

著者

_UNW_currentContext(), _UNW_jmpbufContext(), _UNW_clear(), _UNW_setGR(), _UNW_setGR_NaT(), _UNW_setFR(), _UNW_setBR(), _UNW_setAR(), _UNW_setPR(), _UNW_setPreds(), _UNW_setIP(), _UNW_setCFM(), _UNW_GR_PhysicalNumber(), _UNW_FR_PhysicalNumber(), _UNW_PR_PhysicalNumber(), _UNW_step() は HP で開発されました。

印刷用画面へ
プライバシー 本サイト利用時の合意事項
© 1983-2004 Hewlett-Packard Development Company, L.P.