subi    r1,r1,INT_FRAME_SIZE;   /* alloc frame on kernel stack  */ \
        beq-    1f;                                                        \
        ld      r1,PACAKSAVE(r13);      /* kernel stack to use          */ \
-1:     cmpdi   cr1,r1,-INT_FRAME_SIZE; /* check if r1 is in userspace  */ \
-       blt+    cr1,3f;                 /* abort if it is               */ \
-       li      r1,(trap);              /* will be reloaded later       */ \
-       sth     r1,PACA_TRAP_SAVE(r13);                                    \
-       std     r3,area+EX_R3(r13);                                        \
-       addi    r3,r13,area;            /* r3 -> where regs are saved*/    \
-       RESTORE_CTR(r1, area);                                             \
-       b       bad_stack;                                                 \
+1:     tdgei   r1,-INT_FRAME_SIZE;     /* trap if r1 is in userspace   */ \
+       EMIT_BUG_ENTRY 1b,__FILE__,__LINE__,0;                             \
 3:     EXCEPTION_PROLOG_COMMON_1();                                       \
        kuap_save_amr_and_lock r9, r10, cr1, cr0;                          \
        beq     4f;                     /* if from kernel mode          */ \
        EXCEPTION_PROLOG_COMMON_3(trap);                                   \
        ACCOUNT_STOLEN_TIME
 
-
 /*
  * Exception where stack is already set in r1, r1 is saved in r10.
  * PPR save and CPU accounting is not done (for some reason).
         * we switch to the emergency stack if we're taking a TM Bad Thing from
         * the kernel.
         */
-       li      r10,MSR_PR              /* Build a mask of MSR_PR ..    */
-       oris    r10,r10,0x200000@h      /* .. and SRR1_PROGTM           */
-       and     r10,r10,r12             /* Mask SRR1 with that.         */
-       srdi    r10,r10,8               /* Shift it so we can compare   */
-       cmpldi  r10,(0x200000 >> 8)     /* .. with an immediate.        */
-       bne 1f                          /* If != go to normal path.     */
-
-       /* SRR1 had PR=0 and SRR1_PROGTM=1, so use the emergency stack  */
-       andi.   r10,r12,MSR_PR;         /* Set CR0 correctly for label  */
+
+       andi.   r10,r12,MSR_PR
+       bne     2f                      /* If userspace, go normal path */
+
+       andis.  r10,r12,(SRR1_PROGTM)@h
+       bne     1f                      /* If TM, emergency             */
+
+       cmpdi   r1,-INT_FRAME_SIZE      /* check if r1 is in userspace  */
+       blt     2f                      /* normal path if not           */
+
+       /* Use the emergency stack                                      */
+1:     andi.   r10,r12,MSR_PR          /* Set CR0 correctly for label  */
                                        /* 3 in EXCEPTION_PROLOG_COMMON */
        mr      r10,r1                  /* Save r1                      */
        ld      r1,PACAEMERGSP(r13)     /* Use emergency stack          */
        subi    r1,r1,INT_FRAME_SIZE    /* alloc stack frame            */
        b 3f                            /* Jump into the macro !!       */
-1:     EXCEPTION_COMMON(PACA_EXGEN, 0x700)
+2:
+       EXCEPTION_COMMON(PACA_EXGEN, 0x700)
        bl      save_nvgprs
        RECONCILE_IRQ_STATE(r10, r11)
        addi    r3,r1,STACK_FRAME_OVERHEAD
        bl      bad_page_fault
        b       ret_from_except
 
-/*
- * Here we have detected that the kernel stack pointer is bad.
- * R9 contains the saved CR, r13 points to the paca,
- * r10 contains the (bad) kernel stack pointer,
- * r11 and r12 contain the saved SRR0 and SRR1.
- * We switch to using an emergency stack, save the registers there,
- * and call kernel_bad_stack(), which panics.
- */
-bad_stack:
-       ld      r1,PACAEMERGSP(r13)
-       subi    r1,r1,64+INT_FRAME_SIZE
-       std     r9,_CCR(r1)
-       std     r10,GPR1(r1)
-       std     r11,_NIP(r1)
-       std     r12,_MSR(r1)
-       mfspr   r11,SPRN_DAR
-       mfspr   r12,SPRN_DSISR
-       std     r11,_DAR(r1)
-       std     r12,_DSISR(r1)
-       mflr    r10
-       mfctr   r11
-       mfxer   r12
-       std     r10,_LINK(r1)
-       std     r11,_CTR(r1)
-       std     r12,_XER(r1)
-       SAVE_GPR(0,r1)
-       SAVE_GPR(2,r1)
-       ld      r10,EX_R3(r3)
-       std     r10,GPR3(r1)
-       SAVE_GPR(4,r1)
-       SAVE_4GPRS(5,r1)
-       ld      r9,EX_R9(r3)
-       ld      r10,EX_R10(r3)
-       SAVE_2GPRS(9,r1)
-       ld      r9,EX_R11(r3)
-       ld      r10,EX_R12(r3)
-       ld      r11,EX_R13(r3)
-       std     r9,GPR11(r1)
-       std     r10,GPR12(r1)
-       std     r11,GPR13(r1)
-BEGIN_FTR_SECTION
-       ld      r10,EX_CFAR(r3)
-       std     r10,ORIG_GPR3(r1)
-END_FTR_SECTION_IFSET(CPU_FTR_CFAR)
-       SAVE_8GPRS(14,r1)
-       SAVE_10GPRS(22,r1)
-       lhz     r12,PACA_TRAP_SAVE(r13)
-       std     r12,_TRAP(r1)
-       addi    r11,r1,INT_FRAME_SIZE
-       std     r11,0(r1)
-       li      r12,0
-       std     r12,0(r11)
-       ld      r2,PACATOC(r13)
-       ld      r11,exception_marker@toc(r2)
-       std     r12,RESULT(r1)
-       std     r11,STACK_FRAME_OVERHEAD-16(r1)
-1:     addi    r3,r1,STACK_FRAME_OVERHEAD
-       bl      kernel_bad_stack
-       b       1b
-_ASM_NOKPROBE_SYMBOL(bad_stack);
-
 /*
  * When doorbell is triggered from system reset wakeup, the message is
  * not cleared, so it would fire again when EE is enabled.