使用 Coresight 進行核心崩潰和看門狗復位¶
簡介¶
本文件介紹瞭如何使用 Linux coresight 跟蹤支援來除錯核心崩潰和看門狗復位場景。
核心崩潰期間的 Coresight 跟蹤¶
從 coresight 驅動程式的角度來看,處理核心崩潰情況有四個主要要求。
支援從保留記憶體區域分配跟蹤緩衝區頁面。平臺可以使用新增到相關 coresight 節點的新裝置樹屬性來公佈此功能。
支援在崩潰時停止 coresight 塊
以指定格式儲存所需的元資料
支援讀取崩潰時捕獲的跟蹤資料
從保留 RAM 分配跟蹤緩衝區頁面¶
一個新的可選裝置樹屬性“memory-region”已新增到 Coresight TMC 裝置節點,該屬性將提供跟蹤緩衝區的基地址和大小。
跟蹤緩衝區的靜態分配將確保同時處理 IOMMU 啟用和停用情況。此外,支援持久 RAM 的平臺將允許使用者在後續啟動中無需啟動 crashdump 核心即可讀取跟蹤資料。
注意:對於 ETR 接收裝置,此保留區域將用於跟蹤捕獲和跟蹤資料檢索。對於 ETF 接收裝置,內部 SRAM 將用於跟蹤捕獲,它們將被同步到保留區域進行檢索。
在崩潰時停用 Coresight 塊¶
為了避免核心崩潰後丟失相關跟蹤資料的情況,最好在崩潰時停止 coresight 塊。
這可以透過如下配置比較器、CTI 和接收裝置來實現
Trigger on panic
Comparator --->External out --->CTI -->External In---->ETR/ETF stop
在核心崩潰時儲存元資料¶
Coresight 元資料除了跟蹤資料之外,還包含成功解碼跟蹤所需的所有附加資料。這包括 ETR/ETF/ETB 暫存器快照等。
一個新的可選裝置屬性“memory-region”已新增到 ETR/ETF/ETB 裝置節點中,用於此目的。
讀取崩潰時捕獲的跟蹤資料¶
在崩潰時捕獲的跟蹤資料,可以從重啟的核心或 crashdump 核心中透過特殊的裝置檔案 /dev/crash_tmc_xxx 讀取。此裝置檔案僅在有有效的崩潰資料可用時建立。
核心崩潰時跟蹤捕獲和解碼的一般流程¶
使用 sysfs 介面在所有核心上啟用源和接收器。ETR 接收器應透過從 sysfs 中選擇“resrv”緩衝區模式,從保留記憶體中分配跟蹤緩衝區。
執行相關測試。
在核心崩潰時,所有 coresight 塊都被停用,必要的元資料由核心崩潰處理程式同步。
系統最終將重新啟動或啟動 crashdump 核心。
對於支援 crashdump 核心的平臺,可以使用 coresight sysfs 介面從 crashdump 核心本身轉儲原始跟蹤資料。在這種情況下,不需要持久 RAM。
對於支援持久 RAM 的平臺,可以在隨後的 Linux 啟動中,使用 coresight sysfs 介面轉儲跟蹤資料。在這種情況下,不需要 crashdump 核心。持久 RAM 確保跟蹤資料在重啟後保持完整。
看門狗復位期間的 Coresight 跟蹤¶
處理看門狗復位和核心崩潰情況的主要區別如下:
Coresight 元資料的儲存需要由 SCP(系統控制處理器)韌體以指定格式處理,而不是核心。
韌體為跟蹤緩衝區和元資料提供的保留記憶體區域必須在持久 RAM 中。注意:這是看門狗復位情況的要求,但在核心崩潰情況下是可選的。
看門狗復位只能在滿足上述兩個要求的平臺上支援。
使用 ETR 接收器測試核心崩潰情況的示例命令¶
啟動 Linux 核心,並在核心啟動引數中新增“crash_kexec_post_notifiers”。如果使用者想從 crashdump 核心中讀取跟蹤資料,這是強制性的。
啟用預載入的 ETM 配置
#echo 1 > /sys/kernel/config/cs-syscfg/configurations/panicstop/enable
使用 sysfs 介面配置 CTI
#./cti_setup.sh #cat cti_setup.sh cd /sys/bus/coresight/devices/ ap_cti_config () { #ETM trig out[0] trigger to Channel 0 echo 0 4 > channels/trigin_attach } etf_cti_config () { #ETF Flush in trigger from Channel 0 echo 0 1 > channels/trigout_attach echo 1 > channels/trig_filter_enable } etr_cti_config () { #ETR Flush in from Channel 0 echo 0 1 > channels/trigout_attach echo 1 > channels/trig_filter_enable } ctidevs=`find . -name "cti*"` for i in $ctidevs do cd $i connection=`find . -name "ete*"` if [ ! -z "$connection" ] then echo "AP CTI config for $i" ap_cti_config fi connection=`find . -name "tmc_etf*"` if [ ! -z "$connection" ] then echo "ETF CTI config for $i" etf_cti_config fi connection=`find . -name "tmc_etr*"` if [ ! -z "$connection" ] then echo "ETR CTI config for $i" etr_cti_config fi cd .. done
注意:CTI 連線是 SOC 特定的,因此上述指令碼僅供參考。
為 ETR 緩衝區選擇保留緩衝區模式
#echo "resrv" > /sys/bus/coresight/devices/tmc_etr0/buf_mode_preferred
啟用重新整理觸發器停止配置
#echo 1 > /sys/bus/coresight/devices/tmc_etr0/stop_on_flush
使用 sysfs 介面在核心 1 和 2 上啟動 Coresight 跟蹤
在核心 1 上執行一些應用程式
#taskset -c 1 dd if=/dev/urandom of=/dev/null &
在核心 2 上呼叫核心崩潰
#echo 1 > /proc/sys/kernel/panic #taskset -c 2 echo c > /proc/sysrq-trigger
從重啟的核心或 crashdump 核心中讀取崩潰資料
#dd if=/dev/crash_tmc_etr0 of=/trace/cstrace.bin
執行 opencsd 解碼器工具/指令碼以生成指令跟蹤。
指令跟蹤轉儲示例¶
核心 1 轉儲
A etm4_enable_hw: ffff800008ae1dd4
CONTEXT EL2 etm4_enable_hw: ffff800008ae1dd4
I etm4_enable_hw: ffff800008ae1dd4:
d503201f nop
I etm4_enable_hw: ffff800008ae1dd8:
d503201f nop
I etm4_enable_hw: ffff800008ae1ddc:
d503201f nop
I etm4_enable_hw: ffff800008ae1de0:
d503201f nop
I etm4_enable_hw: ffff800008ae1de4:
d503201f nop
I etm4_enable_hw: ffff800008ae1de8:
d503233f paciasp
I etm4_enable_hw: ffff800008ae1dec:
a9be7bfd stp x29, x30, [sp, #-32]!
I etm4_enable_hw: ffff800008ae1df0:
910003fd mov x29, sp
I etm4_enable_hw: ffff800008ae1df4:
a90153f3 stp x19, x20, [sp, #16]
I etm4_enable_hw: ffff800008ae1df8:
2a0003f4 mov w20, w0
I etm4_enable_hw: ffff800008ae1dfc:
900085b3 adrp x19, ffff800009b95000 <reserved_mem+0xc48>
I etm4_enable_hw: ffff800008ae1e00:
910f4273 add x19, x19, #0x3d0
I etm4_enable_hw: ffff800008ae1e04:
f8747a60 ldr x0, [x19, x20, lsl #3]
E etm4_enable_hw: ffff800008ae1e08:
b4000140 cbz x0, ffff800008ae1e30 <etm4_starting_cpu+0x50>
I 149.039572921 etm4_enable_hw: ffff800008ae1e30:
a94153f3 ldp x19, x20, [sp, #16]
I 149.039572921 etm4_enable_hw: ffff800008ae1e34:
52800000 mov w0, #0x0 // #0
I 149.039572921 etm4_enable_hw: ffff800008ae1e38:
a8c27bfd ldp x29, x30, [sp], #32
..snip
149.052324811 chacha_block_generic: ffff800008642d80:
9100a3e0 add x0,
I 149.052324811 chacha_block_generic: ffff800008642d84:
b86178a2 ldr w2, [x5, x1, lsl #2]
I 149.052324811 chacha_block_generic: ffff800008642d88:
8b010803 add x3, x0, x1, lsl #2
I 149.052324811 chacha_block_generic: ffff800008642d8c:
b85fc063 ldur w3, [x3, #-4]
I 149.052324811 chacha_block_generic: ffff800008642d90:
0b030042 add w2, w2, w3
I 149.052324811 chacha_block_generic: ffff800008642d94:
b8217882 str w2, [x4, x1, lsl #2]
I 149.052324811 chacha_block_generic: ffff800008642d98:
91000421 add x1, x1, #0x1
I 149.052324811 chacha_block_generic: ffff800008642d9c:
f100443f cmp x1, #0x11
核心 2 轉儲
A etm4_enable_hw: ffff800008ae1dd4
CONTEXT EL2 etm4_enable_hw: ffff800008ae1dd4
I etm4_enable_hw: ffff800008ae1dd4:
d503201f nop
I etm4_enable_hw: ffff800008ae1dd8:
d503201f nop
I etm4_enable_hw: ffff800008ae1ddc:
d503201f nop
I etm4_enable_hw: ffff800008ae1de0:
d503201f nop
I etm4_enable_hw: ffff800008ae1de4:
d503201f nop
I etm4_enable_hw: ffff800008ae1de8:
d503233f paciasp
I etm4_enable_hw: ffff800008ae1dec:
a9be7bfd stp x29, x30, [sp, #-32]!
I etm4_enable_hw: ffff800008ae1df0:
910003fd mov x29, sp
I etm4_enable_hw: ffff800008ae1df4:
a90153f3 stp x19, x20, [sp, #16]
I etm4_enable_hw: ffff800008ae1df8:
2a0003f4 mov w20, w0
I etm4_enable_hw: ffff800008ae1dfc:
900085b3 adrp x19, ffff800009b95000 <reserved_mem+0xc48>
I etm4_enable_hw: ffff800008ae1e00:
910f4273 add x19, x19, #0x3d0
I etm4_enable_hw: ffff800008ae1e04:
f8747a60 ldr x0, [x19, x20, lsl #3]
E etm4_enable_hw: ffff800008ae1e08:
b4000140 cbz x0, ffff800008ae1e30 <etm4_starting_cpu+0x50>
I 149.046243445 etm4_enable_hw: ffff800008ae1e30:
a94153f3 ldp x19, x20, [sp, #16]
I 149.046243445 etm4_enable_hw: ffff800008ae1e34:
52800000 mov w0, #0x0 // #0
I 149.046243445 etm4_enable_hw: ffff800008ae1e38:
a8c27bfd ldp x29, x30, [sp], #32
I 149.046243445 etm4_enable_hw: ffff800008ae1e3c:
d50323bf autiasp
E 149.046243445 etm4_enable_hw: ffff800008ae1e40:
d65f03c0 ret
A ete_sysreg_write: ffff800008adfa18
..snip
I 149.05422547 panic: ffff800008096300:
a90363f7 stp x23, x24, [sp, #48]
I 149.05422547 panic: ffff800008096304:
6b00003f cmp w1, w0
I 149.05422547 panic: ffff800008096308:
3a411804 ccmn w0, #0x1, #0x4, ne // ne = any
N 149.05422547 panic: ffff80000809630c:
540001e0 b.eq ffff800008096348 <panic+0xe0> // b.none
I 149.05422547 panic: ffff800008096310:
f90023f9 str x25, [sp, #64]
E 149.05422547 panic: ffff800008096314:
97fe44ef bl ffff8000080276d0 <panic_smp_self_stop>
A panic: ffff80000809634c
I 149.05422547 panic: ffff80000809634c:
910102d5 add x21, x22, #0x40
I 149.05422547 panic: ffff800008096350:
52800020 mov w0, #0x1 // #1
E 149.05422547 panic: ffff800008096354:
94166b8b bl ffff800008631180 <bust_spinlocks>
N 149.054225518 bust_spinlocks: ffff800008631180:
340000c0 cbz w0, ffff800008631198 <bust_spinlocks+0x18>
I 149.054225518 bust_spinlocks: ffff800008631184:
f000a321 adrp x1, ffff800009a98000 <pbufs.0+0xbb8>
I 149.054225518 bust_spinlocks: ffff800008631188:
b9405c20 ldr w0, [x1, #92]
I 149.054225518 bust_spinlocks: ffff80000863118c:
11000400 add w0, w0, #0x1
I 149.054225518 bust_spinlocks: ffff800008631190:
b9005c20 str w0, [x1, #92]
E 149.054225518 bust_spinlocks: ffff800008631194:
d65f03c0 ret
A panic: ffff800008096358
基於 Perf 的測試¶
啟動 perf 會話¶
ETF
perf record -e cs_etm/panicstop,@tmc_etf1/ -C 1
perf record -e cs_etm/panicstop,@tmc_etf2/ -C 2
ETR
perf record -e cs_etm/panicstop,@tmc_etr0/ -C 1,2
崩潰後讀取跟蹤資料¶
上述解釋的基於 sysfs 的方法可用於在核心崩潰重啟後檢索和解碼跟蹤資料。