diff --git a/rpcs3/Emu/CPU/CPUThread.cpp b/rpcs3/Emu/CPU/CPUThread.cpp index 4267e56f91..1f318b8abc 100644 --- a/rpcs3/Emu/CPU/CPUThread.cpp +++ b/rpcs3/Emu/CPU/CPUThread.cpp @@ -1,5 +1,6 @@ #include "stdafx.h" #include "Emu/SysCalls/ErrorCodes.h" +#include "Emu/SysCalls/SysCalls.h" #include "Utilities/Log.h" #include "Emu/Memory/Memory.h" #include "Emu/System.h" @@ -285,8 +286,8 @@ void _se_translator(unsigned int u, EXCEPTION_POINTERS* pExp) // TODO: allow recovering from a page fault //GetCurrentPPUThread().Stop(); Emu.Pause(); - throw fmt::Format("Access violation: addr = 0x%x (last_syscall=0x%llx)", - (u32)addr, (u64)GetCurrentCPUThread()->m_last_syscall); + throw fmt::Format("Access violation: addr = 0x%x (last_syscall=0x%llx (%s))", + (u32)addr, (u64)GetCurrentCPUThread()->m_last_syscall, SysCalls::GetHLEFuncName((u64)GetCurrentCPUThread()->m_last_syscall).c_str()); } else { diff --git a/rpcs3/Emu/Memory/Memory.h b/rpcs3/Emu/Memory/Memory.h index 6ed79d3b55..0c230593d2 100644 --- a/rpcs3/Emu/Memory/Memory.h +++ b/rpcs3/Emu/Memory/Memory.h @@ -266,13 +266,13 @@ public: #endif { m_base_addr = nullptr; - LOG_ERROR(MEMORY, "Initialing memory failed"); + LOG_ERROR(MEMORY, "Initializing memory failed"); assert(0); return; } else { - LOG_NOTICE(MEMORY, "Initialing memory: m_base_addr = 0x%llx", (u64)m_base_addr); + LOG_NOTICE(MEMORY, "Initializing memory: m_base_addr = 0x%llx", (u64)m_base_addr); } switch(type) diff --git a/rpcs3/Emu/SysCalls/Modules/cellSpurs.cpp b/rpcs3/Emu/SysCalls/Modules/cellSpurs.cpp index 41be2f8084..76a8f423ca 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellSpurs.cpp +++ b/rpcs3/Emu/SysCalls/Modules/cellSpurs.cpp @@ -471,7 +471,7 @@ int cellSpursEventFlagGetClearMode(mem_ptr_t eventFlag, mem3 int cellSpursEventFlagGetTasksetAddress(mem_ptr_t eventFlag, mem_ptr_t taskset) { - cellSpurs->Todo("cellSpursEventFlagTryWait(eventFlag_addr=0x%x, taskset_addr=0x%x)", eventFlag.GetAddr(), taskset.GetAddr()); + cellSpurs->Todo("cellSpursEventFlagGetTasksetAddress(eventFlag_addr=0x%x, taskset_addr=0x%x)", eventFlag.GetAddr(), taskset.GetAddr()); if (eventFlag.GetAddr() % 128 != 0) { @@ -716,9 +716,23 @@ int cellSpursTasksetAttributeSetName() return CELL_OK; } -int _cellSpursTasksetAttribute2Initialize() +int _cellSpursTasksetAttribute2Initialize(mem_ptr_t attribute, u32 revision) { - UNIMPLEMENTED_FUNC(cellSpurs); + cellSpurs->Warning("_cellSpursTasksetAttribute2Initialize(attribute_addr=0x%x, revision=%d)", attribute.GetAddr(), revision); + + attribute->revision = revision; + attribute->name_addr = NULL; + attribute->argTaskset = 0; + + for (int i = 0; i < 8; i++) + { + attribute->priority[i] = 1; + } + + attribute->maxContention = 8; + attribute->enableClearLs = 0; + attribute->CellSpursTaskNameBuffer_addr = 0; + return CELL_OK; } @@ -770,9 +784,26 @@ int cellSpursTaskAttributeSetExitCodeContainer() return CELL_OK; } -int _cellSpursTaskAttribute2Initialize() +int _cellSpursTaskAttribute2Initialize(mem_ptr_t attribute, u32 revision) { - UNIMPLEMENTED_FUNC(cellSpurs); + cellSpurs->Warning("_cellSpursTaskAttribute2Initialize(attribute_addr=0x%x, revision=%d)", attribute.GetAddr(), revision); + + attribute->revision = revision; + attribute->sizeContext = 0; + attribute->eaContext = NULL; + + for (int c = 0; c < 4; c++) + { + attribute->lsPattern.u32[c] = 0; + } + + for (int i = 0; i < 2; i++) + { + attribute->lsPattern.u64[i] = 0; + } + + attribute->name_addr = 0; + return CELL_OK; } diff --git a/rpcs3/Emu/SysCalls/Modules/cellSpurs.h b/rpcs3/Emu/SysCalls/Modules/cellSpurs.h index 633da2d541..13d56dfaef 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellSpurs.h +++ b/rpcs3/Emu/SysCalls/Modules/cellSpurs.h @@ -26,30 +26,30 @@ enum CELL_SPURS_TASK_ERROR_PERM = 0x80410909, CELL_SPURS_TASK_ERROR_BUSY = 0x8041090A, CELL_SPURS_TASK_ERROR_FAULT = 0x8041090D, - CELL_SPURS_TASK_ERROR_STAT = 0x8041090F, CELL_SPURS_TASK_ERROR_ALIGN = 0x80410910, + CELL_SPURS_TASK_ERROR_STAT = 0x8041090F, CELL_SPURS_TASK_ERROR_NULL_POINTER = 0x80410911, CELL_SPURS_TASK_ERROR_FATAL = 0x80410914, - CELL_SPURS_TASK_ERROR_SHUTDOWN = 0x80410920, + CELL_SPURS_TASK_ERROR_SHUTDOWN = 0x80410920, }; // Core CellSpurs structures. struct CellSpurs -{ - SPURSManager *spurs; +{ + SPURSManager *spurs; }; struct CellSpurs2 -{ +{ SPURSManager *spurs; }; struct CellSpursAttribute -{ - SPURSManagerAttribute *attr; +{ + SPURSManagerAttribute *attr; }; -struct CellSpursEventFlag +struct CellSpursEventFlag { SPURSManagerEventFlag *eventFlag; }; @@ -60,87 +60,87 @@ struct CellSpursTaskset }; struct CellSpursInfo -{ +{ be_t nSpus; be_t spuThreadGroupPriority; - be_t ppuThreadPriority; - bool exitIfNoWork; - bool spurs2; + be_t ppuThreadPriority; + bool exitIfNoWork; + bool spurs2; be_t traceBuffer_addr; //void *traceBuffer; - be_t traceBufferSize; - be_t traceMode; + be_t traceBufferSize; + be_t traceMode; be_t spuThreadGroup; //typedef u32 sys_spu_thread_group_t; be_t spuThreads[8]; //typedef u32 sys_spu_thread_t; - be_t spursHandlerThread0; - be_t spursHandlerThread1; - s8 namePrefix[CELL_SPURS_NAME_MAX_LENGTH+1]; - be_t namePrefixLength; - be_t deadlineMissCounter; - be_t deadlineMeetCounter; - //u8 padding[]; + be_t spursHandlerThread0; + be_t spursHandlerThread1; + s8 namePrefix[CELL_SPURS_NAME_MAX_LENGTH+1]; + be_t namePrefixLength; + be_t deadlineMissCounter; + be_t deadlineMeetCounter; + //u8 padding[]; }; -struct CellSpursExceptionInfo -{ - be_t spu_thread; - be_t spu_npc; - be_t cause; - be_t option; +struct CellSpursExceptionInfo +{ + be_t spu_thread; + be_t spu_npc; + be_t cause; + be_t option; }; struct CellSpursTraceInfo -{ - be_t spu_thread[8]; - be_t count[8]; - be_t spu_thread_grp; - be_t nspu; - //u8 padding[]; +{ + be_t spu_thread[8]; + be_t count[8]; + be_t spu_thread_grp; + be_t nspu; + //u8 padding[]; }; -struct CellTraceHeader -{ - u8 tag; - u8 length; - u8 cpu; - u8 thread; - be_t time; +struct CellTraceHeader +{ + u8 tag; + u8 length; + u8 cpu; + u8 thread; + be_t time; }; struct CellSpursTracePacket -{ +{ struct header_struct - { - u8 tag; - u8 length; - u8 spu; - u8 workload; - be_t time; + { + u8 tag; + u8 length; + u8 spu; + u8 workload; + be_t time; } header; struct data_struct { struct load_struct - { - be_t ea; - be_t ls; - be_t size; - } load; + { + be_t ea; + be_t ls; + be_t size; + } load; struct map_struct - { - be_t offset; - be_t ls; - be_t size; - } map; + { + be_t offset; + be_t ls; + be_t size; + } map; struct start_struct - { + { s8 module[4]; - be_t level; - be_t ls; - } start; + be_t level; + be_t ls; + } start; - be_t user; + be_t user; be_t guid; } data; }; @@ -152,94 +152,94 @@ typedef void (*CellSpursGlobalExceptionEventHandler)(mem_ptr_t spurs, typedef void (*CellSpursTasksetExceptionEventHandler)(mem_ptr_t spurs, mem_ptr_t taskset, u32 idTask, const mem_ptr_t info, mem_ptr_t arg); -struct CellSpursTasksetInfo -{ - //CellSpursTaskInfo taskInfo[CELL_SPURS_MAX_TASK]; - be_t argument; - be_t idWorkload; +struct CellSpursTasksetInfo +{ + //CellSpursTaskInfo taskInfo[CELL_SPURS_MAX_TASK]; + be_t argument; + be_t idWorkload; be_t idLastScheduledTask; //typedef unsigned CellSpursTaskId - be_t name_addr; - CellSpursTasksetExceptionEventHandler exceptionEventHandler; + be_t name_addr; + CellSpursTasksetExceptionEventHandler exceptionEventHandler; be_t exceptionEventHandlerArgument_addr; //void *exceptionEventHandlerArgument - be_t sizeTaskset; - //be_t reserved[]; + be_t sizeTaskset; + //be_t reserved[]; }; -struct CellSpursTaskset2 +struct CellSpursTaskset2 { be_t skip[10496]; }; -struct CellSpursTasksetAttribute2 -{ - be_t revision; - be_t name_addr; - be_t argTaskset; - u8 priority[8]; - be_t maxContention; - be_t enableClearLs; +struct CellSpursTasksetAttribute2 +{ + be_t revision; + be_t name_addr; + be_t argTaskset; + u8 priority[8]; + be_t maxContention; + be_t enableClearLs; be_t CellSpursTaskNameBuffer_addr; //??? *taskNameBuffer - //be_t __reserved__[]; + //be_t __reserved__[]; }; // cellSpurs task structures. -struct CellSpursTaskNameBuffer -{ - char taskName[CELL_SPURS_MAX_TASK][CELL_SPURS_MAX_TASK_NAME_LENGTH]; +struct CellSpursTaskNameBuffer +{ + char taskName[CELL_SPURS_MAX_TASK][CELL_SPURS_MAX_TASK_NAME_LENGTH]; }; -struct CellSpursTraceTaskData -{ - be_t incident; - be_t task; +struct CellSpursTraceTaskData +{ + be_t incident; + be_t task; }; typedef be_t be_u32; typedef be_t be_u64; -struct CellSpursTaskArgument -{ - be_u32 u32[4]; - be_u64 u64[2]; -}; - -struct CellSpursTaskLsPattern +struct CellSpursTaskArgument { be_u32 u32[4]; be_u64 u64[2]; }; -struct CellSpursTaskAttribute2 -{ - be_t revision; - be_t sizeContext; - be_t eaContext; - CellSpursTaskLsPattern lsPattern; //??? - be_t name_addr; - //be_t __reserved__[]; +struct CellSpursTaskLsPattern +{ + be_u32 u32[4]; + be_u64 u64[2]; }; -struct CellSpursTaskExitCode +struct CellSpursTaskAttribute2 +{ + be_t revision; + be_t sizeContext; + be_t eaContext; + CellSpursTaskLsPattern lsPattern; + be_t name_addr; + //be_t __reserved__[]; +}; + +struct CellSpursTaskExitCode { unsigned char skip[128]; }; -struct CellSpursTaskInfo -{ - CellSpursTaskLsPattern lsPattern; - CellSpursTaskArgument argument; +struct CellSpursTaskInfo +{ + CellSpursTaskLsPattern lsPattern; + CellSpursTaskArgument argument; const be_t eaElf_addr; //void *eaElf const be_t eaContext_addr; //void *eaContext - be_t sizeContext; - be_t state; - be_t hasSignal; - const be_t CellSpursTaskExitCode_addr; - u8 guid[8]; - //be_t reserved[]; + be_t sizeContext; + be_t state; + be_t hasSignal; + const be_t CellSpursTaskExitCode_addr; + u8 guid[8]; + //be_t reserved[]; }; -struct CellSpursTaskBinInfo -{ +struct CellSpursTaskBinInfo +{ be_t eaElf; be_t sizeContext; be_t __reserved__;