From 7007e002e6dd3c54d88081da9b2ac4150cb7c7a2 Mon Sep 17 00:00:00 2001 From: joevt Date: Thu, 23 Nov 2023 19:03:27 -0800 Subject: [PATCH] macio: Make interrupt flags atomic. So they can be modified by other threads. --- devices/ioctrl/grandcentral.cpp | 6 ++++++ devices/ioctrl/heathrow.cpp | 7 +++++-- devices/ioctrl/macio.h | 16 ++++++++-------- devices/ioctrl/ohare.cpp | 4 +++- 4 files changed, 22 insertions(+), 11 deletions(-) diff --git a/devices/ioctrl/grandcentral.cpp b/devices/ioctrl/grandcentral.cpp index ee6af53..3f4c642 100644 --- a/devices/ioctrl/grandcentral.cpp +++ b/devices/ioctrl/grandcentral.cpp @@ -446,6 +446,12 @@ uint32_t GrandCentral::register_dma_int(IntSrc src_id) { void GrandCentral::ack_int_common(uint32_t irq_id, uint8_t irq_line_state) { // native mode: set IRQ bits in int_events1 on a 0-to-1 transition // emulated mode: set IRQ bits in int_events1 on all transitions +#if 1 + if (irq_id & ~(INT_TO_IRQ_ID(0x12) | INT_TO_IRQ_ID(0x1A))) + LOG_F(INTERRUPT, "%s: native interrupt mask:%08x events:%08x levels:%08x change:%08x state:%d", + this->name.c_str(), this->int_mask, this->int_events + 0, this->int_levels + 0, irq_id, irq_line_state + ); +#endif if ((this->int_mask & MACIO_INT_MODE) || (irq_line_state && !(this->int_levels & irq_id))) { this->int_events |= irq_id; diff --git a/devices/ioctrl/heathrow.cpp b/devices/ioctrl/heathrow.cpp index 6ccb089..a6341b1 100644 --- a/devices/ioctrl/heathrow.cpp +++ b/devices/ioctrl/heathrow.cpp @@ -443,7 +443,9 @@ void HeathrowIC::ack_int(uint32_t irq_id, uint8_t irq_line_state) if (!IS_INT1(irq_id)) { // does this irq_id belong to the second set? IRQ_ID_TO_INT2_MASK(irq_id); #if 0 - LOG_F(INFO, "%s: native interrupt events:%08x.%08x levels:%08x.%08x change2:%08x state:%d", this->name.c_str(), this->int_events1, this->int_events2, this->int_levels1, this->int_levels2, irq_id, irq_line_state); + LOG_F(INFO, "%s: native interrupt events:%08x.%08x levels:%08x.%08x change2:%08x state:%d", + this->name.c_str(), this->int_events1 + 0, this->int_events2 + 0, this->int_levels1 + 0, this->int_levels2 + 0, irq_id, irq_line_state + ); #endif // native mode: set IRQ bits in int_events2 on a 0-to-1 transition // emulated mode: set IRQ bits in int_events2 on all transitions @@ -465,7 +467,8 @@ void HeathrowIC::ack_int(uint32_t irq_id, uint8_t irq_line_state) // native mode: set IRQ bits in int_events1 on a 0-to-1 transition // emulated mode: set IRQ bits in int_events1 on all transitions #if 0 - LOG_F(INFO, "%s: native interrupt events:%08x.%08x levels:%08x.%08x change1:%08x state:%d", this->name.c_str(), this->int_events1, this->int_events2, this->int_levels1, this->int_levels2, irq_id, irq_line_state); + LOG_F(INFO, "%s: native interrupt events:%08x.%08x levels:%08x.%08x change1:%08x state:%d", + this->name.c_str(), this->int_events1 + 0, this->int_events2 + 0, this->int_levels1 + 0, this->int_levels2 + 0, irq_id, irq_line_state); #endif if ((this->int_mask1 & MACIO_INT_MODE) || (irq_line_state && !(this->int_levels1 & irq_id))) { diff --git a/devices/ioctrl/macio.h b/devices/ioctrl/macio.h index f06bd5f..ffd494d 100644 --- a/devices/ioctrl/macio.h +++ b/devices/ioctrl/macio.h @@ -162,8 +162,8 @@ private: // interrupt state uint32_t int_mask = 0; - uint32_t int_levels = 0; - uint32_t int_events = 0; + std::atomic int_levels{0}; + std::atomic int_events{0}; bool cpu_int_latch = false; // IOBus devices @@ -230,8 +230,8 @@ private: // interrupt state uint32_t int_mask = 0; - uint32_t int_levels = 0; - uint32_t int_events = 0; + std::atomic int_levels{0}; + std::atomic int_events{0}; bool cpu_int_latch = false; std::unique_ptr awacs; // AWACS audio codec instance @@ -324,12 +324,12 @@ protected: private: uint32_t base_addr = 0; - uint32_t int_events2 = 0; + std::atomic int_events2{0}; uint32_t int_mask2 = 0; - uint32_t int_levels2 = 0; - uint32_t int_events1 = 0; + std::atomic int_levels2{0}; + std::atomic int_events1{0}; uint32_t int_mask1 = 0; - uint32_t int_levels1 = 0; + std::atomic int_levels1{0}; uint32_t feat_ctrl = 0; // features control register uint32_t aux_ctrl = 0; // aux features control register bool cpu_int_latch = false; diff --git a/devices/ioctrl/ohare.cpp b/devices/ioctrl/ohare.cpp index 7b74765..6ef90f6 100644 --- a/devices/ioctrl/ohare.cpp +++ b/devices/ioctrl/ohare.cpp @@ -234,7 +234,9 @@ void OHare::ack_int(uint32_t irq_id, uint8_t irq_line_state) // native mode: set IRQ bits in int_events1 on a 0-to-1 transition // emulated mode: set IRQ bits in int_events1 on all transitions #if 1 - LOG_F(INTERRUPT, "%s: native interrupt mask:%08x events:%08x levels:%08x change:%08x state:%d", this->name.c_str(), this->int_mask, this->int_events, this->int_levels, irq_id, irq_line_state); + LOG_F(INTERRUPT, "%s: native interrupt mask:%08x events:%08x levels:%08x change:%08x state:%d", + this->name.c_str(), this->int_mask, this->int_events + 0, this->int_levels + 0, irq_id, irq_line_state + ); #endif if ((this->int_mask & MACIO_INT_MODE) || (irq_line_state && !(this->int_levels & irq_id))) {