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
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
840
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
AIに既存システムを理解させる技術 ~レガシーを見捨てないハーネスエンジニアリング入門~
ochtum
0
190
PyConJP2026_wat_Python × Signal Processing: How to Draw Pictures with Sound Using Spectrogram Art
wat
0
650
Go 1.27からのGODEBUG / Go 1.27 リリースパーティ #go127party
mazrean
0
280
初心者DevRelとして参加者だった私が、DevRel Talks!#2に登壇するまでにしてきたこと
sokohirai
0
320
【DroidKaigi 2026】「アクセシビリティを利用するとき、 アクセシビリティもまたこちらを利用している」 〜マルウェアによる攻撃と防衛について〜
halunoyo
0
180
まずはプロンプトガイドを読もう、話はそれからだ
kiakiraki
1
250
不幸な GC
chencmd
0
860
이 함수, 실패하면 어떻게 되나요? null부터 Rich Errors까지, Kotlin 에러 처리 15년
haeti2
0
110
高専、大学編入、そして未踏へ〜プロダクト開発とキャリアの歩み - Technical College, University Transfer, and On to “Mitou” / My Journey in Product Development and Career
pkmiya
0
130
AWS Transform Customによる Spring Boot 2.xから4.xへのVerUp
satoshi256kbyte
2
120
Flow は今どうなっているか
mizdra
PRO
0
840
異なる設計思想のフレームワークを経験して得た学び
amekuhideki
2
1.4k
Featured
See All Featured
How to build a perfect <img>
jonoalderson
1
5.9k
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
21
1.6k
Designing Dashboards & Data Visualisations in Web Apps
destraynor
232
55k
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
52
6.1k
The Cult of Friendly URLs
andyhume
79
7k
Measuring & Analyzing Core Web Vitals
bluesmoon
9
990
The Organizational Zoo: Understanding Human Behavior Agility Through Metaphoric Constructive Conversations (based on the works of Arthur Shelley, Ph.D)
kimpetersen
PRO
0
430
Bash Introduction
62gerente
615
220k
Prompt Engineering for Job Search
mfonobong
0
430
The State of eCommerce SEO: How to Win in Today's Products SERPs - #SEOweek
aleyda
2
11k
Everyday Curiosity
cassininazir
0
310
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
35
2.8k
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