Upgrade to Pro — share decks privately, control downloads, hide ads and more …

JTAGでArmプロセッサをデバッグする方法のつづき/KernelVM_Tokyo16

 JTAGでArmプロセッサをデバッグする方法のつづき/KernelVM_Tokyo16

Toshifumi NISHINAGA

July 22, 2023
Tweet

More Decks by Toshifumi NISHINAGA

Other Decks in Programming

Transcript

  1. Interface Processor JTAG armプロセッサデバッグの概要 6 DAP TAP Processor Core JTAG

    DPACC APACC TCK TMS TDI TDO opcode data デバッグ⽤ MMIO Debug Unit DP AP
  2. resume(実⾏再開) • debug stateから抜けて実⾏を再開する機能 • gdbのcontinue操作 • CTIを制御してリスタートリクエストトリガーイベントを起こ すとresumeする •

    細かい⼿順は資料を参照 • CTIの理解に⾃信がないため • 参考 • ARM DDI 0487D.a H2.5 Exiting Debug State • ARM DDI 0487D.a Example H5-3 Synchronously restarting a group of PEs 10
  3. メモリアクセス(基本) • CPUレジスタ経由でメモリアクセスする⽅法 • メリット • ⼿順が簡単 • 柔軟なアクセス •

    8bitアクセス等も可 • デメリット • 低速 • メモリ読み込み例 • メモリをCPUレジスタにロード • CPUレジスタをデバッガで読み込む 13
  4. メモリアクセス(⾼速) • メモリアクセス専⽤モードを利⽤する⽅法 • メリット • レジスタ経由より⾼速 • デメリット •

    ⼿順が⾯倒 • 最⼩アクセス単位が32bitなので柔軟性が低い • アーキテクチャマニュアルに⼿順が書かれている(*) • ARM DDI 0487D.a, K9-7311, Appendix K9 Recommended Upload and Download Processes for External Debug を参照 14 *: 参考元 https://github.com/openocd-org/openocd/blob/master/src/target/aarch64.c#L2149
  5. ⾼速メモリ読み込み⼿順例 1. DBGDTR経由でX0にメモリアドレス をセット 2. X0をDBGDTRに書き込む命令を EDITRにセット 3. EDSCRのMA(メモリアクセスモード )を1にセット

    4. DBGDTRからメモリの値を読み込む。 読み込み時にアドレスはインクリメン トされる 5. ⼿順4をn回繰り返して必要なだけ読み 込む 6. EDSCRのMAを0にして終了 15 図は ARM DDI 0487D.a, K9-7313より引⽤
  6. software breakpointとhardware breakpoint • software breakpoint • ハードの機能を使わないbreakpoint • gdbでbreakコマンドを実⾏するとSW

    breakpointがセットされる • hardware breakpoint • CPUの機能を使うbreakpoint • gdbでhbreakコマンドを実⾏するとHW breakpointがセットされる • https://sourceware.org/gdb/onlinedocs/gdb/Set-Breaks.html 17
  7. 各breakpointのメリット・デメリット • software breakpoint • メリット • (理論上)無制限にbreakpointが作れる • デメリット

    • (armの場合)デバッガが異常終了するとメモリ上の実⾏バイナリが(多分)壊 れる • 実現⽅法の都合(後述) • hardware breakpoint • メリット • デバッガ側の実装は楽 • デメリット • 作れるbreakpoint数が有限(プロセッサ依存) 18
  8. software breakpointの実現⽅法(A64) • 事前準備 • コアがHaltしたらDebugModeに⼊るようにしておく • EDSCRのHDEフラグを1にセット • セット⼿順

    • breakpointを仕込みたいアドレスの命令をHLT命令に書き換える • デバッガは元の命令を覚えておく • https://github.com/openocd-org/openocd/blob/master/src/target/aarch64.c#L1276-L1301 • break時 • HLT命令実⾏時にコアがHaltしてDebug Stateに⼊る • 再開時(未検証) • 元々の命令をDBGITRで実⾏してプログラムカウンタを進める • 実⾏を再開する • 解除⽅法 • HLTに置き換えた命令をもとに戻す • https://github.com/openocd-org/openocd/blob/master/src/target/aarch64.c#L1577C4-L1605C3 19
  9. hardware breakpointの実現⽅法(A64) • セット⼿順 • DBGBVRレジスタにbreakpointを仕込みたいアドレスをセットする • DBGBCRレジスタで以下を設定する • breakpoint

    exceptionを起こすモード(SSC, HMC, PMC) • exceptionを起こす命令の種類(BAS) • breakpointの有効化(E) • 詳細は参考資料※を参照 • break時 • debug stateに⼊る • 解除⽅法 • DBGBCRのEフラグを0にして無効化 20 ※参考資料 ARM DDI 0487D.a D2.9.3 Execution conditions for which a breakpoint generates Breakpoint exceptions G8.3.2 DBGBCR<n>, Debug Breakpoint Control Registers, n = 0 ‒ 15 OpenOCD https://github.com/probe-rs/probe-rs/blob/578b8b247dd268eafe223d364a1421cf2fde1d7c/probe- rs/src/architecture/arm/core/armv8a.rs#L1059-L1080 probe-rs https://github.com/openocd-org/openocd/blob/master/src/target/aarch64.c#L1236-L1275
  10. 今こんなのつくってます • gdb server機能を持っ たデバッグインターフ ェース • マイコン内で制御するの で⾼速(のはず) •

    USBが11Mbpsのため • 先⾏: BlackMagicProbe • https://black- magic.org/index.html • RasPi Picoで動作 • フルrust実装 22 gdb OpenOCD Interface Target gdb server USB JTAG SWD gdb OdangoProbe gdb server Target JTAG SWD
  11. 実装概要 • マルチコア+⾮同期 • embassyを利⽤ • https://github.com /embassy- rs/embassy •

    gdb stubが1コアを 専有 • txがasync対応不可 のため 23 Core0 Core1 gdb stub task usb serial task (jtag)probe task pipe channel シリアル⼊出⼒ (gdbの通信) デバッガ制御
  12. デモ • 間に合いませんでした(ごめんね) • RTIC(embassy)でbreakpoint等動くまでは開発・動作確認済み • RTICはasyncとマルチコア使えないため乗り換え と リファクタ開始 •

    ⾊々忙しくて間に合わず ←いまここ • 次回KernelVMまでに出せるようにしたい 24 ※: > Real-Time Interrupt-driven Concurrency (RTIC) framework https://github.com/rtic-rs/rtic より引⽤