宅男
分类: Android平台
2015-11-18 16:40:58
这是在上文中提到的基本的ARM coresight结构图,但是真实的情况比这个要稍微复杂一些。比如可能涉及到多级的funnel连接。而且由于funnel的端口size(16bit,32bit,64bit甚至128bit)。所以需要一些upsizer或者downsizer来连接不同size的端口。比如连接一个128bit的STM输出到64bit的funnel端口上。就需要在两者之间连接一个128bit到64bit的down sizer.
而且关于coresight的source类型这里只提到了STM和ETM。其实还有很多Qualcomm自主开发的一些模块,以后有机会会涉及。
本文只涉及到关于ETM(embedded trace macro),从这个名字上看不出任何的端倪。这里的embedded中文是“嵌入“的意思。那么嵌入在哪里?答案是嵌入在CPU内部。
ARM的官方文档有这样一段很简短的介绍。
An Embedded Trace Macrocell (ETM) is a real-time trace module providing instruction and data tracing of a processor.
由此可见ETM是一个嵌入在CPU内部用来追踪CPU的指令操作和数据操作的一个模块。
突然感觉很高大上!
现在的ETM文件分为两个版本,一个是关于ETM1.0 到ETM3.5,是对于ARMV7及之前的32位架构的支持。另外一本是随ARMV8架构推出的ETMV4.0,其中最主要的修改就是对于64bit的支持。
本文将集中在ETMV3.5上。ETM的设置将集中在两部分:trigger和filtering.
Trigger是将什么时候去记录这些所谓的指令和数据操作。另外一个是如何在限制追踪的范围,因为CPU只要在运行就会一直在执行指令。不管是userspace的还是kernel空间的。
但是有时候我只对其中的一部分代码感兴趣。那么就可以设置ETM,让其只追踪这部分我感兴趣的代码。
从ETM文档上,可以看到ETM 的event resource很多。但是最主要的是Address comparators.
和Data value comparators。
Address comparators.
关于这些地址比较器,它一共都是偶数个。比如2个,4个或者6个。其原因在于这些comparator可以两两组成一个地址范围,比如[address0, address1]。这就是所谓的address range comparator.其表征的地址范围为(address >= range start address) AND (address < range end address)
Data value comparators
用于表示在发生数据操作(load,store等等)时的操作数。A data value comparator monitors the data bus only when a load or store operation occurs.数据比较器没有range的概念。但是每一个value 比较器都有一个跟它对应的mask的寄存器。所以它可以用来表示一些匹配值。具体为。
除此之外,还有一些别的ETM resource,比如用来追踪用户态进程的context ID comparator等等。
在QC内部的kernel opensource代码中,ETM3.5对应的driver文件是driver/coresight/coresight-etm.c
2043 if (drvdata->nr_addr_cmp >= 2) {
2044 drvdata->addr_val[0] = (uint32_t) _stext;
2045 drvdata->addr_val[1] = (uint32_t) _etext;
2046 drvdata->addr_type[0] = ETM_ADDR_TYPE_RANGE;
2047 drvdata->addr_type[1] = ETM_ADDR_TYPE_RANGE;
2048 if (etm_version_gte(drvdata->arch, ETM_ARCH_V1_0)) {
2049 drvdata->addr_acctype[0] = 0x19;
2050 drvdata->addr_acctype[1] = 0x19;
2051 }
2052 }
在driver中,默认将ETM设置用来追踪kernel 的代码段(range为_stext 到_etext,kernel的代码段)。类型为只追踪ARM指令执行。(0x19)
追踪生成的数据需要用trace32 simulator来解析。