RasPi5のARM JTAGデバッグ命令を総当たりで探してみた
RasPi4でARM JTAGデバッグ機能にアクセスできるようになってきたので、Raspi5でも同様のことができないかどうかを試してみました。
Raspi4と5のJTAGで大きく異なるのは、IRの長さやIDCODEです。
- Raspi4のBCM2711はIRが4bitで、IDCODEは0x4ba00477
- Raspi5のBCM2712はIRが32bitで、IDCODEは0x2a03217f
です。
IRが4bitのARMではIDCODE命令のコードは0xeですが8bitのARMでは0xfeです。では、32bitは・・・ARMのデバッグ仕様書には記載されていません。本当にこれはARMのコアなのかと疑いたくなのですが、IRの長さは紛れもなく32bitあります。
様々な命令を発行しまくって調べてみると、確かに0xffffff0eや0xfffffffeのときにIDCODEを返してくるので、これで正しいのでしょう。
下4bitは0xeでいいのだとしても、上位28bitに何を入れればいいのかわかりません。
32bitの命令空間は広大なのですが、プログラムを組んで28bitを総当たりで調べてみることにしました。
まず、プログラムを組んでRaspi 5 のCPUのJTAG Instructionを順番に与えていって、何bitのDRがつながっているかを総当たりで調べてみます。
何かいろいろ反応しているようで、0xffffff10とか0xffffff18とかバウンダリスキャンレジスタが見えているのではないかと思えるようなビット列が見えています。(492490492というのは010010010010010010010000010010010010ですから、3bitごとに1が立つ、つまりバウンダリスキャンレジスタのコントロールセルが見えているのでしょう。)
いろいろ試してみるのですが、下4bitが6でもEでもIDOCDEが見えています。IRデコーダは3bitしかないのでしょうか。しかし上28bitも見ているような気もします。
INSTを変えてみるとDRの長さがいろいろ変わってくる(何も出力しないパターンもある)のですが、35bitのレジスタがつながることはないのかと思って、下4bitが0x0aである(DPACC)に相当すると思われる0x0000000aから0xfffffffaまでの268,435,456通りの命令コードを送ってみました。
DRに35bitレジスタが実装されていれば、「0x00000000 & "101" & ダミー32bit」 みたいなデータを与えると、「ダミー32bit & レジスタ読み出し値 & ACC」が読み出されるわけです。これを様々なINSTを送った後でDR SCANして試してみるわけです。
結果としては、35bitのレジスタが接続されることはありませんでした。
BCM2712のJTAGには、ARMのデバッグ仕様とは異なる実装がされているか、何かのセキュリティが働いていてJTAGデバッグを禁止している可能性が高いと言えます。
| 固定リンク
コメント