Blackfin arch: get oprofile work for user space
[linux-2.6.git] / arch / blackfin / mach-common / interrupt.S
index 647f0f5..2604b53 100644 (file)
@@ -152,6 +152,12 @@ ENTRY(_evt_ivhw)
 1:
 #endif
 
+       # We are going to dump something out, so make sure we print IPEND properly
+       p2.l = lo(IPEND);
+       p2.h = hi(IPEND);
+       r0 = [p2];
+       [sp + PT_IPEND] = r0;
+
 #ifdef CONFIG_HARDWARE_PM
        r7 = [sp + PT_SEQSTAT];
        r7 = r7 >>> 0xe;
@@ -161,11 +167,6 @@ ENTRY(_evt_ivhw)
        cc = r7 == r5;
        if cc jump .Lcall_do_ovf; /* deal with performance counter overflow */
 #endif
-       # We are going to dump something out, so make sure we print IPEND properly
-       p2.l = lo(IPEND);
-       p2.h = hi(IPEND);
-       r0 = [p2];
-       [sp + PT_IPEND] = r0;
 
        /* set the EXCAUSE to HWERR for trap_c */
        r0 = [sp + PT_SEQSTAT];
@@ -179,7 +180,16 @@ ENTRY(_evt_ivhw)
        call _trap_c;
        SP += 12;
 
+#ifdef EBIU_ERRMST
+       /* make sure EBIU_ERRMST is clear */
+       p0.l = LO(EBIU_ERRMST);
+       p0.h = HI(EBIU_ERRMST);
+       r0.l = (CORE_ERROR | CORE_MERROR);
+       w[p0] = r0.l;
+#endif
+
        call _ret_from_exception;
+
 .Lcommon_restore_all_sys:
        RESTORE_ALL_SYS
        rti;
@@ -187,6 +197,7 @@ ENTRY(_evt_ivhw)
 #ifdef CONFIG_HARDWARE_PM
 .Lcall_do_ovf:
 
+       R0 = SP;
        SP += -12;
        call _pm_overflow;
        SP += 12;