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.

gvb


> -----Original Message-----
> From: owner-linuxppc-embedded at lists.linuxppc.org
> [mailto:owner-linuxppc-embedded at lists.linuxppc.org]On Behalf
> Of Bob Beck
> Sent: Thursday, February 26, 2004 4:23 PM
> To: linuxppc-embedded at lists.linuxppc.org
> 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 assurtech.com
>
>


** Sent via the linuxppc-embedded mail list. See http://lists.linuxppc.org/



Reply via email to