unsigned long retx;
        unsigned long seqstat;
        unsigned int __nmi_count;       /* number of times NMI asserted on this CPU */
+#ifdef CONFIG_DEBUG_DOUBLEFAULT
+       unsigned long dcplb_doublefault_addr;
+       unsigned long icplb_doublefault_addr;
+       unsigned long retx_doublefault;
+       unsigned long seqstat_doublefault;
+#endif
 };
 
 extern struct blackfin_pda cpu_pda[];
 
        DEFINE(PDA_ICPLB, offsetof(struct blackfin_pda, icplb_fault_addr));
        DEFINE(PDA_RETX, offsetof(struct blackfin_pda, retx));
        DEFINE(PDA_SEQSTAT, offsetof(struct blackfin_pda, seqstat));
+#ifdef CONFIG_DEBUG_DOUBLEFAULT
+       DEFINE(PDA_DF_DCPLB, offsetof(struct blackfin_pda, dcplb_doublefault_addr));
+       DEFINE(PDA_DF_ICPLB, offsetof(struct blackfin_pda, icplb_doublefault_addr));
+       DEFINE(PDA_DF_SEQSTAT, offsetof(struct blackfin_pda, seqstat_doublefault));
+       DEFINE(PDA_DF_RETX, offsetof(struct blackfin_pda, retx_doublefault));
+#endif
 #ifdef CONFIG_SMP
        /* Inter-core lock (in L2 SRAM) */
        DEFINE(SIZEOF_CORELOCK, sizeof(struct corelock_slot));
 
        if (((long)fp->seqstat &  SEQSTAT_EXCAUSE) == VEC_UNCOV) {
                unsigned int cpu = smp_processor_id();
                char buf[150];
-               decode_address(buf, cpu_pda[cpu].retx);
+               decode_address(buf, cpu_pda[cpu].retx_doublefault);
                printk(KERN_EMERG "While handling exception (EXCAUSE = 0x%x) at %s:\n",
-                       (unsigned int)cpu_pda[cpu].seqstat & SEQSTAT_EXCAUSE, buf);
-               decode_address(buf, cpu_pda[cpu].dcplb_fault_addr);
+                       (unsigned int)cpu_pda[cpu].seqstat_doublefault & SEQSTAT_EXCAUSE, buf);
+               decode_address(buf, cpu_pda[cpu].dcplb_doublefault_addr);
                printk(KERN_NOTICE "   DCPLB_FAULT_ADDR: %s\n", buf);
-               decode_address(buf, cpu_pda[cpu].icplb_fault_addr);
+               decode_address(buf, cpu_pda[cpu].icplb_doublefault_addr);
                printk(KERN_NOTICE "   ICPLB_FAULT_ADDR: %s\n", buf);
 
                decode_address(buf, fp->retx);
 
         * below
         */
        GET_PDA(p0, r0);
-       r7 = [p0 + PDA_RETX];
+       r7 = [p0 + PDA_DF_RETX];
        p1.l = _init_saved_retx_coreb;
        p1.h = _init_saved_retx_coreb;
        [p1] = r7;
 
-       r7 = [p0 + PDA_DCPLB];
+       r7 = [p0 + PDA_DF_DCPLB];
        p1.l = _init_saved_dcplb_fault_addr_coreb;
        p1.h = _init_saved_dcplb_fault_addr_coreb;
        [p1] = r7;
 
-       r7 = [p0 + PDA_ICPLB];
+       r7 = [p0 + PDA_DF_ICPLB];
        p1.l = _init_saved_icplb_fault_addr_coreb;
        p1.h = _init_saved_icplb_fault_addr_coreb;
        [p1] = r7;
 
-       r7 = [p0 + PDA_SEQSTAT];
+       r7 = [p0 + PDA_DF_SEQSTAT];
        p1.l = _init_saved_seqstat_coreb;
        p1.h = _init_saved_seqstat_coreb;
        [p1] = r7;
 
        [p4] = r7;
        csync;
 
-#ifndef CONFIG_DEBUG_DOUBLEFAULT
-
        /*
         * Save these registers, as they are only valid in exception context
         *  (where we are now - as soon as we defer to IRQ5, they can change)
 
        r6 = retx;
        [p5 + PDA_RETX] = r6;
-#endif
+
+       r6 = SEQSTAT;
+       [p5 + PDA_SEQSTAT] = r6;
+
        /* Save the state of single stepping */
        r6 = SYSCFG;
        [p5 + PDA_SYSCFG] = r6;
        r6 = [p5 + PDA_SYSCFG];
        [sp + PT_SYSCFG] = r6;
 
+       r6 = [p5 + PDA_SEQSTAT]; /* Read back seqstat */
+       [sp + PT_SEQSTAT] = r6;
+
        /* Restore the hardware error vector.  */
        r7.h = _evt_ivhw;
        r7.l = _evt_ivhw;
         */
        EX_SCRATCH_REG = sp;
        GET_PDA_SAFE(sp);
-       sp = [sp + PDA_EXSTACK]
+       sp = [sp + PDA_EXSTACK];
        /* Try to deal with syscalls quickly.  */
        [--sp] = ASTAT;
        [--sp] = (R7:6,P5:4);
        p4.l = lo(DCPLB_FAULT_ADDR);
        p4.h = hi(DCPLB_FAULT_ADDR);
        r7 = [p4];
-       [p5 + PDA_DCPLB] = r7;
+       [p5 + PDA_DF_DCPLB] = r7;
 
        p4.l = lo(ICPLB_FAULT_ADDR);
        p4.h = hi(ICPLB_FAULT_ADDR);
        r7 = [p4];
-       [p5 + PDA_ICPLB] = r7;
+       [p5 + PDA_DF_ICPLB] = r7;
 
-       r6 = retx;
-       [p5 + PDA_RETX] = r6;
+       r7 = retx;
+       [p5 + PDA_DF_RETX] = r7;
 
        r7 = SEQSTAT;           /* reason code is in bit 5:0 */
-       [p5 + PDA_SEQSTAT] = r7;
+       [p5 + PDA_DF_SEQSTAT] = r7;
 #else
        r7 = SEQSTAT;           /* reason code is in bit 5:0 */
 #endif
 
         * below
         */
        GET_PDA(p0, r0);
-       r6 = [p0 + PDA_RETX];
+       r6 = [p0 + PDA_DF_RETX];
        p1.l = _init_saved_retx;
        p1.h = _init_saved_retx;
        [p1] = r6;
 
-       r6 = [p0 + PDA_DCPLB];
+       r6 = [p0 + PDA_DF_DCPLB];
        p1.l = _init_saved_dcplb_fault_addr;
        p1.h = _init_saved_dcplb_fault_addr;
        [p1] = r6;
 
-       r6 = [p0 + PDA_ICPLB];
+       r6 = [p0 + PDA_DF_ICPLB];
        p1.l = _init_saved_icplb_fault_addr;
        p1.h = _init_saved_icplb_fault_addr;
        [p1] = r6;
 
-       r6 = [p0 + PDA_SEQSTAT];
+       r6 = [p0 + PDA_DF_SEQSTAT];
        p1.l = _init_saved_seqstat;
        p1.h = _init_saved_seqstat;
        [p1] = r6;