weiqi7777

cadence indago征程(六) eswd工具配置与仿真

0
阅读(3079)

上一文介绍了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。至于另外一个协议分析,我没有用过,因此就不再介绍。