java-topology/defects/play-0001/patch/play-0001.patch

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];
+}