--- a/include/asm-mips/hazards.h +++ b/include/asm-mips/hazards.h @@ -64,7 +64,7 @@ _ehb ) ASMMACRO(back_to_back_c0_hazard, - _ehb + _ssnop; _ssnop; _ssnop; _ehb ) /* * gcc has a tradition of misscompiling the previous construct using the --- a/arch/mips/kernel/cevt-r4k.c +++ b/arch/mips/kernel/cevt-r4k.c @@ -187,7 +187,7 @@ */ if (c0_compare_int_pending()) { write_c0_compare(read_c0_count()); - irq_disable_hazard(); + back_to_back_c0_hazard(); if (c0_compare_int_pending()) return 0; } @@ -196,7 +196,7 @@ cnt = read_c0_count(); cnt += delta; write_c0_compare(cnt); - irq_disable_hazard(); + back_to_back_c0_hazard(); if ((int)(read_c0_count() - cnt) < 0) break; /* increase delta if the timer was already expired */ @@ -205,11 +205,12 @@ while ((int)(read_c0_count() - cnt) <= 0) ; /* Wait for expiry */ + back_to_back_c0_hazard(); if (!c0_compare_int_pending()) return 0; write_c0_compare(read_c0_count()); - irq_disable_hazard(); + back_to_back_c0_hazard(); if (c0_compare_int_pending()) return 0;