使用 Coresight 進行核心崩潰和看門狗復位

簡介

本文件介紹瞭如何使用 Linux coresight 跟蹤支援來除錯核心崩潰和看門狗復位場景。

核心崩潰期間的 Coresight 跟蹤

從 coresight 驅動程式的角度來看,處理核心崩潰情況有四個主要要求。

  1. 支援從保留記憶體區域分配跟蹤緩衝區頁面。平臺可以使用新增到相關 coresight 節點的新裝置樹屬性來公佈此功能。

  2. 支援在崩潰時停止 coresight 塊

  3. 以指定格式儲存所需的元資料

  4. 支援讀取崩潰時捕獲的跟蹤資料

從保留 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 讀取。此裝置檔案僅在有有效的崩潰資料可用時建立。

核心崩潰時跟蹤捕獲和解碼的一般流程

  1. 使用 sysfs 介面在所有核心上啟用源和接收器。ETR 接收器應透過從 sysfs 中選擇“resrv”緩衝區模式,從保留記憶體中分配跟蹤緩衝區。

  2. 執行相關測試。

  3. 在核心崩潰時,所有 coresight 塊都被停用,必要的元資料由核心崩潰處理程式同步。

    系統最終將重新啟動或啟動 crashdump 核心。

  4. 對於支援 crashdump 核心的平臺,可以使用 coresight sysfs 介面從 crashdump 核心本身轉儲原始跟蹤資料。在這種情況下,不需要持久 RAM。

  5. 對於支援持久 RAM 的平臺,可以在隨後的 Linux 啟動中,使用 coresight sysfs 介面轉儲跟蹤資料。在這種情況下,不需要 crashdump 核心。持久 RAM 確保跟蹤資料在重啟後保持完整。

看門狗復位期間的 Coresight 跟蹤

處理看門狗復位和核心崩潰情況的主要區別如下:

  1. Coresight 元資料的儲存需要由 SCP(系統控制處理器)韌體以指定格式處理,而不是核心。

  2. 韌體為跟蹤緩衝區和元資料提供的保留記憶體區域必須在持久 RAM 中。注意:這是看門狗復位情況的要求,但在核心崩潰情況下是可選的。

看門狗復位只能在滿足上述兩個要求的平臺上支援。

使用 ETR 接收器測試核心崩潰情況的示例命令

  1. 啟動 Linux 核心,並在核心啟動引數中新增“crash_kexec_post_notifiers”。如果使用者想從 crashdump 核心中讀取跟蹤資料,這是強制性的。

  2. 啟用預載入的 ETM 配置

    #echo 1 > /sys/kernel/config/cs-syscfg/configurations/panicstop/enable
    
  3. 使用 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 特定的,因此上述指令碼僅供參考。

  1. 為 ETR 緩衝區選擇保留緩衝區模式

    #echo "resrv" > /sys/bus/coresight/devices/tmc_etr0/buf_mode_preferred
    
  2. 啟用重新整理觸發器停止配置

    #echo 1 > /sys/bus/coresight/devices/tmc_etr0/stop_on_flush
    
  3. 使用 sysfs 介面在核心 1 和 2 上啟動 Coresight 跟蹤

  4. 在核心 1 上執行一些應用程式

    #taskset -c 1 dd if=/dev/urandom of=/dev/null &
    
  5. 在核心 2 上呼叫核心崩潰

    #echo 1 > /proc/sys/kernel/panic
    #taskset -c 2 echo c > /proc/sysrq-trigger
    
  6. 從重啟的核心或 crashdump 核心中讀取崩潰資料

    #dd if=/dev/crash_tmc_etr0 of=/trace/cstrace.bin
    
  7. 執行 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 的方法可用於在核心崩潰重啟後檢索和解碼跟蹤資料。