« Raspberry Pi 4のJTAGデバッグ仕様を勉強中 | トップページ | RasPi5のARM JTAGデバッグ命令を総当たりで探してみた »

2023.12.28

Raspi4を使ってARMのデバッグ仕様を勉強中(続)

ARMのデバッグのための命令DPACC、APACCを使うと35bitのレジスタが接続され、下3bitがA[3:2]になったりR/#Wのフラグになったりするのですが、データの部分は32bitシフトして考えなければならないので、SVFプレイヤーを使って操作するのが大変面倒でした。

そういえば、SVFにはHDRやTDRといった命令があってチェーンの先頭や末尾に任意のビット列を付け加えられるんだったなと思いだし、HDRコマンドで下3bitを送るようにしたら、ものすごく見通しが良くなりました。

Armdebug1

結果もこのように、32bitのデータ部分だけが抜きだされて読むことができます。

Armdebug2

いろいろ試してみてわかったことは、

まず、CTRL/STATレジスタに0x50000000を書いてデバッグ機能を有効にすること。そして、SELECTレジスタとAPACCを使って任意のMEM-APにアクセスするわけですが、

Raspi4(BCM2711)のMEM-APのBASE(0xf8)は0x80020003で、IDR(0xfc)は0x24770002であるということです。このあたりの値はCPUの実装によって異なってくると思うので、この値が読み出せたらひとまず成功ということでしょう。

Debug Register Fileを読み書きしたい場合はTAR(0x04)にアドレスを設定してDRW(0x0c)を読み書きするか、Bank1のBD0~BD3にアクセスするかなのですが、BDを使うと4ワード連続でアクセスできるようですが、DRW経由で1ワードずつ読み出せば足りるので、BD0~3は使わなくてもよさそうです。

それから、BASEADDR[0]の内容は0x003E0003だったので、OpenOCDでdebug info 0としたときの内容とも一致しているので、アクセス方法としては正しいのだろう。

こういった値を読み出すためのアクセス方法がわかってくると、ARMのデバッグに書かれているこの複雑な図の意味がわかってきます。

Armdebug3

この図はどういうことなのかというと、

  • 1段目のDPACCレジスタは、DPACC命令の後でJTAGのDRを読み書きしてアクセスする
  • 2段目のMemory Access Port(MEM-AP)は、DPACCのSELECTレジスタとAPACCで指定するA[3:2]でアドレスを指定して読み書きする。0x00~0xfcまでのアドレスしかない。
  • 3段目のDebug Register Fileは、MEM-APのTARレジスタでアドレスを指定してDRWレジスタを通じて読み書きする。

ということです。3段目のレジスタのアドレスは実装依存なので、MEM-APのDebug Access Base(0xf8 BASE)に書かれている値がROM Tableの先頭アドレスになっていて、そのROM Tableの+0x000にProcessor 4KB baseが、+0x004にETM 4kB baseのアドレスが書かれているので、そのアドレスを取得してアクセスするのだろうと思われます。

実際にTARに0x00000000~0x00000010を書き込んで読んでみると、OpenOCDでdap info 0をしたときの
[L01] ROMTABLE[0x0] = 0x00010003
のような結果と同じ値が読み出されました。

Armdebug5

ROM TableのETM addressが0x00000000だから、おそらくETMのレジスタを読み出しているのだろうと思われます。

Armdebug4

それから、CSWのAddrIncを01にすれば、DRWを読み出すたびにアドレスがインクリメントされることを発見しました。

// CIDRの読み出し
HDR 3 TDI (2); // Write A[3:2] = 01 TAR
SDR 32 TDI (80020ff2) ; // address
HDR 3 TDI (7); // Read
SDR 32 TDI (00000000) ; // read DRW
SDR 32 TDI (00000000) PRINT ; // read DRW
SDR 32 TDI (00000000) PRINT ; // read DRW
SDR 32 TDI (00000000) PRINT ; // read DRW
SDR 32 TDI (00000000) PRINT ; // read DRW

CIDRのように連続したアドレスに配置されたレジスタも読み出す場合に便利かもしれません。

Armdebug6

Armdebug7

仕様のとおりの値が読み出せたのですが、あまり面白い値ではありませんでした。

プロセッサのコアの数とか、そういう値がどこかにあるといいんですが・・・

 

|

« Raspberry Pi 4のJTAGデバッグ仕様を勉強中 | トップページ | RasPi5のARM JTAGデバッグ命令を総当たりで探してみた »

コメント

コメントを書く



(ウェブ上には掲載しません)




« Raspberry Pi 4のJTAGデバッグ仕様を勉強中 | トップページ | RasPi5のARM JTAGデバッグ命令を総当たりで探してみた »