Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
JTAGでArmプロセッサをデバッグする方法のつづき/KernelVM_Tokyo16
Search
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
Toshifumi NISHINAGA
July 22, 2023
Programming
750
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
JTAGでArmプロセッサをデバッグする方法のつづき/KernelVM_Tokyo16
Toshifumi NISHINAGA
July 22, 2023
More Decks by Toshifumi NISHINAGA
See All by Toshifumi NISHINAGA
マイコンでもRustのtestがしたい その2/KernelVM Tokyo 18
tnishinaga
2
2.6k
マイコンでもRustのtestがしたい/KernelVM Kansai 11
tnishinaga
1
1.8k
BareMetalで遊ぶRaspberry Pi 5 PCIe編/KernelVM Tokyo17
tnishinaga
2
3.8k
probe-rsの紹介と最近の貢献紹介/CELF-02-03
tnishinaga
1
830
SecurityCamp2023基板作るコース講義資料/Security Camp 2023 Lecture Materials
tnishinaga
8
2.8k
RP2040のPIOを使う話/KernelVM Hokuriku 6
tnishinaga
4
8.9k
CMSIS-DAPの概要と使い方/KernelVM Online5
tnishinaga
1
2.4k
JTAGでarmプロセッサをデバッグする話/KernelVM Online4
tnishinaga
5
4k
ARM入門/arm introduction
tnishinaga
14
14k
Other Decks in Programming
See All in Programming
FastAPI の並行処理モデルを完全に理解する
hoto17296
9
3.3k
[DroidKaigi 26] How We Moved from Android Studio to Slack
thisaay
0
120
【デモ】Kiroで体験する仕様駆動開発|設計からコーディングまでAIと進める開発フロー
cmkudo
0
530
AWS Transform Customによる Spring Boot 2.xから4.xへのVerUp
satoshi256kbyte
2
120
コンパウンドプロダクト開発のためのローカルプロセスマネージャー再発明 #layerxgo
izumin5210
0
590
Introducing Stack Pull Request in GitHub
kkamegawa
0
120
Hello, Hiroshima Geospatial Data! — Exploring DoboX with Python
ra0kley
0
140
業務時間外もAIに働いてもらう話
colorful12
3
9.4k
思考垂れ流し開発 ~音声入力 × AIエージェント × 開発ハーネスによる試行錯誤~
npostring
0
560
Flow は今どうなっているか
mizdra
PRO
0
800
Detecting Compromised CI with eBPF and Cilium Tetragon
lizrice
0
280
AI Readyの正体はデータマネジメントだ メダリオン2.0の最前線
freee
PRO
0
480
Featured
See All Featured
Ethics towards AI in product and experience design
skipperchong
2
360
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
230
23k
Thoughts on Productivity
jonyablonski
76
5.3k
30 Presentation Tips
portentint
PRO
1
380
Money Talks: Using Revenue to Get Sh*t Done
nikkihalliwell
0
480
Site-Speed That Sticks
csswizardry
13
1.5k
The AI Revolution Will Not Be Monopolized: How open-source beats economies of scale, even for LLMs
inesmontani
PRO
3
3.7k
How STYLIGHT went responsive
nonsquared
100
6.3k
Statistics for Hackers
jakevdp
799
230k
Effective software design: The role of men in debugging patriarchy in IT @ Voxxed Days AMS
baasie
0
500
Dominate Local Search Results - an insider guide to GBP, reviews, and Local SEO
greggifford
PRO
0
310
Introduction to Domain-Driven Design and Collaborative software design
baasie
1
960
Transcript
JTAGでArmプロセッサを デバッグする⽅法のつづき Toshifumi NISHINAGA (CV: ついなちゃん) @tnishinaga 2023-07-22 KernelVM Tokyo
16 https://speakerdeck.com/tnishinaga/kernelvm-tokyo16 1
⾃⼰紹介 • tnishinaga(CVついなちゃん) • kernelvm online 4でJTAGでarmプ ロセッサをデバッグする発表した ⼈ •
https://speakerdeck.com/tnishinaga /kernelvm-online4 2
⽬次 • Armデバッグのおさらい • Armプロセッサデバッグのつづき • OdangoProbeの紹介 3
Armデバッグのおさらい 4
プロセッサデバッグの概要 gdb OpenOCD Interface Target gdb server USB JTAG SWD
5
Interface Processor JTAG armプロセッサデバッグの概要 6 DAP TAP Processor Core JTAG
DPACC APACC TCK TMS TDI TDO opcode data デバッグ⽤ MMIO Debug Unit DP AP
armプロセッサデバッグ⽅法 のつづき 8
以下を追加でご紹介 • resume(実⾏再開) • step実⾏ • メモリアクセス • 基本版 •
⾼速版 • breakpoint • software • hardware 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
step実⾏ • resume後、1命令実⾏後に⾃動で⽌まる機能 • gdbのstep操作 • EDSCRのSSフラグで設定する • 1命令実⾏後にhaltしてDebugStateに⼊る •
参考 • ARM DDI 0487D.a, H9.2.27 EDESR, External Debug Event Status Register 11
メモリアクセス • デバッガからプロセッサのメモリを読み書きする⽅法 • 以下の2パターンある • 基本 • ⾼速 12
メモリアクセス(基本) • CPUレジスタ経由でメモリアクセスする⽅法 • メリット • ⼿順が簡単 • 柔軟なアクセス •
8bitアクセス等も可 • デメリット • 低速 • メモリ読み込み例 • メモリをCPUレジスタにロード • CPUレジスタをデバッガで読み込む 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
⾼速メモリ読み込み⼿順例 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より引⽤
breakpoint • 特定アドレスの命令実⾏前に処理を中断させる機能 • softwareとhardwareの2種類ある 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
各breakpointのメリット・デメリット • software breakpoint • メリット • (理論上)無制限にbreakpointが作れる • デメリット
• (armの場合)デバッガが異常終了するとメモリ上の実⾏バイナリが(多分)壊 れる • 実現⽅法の都合(後述) • hardware breakpoint • メリット • デバッガ側の実装は楽 • デメリット • 作れるbreakpoint数が有限(プロセッサ依存) 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
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
OdangoProbeの紹介 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
実装概要 • マルチコア+⾮同期 • 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の通信) デバッガ制御
デモ • 間に合いませんでした(ごめんね) • RTIC(embassy)でbreakpoint等動くまでは開発・動作確認済み • RTICはasyncとマルチコア使えないため乗り換え と リファクタ開始 •
⾊々忙しくて間に合わず ←いまここ • 次回KernelVMまでに出せるようにしたい 24 ※: > Real-Time Interrupt-driven Concurrency (RTIC) framework https://github.com/rtic-rs/rtic より引⽤
参考資料 • ARM DDI 0487D.a • https://developer.arm.com/documentation/ddi0487/da/?lang=en 25