TF-A - How to debug
目录
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.
您无法将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()条目。
<securetransclude src="ProtectedTemplate:PublicationRequestId" params="9776 | 2018-11-22 | PhilipeS"></securetransclude>