上一文介绍了eswd工具的使用,该工具,可以将cpu的执行流,与elf程序对应起来,让我们方便的去debug。
下面,就说一下,怎么实现上述过程。
需要三个文件
◾cpu架构描述文件
◾cpu执行的指令流文件,下文简称tarmac文件
◾eswd配置文件
一、cpu架构的描述
eswd工具,需要cpu架构的描述文件。我们使用自定义架构的方式,传递给eswd工具。
这款自定义架构的处理为xxx(基于ARMv8)。定义xxx_eswd.conf文件。
首先是xxx(架构的名字),随后跟着一个大括号,描述这款架构的信息。
◾disassembly_tool:定义反汇编工具,因为ARMv8支持aarch64和aarch32两种架构,因此这里有2个反汇编工具。
◾pc:定义pc寄存器的名字,后面程序的对应,就根据该名字进行对应
◾reg_alias: 寄存器的别名,ARMv8有X和W寄存器的区别,W寄存器,其实就是X寄存器的低32bit。
ARMv8架构,包括了aarch32的R寄存器,因此在reg_alias中,也需要进行定义。
1、reg_banks
reg_banks,定义寄存器。需要查看的寄存器,需要在这里定义。格式如下图:
这里定义了系统寄存器,向量寄存器,通用寄存器。图中的。。。,是省略的寄存器描述,需要自己填写完整。
对于寄存器描述,需要如下的描述信息
寄存器的名字 "寄存器位宽,寄存器描述"
◾寄存器的名字:该寄存器将来显示在eswd工具上的寄存器的名字,eswd工具,会从cpu仿真log中,查找该寄存器名字,并将值进行关联。
◾寄存器位宽:指定寄存器的位宽
◾寄存器描述:该寄存器的功能
如 CPSR "32,program status register"
表示,有一个系统寄存器CPSR,32bit寄存器,是program status register。
将自己关心的寄存器,给描述出来。不关心的寄存器,可以不用描述。寄存器描述多了,会减慢eswd分析的过程。
有描述的寄存器,在eswd工具的registers子界面,就可以看到寄存器的值。
2、modes
modes,定义cpu允许的模式。其格式如下:
对于ARMv8,使用CPSR,来判断当前cpu的模式。
mode_reg,指定cpu mode,关联的寄存器,后面的0x1f,表示取该寄存器的低5个bit。
mode_enum:对cpu的mode的枚举描述,第一列是cpu的模式,第二列是对应寄存器的值,也就是 CPSR & 0x1f的值。
对于cpu架构,描述这些信息,就已足够了。更多的内容,要查看eswd工具的userguide。
3、dwarf_regs
dwarf_regs段,用来描述cpu的不同mode下,dwarf寄存器与物理寄存器的映射关系。
在xxx架构中,描述如下:
上图是dwarf_regs段描述的一部分,对于modes段,指定的每个cpu模式,都需要进行定义。
4、event
event的定义如下,可以用来追踪一些event。
如果tarmac文件中,有相应的event关键字,那么会在波形文件中,有显示。
如以下,定义了三个event。mode_change是自带的event。
events mode_change,RESET_EVENT,CALL_EXCEPTION
indago工具中,显示如下。
在569465ns,出现过CALL_EXCEPTION这个event。和tarmac文件中一致。
二、cpu执行的指令流
要将cpu的仿真指令流,最终转化成tarmac文件。将来提供给eswd工具使用。
tarmac文件的格式如下图:
1、pc change
对于pc change,格式如下图:
2、寄存器访问
对于寄存器,格式如下图:
有了寄存器的信息,indago界面,才可以显示出寄存器的值。
3、memory访问
对于memory访问,格式要复杂一些:
有了memory的信息,我们就可以在indago界面中,看到c代码的各个变量的值。
4、event
对event,格式如下图:
5、自己实现
只有tarmac的格式,符合上面定义的格式,eswd工具,才能够将tarmac的结果,与elf程序给对应起来。
打印的tarmac的格式如下图所示:
第一列,表示仿真时间,第二列是时间单位。
如果是指令的信息,PC表示指令的PC,后续跟指令码。最后跟反汇编。反汇编信息这一列,可以不要。
如果是指令的执行结果,REG表示寄存器,后续跟寄存器的值。这里的寄存器,要和cpu架构描述文件中的寄存器描述的名字要一致。
如果是EVENT,EVENT表示事件,后面跟时间的名字,名字要和cpu架构描述文件中,event指定的事件一致。
对于CPSR,在17905ns,值是0x600003cd,和0x1f与,结果是0x0000000d。从cpu架构描述文件中,可以知道,当前cpu处于EL3H模式。
时间,最好和波形中的时间一致,这样当发现问题后,可以很快的定位到波形的位置。
cpu仿真打印的log,可能和eswd要求的log格式不一致,因此需要脚本进行处理,将cpu仿真打印的log,和eswd要求的log格式一致。
三、eswd配置文件
在提供了cpu架构描述文件,cpu执行指令流log(以下简称tarmac文件)后,还需要配置文件。
配置文件,以config关键字开始,配置的描述,都在config包围的大括号中。
tarmacfile_optional 1:如果该core的tarmac文件不存在,那么忽略该core的分析。xxx是一个8core的cpu,在某些情况下,可能只有某几个cpu在跑。
1、archs段
描述架构信息,格式如下图:
我实现的如下图:
archs段,描述cpu的架构信息。corecfgfile,指定cpu架构描述文件,initmode指定cpu在初始时刻,的cpu模式。archs段中,可以描述多个cpu的架构信息。
2、processors段
processors段,指定处理器的配置信息。processor中,可以嵌套多个processors。
对于嵌套的每一个processors,name表示该processors的名字,cores,表示该processors中包含的core。
对于每个core:
◾name表示该core的名字
◾coretype,指定archs段中的cpu架构
◾tarmactype:PROCTARMAC,表示使用tarmac文件的方式进行追踪,还有一种是使用shm波形文件方式。
◾tarmacfile:cpu执行的指令流log文件
◾imagefile:core上执行的elf文件
◾events:指定event,eswd工具,支持在不同的时刻,载入不同的elf程序。如果有这样的需求,就在events中指定。
上面的描述,在eswd的cores界面如下:
如果processors描述如下:
那么eswd工具上,cores的子界面如下图所示:
通过该配置文件,就告诉了eswd工具,追踪的cpu架构,cpu架构文件,tarmac文件,elf文件。
四、仿真
完成上述工作后,就是用使用irun工具,搭配-esw选项,产生eswd database,之后使用eswd工具分析。
irun -log logfile -64bit -esw arch_config:./xxx_eswd.conf -esw config:./config_proctarmac_aarch64.in
◾-esw arch_config: 指定cpu架构描述文件
◾-esw config: 指定eswd配置文件
仿真完毕后,会生成ida.db,esw.db,eswtarmac.shm这3个文件夹。这些就是eswd database。
指定indago -64bit命令,就会启动indago工具。
3、总结
要使用cadence公司提供的eswd工具,需要进行一些配置。配置比较花时间与精力,但是花费的时间与精力是值得的。因为通过这个工具,我们能够看到软件,在cpu上的执行流程以及执行结果,从而方便我们去debug。
eswd还有其他的一些更高级的功能,这部分,我就不介绍了,大家可以看到eswd的userguide。
到这里,cadence indago征程,就结束了,主要是介绍了indago系列的2个工具,debug app与eswd。至于另外一个协议分析,我没有用过,因此就不再介绍。
更多相关阅读
cadence indago征程(三)indago工具的使用
cadence indago征程(四)仿真加速indago database
cadence indago征程(五)最强cpu debug工具-eswd