我有兴趣直接修改BTB(分支目标缓冲区)和Cortex A8上的GHB的内容。 ARM手册说的是:
在指令侧GHB数组中写入一个条目,例如:
LDR R0, =0x3333AAAA;
MCR p15, 0, R0, c15, c1, 0; Move R0 to I-L1 Data 0 Register
LDR R1, =0x0000020C;
MCR p15, 0, R1, c15, c5, 2; Write I-L1 Data 0 Register to GHB
要读取指令侧GHB数组中的一个条目,例如:
LDR R1, =0x0000020C;
MCR p15, 0, R1, c15, c7, 2; Read GHB into I-L1 Data 0 Register
MRC p15, 0, R0, c15, c1, 0; Move I-L1 Data 0 Register to R0
我只对数据的格式感兴趣。据推测,GHB的内容是2位,对吧?因此,重点是为4096个值中的特定值提供一些索引,将该索引加载到寄存器中,然后将您要查找的值读入寄存器(在示例中为r0)。
但我不清楚这种格式是什么。我从其他来源读到:
GHB由所遇到的最后十个分支的方向的10位历史和PC的4位索引。
任何人都可以帮助解释一下这个问题和/或为实际索引提供有效的格式来读/写吗?我将很快在实际的硬件上尝试这个,并且假设我只能从I-L1数据0寄存器获得00,01,10或11,无论我将哪个索引加载到r1中(如上例所示) ),但任何更多的解释表示赞赏。
(如果你想获得有关如何索引BTB的相同信息,那也会很棒!下面的说明如下)
在指令侧BTB阵列中写入一个条目,例如:
LDR R0, =0x01234567;
MCR p15, 0, R0, c15, c1, 0; Move R0 to I-L1 Data 0 Register
LDR R2, =0x0DDFFFFF;
MCR p15, 0, R2, c15, c1, 1; Move R0 to I-L1 Data 1 Register
LDR R1, =0x40000408;
MCR p15, 0, R1, c15, c5, 3; Write I-L1 Data 0 or 1 Register to BTB
读取指令侧BTB阵列中的一个条目,例如:
LDR R1, =0x40000408;
MCR p15, 0, R1, c15, c7, 3; Read BTB into I-L1 Data 0 or 1 Register
MRC p15, 0, R0, c15, c1, 0; Move I-L1 Data 0 Register to R0
MRC p15, 0, R2, c15, c1, 1; Move I-L1 Data 1 Register to R2
谢谢!