# UNDF: UNDF-2026-000001144 --- a/Source/iop/IopBios.h +++ b/Source/iop/IopBios.h @@ -670,6 +670,7 @@ private: IntrHandlerList m_intrHandlers; VblankHandlerList m_vblankHandlers; + std::array m_intrHandlerIndex; --- a/Source/iop/IopBios.cpp +++ b/Source/iop/IopBios.cpp @@ -159,6 +159,7 @@ void CIopBios::Reset(const BiosDebugInfoProviderPtr& debugInfoProvider) m_intrHandlers.FreeAll(); + m_intrHandlerIndex.fill(-1); m_vblankHandlers.FreeAll(); @@ -3054,6 +3054,7 @@ int32 CIopBios::RegisterIntrHandler(uint32 line, uint32 mode, uint32 handler, uint32 arg) assert(FindIntrHandler(line) == -1); if(FindIntrHandler(line) != -1) { return KERNEL_RESULT_ERROR_FOUND_HANDLER; } if(line >= Iop::CIntc::LINES_MAX) { return KERNEL_RESULT_ERROR_ILLEGAL_INTRCODE; } //Registering a null handler is a no-op if(handler == 0) { return KERNEL_RESULT_OK; } uint32 handlerId = m_intrHandlers.Allocate(); assert(handlerId != -1); if(handlerId == -1) { return KERNEL_RESULT_ERROR; } auto intrHandler = m_intrHandlers[handlerId]; intrHandler->line = line; intrHandler->mode = mode; intrHandler->handler = handler; intrHandler->arg = arg; + m_intrHandlerIndex[line] = static_cast(handlerId); return KERNEL_RESULT_OK; } @@ -3089,6 +3089,7 @@ int32 CIopBios::ReleaseIntrHandler(uint32 line) uint32 handlerId = FindIntrHandler(line); if(handlerId == -1) { return KERNEL_RESULT_ERROR_NOTFOUND_HANDLER; } m_intrHandlers.Free(handlerId); + m_intrHandlerIndex[line] = -1; return KERNEL_RESULT_OK; } @@ -3106,11 +3106,7 @@ int32 CIopBios::FindIntrHandler(uint32 line) -{ - for(auto handlerIterator = std::begin(m_intrHandlers); handlerIterator != std::end(m_intrHandlers); handlerIterator++) - { - auto handler = m_intrHandlers[handlerIterator]; - if(!handler) continue; - if(handler->line == line) return handlerIterator; - } - return -1; -} +{ + if(line >= Iop::CIntc::LINES_MAX) return -1; + return m_intrHandlerIndex[line]; +}