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. JTAGでArmプロセッサを
    デバッグする⽅法のつづき
    Toshifumi NISHINAGA (CV: ついなちゃん)
    @tnishinaga
    2023-07-22 KernelVM Tokyo 16
    https://speakerdeck.com/tnishinaga/kernelvm-tokyo16
    1

    View full-size slide

  2. ⾃⼰紹介
    • tnishinaga(CVついなちゃん)
    • kernelvm online 4でJTAGでarmプ
    ロセッサをデバッグする発表した

    • https://speakerdeck.com/tnishinaga
    /kernelvm-online4
    2

    View full-size slide

  3. ⽬次
    • Armデバッグのおさらい
    • Armプロセッサデバッグのつづき
    • OdangoProbeの紹介
    3

    View full-size slide

  4. Armデバッグのおさらい
    4

    View full-size slide

  5. プロセッサデバッグの概要
    gdb
    OpenOCD Interface Target
    gdb
    server
    USB
    JTAG
    SWD
    5

    View full-size slide

  6. Interface Processor
    JTAG
    armプロセッサデバッグの概要
    6
    DAP
    TAP
    Processor
    Core
    JTAG
    DPACC
    APACC
    TCK
    TMS
    TDI
    TDO
    opcode
    data
    デバッグ⽤
    MMIO
    Debug
    Unit
    DP
    AP

    View full-size slide

  7. armプロセッサデバッグ⽅法
    のつづき
    8

    View full-size slide

  8. 以下を追加でご紹介
    • resume(実⾏再開)
    • step実⾏
    • メモリアクセス
    • 基本版
    • ⾼速版
    • breakpoint
    • software
    • hardware
    9

    View full-size slide

  9. 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

    View full-size slide

  10. step実⾏
    • resume後、1命令実⾏後に⾃動で⽌まる機能
    • gdbのstep操作
    • EDSCRのSSフラグで設定する
    • 1命令実⾏後にhaltしてDebugStateに⼊る
    • 参考
    • ARM DDI 0487D.a, H9.2.27 EDESR, External Debug Event Status
    Register
    11

    View full-size slide

  11. メモリアクセス
    • デバッガからプロセッサのメモリを読み書きする⽅法
    • 以下の2パターンある
    • 基本
    • ⾼速
    12

    View full-size slide

  12. メモリアクセス(基本)
    • CPUレジスタ経由でメモリアクセスする⽅法
    • メリット
    • ⼿順が簡単
    • 柔軟なアクセス
    • 8bitアクセス等も可
    • デメリット
    • 低速
    • メモリ読み込み例
    • メモリをCPUレジスタにロード
    • CPUレジスタをデバッガで読み込む
    13

    View full-size slide

  13. メモリアクセス(⾼速)
    • メモリアクセス専⽤モードを利⽤する⽅法
    • メリット
    • レジスタ経由より⾼速
    • デメリット
    • ⼿順が⾯倒
    • 最⼩アクセス単位が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

    View full-size slide

  14. ⾼速メモリ読み込み⼿順例
    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より引⽤

    View full-size slide

  15. breakpoint
    • 特定アドレスの命令実⾏前に処理を中断させる機能
    • softwareとhardwareの2種類ある
    16

    View full-size slide

  16. 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

    View full-size slide

  17. 各breakpointのメリット・デメリット
    • software breakpoint
    • メリット
    • (理論上)無制限にbreakpointが作れる
    • デメリット
    • (armの場合)デバッガが異常終了するとメモリ上の実⾏バイナリが(多分)壊
    れる
    • 実現⽅法の都合(後述)
    • hardware breakpoint
    • メリット
    • デバッガ側の実装は楽
    • デメリット
    • 作れるbreakpoint数が有限(プロセッサ依存)
    18

    View full-size slide

  18. 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

    View full-size slide

  19. 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, 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

    View full-size slide

  20. OdangoProbeの紹介
    21

    View full-size slide

  21. 今こんなのつくってます
    • 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

    View full-size slide

  22. 実装概要
    • マルチコア+⾮同期
    • 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の通信)
    デバッガ制御

    View full-size slide

  23. デモ
    • 間に合いませんでした(ごめんね)
    • RTIC(embassy)でbreakpoint等動くまでは開発・動作確認済み
    • RTICはasyncとマルチコア使えないため乗り換え と リファクタ開始
    • ⾊々忙しくて間に合わず ←いまここ
    • 次回KernelVMまでに出せるようにしたい
    24
    ※: > Real-Time Interrupt-driven Concurrency (RTIC) framework
    https://github.com/rtic-rs/rtic より引⽤

    View full-size slide

  24. 参考資料
    • ARM DDI 0487D.a
    • https://developer.arm.com/documentation/ddi0487/da/?lang=en
    25

    View full-size slide