> How is a virtual address 
> calculated for a high address like 0x4F600000?

Add this to the MMU initialzation code (initial_mmu):

/* map leds - 1:1 phys=virt */
        lis     r3,0x4F600000 at h
        ori     r3,r3,0x4F600000 at l
        mr      r4,r3
        clrrwi  r4,r4,12
        ori     r4,r4,(TLB_WR|TLB_I|TLB_M|TLB_G)

        clrrwi  r3,r3,12
        ori     r3,r3,(TLB_VALID | TLB_PAGESZ(PAGESZ_4K))

        li      r0,0                    /* TLB slot 0 */
        tlbwe   r4,r0,TLB_DATA
        tlbwe   r3,r0,TLB_TAG

Then you have a one to one mapping between physical and virtual memory, 
and you can access the LEDs at the same address after turning one the
MMU.

BTW, we had a similar problem, but the reason was not turning on the
MMU. The MMU is enabled by writing MSR_KERNEL the status register. This
also enables the machine state exception interrupt. 

Our hardware design produced PLB bus exceptions, which was unnoticed on
standalone applications. But this bus exceptions also trigger machine
state exceptions. So instead of jumping to start_here the processor
branched to 0x200 - unfortunatly the trap table is not set up at this
point in the boot process...

Alex 


Reply via email to