DEFINE(KSP_VSID, offsetof(struct thread_struct, ksp_vsid));
 #else /* CONFIG_PPC64 */
        DEFINE(PGDIR, offsetof(struct thread_struct, pgdir));
-#if defined(CONFIG_4xx) || defined(CONFIG_BOOKE)
-       DEFINE(THREAD_DBCR0, offsetof(struct thread_struct, dbcr0));
-#endif
 #ifdef CONFIG_SPE
        DEFINE(THREAD_EVR0, offsetof(struct thread_struct, evr[0]));
        DEFINE(THREAD_ACC, offsetof(struct thread_struct, acc));
        DEFINE(THREAD_USED_SPE, offsetof(struct thread_struct, used_spe));
 #endif /* CONFIG_SPE */
 #endif /* CONFIG_PPC64 */
+#if defined(CONFIG_4xx) || defined(CONFIG_BOOKE)
+       DEFINE(THREAD_DBCR0, offsetof(struct thread_struct, dbcr0));
+#endif
 #ifdef CONFIG_KVM_BOOK3S_32_HANDLER
        DEFINE(THREAD_KVM_SVCPU, offsetof(struct thread_struct, kvm_shadow_vcpu));
 #endif
 
 
        CURRENT_THREAD_INFO(r9, r1)
        ld      r3,_MSR(r1)
+#ifdef CONFIG_PPC_BOOK3E
+       ld      r10,PACACURRENT(r13)
+#endif /* CONFIG_PPC_BOOK3E */
        ld      r4,TI_FLAGS(r9)
        andi.   r3,r3,MSR_PR
        beq     resume_kernel
+#ifdef CONFIG_PPC_BOOK3E
+       lwz     r3,(THREAD+THREAD_DBCR0)(r10)
+#endif /* CONFIG_PPC_BOOK3E */
 
        /* Check current_thread_info()->flags */
        andi.   r0,r4,_TIF_USER_WORK_MASK
+#ifdef CONFIG_PPC_BOOK3E
+       bne     1f
+       /*
+        * Check to see if the dbcr0 register is set up to debug.
+        * Use the internal debug mode bit to do this.
+        */
+       andis.  r0,r3,DBCR0_IDM@h
        beq     restore
-
-       andi.   r0,r4,_TIF_NEED_RESCHED
-       beq     1f
+       mfmsr   r0
+       rlwinm  r0,r0,0,~MSR_DE /* Clear MSR.DE */
+       mtmsr   r0
+       mtspr   SPRN_DBCR0,r3
+       li      r10, -1
+       mtspr   SPRN_DBSR,r10
+       b       restore
+#else
+       beq     restore
+#endif
+1:     andi.   r0,r4,_TIF_NEED_RESCHED
+       beq     2f
        bl      .restore_interrupts
        SCHEDULE_USER
        b       .ret_from_except_lite
 
-1:     bl      .save_nvgprs
+2:     bl      .save_nvgprs
        bl      .restore_interrupts
        addi    r3,r1,STACK_FRAME_OVERHEAD
        bl      .do_notify_resume