#include <ioports.h>
 #include <lmb.h>
 #include <asm/io.h>
+#include <asm/mmu.h>
 #include "mp.h"
 
 DECLARE_GLOBAL_DATA_PTR;
        ulong fixup = (ulong)&__secondary_start_page;
        u32 bootpg = determine_mp_bootpg();
 
-       memcpy((void *)bootpg, (void *)fixup, 4096);
-       flush_cache(bootpg, 4096);
+       /* look for the tlb covering the reset page, there better be one */
+       int i = find_tlb_idx((void *)0xfffff000, 1);
 
-       pq3_mp_up(bootpg);
+       /* we found a match */
+       if (i != -1) {
+               /* map reset page to bootpg so we can copy code there */
+               disable_tlb(i);
+       
+               set_tlb(1, 0xfffff000, bootpg, /* tlb, epn, rpn */
+                       MAS3_SX|MAS3_SW|MAS3_SR, MAS2_M, /* perms, wimge */
+                       0, i, BOOKE_PAGESZ_4K, 1); /* ts, esel, tsize, iprot */
+
+               memcpy((void *)0xfffff000, (void *)fixup, 4096);
+               flush_cache(0xfffff000, 4096);
+
+               disable_tlb(i);
+
+               /* setup reset page back to 1:1, we'll use HW boot translation
+                * to map this where we want
+                */
+               set_tlb(1, 0xfffff000, 0xfffff000, /* tlb, epn, rpn */
+                       MAS3_SX|MAS3_SW|MAS3_SR, MAS2_I, /* perms, wimge */
+                       0, i, BOOKE_PAGESZ_4K, 1); /* ts, esel, tsize, iprot */
+
+               pq3_mp_up(bootpg);
+       } else {
+               puts("WARNING: No reset page TLB. "
+                       "Skipping secondary core setup\n");
+       }
 }