Index: sys/arm64/arm64/gic_v3.c =================================================================== --- sys/arm64/arm64/gic_v3.c +++ sys/arm64/arm64/gic_v3.c @@ -48,6 +48,7 @@ #include #include +#include #include #include "pic_if.h" @@ -230,7 +231,19 @@ uint64_t active_irq; while (1) { + if (CPU_MATCH(CPU_IMPL_MASK | CPU_PART_MASK, + CPU_IMPL_CAVIUM, CPU_PART_THUNDER, 0, 0)) { + /* + * Hardware: Cavium ThunderX + * Chip revision: Pass 1.0, Pass 1.1 + * ERRATUM: 22978, 23154 + */ + __asm __volatile("nop;nop;nop;nop;nop;nop;nop;nop;\n" + "mrs %0, ICC_IAR1_EL1\n" + "nop;nop;nop;nop;dsb sy;" : "=&r" (active_irq)); + } else { active_irq = gic_icc_read(IAR1); + } if (__predict_false(active_irq == ICC_IAR1_EL1_SPUR)) break;