ARM external debug寄存器的访问
0赞在ARM处理器的内部,实现了若干的external debug(以下简称ED)寄存器,用来实现处理器的external debug功能。
一、ED寄存器访问的条件
对于ED寄存器的访问,是有条件限制的,一般是如下的几个条件。
-
OFF: core状态是power down还是power up
-
DLK: double lock 状态是lock还是unlock
-
OSLK: os lock状态是lock还是unlock
-
SLK: software lock状态是lock还是unlock
1、OFF
OFF表示core是power down状态还是power up状态。如果要对ED寄存器访问,那肯定是需要core是power up状态的。但是,有一些ED寄存器,在core是power down的情况下,也是可以访问的。
2、DLK
对于DLK,DLK只会在core要进入power down时需要用到的,因为core进入power down,是需要一个序列的,而这个序列是不能被打断的,也就是在执行这个序列时,外部的debugger是不能对core有影响的。此时debugger不能访问ED寄存器,core的halting也是禁止的。
由OSDLR_EL1寄存器来控制目前DLK的状态。
在复位之后,这个DLK为0,表示正常情况下,DLK都为0,即double lock是unlock的。只有当core要进入power down时,就需要软件将这一位置1,表示double lock给lock住。此时core完全禁止debugger对ED寄存器的访问,并且core的external debug功能被禁止掉。
3、OSLK
对于OSLK,用来禁止外部的debugger对一些ED寄存器的访问。由OSLSR_EL1寄存器来决定当前的os lock的状态。
该位是cold reset的,warm reset没有影响。
不过OSLSR_EL1是一个只读寄存器,要通过修改OSLAR_EL1寄存器才可以修改OSLK状态。该寄存器是一个只写的寄存器。
OS lock不会影响PE进入到debug state,但是会影响对debug 寄存器的访问。因此在进入debug state前,还是要将os lock给unlock的。
4、SLK
software lock,用来禁止外部的debugger对一些ED寄存器的写操作,并且让寄存器的读取没有side-effect。
由EDLSR寄存器(ED寄存器)来控制
这个是一个只读的寄存器,而修改该寄存器的SLK位,要通过修改EDLAR寄存器(ED寄存器),往这个寄存器写入0xc5acce55,就将software lock给unlock,如果写入其他值,那么就将software lock给lock。
这两个寄存器,都是memory map的方式,即程序通过ldr,str来进行访问。debugger通过DAP去访问。
5、ED寄存器访问权限
以下是ED寄存器的访问权限的列表:
表中的访问权限,如下表所示,比如RO,就表示只读。
EDAD,表示是否允许外部debugger访问ED寄存器。
从上图可以看出,大多数寄存器当OFF,DLK,OSLK下,是不能访问的,因此有Error,这里的Error体现在APB访问时,APB总线上的PSLVERR信号会拉高,表示访问出现error。
而SLK下,会将很多RW的寄存器变为WO或WI。