AR# 47554

Zynq-7000、APU - デバッグ プログラム カウンター サンプリング (DBGPCSR) レジスタ フォーマットが間違っている

説明

DBGPCSR レジスタ フォーマットが間違っているのに、期待 PC 値および命令ステートがデバッグ ツールで計算される可能性があります。

ソリューション


影響 :

深刻な問題ではありません。プログラム カウンター、プロセッサのプログラム カウンタ (PC) を正しく計算するタイミングをデバッグ ツールで認識する必要があります。

回避策 :

DBGPCSR レジスタを読み出して、期待 PC 値および命令ステートをデバッグ ツールで検出することができます。

対象となるコンフィギュレーション :

ARM プロセッサの 1 つまたは両方を使用するシステム
影響のあるデバイス リビジョン : すべて。修正の予定なし。詳細は、Zynq-7000 デバイス アドバイザリ マスター アンサー
を参照してください。

ARM アーキテクチャでは DBGPCSR レジスタが次のように定義されています。
  • DBGPCSR[31:2] には PC の ビット [31:2] のサンプルされた値が含まれています。サンプルされた値は、命令アドレスと、プロセッサ命令セット ステートによって異なるオフセット値を足したものです。
  • DBGPCSR[1:0] では、次の許容値で PC のサンプル値の意味が指定されます。
    • 0b00 ((DBGPCSR[31:2] << 2) - 8) は ARM ステート命令を参照
    • 0bx1 ((DBGPCSR[31:1] << 1) - 4) は Thumb/ThumbEE ステート命令を参照
    • 0b10 IMPLEMENTATION DEFINED.

このフィールドではプロセッサ命令がエンコードされるので、レジスタのビット [31:2] でサンプルされた値から該当するオフセットを差し引くことで、プロファイリング ツールで正しい命令アドレスを計算することができます。

Cortex-A9 では、次のエンコーディングで DBGPCSR は実行された分岐のターゲット アドレスをサンプルします (しかしデータ中止への投機の可能性あり)。
  • DBGPCSR[31:2] には、オフセットなしのターゲット分岐命令のアドレスが含まれています。
  • DBGPCSR[1:0] には、ターゲット分岐命令の実行ステートが含まれています。
    • 0xb00 (ARM ステート命令)
    • 0xb01 (Thumb2 ステート命令)
    • 0xb10 (Jazelle ステート命令)
    • 0xb11 (Thumb2EE ステート命令)

影響の詳細

深刻な問題ではありません。この問題は、期待 PC 値を得るには、デバッガー ツールが DBGPCSR[1:0] の指定値に依存してはならないこと、または DBGPCSR[31:2] からのオフセットを削除してはならないことを示しています。DBGPCSR[31:2] 値から 4 または 8 を差し引くと、実行されてこなかったコード部分や、実行コードが含まれていないコード部分になる場合があります。

PC[1]=1 であるが DBGPCSR[1]=0 という設定のハーフ ワード バウンダリの Thumb 命令、または PC[1]=0 および DBGPCSR[1]=1 という設定の ThumbEE 命令でも同じことになる可能性があります。

Cortex-A9 では、DBGPCSR は常に分岐ターゲット (ツールへの基本ブロックの開始点) であるため、デバッガーでこうしたケースの多くを検出し、正しい基本ブロックにサンプルを割り当てることができるはずです。
AR# 47554
日付 08/06/2012
ステータス アクティブ
種類 デザイン アドバイザリ
デバイス