MMU Problem bringing up kernel with PPC 603 chip

VanBaren, Gerald (AGRE) Gerald.VanBaren at
Sat Feb 28 04:19:59 EST 2004

You are turning off the MMU when you execute the RFI.  This is a very delicate operation: any screw up here causes the machine to crash mysteriously.  Oh, wait, you know that already ;-).

Questions: Why is your MMU on when you call this routine?  Who turned it on?  Why?  What is the MMU mapping to/from?

Several suspect areas:
* You have cache enabled and are using the MMU to mark areas as cache-inhibited (necessary for all I/O type stuff).  When you disable the MMU, _everything_ becames cached by fiat, causing all I/O to become cached.  At this point, the CPU state is indistingishable from crashed because it is being held hostage by the cache (nothing comes in, nothing goes out).  Solution: disable the cache before disabling the MMU.

* Your MMU is not mapping memory 1:1 so turning it off makes your memory disappear out from under your CPU.  Crash.  Solution: you need to return (RFI) to an area of memory that will exist when the MMU is disabled.


> -----Original Message-----
> From: owner-linuxppc-embedded at
> [mailto:owner-linuxppc-embedded at]On Behalf
> Of Bob Beck
> Sent: Thursday, February 26, 2004 4:23 PM
> To: linuxppc-embedded at
> Subject: MMU Problem bringing up kernel with PPC 603 chip
> All,
> I'm bringing up my 1st kernel on a proprietary board
> using a PPC 603E chip.
> The kernel is configured using the 6xx/7xx ppc selection.
> The kernel starts executing at __start in head.S and
> branches to early_init(). I have stubbed out the call
> to prom_init() since this is an embedded system and
> not a power mac (as the comments at the top of the
> prom.c file indicate).
> The code returns to head.S and branches to mmu_off.
> Here is the code for mmu_off.
> mmu_off:
> 	addi	r4, r3, __after_mmu_off - _start
> 	mfmsr	r3
> 	andi.	r0,r3,MSR_DR|MSR_IR		/* MMU enabled? */
> 	beqlr
> 	andc	r3,r3,r0
> 	mtspr	SRR0,r4
> 	mtspr	SRR1,r3
> 	sync
> 	RFI
> This executes all the way to the "RFI" instruction,
> but never comes back to the place in the code that
> called mmu_off.
> Why is the "return from interrupt" going out into
> space ? Any suggestions ?
> Best Regards,
> Bob Beck
> beck at

** Sent via the linuxppc-embedded mail list. See

More information about the Linuxppc-embedded mailing list