Execution stops while enabling MMU

Neil Bradley nb at synthcom.com
Fri Jun 1 20:57:03 UTC 2007


> I try to use FreeBSD with an AT91RM9200-based board similar to KB920X. I
> use an existing boot loader (U-Boot running at 0x00000000) to copy the raw
> binary kernel (not ELF) to the beginning of the SDRAM (0x20000000) and
> execute it with the "go" command. But suddenly the execution stops while
> enabling the MMU in src/sys/arm/arm/locore.S:
>
>  /* Enable MMU */
>  mrc     p15, 0, r0, c1, c0, 0
>  orr     r0, r0, #CPU_CONTROL_MMU_ENABLE
>  mcr     p15, 0, r0, c1, c0, 0

I'm a bit new to these parts, but I have done some MMU work with the 
XScale ARM (and other ARM CPUs), and enabling the MMU is a bit more 
complicated, especially dealing with ensuring the instruction pipelines 
aren't doing anything afterward when the MMU gets enabled. I didn't see 
the code that comes after this sequence, but here is my sequence for 
enabling the MMU, in hopes it will do some good. This assumes that 
virtual == physical for the sake of the code execution:

         mov     r1, #1
         mcr     p15, 0, r0, c8, c7, 0   ; Flush I+D TLBs
         mcr     p15, 0, r1, c7, c10, 4  ; Drain write and fill buffers

 	ldr	r2,=VirtualExecutionStart
 	mrc	p15, 0, r0, c1, c0, 0
 	orr	r0, r0, #0x1000		; Enable instruction cache
 	orr	r0, r0, #0x0800		; Enable branch target buffer
 	orr	r0, r0, #0x0004		; Enable data cache
 	orr	r0, r0, #0x0001		; Enable MMU
 	mcr	p15, 0, r0, c1, c0, 0
 	mov	pc, r2
 	nop
 	nop
 	nop

VirtualExecutionStart
 	....

As an aside, you might want to also enable the I and D cache (0x1004) 
along with the MMU enable, in addition to the branch target buffer 
(0x0800), as I have done above.

The code sequence above has been validated on the Intel PXA270, Intel 
IXP4xx series, Atmel SAM9 ARM9 CPUs, and the Freescale MX31. Hope this 
helps!

-->Neil

----------------------------------------------------------------------------
C. Neil Bradley - KE7IXP - The one eyed man in the land of the blind is not
                            king. He's a prisoner.


More information about the freebsd-arm mailing list