die_if_kernel("Kernel ale access", regs);
        force_sig_fault(SIGBUS, BUS_ADRALN, (void __user *)regs->csr_badvaddr);
 #else
+       bool pie = regs_irqs_disabled(regs);
        unsigned int *pc;
 
-       if (regs->csr_prmd & CSR_PRMD_PIE)
+       if (!pie)
                local_irq_enable();
 
        perf_sw_event(PERF_COUNT_SW_ALIGNMENT_FAULTS, 1, regs, regs->csr_badvaddr);
        die_if_kernel("Kernel ale access", regs);
        force_sig_fault(SIGBUS, BUS_ADRALN, (void __user *)regs->csr_badvaddr);
 out:
-       if (regs->csr_prmd & CSR_PRMD_PIE)
+       if (!pie)
                local_irq_disable();
 #endif
        irqentry_exit(regs, state);
 asmlinkage void noinstr do_bce(struct pt_regs *regs)
 {
        bool user = user_mode(regs);
+       bool pie = regs_irqs_disabled(regs);
        unsigned long era = exception_era(regs);
        u64 badv = 0, lower = 0, upper = ULONG_MAX;
        union loongarch_instruction insn;
        irqentry_state_t state = irqentry_enter(regs);
 
-       if (regs->csr_prmd & CSR_PRMD_PIE)
+       if (!pie)
                local_irq_enable();
 
        current->thread.trap_nr = read_csr_excode();
        force_sig_bnderr((void __user *)badv, (void __user *)lower, (void __user *)upper);
 
 out:
-       if (regs->csr_prmd & CSR_PRMD_PIE)
+       if (!pie)
                local_irq_disable();
 
        irqentry_exit(regs, state);
 asmlinkage void noinstr do_bp(struct pt_regs *regs)
 {
        bool user = user_mode(regs);
+       bool pie = regs_irqs_disabled(regs);
        unsigned int opcode, bcode;
        unsigned long era = exception_era(regs);
        irqentry_state_t state = irqentry_enter(regs);
 
-       if (regs->csr_prmd & CSR_PRMD_PIE)
+       if (!pie)
                local_irq_enable();
 
        if (__get_inst(&opcode, (u32 *)era, user))
        }
 
 out:
-       if (regs->csr_prmd & CSR_PRMD_PIE)
+       if (!pie)
                local_irq_disable();
 
        irqentry_exit(regs, state);
 
 asmlinkage void noinstr do_lbt(struct pt_regs *regs)
 {
+       bool pie = regs_irqs_disabled(regs);
        irqentry_state_t state = irqentry_enter(regs);
 
        /*
         * (including the user using 'MOVGR2GCSR' to turn on TM, which
         * will not trigger the BTE), we need to check PRMD first.
         */
-       if (regs->csr_prmd & CSR_PRMD_PIE)
+       if (!pie)
                local_irq_enable();
 
        if (!cpu_has_lbt) {
        preempt_enable();
 
 out:
-       if (regs->csr_prmd & CSR_PRMD_PIE)
+       if (!pie)
                local_irq_disable();
 
        irqentry_exit(regs, state);