系统初始化
系统初始化对不同的CPU,基本步骤是类似的.
系统初始化的主要步骤如下
启动 关闭中断 放boot type到堆栈 清空缓存 VxWorks 系统的 PowerPC BSP,系统开机后执行的第一个函数 romInit(),在ROM的起点,这 里是使用的PowerPC汇编语言
/* 定义内部函数 internals */ .globl romInit /* start of system code */ .globl _romInit /* start of system code */
/* 定义外部函数 externals */ .extern romStart /* system initialization routine */
.text .align 2
/******************************************************************************* * * romInit ( int startType /@ only used by 2nd entry point @/ ) */
romInit: _romInit: bl cold /* 冷启动 */ bl warm /* 热启动 */
cold: li p5, BOOT_COLD bl start /* skip over next instruction */
warm: or p5, p0, p0 /* startType to p5 */
start: /* 此处是系统启动开始 */
/* 屏蔽MSR中CE,EE位,关闭所有的外部中断 /* * Disable external interrupts */
mfmsr p0 /* p0 = msr */ INT_MASK (p0, p1) /* mask EE and CE bit */ ori p1,p1,_PPC_MSR_ME /* enable machine checks */ mtmsr p1 /* msr = p1 */ isync
/* 下面两步是按照硬件定义初始化一些SPR,DCR寄存器,置0或置1
/* SPR是特殊功能寄存器,DCR为设备控制寄存器,还有MSR机器状态寄存器,这些是PowerPC内核中很重要的寄存器
/* 初始化SPR,DCR寄存器置0 * Initalize registers that need to be set to zero. */
addi r4,r0,0x0000 mtspr SGR,r4 /* 解锁所有存储区域 SPR 中 SGR 位置0 */ mtspr ESR, r4 /* SPR中的错误状态位 ESR 清0 */ mtspr TCR, r4 /* 关闭所有的 timers */ mtspr PIT, r4 /* 清0 PIT timer */ mtdcr UICER, r4 /* 关闭中断控制器(UIC)中的所有中断 */ mtspr XER, r4 /* 清0 integer exception 寄存器 */
/* 初始化另一些SPR,DCR寄存器置1 * Initalize registers that need to be cleared with 0xFFFFFFFF. */
addis r4,r0,0xffff ori r4,r4,0xffff mtspr TSR, r4 /* timer */ mtspr DBSR, r4 /* 调试状态位置1 */ mtdcr UICSR, r4 /* 清除中断控制器(UIC)中的所有 pending 中断 */ mtdcr dmasr, r4 /* DMA状态寄存器置1 */
/* PowerPC405用两个缓存,一个是16K指令缓存(ICU),一个是6K数据缓存(DCU),下面是清空着两个缓存,并根据硬件设置缓存 */
/* 清空指令缓存 */ /*BESR type regs ZZZZZZZZZZZZ * Invalidate the entire instruction cache. This can be done * with a single iccci instruction in the processor core. */
iccci r0, r0
/*清空数据缓存 * Invalidate the entire data cache. * The 405 processor core in the 405GP has 128 congruence classes. * Each cache line in the 405 processor is 32 bytes. */
/* * Turn the instruction cache on for faster boot-up. * Also, the icache is needed to help initialize Bank 0 * of the EBC to speed up accesses to flash. * address space 0x00000000-0x07ffffff is cached * address space 0xf8000000-0xffffffff is cached */
lis p0, HIADJ(_PPC403_ICCR_DEFAULT_VAL) addi p0, p0, LO(_PPC403_ICCR_DEFAULT_VAL) mtspr _PPC403_ICCR, p0 isync |