46 lines
1.1 KiB
Diff
46 lines
1.1 KiB
Diff
--- 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;
|
|
|