TF-A - How to debug

来自百问网嵌入式Linux wiki

Article Purpose

本文介绍了如何调试TF-A固件。
调试专门链接到TrustZone环境。 调试TF-A的主要方法有两种,一种是使用代码内部的跟踪,另一种是使用JTAG来访问安全环境。 这里的重点是集成在OpenSTLinux中的解决方案:通过gdb调试(基于ST-Link或JTAG)。

Debugging

TF-A Version number

调试的起点是确定目标中使用的TF-A版本。 调试和发行版本以以下格式显示在控制台上:

NOTICE: BL2: v2.0(debug):<tag>
  • v2.0是使用的TF-A版本。
  • (debug) :启用构建模式。
  • <tag> : 在构建时由git describe命令生成的Git参考。

Debug with traces

TF-A允许启用RELEASE和DEBUG模式:

  • RELEASE模式在默认LOG_LEVEL为 20 的情况下构建,仅打印ERROR和NOTICE的跟踪
  • DEBUG模式启用 -g 构建标志(用于调试构建对象),并将LOG_LEVEL缺省为 40

使用DEBUG LOG_LEVEL,您可以添加控制台跟踪,如错误、通知、警告或信息。 请参阅include/common/debug.h.

Warning.png 您无法将LOG_LEVEL设置为50(最高级别)来构建代码; 跟踪太多,并且TF-A不适合SYSRAM。如果需要,将某些VERBOSE设置更改为INFO。

对于这两种模式,必须确保正确配置了UART:

  • BL2: 默认情况下启用UART跟踪
  • BL32: 默认情况下启用UART跟踪

在stdout-path属性的设备树的所选节点中定义的控制台上可以找到跟踪和错误:

chosen {
        stdout-path = "serial0:115200n8";
};

Debug with GDB

TF-A在SYSRAM中运行,并在CPU安全状态下执行。根据板卡的不同,可以使用ST-Link或JTAG输出通过JTAG调试TF-A。

Debug boot sequence

BL2引导阶段仅在引导序列期间执行。要闯入BL2,请连接到目标并闯入。

将符号加载到正确的偏移量:

(gdb) add-symbol-file <path_to_build_folder>/tf-a-bl2.elf (or bl2.elf) <load_address>

可以在生成的 tf-a-stm32mp157c-<board>.map 文件中找到BL2和BL32加载地址:

...
 *fill*         0x000000002ffce000     0x5000 
                0x000000002ffd3000                __BL2_IMAGE_START__ = .  -> BL2 Load address
 *(.bl2_image*)
 .bl2_image     0x000000002ffd3000    0x1166c build/stm32mp1/stm32mp1.o
                0x000000002ffe466c                __BL2_IMAGE_END__ = .
                0x0000000000024b00                . = 0x24b00
 *fill*         0x000000002ffe466c     0x2994 
                0x000000002ffe7000                __BL32_IMAGE_START__ = . -> BL32 Load address
 *(.bl32_image*)
 .bl32_image    0x000000002ffe7000    0x1744c build/stm32mp1/stm32mp1.o
                0x000000002fffe44c                __BL32_IMAGE_END__ = .
                0x000000002fffe44c                __DATA_END__ = .
                0x000000002fffe44c                __TF_END__ = .
...

在此示例中:

  • BL2 加载地址为 0x2ffd3000
  • BL32 加载地址为 0x2ffe7000

您可以直接加载所有符号:

(gdb) add-symbol-file <path_to_build_folder>/tf-a-bl2.elf 0x2ffd3000
(gdb) add-symbol-file <path_to_build_folder>/tf-a-bl32.elf 0x2ffe7000

设置您的硬件断点并重置:

(gdb) hb bl2_early_platform_setup
(gdb) monitor reset halt

Debugging during runtime execution

一旦运行U-Boot 或Linux内核,就无法访​​问安全内存或区域,但可以中断,并在SMC处理程序中设置硬件断点(在BL32中)。一旦GDB 进入安全区域并到达中断指令,它就会中断。一旦在安全监视器中暂停,GDB 可以访问安全资源,如IP或内存。 例如,可以闯入内核:

(gdb) hb stm32mp1_svc_smc_handler
(gdb) continue

在第一次进行SMC调用时,GDB中断了BL32中的stm32mp1_svc_smc_handler()条目。