其中,STACK_SAVE是为RomStart()函数准备的最大堆栈大小。对于8260来说,其堆栈增长方向是向下的,在本单板调试过程中采用的是ROM驻留型映像启动顺序,因此堆栈的起始地址为STACK_RESIDENT。在经过多次的宏定义后最终被设置为RAM_HIGH_ADRS宏,具体在configAll.h和config.h头文件中实现。至于ROM驻留型映像和非ROM驻留型映像详细介绍有很多这方面的教材或资料,这里不再加以解释。
初始化好堆栈指针,还要计算跳转到C程序中romStart()函数的入口地址:
(romStart – romInit + ROM_TEXT_ADRS),其中ROM_TEXT_ADRS为引导ROM入口地址的宏。建议在该过程中使用的寄存器最好是前面代码段中未使用过的,否则还要在堆栈指针初始化时进行寄存器的入栈保护操作。
整个过程的如下:
lis sp, HIADJ (STACK_ADRS) /* sp used as stack register for PPC */addi sp, sp, LO(STACK_ADRS)
addi sp, sp, -FRAMEBASESZ /* get frame stack */
lis r7, HIADJ(romInit)
addi r7, r7, LO(romInit)
lis r8, HIADJ(ROM_TEXT_ADRS)
addi r8, r8, LO(ROM_TEXT_ADRS)
lis r6, HIADJ(romStart)
addi r6, r6, LO(romStart) /* load R6 with C entry point */
sub r6, r6, r7 /* romStart-romInit+ROM_TEXT_ADRS */
add r6, r6, r8
mtspr LR, r6 /* save destination address into LR register */
blr /* jump to the C entry point */