mfspr   r3,SPRN_IMISS
        lis     r1,PAGE_OFFSET@h                /* check if kernel address */
        cmplw   0,r1,r3
-       mfspr   r2,SPRN_SPRG_THREAD
+       mfspr   r2, SPRN_SPRG_PGDIR
        li      r1,_PAGE_USER|_PAGE_PRESENT|_PAGE_EXEC /* low addresses tested as user */
-       lwz     r2,PGDIR(r2)
        bge-    112f
        mfspr   r2,SPRN_SRR1            /* and MSR_PR bit from SRR1 */
        rlwimi  r1,r2,32-12,29,29       /* shift MSR_PR to _PAGE_USER posn */
        lis     r2,swapper_pg_dir@ha    /* if kernel address, use */
        addi    r2,r2,swapper_pg_dir@l  /* kernel page table */
-112:   tophys(r2,r2)
-       rlwimi  r2,r3,12,20,29          /* insert top 10 bits of address */
+       tophys(r2,r2)
+112:   rlwimi  r2,r3,12,20,29          /* insert top 10 bits of address */
        lwz     r2,0(r2)                /* get pmd entry */
        rlwinm. r2,r2,0,0,19            /* extract address of pte page */
        beq-    InstructionAddressInvalid       /* return if no mapping */
        mfspr   r3,SPRN_DMISS
        lis     r1,PAGE_OFFSET@h                /* check if kernel address */
        cmplw   0,r1,r3
-       mfspr   r2,SPRN_SPRG_THREAD
+       mfspr   r2, SPRN_SPRG_PGDIR
        li      r1,_PAGE_USER|_PAGE_PRESENT /* low addresses tested as user */
-       lwz     r2,PGDIR(r2)
        bge-    112f
        mfspr   r2,SPRN_SRR1            /* and MSR_PR bit from SRR1 */
        rlwimi  r1,r2,32-12,29,29       /* shift MSR_PR to _PAGE_USER posn */
        lis     r2,swapper_pg_dir@ha    /* if kernel address, use */
        addi    r2,r2,swapper_pg_dir@l  /* kernel page table */
-112:   tophys(r2,r2)
-       rlwimi  r2,r3,12,20,29          /* insert top 10 bits of address */
+       tophys(r2,r2)
+112:   rlwimi  r2,r3,12,20,29          /* insert top 10 bits of address */
        lwz     r2,0(r2)                /* get pmd entry */
        rlwinm. r2,r2,0,0,19            /* extract address of pte page */
        beq-    DataAddressInvalid      /* return if no mapping */
        mfspr   r3,SPRN_DMISS
        lis     r1,PAGE_OFFSET@h                /* check if kernel address */
        cmplw   0,r1,r3
-       mfspr   r2,SPRN_SPRG_THREAD
+       mfspr   r2, SPRN_SPRG_PGDIR
        li      r1,_PAGE_RW|_PAGE_USER|_PAGE_PRESENT /* access flags */
-       lwz     r2,PGDIR(r2)
        bge-    112f
        mfspr   r2,SPRN_SRR1            /* and MSR_PR bit from SRR1 */
        rlwimi  r1,r2,32-12,29,29       /* shift MSR_PR to _PAGE_USER posn */
        lis     r2,swapper_pg_dir@ha    /* if kernel address, use */
        addi    r2,r2,swapper_pg_dir@l  /* kernel page table */
-112:   tophys(r2,r2)
-       rlwimi  r2,r3,12,20,29          /* insert top 10 bits of address */
+       tophys(r2,r2)
+112:   rlwimi  r2,r3,12,20,29          /* insert top 10 bits of address */
        lwz     r2,0(r2)                /* get pmd entry */
        rlwinm. r2,r2,0,0,19            /* extract address of pte page */
        beq-    DataAddressInvalid      /* return if no mapping */
        li      r0,NUM_USER_SEGMENTS
        mtctr   r0
 
+       lwz     r4, MM_PGD(r4)
 #ifdef CONFIG_BDI_SWITCH
        /* Context switch the PTE pointer for the Abatron BDI2000.
         * The PGDIR is passed as second argument.
         */
-       lwz     r4,MM_PGD(r4)
        lis     r5, abatron_pteptrs@ha
        stw     r4, abatron_pteptrs@l + 0x4(r5)
 #endif
+       tophys(r4, r4)
+       mtspr   SPRN_SPRG_PGDIR, r4
        li      r4,0
        isync
 3: