Мне интересно работать непосредственно с содержимым BTB (целевого буфера ветки) и GHB на Cortex A8. В руководстве 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-битной историей направления последних десяти ответвлений и 4 битами PC.
Может ли кто-нибудь помочь объяснить это немного подробнее и/или предоставить допустимый формат для фактических индексов, которые можно использовать для чтения/записи? Я собираюсь попробовать это на реальном оборудовании в ближайшее время, и, предположительно, я должен получить только 00, 01, 10 или 11 из регистра I-L1 Data 0, независимо от того, какой индекс я загружаю в 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
Спасибо!