Chinaunix首页 | 论坛 | 博客
  • 博客访问: 748679
  • 博文数量: 79
  • 博客积分: 2671
  • 博客等级: 少校
  • 技术积分: 1247
  • 用 户 组: 普通用户
  • 注册时间: 2010-04-02 15:26
个人简介

宅男

文章分类

全部博文(79)

文章存档

2017年(11)

2016年(12)

2015年(6)

2012年(10)

2011年(33)

2010年(7)

分类: Android平台

2015-11-18 16:40:58


这是在上文中提到的基本的ARM coresight结构图,但是真实的情况比这个要稍微复杂一些。比如可能涉及到多级的funnel连接。而且由于funnel的端口size16bit,32bit,64bit甚至128bit)。所以需要一些upsizer或者downsizer来连接不同size的端口。比如连接一个128bitSTM输出到64bitfunnel端口上。就需要在两者之间连接一个128bit64bitdown sizer.

而且关于coresightsource类型这里只提到了STMETM。其实还有很多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的设置将集中在两部分:triggerfiltering.

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 _etextkernel的代码段)。类型为只追踪ARM指令执行。(0x19)


追踪生成的数据需要用trace32 simulator来解析。


当然ETM的调试能力并不仅仅限于此,有很多的自定义调试能力。更多的需要集合实际的需要来使用
这些自定义的调试能力。






阅读(6942) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~