一、编写目的
处于加深记忆,后期方便回忆。以z4核为例,z7内核类似。
二、流程
1、关闭看门狗
看门狗默认是开启的,初始化第一步先关闭看门狗,代码如下。
e_lis r4, 0xFC05 /*读取看门狗对应地址到r4寄存器*/
e_or2i r4, 0x8000
e_li r3, 0xC520 /*开关看门狗需要偏移0x10地址写入特性序列0xC520 0xD928*/
e_stw r3, 0x10(r4)
e_li r3, 0xD928
e_stw r3, 0x10(r4)
e_lis r3, 0xFF00 /*在偏移0地址写入0xFF00010A,至于最后为啥是0A,没看懂*/
e_or2i r3, 0x010A
e_stw r3, 0(r4)
2、清空分支预测中其他的有效值,并使能分支预测功能
e_li r3, 0x201
mtspr 1013, r3 /*写入BUCSR*/
se_isync
3、初始化内核通用寄存器
e_li r0, 0
e_li r1, 0
e_li r2, 0
e_li r3, 0
e_li r4, 0
e_li r5, 0
e_li r6, 0
e_li r7, 0
e_li r8, 0
e_li r9, 0
e_li r10, 0
e_li r11, 0
e_li r12, 0
e_li r13, 0
e_li r14, 0
e_li r15, 0
e_li r16, 0
e_li r17, 0
e_li r18, 0
e_li r19, 0
e_li r20, 0
e_li r21, 0
e_li r22, 0
e_li r23, 0
e_li r24, 0
e_li r25, 0
e_li r26, 0
e_li r27, 0
e_li r28, 0
e_li r29, 0
e_li r30, 0
e_li r31, 0
4、初始化其他的内核寄存器
mtspr 1, r1 ;#XER
mtcrf 0xFF, r1
mtspr CTR, r1
mtspr 272, r1 ;#SPRG0
mtspr 273, r1 ;#SPRG1
mtspr 274, r1 ;#SPRG2
mtspr 275, r1 ;#SPRG3
mtspr 58, r1 ;#CSRR0
mtspr 59, r1 ;#CSRR1
mtspr 570, r1 ;#MCSRR0
mtspr 571, r1 ;#MCSRR1
mtspr 61, r1 ;#DEAR
mtspr 63, r1 ;#IVPR
mtspr 256, r1 ;#USPRG0
mtspr 62, r1 ;#ESR
mtspr 8,r31 ;#LR
5、根据PID的值决定是否跳转到初始化local ram(5777m有3个有效核,z4的id编码是2,即只有在z4中会初始化ram,z7直接跳过ram后初始化localram)。把循环的周期放入ctr寄存器,然后地址放在r5中。前面给通用寄存器r0~r31写的0,这里给ram初始化也是0.
;# Store number of 128Byte (32GPRs) segments in Counter
mfspr r9, 286 ;# Save coreid to r9
e_cmp16i r9, 0
e_beq initialise_local_data_SRAM
e_cmp16i r9, 1
e_beq initialise_local_data_SRAM
e_lis r5, __SRAM_SIZE@h # Initialize r5 to size of SRAM (Bytes)
e_or2i r5, __SRAM_SIZE@l
e_srwi r5, r5, 0x7 # Divide SRAM size by 128
mtctr r5 # Move to counter for use with "bdnz"
;# Base Address of the internal SRAM
e_lis