Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
JTAGでArmプロセッサをデバッグする方法のつづき/KernelVM_Tokyo16
Search
Toshifumi NISHINAGA
July 22, 2023
Programming
760
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.7k
マイコンでもRustのtestがしたい/KernelVM Kansai 11
tnishinaga
1
1.9k
BareMetalで遊ぶRaspberry Pi 5 PCIe編/KernelVM Tokyo17
tnishinaga
2
3.9k
probe-rsの紹介と最近の貢献紹介/CELF-02-03
tnishinaga
1
850
SecurityCamp2023基板作るコース講義資料/Security Camp 2023 Lecture Materials
tnishinaga
8
2.8k
RP2040のPIOを使う話/KernelVM Hokuriku 6
tnishinaga
4
9.1k
CMSIS-DAPの概要と使い方/KernelVM Online5
tnishinaga
1
2.5k
JTAGでarmプロセッサをデバッグする話/KernelVM Online4
tnishinaga
5
4k
ARM入門/arm introduction
tnishinaga
14
14k
Other Decks in Programming
See All in Programming
App Intentsのビルドプロセスを支える技術
kntkymt
0
410
JRuby: Past, Present, and Future
headius
0
170
AWS Step Functions 大規模並列の壁を越える / jaws-sonic-2026-niigata-step-functions
kasacchiful
PRO
1
500
ゲームコントローラやキーボードのファームウェアをSwiftで書く
kishikawakatsumi
1
250
C#の現在地 進化の歴史と、AI時代の.NET Everywhere
neuecc
4
3.2k
すこし踏み込む CancellationToken
htkym
2
710
個人開発基盤をまるごとCloudflareに引っ越して爆速で総合的体験を向上させた話
tinykitten
0
200
【高い買い物LT会】初任給で話題の国産フィジカルAIを買った話
akagami
PRO
0
160
スマートフォンでモールス信号を送受信する 〜スマートフォンのLEDとカメラで作る光通信の設計と実装〜
atsuki_seo
0
160
スマート反転とウェブアクセシビリティ
camiha
0
210
アクセシビリティから考える情報設計
high_g_engineer
0
380
setup-vp GitLab対応の裏側
naokihaba
0
120
Featured
See All Featured
Designing Dashboards & Data Visualisations in Web Apps
destraynor
232
55k
What's in a price? How to price your products and services
michaelherold
247
13k
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
9
1.6k
Leveraging LLMs for student feedback in introductory data science courses - posit::conf(2025)
minecr
1
400
Mind Mapping
helmedeiros
1
370
The Limits of Empathy - UXLibs8
cassininazir
1
680
Bioeconomy Workshop: Dr. Julius Ecuru, Opportunities for a Bioeconomy in West Africa
akademiya2063
PRO
1
360
The browser strikes back
jonoalderson
0
1.7k
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
35
3.8k
Claude Code のすすめ
schroneko
67
230k
Highjacked: Video Game Concept Design
rkendrick25
PRO
1
460
Scaling GitHub
holman
464
140k
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