gdbからMMRレジスタにアクセスする

gdbをコマンドラインから使う時に便利なMMR定義をアップデートしました。

GNUプロジェクトがいちいちAnalog Devicesのプロセッサの品揃えに対応するはずがないので、gdbが対応するのはプロセッサ・コアの内部レジスタだけです。MMR (Memory Mapped Register) はGNUプロジェクトではない誰かが対応する必要があります。

これまでの対応

Blackfin Koopは、Eclipse用にレジスタ・アクセス用のプラグインを提供しています。これを使えば、Eclipse越しにgdbを使ってBlackfinシリーズのMMRにアクセスできます。この機能を使えばMMRへのアクセスが非常に簡単になります。

ところが、Eclipseを使わない裸のbfin-elf-gdbを使う際には、当然このプラグインは使えません。MMRにアクセスするならばMMRのアドレスとデータサイズを調べて正確な型付けでアクセスしなければなりません。即興で書きますので少々不正確ですが、こんな感じです。

(gdb) print/x *(unsigned short *) 0xFE001104

正直やっていられません。

この問題に対応するために、だいぶ前からTOPPERS/JSP for Blackfin プロジェクトでは少々トリッキーな事をやっています。MMRアクセス用の擬似変数を仕立てて、MMRと同じアドレスにマップしているのです。この仕組みのおかげでgdbからはMMRは変数として扱うことできます。

ところが、話は簡単ではありません。通常の変数であれば、プログラムの開始時に初期値かゼロで埋め立てられます。そんな事をMMRに対して行えば、当然プログラムが異常動作します。そこで色々と策を弄して初期値のロードを阻害していたのですが、結局最近になってそれらの策がLDRファイルの作成に干渉することがわかったため、MMRの定義をTOPPERS/JSP for Blackfin カーネルから削除しました

新しい方法

現在のTOPPERS/JSP for Blackfinには、MMRファイル用の変数定義もセクション宣言もありません。その代わりに、別のELFファイルを用意しました。

TOPPERS/JSP アプリケーションのELFファイル名は”jsp”です。このファイルをデバッグする場合には、コマンドラインで以下のように操作します。

$ bfin-elf-gdb –q jsp

(gdb) target remote localhost:2000

(gdb) load

通常はここからデバッグが始まりますが、今回用意したMMR定義ファイルを使う場合には、さらに次のようにコマンドを入力します。

(gdb) add-symbols-file mmr_bf592.out 0

mmr_bf592.outが今回使用するELFファイルです。add-symbols-fileはgdbのコマンドで現在ロードされているシンボル情報に対して、新しいファイルからシンボル情報を抽出して追加します。ポイントは新しいファイルをロードしないことで、元からあるjspファイルのシンボルとバイナリを維持したまま、mmr_bf592.outからMMRのアドレスと型情報をロードします。

このファイルを読み込むことで、gdb上ではMMRはアプリケーションのグローバル変数として扱うことができます。gdbは変数名に対してcompletion機能を持っていますので、”mmr”で始まるMMR名を最小のキータイプ数で指定できます。

ファイルの取得方法と対応プロセッサ

ファイルはまだリリースしていません。

CVSのgen_mmr_symbolsモジュールからupdateで取り出してください。makeファイル一発でビルドできます。

対応プロセッサは現在以下の4シリーズです。

  • ADSP-BF533
  • ADSP-BF537
  • ADSP-BF518
  • ADSP-BF592

正直このMMR定義は面倒きわまりないため、他のプロセッサに対応するかどうかは未定です。

リリース時期についても未定です。jspカーネル本体と同時期でしょうかね。

コメントする

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください