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

uc_access(3)

Itanium(R) ベース プラットフォーム 専用
HP-UX 11i Version 2: September 2004
≫ 

テクニカル ドキュメント

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

 ≫ 目次

 ≫ 索引

名称

uc_access: __uc_get_reason(), __uc_get_grs(), __uc_set_grs(), __uc_get_frs(), __uc_set_frs(), __uc_get_prs(), __uc_set_prs(), __uc_get_brs(), __uc_set_brs(), __uc_get_ip(), __uc_set_ip(), __uc_get_cfm(), __uc_set_cfm(), __uc_get_um(), __uc_set_um(), __uc_get_ar_rsc(), __uc_set_ar_rsc(), __uc_get_ar_bsp(), __uc_get_ar_bspstore(), __uc_get_ar_csd(), __uc_set_ar_csd(), __uc_get_ar_ssd(), __uc_set_ar_ssd(), __uc_get_ar_ccv(), __uc_set_ar_ccv(), __uc_get_ar_unat(), __uc_set_ar_unat(), __uc_get_ar_fpsr(), __uc_set_ar_fpsr(), __uc_get_ar_pfs(), __uc_set_ar_pfs(), __uc_get_ar_lc(), __uc_set_ar_lc(), __uc_get_ar_ec(), __uc_set_ar_ec(), __uc_get_ed(), __uc_set_ed(), __uc_get_rsebs(), __uc_set_rsebs(), __uc_get_rsebs64(), __uc_set_rsebs64(), __uc_get_ar(), __uc_set_ar(), __uc_get_cr() ― ucontext_t (ユーザーコンテキスト) アクセス

構文

cc [ flag... ] file... -luca [ library... ]

#include <sys/types.h> 
#include <machine/sys/reg_struct.h> 
#include <signal.h> 
#include <uc_access.h> 

int __uc_get_reason(const ucontext_t *ucp, uint16_t *value);

int __uc_get_grs(const ucontext_t *ucp, unsigned int first, unsigned int count, uint64_t values[], unsigned int *NaT);

int __uc_set_grs(ucontext_t *ucp, unsigned int first, unsigned int count, const uint64_t values[], unsigned int NaT);

int __uc_get_frs(const ucontext_t *ucp, unsigned int first, unsigned int count, fp_regval_t values[]);

int __uc_set_frs(ucontext_t *ucp, unsigned int first, unsigned int count, const fp_regval_t values[]);

int __uc_get_prs(const ucontext_t *ucp, uint64_t *values);

int __uc_set_prs(ucontext_t *ucp, uint64_t values);

int __uc_get_brs(const ucontext_t *ucp, unsigned int first, unsigned int count, uint64_t values[]);

int __uc_set_brs(ucontext_t *ucp, unsigned int first, unsigned int count, const uint64_t values[]);

int __uc_get_ip(const ucontext_t *ucp, uint64_t *value);

int __uc_set_ip(ucontext_t *ucp, uint64_t value);

int __uc_get_cfm(const ucontext_t *ucp, uint64_t *value);

int __uc_set_cfm(ucontext_t *ucp, uint64_t value);

int __uc_get_um(const ucontext_t *ucp, uint64_t *value);

int __uc_set_um(ucontext_t *ucp, uint64_t value);

int __uc_get_ar_rsc(const ucontext_t *ucp, rsc_t *value);

int __uc_set_ar_rsc(ucontext_t *ucp, rsc_t value);

int __uc_get_ar_bsp(const ucontext_t *ucp, uint64_t *value);

int __uc_get_ar_bspstore(const ucontext_t *ucp, uint64_t *value);

int __uc_get_ar_csd(const ucontext_t *ucp, uint64_t *value);

int __uc_set_ar_csd(ucontext_t *ucp, uint64_t value);

int __uc_get_ar_ssd(const ucontext_t *ucp, uint64_t *value);

int __uc_set_ar_ssd(ucontext_t *ucp, uint64_t value);

int __uc_get_ar_ccv(const ucontext_t *ucp, uint64_t *value);

int __uc_set_ar_ccv(ucontext_t *ucp, uint64_t value);

int __uc_get_ar_unat(const ucontext_t *ucp, uint64_t *value);

int __uc_set_ar_unat(ucontext_t *ucp, uint64_t value);

int __uc_get_ar_fpsr(const ucontext_t *ucp, fpsr_t *value);

int __uc_set_ar_fpsr(ucontext_t *ucp, fpsr_t value);

int __uc_get_ar_pfs(const ucontext_t *ucp, pfs_t *value);

int __uc_set_ar_pfs(ucontext_t *ucp, pfs_t value);

int __uc_get_ar_lc(const ucontext_t *ucp, uint64_t *value);

int __uc_set_ar_lc(ucontext_t *ucp, uint64_t value);

int __uc_get_ar_ec(const ucontext_t *ucp, uint64_t *value);

int __uc_set_ar_ec(ucontext_t *ucp, uint64_t value);

int __uc_get_ed(const ucontext_t *ucp, uint64_t *value);

int __uc_set_ed(ucontext_t *ucp, uint64_t value);

int __uc_get_rsebs(const ucontext_t *ucp, uint64_t *addr, unsigned int count, uint64_t values[]);

int __uc_set_rsebs(ucontext_t *ucp, uint64_t *addr, unsigned int count, const uint64_t values[]);

int __uc_get_rsebs64(const ucontext_t *ucp, ptr64_t addr, unsigned int count, uint64_t values[]);

int __uc_set_rsebs64(ucontext_t *ucp, ptr64_t addr, unsigned int count, const uint64_t values[]);

int __uc_get_ar(const ucontext_t *ucp, unsigned int reg, uint64_t *value);

int __uc_set_ar(ucontext_t *ucp, unsigned int reg, uint64_t value);

int __uc_get_cr(const ucontext_t *ucp, unsigned int reg, uint64_t *value);

説明

Ucontext Access インタフェースにより、アプリケーションは ucontext_t ユーザーコンテキスト構造体内の、非公開の mcontext_t 構造体に含まれる Itanium(R) ベース レジスタにアクセスすることができます。

これらのすべてのインタフェースでは、 ucp は、シグナルハンドラーの 3 番目の引き数としてアプリケーションに渡された ucontext_t、 ユーザーが割り当てたメモリーに getcontext() で設定した ucontext_t、 またはアプリケーションの core ファイルから読み取られた ucontext_t へのポインターです。

システムコールは関数呼び出しを介して実行されるため、システムコールで作成されたコンテキストでは、以下に記すようにスクラッチレジスタとその他の個別の値が除外されます。

以下の関数を使うには、コンパイラまたはリンカーのコマンド行で -luca を指定して、ucontext アクセスライブラリとリンクします。

個々のインタフェースの説明

__uc_get_reason()
  

コンテキストが、 システムコールで作成されたものである場合は、 value 引き数が指す場所にゼロを格納して返し、コンテキストが、ユーザーコードの実行中に発生した割り込みの処理中に作成されたものである場合は、ゼロ以外の値を返します。

__uc_get_grs() 

first から first + count-1 の範囲の静的汎用レジスタの保存された値を values[] 配列に格納して返し、対応する NaT ビット値を NaT 引き数に格納して返します。 静的汎用レジスタ (GR1-GR31) だけがこのインタフェースで読み取ることができます。 スタック汎用レジスタ (GR32-GR127) は、RSE バッキングストアまたは RSE バッキングストアのオーバーフロー領域から読み取る必要があります (後述の __uc_get_rsebs() を参照)。

要求された汎用レジスタに対応する NaT ビットは、NaT 引き数の対応するビットに設定されます。たとえば、 NaT & (1 << 5) は GR5 の NaT ビットを表します。

システムコールで作成されたコンテキストの場合、スクラッチレジスタ (GR2、GR3 および GR14-GR31) は、 values[X] == 0(NaT >> X) && 1 == 1 として読み取ります。

__uc_set_grs() 

first から first + count-1 の範囲の静的汎用レジスタの保存された値を、 values[] 配列の最初の count 個の要素の内容で上書きして、対応する NaT ビットを NaT 引き数に設定されているビットで上書きします。 静的汎用レジスタ (GR1-GR31) にのみ、このインタフェースで書き込むことができます。 スタック汎用レジスタ (GR32-GR127) の場合は、RSE バッキングストアまたは RSE バッキングストアのオーバーフロー領域に書き込む必要があります (後述の __uc_set_rsebs() を参照)。

指定された汎用レジスタに対応する NaT ビットが、NaT 引き数の対応するビットに設定されている必要があります。たとえば、GR5 の NaT ビットは NaT & (1 << 5) で上書きされます。

システムコールで作成されたコンテキストの場合、スクラッチレジスタ (GR2、GR3 および GR14-GR31) に書き込もうとすると、 EINVAL が返されます。

__uc_get_frs() 

first から first + count-1 までの範囲の浮動小数点レジスタの保存された値を、 values[] 配列に格納して返します。

システムコールで作成されたコンテキストの場合、スクラッチレジスタ (FR6-FR15 と FR32-FR127) は、 0.0 として読み取ります。

__uc_set_frs() 

first から first + count-1 までの範囲の浮動小数点レジスタの保存された値を、 values[] 配列の最初の count 個の要素の内容で上書きします。

システムコールで作成されたコンテキストの場合、スクラッチレジスタ (FR6-FR15 と FR32-FR127) に書き込もうとすると、 EINVAL が返されます。 FP 値のビット {127:82} を設定しようとすると、 EINVAL が返されます。

__uc_get_prs() 

プレディケートレジスタの保存された値を、 values 引き数が指す場所に格納して返します。

システムコールで作成されたコンテキストの場合、スクラッチ プレディケートレジスタ (PR6-PR15) は、 0 として読み取ります。

__uc_set_prs() 

プレディケートレジスタの保存された値を、 values で上書きします。

システムコールで作成されたコンテキストの場合、スクラッチ プレディケートレジスタ (PR6-PR15) に設定しようとすると、 EINVAL が返されます。

PR[0] をクリアしようとすると、エラー表示なしで無視されます。

__uc_get_brs() 

first から first + count-1 までの範囲のブランチレジスタの保存された値を、 values[] 配列に格納して返します。

システムコールで作成されたコンテキストの場合、スクラッチレジスタ (BR6-BR7) は、 0 として読み取ります。

__uc_set_brs() 

first から first + count-1 までの範囲のブランチレジスタの保存された値を、 values[] 配列の最初の count 個の要素の内容で上書きします。

システムコールで作成されたコンテキストの場合、スクラッチレジスタ (BR6-BR7) に書き込もうとすると、 EINVAL が返されます。

__uc_get_ip() 

命令ポインターレジスタの保存された値を、 value 引き数に格納して返します。

割り込みの処理中に作成されたコンテキストの場合、 value は次に実行する命令の命令ポインターになります。命令スロットは、 value の下位 2 ビットの値 01 または 2 で表されます。 トラップと割り込みの場合、 value は次の命令を指します。 フォルトの場合、 value はフォルトが発生した命令を指します。 システムコールで作成されたコンテキストの場合、 value はシステムコールからのリターンポインターになります。 value の下位 2 ビットは 0 になります。

__uc_set_ip() 

命令ポインターレジスタの保存された値を value で上書きします。

割り込みの処理中に作成されたコンテキストの場合、 value の下位 2 ビットで表される命令スロットは、次に実行する命令になります。 システムコールで作成されたコンテキストの場合、命令スロットとしてゼロでない値を設定しようとすると、 EINVAL が返されます。

__uc_get_cfm() 

カレントフレームマーカー レジスタの保存された値を、 value 引き数に格納して返します。

システムコールで作成されたコンテキストの場合、 value はカーネルを呼び出した関数に対応するフレームマーカーになります。

__uc_set_cfm() 

カレントフレームマーカー レジスタの保存された値を value で上書きします。

__uc_get_um() 

ユーザーマスクレジスタの保存された値を、 value 引き数に格納して返します。

__uc_set_um() 

保存されたユーザーマスクレジスタを value で上書きします。 予約されたビットを設定しようとすると、 EINVAL が返されます。

__uc_get_ed() 

例外延期ビットの保存された値を value 引き数の下位ビットに格納して返します。 このビットは割り込みコンテキストにのみ保存されます。 システムコールで保存されたコンテキストからこのビットを読み込もうとすると、 EINVAL が返されます。

__uc_set_ed() 

保存された例外延期ビット値を、指定された value の下位ビットで上書きします。 このビットは割り込みコンテキストにのみ保存されます。 このビットを、システムコールで保存されたコンテキストに書き込もうとすると、 EINVAL が返されます。 CR.ISR.ED が設定されていない場合にこのビットを設定しようとすると、 EINVAL が返されます。

__uc_get_ar_rsc()
  

保存された AR.RSC レジスタの値を、 value 引き数に返します。

__uc_set_ar_rsc()
  

保存された AR.RSC レジスタの値を、 value で上書きします。

__uc_get_ar_bsp()
  

保存された AR.BSP レジスタの値を value 引き数に返します。 規約上、この値は、 システムコールに入る時に使用される br.call 、または 割り込みの処理で使用される cover の効果を反映しています。 次回の実行時に設定される AR.BSP の値を調べるには、以下の処理が必要です。

1) 

__uc_get_reason() を呼び出して、 コンテキストが、システムコールあるいは割り込みの処理いずれで作成されたのかを確認する。

2) 

Call __uc_get_cfm() を呼び出して、 現在のフレームマーカーを取得する。

3) 

CFM.sol (システムコール コンテキストの場合)、または CFM.sof (割り込みコンテキストの場合) を使って AR.BSP の値を調節する。

__uc_get_ar_bspstore()
  

保存された AR.BSPSTORE レジスタの値を、 value 引き数に返します。

__uc_get_ar_csd()
  

保存された AR.CSD レジスタの値を、 value 引き数に返します。 システムコール内で作成されたコンテキストでは、この値は未定義です。

__uc_set_ar_csd()
  

保存された AR.CSD レジスタの値を、 value で上書きします。 システムコール内で作成されたコンテキストでは、この呼び出しは EINVAL を返します。(他の副作用はありません)

__uc_get_ar_ssd()
  

保存された AR.SSD レジスタの値を、 value 引き数に返します。 システムコール内で作成されたコンテキストでは、この値は未定義です。

__uc_set_ar_ssd()
  

保存された AR.SSD レジスタの値を、 value で上書きします。 システムコール内で作成されたコンテキストでは、この呼び出しは EINVAL を返します。(他の副作用はありません)

__uc_get_ar_ccv()
  

保存された AR.CCV レジスタの値を、 value 引き数に返します。 システムコール内で作成されたコンテキストでは、この値は未定義です。

__uc_set_ar_ccv()
  

保存された AR.CCV レジスタの値を、 value で上書きします。 システムコール内で作成されたコンテキストでは、この呼び出しは EINVAL を返します。(他の副作用はありません)

__uc_get_ar_unat()
  

保存された AR.UNAT レジスタの値を、 value 引き数に返します。

__uc_set_ar_unat()
  

保存された AR.UNAT レジスタの値を、 value で上書きします。

__uc_get_ar_fpsr()
  

保存された AR.FPSR レジスタの値を、 value 引き数に返します。

__uc_set_ar_fpsr()
  

保存された AR.FPSR レジスタの値を、 value で上書きします。

__uc_get_ar_pfs()
  

保存された AR.PFS レジスタの値を、 value 引き数に返します。 システムコール内で作成されたコンテキストでは、この値は未定義です。 現在のフレームマーカーを読み込むには __uc_get_cfm() を、 現在のエピローグ数を読み込むには __uc_get_ar_ec() を使用します。

__uc_set_ar_pfs()
  

保存された AR.PFS レジスタの値を、 value で上書きします。 システムコール内で作成されたコンテキストでは、 __uc_set_ar_pfs()EINVAL を返します。(他の副作用はありません)

__uc_get_ar_lc() 

保存された AR.LC レジスタの値を、 value 引き数に返します。

__uc_set_ar_lc() 

保存された AR.LC レジスタの値を、 value で上書きします。

__uc_get_ar_ec() 

保存された AR.EC レジスタの値を、 value 引き数に返します。

__uc_set_ar_ec() 

保存された AR.EC レジスタの値を、 value の下位 6 ビットの値で上書きします。

__uc_get_ar() 

reg で指定されたアプリケーションレジスタの保存された値を、 value 引き数に格納して返します。

__uc_set_ar() 

reg で指定されたアプリケーションレジスタの保存された値を value で上書きします。

次のアプリケーションレジスタを指定することができます。

  • regレジスタgetset
    16AR_RSCXX
    17AR_BSPX 
    18AR_BSPSTOREXX
    25AR_AR_CSD(*)XX
    26AR_AR_SSD(*)XX
    32AR_CCV(*)XX
    36AR_UNATXX
    40AR_FPSRXX
    64AR_PFS(+)XX
    65AR_LCXX
    66AR_ECXX

    .IP 

    * AR_CSDAR_SSD はスクラッチレジスタです。 システムコールで作成されたコンテキストの場合、 AR_CCV は 0 として読み取られます。 AR_CCV に書き込もうとすると、 EINVAL が返されます。

    + 呼び出し元のプログラムでは、アンワインド情報でシグナル配信に先行する関数を調べて、 AR.PFS レジスタに有効なデータが含まれているかどうか判断する必要があることに注意してください。

    __uc_get_cr() 

    reg で指定された制御レジスタの保存された値を、 values 引き数に格納して返します。

    次の制御レジスタを指定することができます。

regレジスタ注記
17CR_ISR 
20CR_IFA特定のタイプの割り込みでのみ有効
22CR_IIPA 

 

システムコールで作成されたコンテキストの場合、制御レジスタは 0 として読み取ります。

__uc_get_rsebs(), __uc_set_rsebs(),
  

__uc_get_rsebs64(), __uc_set_rsebs64
  

シグナルハンドラーが起動されるとき、カーネルはすべてのダーティ RSE レジスタをオリジナルの RSE バッキングストアに書き込もうとします。 このような操作を実行できない場合 (つまり、メモリーがマップされていない場合)、カーネルは残りのダーティレジスタを ucontext_t 内のオーバーフロー領域に書き込みます。 これらのインタフェースは、このオーバーフロー領域に保存された、それらの値にアクセスするために用意されています。

__uc_get_ar() を使用して、 AR.BSP および AR.BSPSTORE の値を取り出します。

アクセスしたい値のアドレスアクセス方法
< AR.BSPSTORE直接の読み取り/書き込み
AR.BSPSTORE <= addr < AR.BSP__uc_[gs]et_rsebs{64}()
最後の NaT コレクションの特別な場合:__uc_[gs]et_rsebs{64}()
addr == AR.BSP | 0x1f8 

 

NaT ビットは、 AR.RNAT 値とオーバーフロー領域の間で分割されることがあります。

アドレスNaT の検索場所
addr < AR.BSPSTORE & ~0x1ffdirect read/write of backing store
addr < AR.BSPSTORE & ~0x1ffバッキングストアの
 直接の読み取り/書き込み
AR.BSPSTORE & ~0x1ff <= addr < AR.BSP__uc_[gs]et_rsebs{64}(addr|0x1f8)

 

呼び出し元が 32 ビットの場合、 __uc_get_rsebs()__uc_set_rsebs() は、addr 引き数を拡張 (swizzle) します。

__uc_[gs]et_rsebs64() は、64 ビットアプリケーション内に生成された ucontext_t を読み取る 32 ビットプログラム用に用意されています。 __uc_[gs]et_rsebs64() は、addr 引き数が拡張されない点で __uc_[gs]et_rsebs() とは異なります。 __uc_[gs]et_rsebs64() は 32 ビットバージョンのライブラリにのみ含まれています。

戻り値

正常終了の場合、すべてのインタフェースは 0 を返して正常終了を表します。また、無効な引き数を渡した場合、 EINVAL を返します。

エラー

Ucontext Access インタフェースは、次の条件のいずれかを満たす場合に失敗します。

EINVAL 

上にリストした任意のインタフェースで、 ucp 引き数が NULL ポインターであるか、または無効なバージョンやサイズを持つ ucontext_t を指している場合。

EINVAL 

__uc_get_grs() または __uc_set_grs() 呼び出しで、 firstcount で指定したレジスタの範囲に、1〜 31 の範囲以外の値が含まれている場合。

EINVAL 

__uc_set_grs() 呼び出しで、 ucp がシステムコールで作成されていて、 firstcount で指定したレジスタの範囲にスクラッチレジスタが含まれている場合。

EINVAL 

__uc_get_frs() または __uc_set_frs() 呼び出しで、 firstcount で指定したレジスタの範囲に、2〜 127 の範囲以外の値が含まれている場合。

EINVAL 

__uc_set_frs() 呼び出しで、 ucp がシステムコールで作成されていて、 firstcount で指定したレジスタの範囲にスクラッチレジスタが含まれている場合。 あるいは、FP 値のビット {127:82} を設定しようとした場合。

EINVAL 

__uc_set_prs() 呼び出しで、 ucp がシステムコールで作成されていて、 value に、設定されたスクラッチビットが含まれている場合。

EINVAL 

__uc_get_brs() または __uc_set_brs() 呼び出しで、 firstcount で指定したレジスタの範囲に、0〜7 の範囲以外の値が含まれている場合。

EINVAL 

__uc_set_brs() 呼び出しで、 ucp がシステムコールで作成されていて、 firstcount で指定したレジスタの範囲にスクラッチレジスタが含まれている場合。

EINVAL 

__uc_set_ip() 呼び出しで、 ucp がシステムコールで作成されていて、 value の下位 2 ビットがゼロでない場合。あるいは、 ucp がシステムコールで作成されたものではなく、 value の下位 2 ビットが 0x3 の場合。

EINVAL 

__uc_set_cfm() 呼び出しで、範囲 37:0 以外のビットが設定されている場合。

EINVAL 

__uc_set_um() 呼び出しで、範囲 5:1 以外のビットが設定されている場合。

EINVAL 

__uc_set_ar_rsc()__uc_set_ar_fpsr()、 または __uc_set_ar_pfs() 呼び出しで、予約済みビットが 0 ではない場合。

EINVAL 

__uc_get_ar()__uc_set_ar()、 または __uc_get_cr() 呼び出しで、無効なレジスタが指定されている場合。

EINVAL 

__uc_set_ar() 呼び出しで、 reg が有効なレジスタを指定していて、設定された予約済みビットが value に含まれている場合。

EINVAL 

__uc_get_ed() または __uc_set_ed() 呼び出しで、 ucp がシステムコールで作成されていた場合。

EINVAL 

__uc_set_ed() 呼び出しで、 value の下位ビット以外のビットがセットされている場合。または下位ビットがセットされていて、保存された CR.ISR.ED ビットがクリアされている場合。

EINVAL 

__uc_get_rsebs{64}() または __uc_set_rsebs{64}() 呼び出しで、 addrcount で指定したメモリー位置の範囲に、 AR.BSPSTORE (包括的) と AR.BSP (排他的) の範囲以外の値が含まれている場合。あるいは、最後の NaT コレクション位置を指定していて、 count != 1 の場合。

警告

引き数については、最低限のチェックしか行われません。 レジスタやレジスタフィールドに、無効な値や範囲外の値を書き込まないように十分に注意してください。 無効な値や範囲外の値でレジスタが上書きされた場合、シグナルハンドラや setcontext(2) 呼び出しから戻った際の動作は未定義です。

__uc_get_ar() は、廃止予定です。既存のアプリケーション以外では使用せず、代わりに __uc_get_ar_rsc()__uc_get_ar_bsp()__uc_get_ar_bspstore()__uc_get_ar_csd()__uc_get_ar_ssd()__uc_get_ar_ccv()__uc_get_ar_unat()__uc_get_ar_fpsr()__uc_get_ar_pfs()__uc_get_ar_lc()、 および __uc_get_ar_ec() を使用することを推奨します。

__uc_set_ar() は、廃止予定です。既存のアプリケーション以外では使用せず、代わりに __uc_set_ar_rsc()__uc_set_ar_csd()__uc_set_ar_ssd()__uc_set_ar_ccv()__uc_set_ar_unat()__uc_set_ar_fpsr()__uc_set_ar_pfs()__uc_set_ar_lc()、 および __uc_set_ar_ec() を使用することを推奨します。 __uc_get_cr() は、廃止予定です。既存のアプリケーション以外では使用しないでください。

著者

UContext Access ライブラリは HP で開発されました。

ファイル

/usr/include/sys/uc_access.h
  

インタフェースのプロトタイプ宣言

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