]> git.sur5r.net Git - u-boot/blobdiff - cpu/mpc85xx/start.S
Merge git://www.denx.de/git/u-boot into merge
[u-boot] / cpu / mpc85xx / start.S
index 040b88deebf1613a2588a597bb420a6ad92e5288..2c98c2ad8a0cbfa0d9e473fec8daa73d2b950c67 100644 (file)
@@ -1,7 +1,6 @@
 /*
- * Copyright 2004 Freescale Semiconductor.
+ * Copyright 2004, 2007 Freescale Semiconductor.
  * Copyright (C) 2003  Motorola,Inc.
- * Xianghua Xiao<X.Xiao@motorola.com>
  *
  * See file CREDITS for list of people who contributed to this
  * project.
@@ -46,7 +45,7 @@
 #endif
 
 #undef MSR_KERNEL
-#define MSR_KERNEL ( MSR_ME  ) /* Machine Check */
+#define MSR_KERNEL ( MSR_ME  /* Machine Check */
 
 /*
  * Set up GOT: Global Offset Table
  *
  */
 
-    .section .bootpg,"ax"
-    .globl _start_e500
+       .section .bootpg,"ax"
+       .globl _start_e500
 
 _start_e500:
-       mfspr   r0, PVR
-       lis     r1, PVR_85xx_REV1@h
-       ori     r1, r1, PVR_85xx_REV1@l
-       cmpw    r0, r1
-       bne     1f
 
-       /* Semi-bogus errata fixup for Rev 1 */
-       li      r0,0x2000
-       mtspr   977,r0
+/* clear registers/arrays not reset by hardware */
 
-       /*
-        * Before invalidating MMU L1/L2, read TLB1 Entry 0 and then
-        * write it back immediately to fixup a Rev 1 bug (Errata CPU4)
-        * for this initial TLB1 entry 0, otherwise the TLB1 entry 0
-        * will be invalidated (incorrectly).
-        */
-       lis     r2,0x1000
-       mtspr   MAS0,r2
-       tlbre
-       tlbwe
-       isync
-
-1:
-       /*
-        * Clear and set up some registers.
-        * Note: Some registers need strict synchronization by
-        * sync/mbar/msync/isync when being "mtspr".
-        * BookE: isync before PID,tlbivax,tlbwe
-        * BookE: isync after MSR,PID; msync_isync after tlbivax & tlbwe
-        * E500:  msync,isync before L1CSR0
-        * E500:  isync after BBEAR,BBTAR,BUCSR,DBCR0,DBCR1,HID0,HID1,
-        *        L1CSR0, L1CSR1, MAS[0,1,2,3,4,6],MMUCSR0, PID[0,1,2],
-        *        SPEFCSR
-        */
-
-       /* invalidate d-cache */
-       mfspr   r0,L1CSR0
-       ori     r0,r0,0x0002
-       msync
-       isync
-       mtspr   L1CSR0,r0
-       isync
-
-       /* disable d-cache */
-       li      r0,0x0
-       mtspr   L1CSR0,r0
-       isync
-
-       /* invalidate i-cache */
-       mfspr   r0,L1CSR1
-       ori     r0,r0,0x0002
-       mtspr   L1CSR1,r0
-       isync
-
-       /* disable i-cache */
-       li      r0,0x0
-       mtspr   L1CSR1,r0
-       isync
-
-       /* clear registers */
-       sync
-       li      r0,0
-       mtspr   SRR0,r0
-       mtspr   SRR1,r0
-       mtspr   CSRR0,r0
-       mtspr   CSRR1,r0
-       mtspr   MCSRR0,r0
-       mtspr   MCSRR1,r0
-
-       mtspr   ESR,r0
-       mtspr   MCSR,r0
-       mtspr   DEAR,r0
-
-       mtspr   DBCR0,r0
-       isync
-       mtspr   DBCR1,r0
-       isync
-       mtspr   DBCR2,r0
-       isync
-       mtspr   IAC1,r0
-       mtspr   IAC2,r0
-       mtspr   DAC1,r0
-       mtspr   DAC2,r0
+       /* L1 */
+       li      r0,2
+       mtspr   L1CSR0,r0       /* invalidate d-cache */
+       mtspr   L1CSR1,r0       /* invalidate i-cache */
 
        mfspr   r1,DBSR
        mtspr   DBSR,r1         /* Clear all valid bits */
 
-       isync
-       mtspr   PID0,r0
-       isync
-       mtspr   PID1,r0
-       isync
-       mtspr   PID2,r0
-       isync
-
-       mtspr   TCR,r0
-
-       mtspr   BUCSR,r0        /* disable branch prediction */
-       isync
-
-       mtspr   HID0,r0
-       isync
-       mtspr   HID1,r0
-       isync
+       /*
+        *      Enable L1 Caches early
+        *
+        */
 
-       mtspr   MAS4,r0
+       lis     r2,L1CSR0_CPE@H /* enable parity */
+       ori     r2,r2,L1CSR0_DCE
+       mtspr   L1CSR0,r2       /* enable L1 Dcache */
        isync
-       mtspr   MAS6,r0
+       mtspr   L1CSR1,r2       /* enable L1 Icache */
        isync
+       msync
 
        /* Setup interrupt vectors */
-       lis     r1,0xfff8
-       mtspr IVPR, r1
+       lis     r1,TEXT_BASE@h
+       mtspr   IVPR,r1
 
-       li      r1,0x0100
+       li      r1,0x0100
        mtspr   IVOR0,r1        /* 0: Critical input */
-       li      r1,0x0200
+       li      r1,0x0200
        mtspr   IVOR1,r1        /* 1: Machine check */
-       li      r1,0x0300
+       li      r1,0x0300
        mtspr   IVOR2,r1        /* 2: Data storage */
-       li      r1,0x0400
+       li      r1,0x0400
        mtspr   IVOR3,r1        /* 3: Instruction storage */
        li      r1,0x0500
        mtspr   IVOR4,r1        /* 4: External interrupt */
@@ -214,29 +127,25 @@ _start_e500:
        mtspr   IVOR6,r1        /* 6: Program check */
        li      r1,0x0800
        mtspr   IVOR7,r1        /* 7: floating point unavailable */
-       li      r1,0x0c00
+       li      r1,0x0900
        mtspr   IVOR8,r1        /* 8: System call */
        /* 9: Auxiliary processor unavailable(unsupported) */
-       li      r1,0x1000
+       li      r1,0x0a00
        mtspr   IVOR10,r1       /* 10: Decrementer */
-       li      r1,0x1400
+       li      r1,0x0b00
+       mtspr   IVOR11,r1       /* 11: Interval timer */
+       li      r1,0x0c00
+       mtspr   IVOR12,r1       /* 12: Watchdog timer */
+       li      r1,0x0d00
        mtspr   IVOR13,r1       /* 13: Data TLB error */
-       li      r1,0x1300
+       li      r1,0x0e00
        mtspr   IVOR14,r1       /* 14: Instruction TLB error */
-       li      r1,0x2000
+       li      r1,0x0f00
        mtspr   IVOR15,r1       /* 15: Debug */
 
-       /*
-        * Invalidate MMU L1/L2
-        *
-        * Note: There is a fixup earlier for Errata CPU4 on
-        * Rev 1 parts that must precede this MMU invalidation.
-        */
-       li      r2, 0x001e
-       mtspr   MMUCSR0, r2
-       isync
 
-       /* After reset, CCSRBAR is located at CFG_CCSRBAR_DEFAULT, i.e.
+       /*
+        * After reset, CCSRBAR is located at CFG_CCSRBAR_DEFAULT, i.e.
         * 0xff700000-0xff800000. We need add a TLB1 entry for this 1MB
         * region before we can access any CCSR registers such as L2
         * registers, Local Access Registers,etc. We will also re-allocate
@@ -246,119 +155,68 @@ _start_e500:
         * (e.g. board/<yourboard>/init.S)
         *
         */
-       bl      tlb1_entry
+       bl      tlb1_entry
        mr      r5,r0
-       li      r1,0x000f       /* max 16 TLB1 entries */
-       mtctr   r1
        lwzu    r4,0(r5)        /* how many TLB1 entries we actually use */
-
-0:     cmpwi   r4,0
-       beq     1f
-       lwzu    r0,4(r5)
-       lwzu    r1,4(r5)
-       lwzu    r2,4(r5)
-       lwzu    r3,4(r5)
-       mtspr   MAS0,r0
-       mtspr   MAS1,r1
-       mtspr   MAS2,r2
-       mtspr   MAS3,r3
+       mtctr   r4
+
+0:     lwzu    r6,4(r5)
+       lwzu    r7,4(r5)
+       lwzu    r8,4(r5)
+       lwzu    r9,4(r5)
+       mtspr   MAS0,r6
+       mtspr   MAS1,r7
+       mtspr   MAS2,r8
+       mtspr   MAS3,r9
        isync
        msync
        tlbwe
        isync
-       addi    r4,r4,-1
        bdnz    0b
 
 1:
 #if (CFG_CCSRBAR_DEFAULT != CFG_CCSRBAR)
        /* Special sequence needed to update CCSRBAR itself */
-       lis     r4, CFG_CCSRBAR_DEFAULT@h
-       ori     r4, r4, CFG_CCSRBAR_DEFAULT@l
+       lis     r4,CFG_CCSRBAR_DEFAULT@h
+       ori     r4,r4,CFG_CCSRBAR_DEFAULT@l
 
-       lis     r5, CFG_CCSRBAR@h
-       ori     r5, r5, CFG_CCSRBAR@l
+       lis     r5,CFG_CCSRBAR@h
+       ori     r5,r5,CFG_CCSRBAR@l
        srwi    r6,r5,12
-       stw     r6, 0(r4)
+       stw     r6,0(r4)
        isync
 
-       lis     r5, 0xffff
+       lis     r5,0xffff
        ori     r5,r5,0xf000
-       lwz     r5, 0(r5)
+       lwz     r5,0(r5)
        isync
 
-       lis     r3, CFG_CCSRBAR@h
-       lwz     r5, CFG_CCSRBAR@l(r3)
+       lis     r3,CFG_CCSRBAR@h
+       lwz     r5,CFG_CCSRBAR@l(r3)
        isync
 #endif
 
-       /*  invalidate all TLB0 entries */
-       li      r3,4
-       li      r4,0
-       tlbivax r4,r3
-       /*
-        * To avoid REV1 Errata CPU6 issues, make sure
-        * the instruction following tlbivax is not a store.
-        */
-
 
        /* set up local access windows, defined at board/<boardname>/init.S */
        lis     r7,CFG_CCSRBAR@h
        ori     r7,r7,CFG_CCSRBAR@l
 
-       bl      law_entry
+       bl      law_entry
        mr      r6,r0
-#if  defined(CONFIG_RAM_AS_FLASH)
-       li      r1,0x0006
-#else
-       li      r1,0x0007       /*we have 8 LAWs, but reseve one for boot-over-rio-or-pci */
-#endif
-       mtctr   r1
        lwzu    r5,0(r6)        /* how many windows we actually use */
+       mtctr   r5
 
-#if defined(CONFIG_RAM_AS_FLASH)
-       li      r2,0x0c48
-       li      r1,0x0c50
-#else
-       li      r2,0x0c28       /* the first pair is reserved for boot-over-rio-or-pci */
-       li      r1,0x0c30
-#endif
+       li      r2,0x0c28       /* the first pair is reserved for */
+       li      r1,0x0c30       /* boot-over-rio-or-pci */
 
-0:     cmpwi   r5,0
-       beq     1f
-       lwzu    r4,4(r6)
+0:     lwzu    r4,4(r6)
        lwzu    r3,4(r6)
        stwx    r4,r7,r2
        stwx    r3,r7,r1
-       addi    r5,r5,-1
        addi    r2,r2,0x0020
        addi    r1,r1,0x0020
        bdnz    0b
 
-       /* Jump out the last 4K page and continue to 'normal' start */
-1:     bl      3f
-       b       _start
-
-3:     li      r0,0
-       mtspr   SRR1,r0         /* Keep things disabled for now */
-       mflr    r1
-       mtspr   SRR0,r1
-       rfi
-
-/*
- * r3 - 1st arg to board_init(): IMMP pointer
- * r4 - 2nd arg to board_init(): boot flag
- */
-       .text
-       .long   0x27051956              /* U-BOOT Magic Number                  */
-       .globl  version_string
-version_string:
-       .ascii U_BOOT_VERSION
-       .ascii " (", __DATE__, " - ", __TIME__, ")"
-       .ascii CONFIG_IDENT_STRING, "\0"
-
-       . = EXC_OFF_SYS_RESET
-       .globl  _start
-_start:
        /* Clear and set up some registers. */
        li      r0,0x0000
        lis     r1,0xffff
@@ -376,69 +234,80 @@ _start:
        isync
 
        /* Enable Time Base and Select Time Base Clock */
-       li      r0,0x4000               /* time base is processor clock */
-       mtspr   HID0,r0
-       isync
-
-#if defined(CONFIG_ADDR_STREAMING)
-       li      r0,0x3000
+       lis     r0,HID0_EMCP@h          /* Enable machine check */
+#if defined(CONFIG_ENABLE_36BIT_PHYS)
+       ori     r0,r0,(HID0_TBEN|HID0_ENMAS7)@l /* Enable Timebase & MAS7 */
 #else
-       li      r0,0x1000
+       ori     r0,r0,HID0_TBEN@l       /* enable Timebase */
 #endif
+       mtspr   HID0,r0
+
+       li      r0,(HID1_ASTME|HID1_ABE)@l      /* Addr streaming & broadcast */
        mtspr   HID1,r0
-       isync
 
        /* Enable Branch Prediction */
 #if defined(CONFIG_BTB)
        li      r0,0x201                /* BBFI = 1, BPEN = 1 */
        mtspr   BUCSR,r0
-       isync
 #endif
 
 #if defined(CFG_INIT_DBCR)
        lis     r1,0xffff
        ori     r1,r1,0xffff
-       mtspr   dbsr,r1                 /* Clear all status bits */
+       mtspr   DBSR,r1                 /* Clear all status bits */
        lis     r0,CFG_INIT_DBCR@h      /* DBCR0[IDM] must be set */
        ori     r0,r0,CFG_INIT_DBCR@l
-       mtspr   dbcr0,r0
-       isync
+       mtspr   DBCR0,r0
 #endif
 
 /* L1 DCache is used for initial RAM */
-       mfspr   r2, L1CSR0
-       ori     r2, r2, 0x0003
-       oris    r2, r2, 0x0001
-       msync
-       isync
-       mtspr   L1CSR0, r2      /* enable/invalidate L1 Dcache */
-       isync
 
        /* Allocate Initial RAM in data cache.
         */
-       lis     r3, CFG_INIT_RAM_ADDR@h
-       ori     r3, r3, CFG_INIT_RAM_ADDR@l
-       li      r2, 512 /* 512*32=16K */
-       mtctr   r2
-       li      r0, 0
+       lis     r3,CFG_INIT_RAM_ADDR@h
+       ori     r3,r3,CFG_INIT_RAM_ADDR@l
+       li      r2,512 /* 512*32=16K */
+       mtctr   r2
+       li      r0,0
 1:
-       dcbz    r0, r3
-       dcbtls  0,r0, r3
-       addi    r3, r3, 32
-       bdnz    1b
+       dcbz    r0,r3
+       dcbtls  0,r0,r3
+       addi    r3,r3,32
+       bdnz    1b
 
-#ifndef CFG_RAMBOOT
-       /* Calculate absolute address in FLASH and jump there           */
+       /* Jump out the last 4K page and continue to 'normal' start */
+#ifdef CFG_RAMBOOT
+       bl      3f
+       b       _start_cont
+#else
+       /* Calculate absolute address in FLASH and jump there           */
        /*--------------------------------------------------------------*/
-       lis     r3, CFG_MONITOR_BASE@h
-       ori     r3, r3, CFG_MONITOR_BASE@l
-       addi    r3, r3, in_flash - _start + EXC_OFF_SYS_RESET
-       mtlr    r3
-       blr
+       lis     r3,CFG_MONITOR_BASE@h
+       ori     r3,r3,CFG_MONITOR_BASE@l
+       addi    r3,r3,_start_cont - _start + _START_OFFSET
+       mtlr    r3
+#endif
+
+3:     li      r0,0
+       mtspr   SRR1,r0         /* Keep things disabled for now */
+       mflr    r1
+       mtspr   SRR0,r1
+       rfi
+       isync
 
-in_flash:
-#endif  /* CFG_RAMBOOT */
+       .text
+       .globl  _start
+_start:
+       .long   0x27051956              /* U-BOOT Magic Number */
+       .globl  version_string
+version_string:
+       .ascii U_BOOT_VERSION
+       .ascii " (", __DATE__, " - ", __TIME__, ")"
+       .ascii CONFIG_IDENT_STRING, "\0"
 
+       .align  4
+       .globl  _start_cont
+_start_cont:
        /* Setup the stack in initial RAM,could be L2-as-SRAM or L1 dcache*/
        lis     r1,CFG_INIT_RAM_ADDR@h
        ori     r1,r1,CFG_INIT_SP_OFFSET@l
@@ -449,27 +318,24 @@ in_flash:
 
        stwu    r1,-8(r1)               /* Save back chain and move SP */
        lis     r0,RESET_VECTOR@h       /* Address of reset vector */
-       ori     r0,r0, RESET_VECTOR@l
+       ori     r0,r0,RESET_VECTOR@l
        stwu    r1,-8(r1)               /* Save back chain and move SP */
        stw     r0,+12(r1)              /* Save return addr (underflow vect) */
 
        GET_GOT
        bl      cpu_init_f
-       bl      icache_enable
        bl      board_init_f
-       sync
-
-
-/* --FIXME-- machine check with MCSRRn and rfmci */
+       isync
 
+       . = EXC_OFF_SYS_RESET
        .globl  _start_of_vectors
 _start_of_vectors:
-#if 0
+
 /* Critical input. */
-       CRIT_EXCEPTION(0x0100, CritcalInput, CritcalInputException)
-#endif
-/* Machine check --FIXME-- Should be MACH_EXCEPTION */
-       CRIT_EXCEPTION(0x0200, MachineCheck, MachineCheckException)
+       CRIT_EXCEPTION(0x0100, CriticalInput, CritcalInputException)
+
+/* Machine check */
+       MCK_EXCEPTION(0x200, MachineCheck, MachineCheckException)
 
 /* Data Storage exception. */
        STD_EXCEPTION(0x0300, DataStorage, UnknownException)
@@ -478,12 +344,12 @@ _start_of_vectors:
        STD_EXCEPTION(0x0400, InstStorage, UnknownException)
 
 /* External Interrupt exception. */
-       STD_EXCEPTION(0x0500, ExtInterrupt, UnknownException)
+       STD_EXCEPTION(0x0500, ExtInterrupt, ExtIntException)
 
 /* Alignment exception. */
        . = 0x0600
 Alignment:
-       EXCEPTION_PROLOG
+       EXCEPTION_PROLOG(SRR0, SRR1)
        mfspr   r4,DAR
        stw     r4,_DAR(r21)
        mfspr   r5,DSISR
@@ -495,13 +361,13 @@ Alignment:
        mtlr    r6
        blrl
 .L_Alignment:
-       .long   AlignmentException - _start + EXC_OFF_SYS_RESET
-       .long   int_return - _start + EXC_OFF_SYS_RESET
+       .long   AlignmentException - _start + _START_OFFSET
+       .long   int_return - _start + _START_OFFSET
 
 /* Program check exception */
        . = 0x0700
 ProgramCheck:
-       EXCEPTION_PROLOG
+       EXCEPTION_PROLOG(SRR0, SRR1)
        addi    r3,r1,STACK_FRAME_OVERHEAD
        li      r20,MSR_KERNEL
        rlwimi  r20,r23,0,16,16         /* copy EE bit from saved MSR */
@@ -509,115 +375,94 @@ ProgramCheck:
        mtlr    r6
        blrl
 .L_ProgramCheck:
-       .long   ProgramCheckException - _start + EXC_OFF_SYS_RESET
-       .long   int_return - _start + EXC_OFF_SYS_RESET
+       .long   ProgramCheckException - _start + _START_OFFSET
+       .long   int_return - _start + _START_OFFSET
 
        /* No FPU on MPC85xx.  This exception is not supposed to happen.
        */
        STD_EXCEPTION(0x0800, FPUnavailable, UnknownException)
-       STD_EXCEPTION(0x0900, Decrementer, timer_interrupt)
-       STD_EXCEPTION(0x0a00, Trap_0a, UnknownException)
-       STD_EXCEPTION(0x0b00, Trap_0b, UnknownException)
 
-       . = 0x0c00
+       . = 0x0900
 /*
  * r0 - SYSCALL number
  * r3-... arguments
  */
 SystemCall:
-       addis   r11,r0,0                /* get functions table addr */
-       ori     r11,r11,0               /* Note: this code is patched in trap_init */
-       addis   r12,r0,0                /* get number of functions */
-       ori     r12,r12,0
-
-       cmplw   0, r0, r12
-       bge     1f
-
-       rlwinm  r0,r0,2,0,31            /* fn_addr = fn_tbl[r0] */
-       add     r11,r11,r0
-       lwz     r11,0(r11)
-
-       li      r20,0xd00-4             /* Get stack pointer */
-       lwz     r12,0(r20)
-       subi    r12,r12,12              /* Adjust stack pointer */
-       li      r0,0xc00+_end_back-SystemCall
-       cmplw   0, r0, r12              /* Check stack overflow */
-       bgt     1f
-       stw     r12,0(r20)
-
-       mflr    r0
-       stw     r0,0(r12)
-       mfspr   r0,SRR0
-       stw     r0,4(r12)
-       mfspr   r0,SRR1
-       stw     r0,8(r12)
-
-       li      r12,0xc00+_back-SystemCall
-       mtlr    r12
-       mtspr   SRR0,r11
-
-1:      SYNC
+       addis   r11,r0,0        /* get functions table addr */
+       ori     r11,r11,0       /* Note: this code is patched in trap_init */
+       addis   r12,r0,0        /* get number of functions */
+       ori     r12,r12,0
+
+       cmplw   0,r0,r12
+       bge     1f
+
+       rlwinm  r0,r0,2,0,31    /* fn_addr = fn_tbl[r0] */
+       add     r11,r11,r0
+       lwz     r11,0(r11)
+
+       li      r20,0xd00-4     /* Get stack pointer */
+       lwz     r12,0(r20)
+       subi    r12,r12,12      /* Adjust stack pointer */
+       li      r0,0xc00+_end_back-SystemCall
+       cmplw   0,r0,r12        /* Check stack overflow */
+       bgt     1f
+       stw     r12,0(r20)
+
+       mflr    r0
+       stw     r0,0(r12)
+       mfspr   r0,SRR0
+       stw     r0,4(r12)
+       mfspr   r0,SRR1
+       stw     r0,8(r12)
+
+       li      r12,0xc00+_back-SystemCall
+       mtlr    r12
+       mtspr   SRR0,r11
+
+1:     SYNC
        rfi
 _back:
 
-       mfmsr   r11                     /* Disable interrupts */
-       li      r12,0
-       ori     r12,r12,MSR_EE
-       andc    r11,r11,r12
-       SYNC                            /* Some chip revs need this... */
-       mtmsr   r11
+       mfmsr   r11                     /* Disable interrupts */
+       li      r12,0
+       ori     r12,r12,MSR_EE
+       andc    r11,r11,r12
+       SYNC                            /* Some chip revs need this... */
+       mtmsr   r11
        SYNC
 
-       li      r12,0xd00-4             /* restore regs */
-       lwz     r12,0(r12)
+       li      r12,0xd00-4             /* restore regs */
+       lwz     r12,0(r12)
 
-       lwz     r11,0(r12)
-       mtlr    r11
-       lwz     r11,4(r12)
-       mtspr   SRR0,r11
-       lwz     r11,8(r12)
-       mtspr   SRR1,r11
+       lwz     r11,0(r12)
+       mtlr    r11
+       lwz     r11,4(r12)
+       mtspr   SRR0,r11
+       lwz     r11,8(r12)
+       mtspr   SRR1,r11
 
-       addi    r12,r12,12              /* Adjust stack pointer */
-       li      r20,0xd00-4
-       stw     r12,0(r20)
+       addi    r12,r12,12              /* Adjust stack pointer */
+       li      r20,0xd00-4
+       stw     r12,0(r20)
 
        SYNC
        rfi
 _end_back:
 
-       STD_EXCEPTION(0xd00, SingleStep, UnknownException)
+       STD_EXCEPTION(0x0a00, Decrementer, timer_interrupt)
+       STD_EXCEPTION(0x0b00, IntervalTimer, UnknownException)
+       STD_EXCEPTION(0x0c00, WatchdogTimer, UnknownException)
 
-       STD_EXCEPTION(0xe00, Trap_0e, UnknownException)
-       STD_EXCEPTION(0xf00, Trap_0f, UnknownException)
+       STD_EXCEPTION(0x0d00, DataTLBError, UnknownException)
+       STD_EXCEPTION(0x0e00, InstructionTLBError, UnknownException)
 
-       STD_EXCEPTION(0x1000, PIT, PITException)
+       CRIT_EXCEPTION(0x0f00, DebugBreakpoint, DebugException )
 
-       STD_EXCEPTION(0x1100, InstructionTLBMiss, UnknownException)
-       STD_EXCEPTION(0x1200, DataTLBMiss, UnknownException)
-       STD_EXCEPTION(0x1300, InstructionTLBError, UnknownException)
-       STD_EXCEPTION(0x1400, DataTLBError, UnknownException)
-
-       STD_EXCEPTION(0x1500, Reserved5, UnknownException)
-       STD_EXCEPTION(0x1600, Reserved6, UnknownException)
-       STD_EXCEPTION(0x1700, Reserved7, UnknownException)
-       STD_EXCEPTION(0x1800, Reserved8, UnknownException)
-       STD_EXCEPTION(0x1900, Reserved9, UnknownException)
-       STD_EXCEPTION(0x1a00, ReservedA, UnknownException)
-       STD_EXCEPTION(0x1b00, ReservedB, UnknownException)
-
-       STD_EXCEPTION(0x1c00, DataBreakpoint, UnknownException)
-       STD_EXCEPTION(0x1d00, InstructionBreakpoint, UnknownException)
-       STD_EXCEPTION(0x1e00, PeripheralBreakpoint, UnknownException)
-       STD_EXCEPTION(0x1f00, DevPortBreakpoint, UnknownException)
-
-       CRIT_EXCEPTION(0x2000, DebugBreakpoint, DebugException )
-
-       .globl  _end_of_vectors
+       .globl  _end_of_vectors
 _end_of_vectors:
 
 
-       . = 0x2100
+       . = . + (0x100 - ( . & 0xff ))  /* align for debug */
 
 /*
  * This code finishes saving the registers to the exception frame
@@ -702,26 +547,58 @@ crit_return:
        REST_GPR(31, r1)
        lwz     r2,_NIP(r1)     /* Restore environment */
        lwz     r0,_MSR(r1)
-       mtspr   990,r2          /* SRR2 */
-       mtspr   991,r0          /* SRR3 */
+       mtspr   SPRN_CSRR0,r2
+       mtspr   SPRN_CSRR1,r0
        lwz     r0,GPR0(r1)
        lwz     r2,GPR2(r1)
        lwz     r1,GPR1(r1)
        SYNC
        rfci
 
+mck_return:
+       mfmsr   r28             /* Disable interrupts */
+       li      r4,0
+       ori     r4,r4,MSR_EE
+       andc    r28,r28,r4
+       SYNC                    /* Some chip revs need this... */
+       mtmsr   r28
+       SYNC
+       lwz     r2,_CTR(r1)
+       lwz     r0,_LINK(r1)
+       mtctr   r2
+       mtlr    r0
+       lwz     r2,_XER(r1)
+       lwz     r0,_CCR(r1)
+       mtspr   XER,r2
+       mtcrf   0xFF,r0
+       REST_10GPRS(3, r1)
+       REST_10GPRS(13, r1)
+       REST_8GPRS(23, r1)
+       REST_GPR(31, r1)
+       lwz     r2,_NIP(r1)     /* Restore environment */
+       lwz     r0,_MSR(r1)
+       mtspr   SPRN_MCSRR0,r2
+       mtspr   SPRN_MCSRR1,r0
+       lwz     r0,GPR0(r1)
+       lwz     r2,GPR2(r1)
+       lwz     r1,GPR1(r1)
+       SYNC
+       rfmci
+
 /* Cache functions.
 */
 invalidate_icache:
        mfspr   r0,L1CSR1
-       ori     r0,r0,0x0002
+       ori     r0,r0,L1CSR1_ICFI
+       msync
+       isync
        mtspr   L1CSR1,r0
        isync
-       blr                             /*   entire I cache */
+       blr                             /* entire I cache */
 
 invalidate_dcache:
        mfspr   r0,L1CSR0
-       ori     r0,r0,0x0002
+       ori     r0,r0,L1CSR0_DCFI
        msync
        isync
        mtspr   L1CSR0,r0
@@ -744,9 +621,9 @@ icache_enable:
        .globl  icache_disable
 icache_disable:
        mfspr   r0,L1CSR1
-       lis     r1,0xfffffffe@h
-       ori     r1,r1,0xfffffffe@l
-       and     r0,r0,r1
+       lis     r3,0
+       ori     r3,r3,L1CSR1_ICE
+       andc    r0,r0,r3
        mtspr   L1CSR1,r0
        isync
        blr
@@ -754,7 +631,7 @@ icache_disable:
        .globl  icache_status
 icache_status:
        mfspr   r3,L1CSR1
-       srwi    r3, r3, 31      /* >>31 => select bit 0 */
+       andi.   r3,r3,L1CSR1_ICE
        blr
 
        .globl  dcache_enable
@@ -774,12 +651,10 @@ dcache_enable:
 
        .globl  dcache_disable
 dcache_disable:
-       mfspr   r0,L1CSR0
-       lis     r1,0xfffffffe@h
-       ori     r1,r1,0xfffffffe@l
-       and     r0,r0,r1
-       msync
-       isync
+       mfspr   r3,L1CSR0
+       lis     r4,0
+       ori     r4,r4,L1CSR0_DCE
+       andc    r3,r3,r4
        mtspr   L1CSR0,r0
        isync
        blr
@@ -787,27 +662,27 @@ dcache_disable:
        .globl  dcache_status
 dcache_status:
        mfspr   r3,L1CSR0
-       srwi    r3, r3, 31      /* >>31 => select bit 0 */
+       andi.   r3,r3,L1CSR0_DCE
        blr
 
        .globl get_pir
 get_pir:
-       mfspr   r3, PIR
+       mfspr   r3,PIR
        blr
 
        .globl get_pvr
 get_pvr:
-       mfspr   r3, PVR
+       mfspr   r3,PVR
        blr
 
        .globl get_svr
 get_svr:
-       mfspr   r3, SVR
+       mfspr   r3,SVR
        blr
 
        .globl wr_tcr
 wr_tcr:
-       mtspr   TCR, r3
+       mtspr   TCR,r3
        blr
 
 /*------------------------------------------------------------------------------- */
@@ -922,6 +797,18 @@ ppcDcbi:
        dcbi    r0,r3
        blr
 
+/*--------------------------------------------------------------------------
+ * Function:    ppcDcbz
+ * Description:         Data Cache block zero.
+ * Input:       r3 = effective address
+ * Output:      none.
+ *-------------------------------------------------------------------------- */
+
+       .globl  ppcDcbz
+ppcDcbz:
+       dcbz    r0,r3
+       blr
+
 /*------------------------------------------------------------------------------- */
 /* Function:    ppcSync */
 /* Description:         Processor Synchronize */
@@ -948,16 +835,16 @@ ppcSync:
  */
        .globl  relocate_code
 relocate_code:
-       mr      r1,  r3         /* Set new stack pointer                */
-       mr      r9,  r4         /* Save copy of Init Data pointer       */
-       mr      r10, r5         /* Save copy of Destination Address     */
+       mr      r1,r3           /* Set new stack pointer                */
+       mr      r9,r4           /* Save copy of Init Data pointer       */
+       mr      r10,r5          /* Save copy of Destination Address     */
 
-       mr      r3,  r5                         /* Destination Address  */
-       lis     r4, CFG_MONITOR_BASE@h          /* Source      Address  */
-       ori     r4, r4, CFG_MONITOR_BASE@l
+       mr      r3,r5                           /* Destination Address  */
+       lis     r4,CFG_MONITOR_BASE@h           /* Source      Address  */
+       ori     r4,r4,CFG_MONITOR_BASE@l
        lwz     r5,GOT(__init_end)
        sub     r5,r5,r4
-       li      r6, CFG_CACHELINE_SIZE          /* Cache Line Size      */
+       li      r6,CFG_CACHELINE_SIZE           /* Cache Line Size      */
 
        /*
         * Fix GOT pointer:
@@ -966,12 +853,12 @@ relocate_code:
         *
         * Offset:
         */
-       sub     r15, r10, r4
+       sub     r15,r10,r4
 
        /* First our own GOT */
-       add     r14, r14, r15
+       add     r14,r14,r15
        /* the the one used by the C code */
-       add     r30, r30, r15
+       add     r30,r30,r15
 
        /*
         * Now relocate code
@@ -1022,15 +909,20 @@ relocate_code:
 7:     sync                    /* Wait for all icbi to complete on bus */
        isync
 
+       /*
+        * Re-point the IVPR at RAM
+        */
+       mtspr   IVPR,r10
+
 /*
  * We are done. Do not return, instead branch to second part of board
  * initialization, now running from RAM.
  */
 
-       addi    r0, r10, in_ram - _start + EXC_OFF_SYS_RESET
+       addi    r0,r10,in_ram - _start + _START_OFFSET
        mtlr    r0
        blr                             /* NEVER RETURNS! */
-
+       .globl  in_ram
 in_ram:
 
        /*
@@ -1074,19 +966,19 @@ clear_bss:
        lwz     r3,GOT(__bss_start)
        lwz     r4,GOT(_end)
 
-       cmplw   0, r3, r4
+       cmplw   0,r3,r4
        beq     6f
 
-       li      r0, 0
+       li      r0,0
 5:
-       stw     r0, 0(r3)
-       addi    r3, r3, 4
-       cmplw   0, r3, r4
+       stw     r0,0(r3)
+       addi    r3,r3,4
+       cmplw   0,r3,r4
        bne     5b
 6:
 
-       mr      r3, r9          /* Init Data pointer            */
-       mr      r4, r10         /* Destination Address          */
+       mr      r3,r9           /* Init Data pointer            */
+       mr      r4,r10          /* Destination Address          */
        bl      board_init_r
 
        /*
@@ -1095,72 +987,71 @@ clear_bss:
         * r3: dest_addr
         * r7: source address, r8: end address, r9: target address
         */
-       .globl  trap_init
+       .globl  trap_init
 trap_init:
-       lwz     r7, GOT(_start)
-       lwz     r8, GOT(_end_of_vectors)
+       lwz     r7,GOT(_start_of_vectors)
+       lwz     r8,GOT(_end_of_vectors)
 
-       li      r9, 0x100               /* reset vector always at 0x100 */
+       li      r9,0x100                /* reset vector always at 0x100 */
 
-       cmplw   0, r7, r8
-       bgelr                           /* return if r7>=r8 - just in case */
+       cmplw   0,r7,r8
+       bgelr                           /* return if r7>=r8 - just in case */
 
-       mflr    r4                      /* save link register           */
+       mflr    r4                      /* save link register           */
 1:
-       lwz     r0, 0(r7)
-       stw     r0, 0(r9)
-       addi    r7, r7, 4
-       addi    r9, r9, 4
-       cmplw   0, r7, r8
-       bne     1b
+       lwz     r0,0(r7)
+       stw     r0,0(r9)
+       addi    r7,r7,4
+       addi    r9,r9,4
+       cmplw   0,r7,r8
+       bne     1b
 
        /*
         * relocate `hdlr' and `int_return' entries
         */
-       li      r7, .L_MachineCheck - _start + EXC_OFF_SYS_RESET
-       li      r8, Alignment - _start + EXC_OFF_SYS_RESET
+       li      r7,.L_CriticalInput - _start + _START_OFFSET
+       bl      trap_reloc
+       li      r7,.L_MachineCheck - _start + _START_OFFSET
+       bl      trap_reloc
+       li      r7,.L_DataStorage - _start + _START_OFFSET
+       bl      trap_reloc
+       li      r7,.L_InstStorage - _start + _START_OFFSET
+       bl      trap_reloc
+       li      r7,.L_ExtInterrupt - _start + _START_OFFSET
+       bl      trap_reloc
+       li      r7,.L_Alignment - _start + _START_OFFSET
+       bl      trap_reloc
+       li      r7,.L_ProgramCheck - _start + _START_OFFSET
+       bl      trap_reloc
+       li      r7,.L_FPUnavailable - _start + _START_OFFSET
+       bl      trap_reloc
+       li      r7,.L_Decrementer - _start + _START_OFFSET
+       bl      trap_reloc
+       li      r7,.L_IntervalTimer - _start + _START_OFFSET
+       li      r8,_end_of_vectors - _start + _START_OFFSET
 2:
-       bl      trap_reloc
-       addi    r7, r7, 0x100           /* next exception vector        */
-       cmplw   0, r7, r8
-       blt     2b
-
-       li      r7, .L_Alignment - _start + EXC_OFF_SYS_RESET
-       bl      trap_reloc
-
-       li      r7, .L_ProgramCheck - _start + EXC_OFF_SYS_RESET
-       bl      trap_reloc
-
-       li      r7, .L_FPUnavailable - _start + EXC_OFF_SYS_RESET
-       li      r8, SystemCall - _start + EXC_OFF_SYS_RESET
-3:
-       bl      trap_reloc
-       addi    r7, r7, 0x100           /* next exception vector        */
-       cmplw   0, r7, r8
-       blt     3b
-
-       li      r7, .L_SingleStep - _start + EXC_OFF_SYS_RESET
-       li      r8, _end_of_vectors - _start + EXC_OFF_SYS_RESET
-4:
-       bl      trap_reloc
-       addi    r7, r7, 0x100           /* next exception vector        */
-       cmplw   0, r7, r8
-       blt     4b
+       bl      trap_reloc
+       addi    r7,r7,0x100             /* next exception vector        */
+       cmplw   0,r7,r8
+       blt     2b
+
+       lis     r7,0x0
+       mtspr   IVPR,r7
 
-       mtlr    r4                      /* restore link register        */
+       mtlr    r4                      /* restore link register        */
        blr
 
        /*
         * Function: relocate entries for one exception vector
         */
 trap_reloc:
-       lwz     r0, 0(r7)               /* hdlr ...                     */
-       add     r0, r0, r3              /*  ... += dest_addr            */
-       stw     r0, 0(r7)
+       lwz     r0,0(r7)                /* hdlr ...                     */
+       add     r0,r0,r3                /*  ... += dest_addr            */
+       stw     r0,0(r7)
 
-       lwz     r0, 4(r7)               /* int_return ...               */
-       add     r0, r0, r3              /*  ... += dest_addr            */
-       stw     r0, 4(r7)
+       lwz     r0,4(r7)                /* int_return ...               */
+       add     r0,r0,r3                /*  ... += dest_addr            */
+       stw     r0,4(r7)
 
        blr
 
@@ -1168,15 +1059,15 @@ trap_reloc:
 .globl unlock_ram_in_cache
 unlock_ram_in_cache:
        /* invalidate the INIT_RAM section */
-       lis     r3, (CFG_INIT_RAM_ADDR & ~31)@h
-       ori     r3, r3, (CFG_INIT_RAM_ADDR & ~31)@l
-       li      r2,512
-       mtctr   r2
-1:     icbi    r0, r3
-       dcbi    r0, r3
-       addi    r3, r3, 32
+       lis     r3,(CFG_INIT_RAM_ADDR & ~31)@h
+       ori     r3,r3,(CFG_INIT_RAM_ADDR & ~31)@l
+       li      r4,512
+       mtctr   r4
+1:     icbi    r0,r3
+       dcbi    r0,r3
+       addi    r3,r3,32
        bdnz    1b
-       sync                    /* Wait for all icbi to complete on bus */
+       sync                    /* Wait for all icbi to complete on bus */
        isync
        blr
 #endif