76 lines
2 KiB
Diff
76 lines
2 KiB
Diff
# 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<int32, Iop::CIntc::LINES_MAX> 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<int32>(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];
|
|
+}
|