龙芯的 TAP 寄存器
由于没有官方文档,此处是根据对 la-dbg-tool-usb-20240116
的逆向工程进行科学冒怼得到的。经与 ejtag_debug_usb-20240116-amd64
的逆向工程交叉验证,MIPS 时代的龙芯 CPU 大体上遵守了标准定义的 IR,而 LoongArch 时代的 CPU 或许是保险起见为了切割与 MIPS 的知识产权联系,选择了不遵守这些标准(然而,这些寄存器的使用方法、CPU 核调试的逻辑、CONTROL 寄存器的定义都大体保留了 MIPS 设计或者只作了必要改动,这些内容将在后续章节中提及)。所以,表中提及的“与标准定义不同”的 IR,可以认为是只有 LoongArch 架构的龙芯 CPU 特有的,而标准定义的 IR 仍然适用于 MIPS 时代的龙芯 CPU。
对这些工具的逆向工程使用了 IDA Free 9.0 及云端反编译器,感谢 Hex-Rays 公司对个人用户的支持。
由官方 EJTAG 调试探头固件中 IR 长度全局变量的默认值来看,龙芯 LoongArch CPU 的 IR 长度为 4 位。但 MIPS 时代由于 EJTAG 标准规定的寄存器比较多,龙芯 MIPS CPU 的 IR 长度很可能是 5 位。
此章节并未经过完整实验验证。未列出的 IR 亦不代表龙芯并未实现这个寄存器。
IR | 指令 | 注解 |
---|---|---|
0x0 | BYPASS | IR 与标准定义(IR 所有位全为 1)不同。 但需要指出的是,IEEE 1149.1 标准规定标准 JTAG 必须使用“IR全为1”表示 BYPASS 指令。此处龙芯显然违反了最基础的标准。 |
0x1 | IDCODE | 较老的龙芯 CPU 上读出值是 0x20010819,是龙芯跑通自己家第一颗芯片的日期;较新的龙芯 CPU 上读出值是 0x5a5a5a5a,除了是个花码之外没有什么特殊含义。 |
0x3 | ADDRESS | IR 与标准定义(0x8)不同。 |
0x4 | DATA | IR 与标准定义(0x9)不同。 |
0x5 | CONTROL | IR 与标准定义(0xA)不同。 |
0x6 | PCSAMPLE | IR 与标准定义(0x14)不同。 注:在 la-dbg-tool-usb 中似乎没发现对这个寄存器的任何其他使用。 |
0x7 | ALL | IR 与标准定义(0xB)不同。 |
0x8 | FASTDATA | IR 与标准定义(0xE)不同。 |
MIPS EJTAG 对这些 IR 的定义见标准 92 页。
LoongArch CPU 的 TAP 对这些指令使能时 TDI、TDO 所连接的寄存器的接法与 MIPS 的相同。