引言
对DRAM clock的调整可能会影响对DRAM的读写,所以安全的方法是将指令预读。
代码如下
; First get cache info。CP15 c0中记录着该处理器的cache信息
mrc p15, 0, r0, c0, c0, 1
; Get I cache line size as (1 << (b[1..0] + 3)),
;32位的低两位表示cache line size,但是要经过前面的运算,可以为8,16,32,64字节
and r3, r0, #3
add r3, r3, #3
mov r2, #1
mov r2, r2, lsl r3
sub r3, r2, #1
;运算后:
;r2=cache line size r3=r2-1
; Now get first and last instruction addresses。这两个地址见代码后半部。可以理解为:
;r0= IC2START r1= IC2END
add r0, pc, #(IC2START - . + 8)
add r1, pc, #(IC2END - . + 8)
; Make sure that address is cache line aligned。调整R0,使它对齐到cache line
add r0, r0, r3
bic r0, r0, r3
; Avoid doing too much
sub r1, r1, #4
; Prefetch instructions。循环预取r0所指示地址的指令
60 mcr p15, 0, r0, c7, c13, 1
add r0, r0, r2
cmp r0, r1
bls %B60
。。。
IC2START
;这里的nop用来适应前面IC2START的cache line 对齐,所以填充nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
;具体的DRAM clock调整
。。。
IC2END