这是boorloader里面的nandflash的call_linux函数里面的下面是call_linux的代码:
void call_linux(U32 a0, U32 a1, U32 a2)
{
void (*goto_start)(U32, U32);
rINTMSK=BIT_ALLMSK;
cache_clean_invalidate();
tlb_invalidate();
__asm{
// mov r0, a0//%0
// mov r1, a1//%1
// mov r2, a2//%2
mov ip, #0
mcr p15, 0, ip, c13, c0, 0 /* zero PID */
mcr p15, 0, ip, c7, c7, 0 /* invalidate I,D caches */
mcr p15, 0, ip, c7, c10, 4 /* drain write buffer */
mcr p15, 0, ip, c8, c7, 0 /* invalidate I,D TLBs */
mrc p15, 0, ip, c1, c0, 0 /* get control register */
bic ip, ip, #0x0001 /* disable MMU */
mcr p15, 0, ip, c1, c0, 0 /* write control register */
//mov pc, r2
//nop
//nop
/* no outpus */
//: "r" (a0), "r" (a1), "r" (a2)
}
// SetClockDivider(1, 1);
// SetSysFclk(FCLK_200M); //start kernel, use 200M
//SET_IF();
goto_start = (void (*)(U32, U32))a2;
(*goto_start)(a0, a1);
}
我想是不是go_start函数的起始地址是a2,参数是a1,a2;但我完全没见过这种奇怪的写法,完全弄不懂,求解释。 |