void  call_linux(long a0, long a1, long a2)
{
 	local_irq_disable();
	cache_clean_invalidate();
	tlb_invalidate();

__asm__(
	"mov	r0, %0\n"
	"mov	r1, %1\n"
	"mov	r2, %2\n"
	"mov	ip, #0\n"
	"mcr	p15, 0, ip, c13, c0, 0\n"	/* zero PID */
	"mcr	p15, 0, ip, c7, c7, 0\n"	/* invalidate I,D caches */
	"mcr	p15, 0, ip, c7, c10, 4\n"	/* drain write buffer */
	"mcr	p15, 0, ip, c8, c7, 0\n"	/* invalidate I,D TLBs */
	"mrc	p15, 0, ip, c1, c0, 0\n"	/* get control register */
	"bic	ip, ip, #0x0001\n"		/* disable MMU */
	"mcr	p15, 0, ip, c1, c0, 0\n"	/* write control register */
	"mov	pc, r2\n"
	"nop\n"
	"nop\n"
	: /* no outpus */
	: "r" (a0), "r" (a1), "r" (a2)
	: "r0","r1","r2","ip"
	);
}
Пример #2
0
/*
 * clean and invalidate I & D cache ,mmu table, and then boot linux zImage
 * a0	must be zero
 * a1	machine type
 * a2   linux zImage addr
 */
void  call_linux(ulong a0, ulong a1, ulong a2)
{
	ulong ip;
	boot_linux_t boot_linux = (boot_linux_t)a2;

 	local_irq_disable();
	cache_clean_invalidate();
	tlb_invalidate();

	__asm
	{
		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 	*/
	}

	boot_linux(a0, a1, a2);
}