From 293f276f873e8f149a9692dd57f5615cbe631e34 Mon Sep 17 00:00:00 2001 From: Nekotekina Date: Tue, 19 Aug 2014 01:16:48 +0400 Subject: [PATCH] Some headers defined --- rpcs3/Emu/SysCalls/Modules/cellSync.cpp | 381 +++++++++++++----------- rpcs3/Emu/SysCalls/Modules/cellSync.h | 22 +- 2 files changed, 232 insertions(+), 171 deletions(-) diff --git a/rpcs3/Emu/SysCalls/Modules/cellSync.cpp b/rpcs3/Emu/SysCalls/Modules/cellSync.cpp index 8a853772c2..00f6c79479 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellSync.cpp +++ b/rpcs3/Emu/SysCalls/Modules/cellSync.cpp @@ -16,10 +16,8 @@ Module *cellSync = nullptr; u32 libsre = 0; #endif -s32 cellSyncMutexInitialize(mem_ptr_t mutex) +s32 syncMutexInitialize(mem_ptr_t mutex) { - cellSync->Log("cellSyncMutexInitialize(mutex_addr=0x%x)", mutex.GetAddr()); - if (!mutex) { return CELL_SYNC_ERROR_NULL_POINTER; @@ -35,6 +33,13 @@ s32 cellSyncMutexInitialize(mem_ptr_t mutex) return CELL_OK; } +s32 cellSyncMutexInitialize(mem_ptr_t mutex) +{ + cellSync->Log("cellSyncMutexInitialize(mutex_addr=0x%x)", mutex.GetAddr()); + + return syncMutexInitialize(mutex); +} + s32 cellSyncMutexLock(mem_ptr_t mutex) { cellSync->Log("cellSyncMutexLock(mutex_addr=0x%x)", mutex.GetAddr()); @@ -139,10 +144,8 @@ s32 cellSyncMutexUnlock(mem_ptr_t mutex) return CELL_OK; } -s32 cellSyncBarrierInitialize(mem_ptr_t barrier, u16 total_count) +s32 syncBarrierInitialize(mem_ptr_t barrier, u16 total_count) { - cellSync->Log("cellSyncBarrierInitialize(barrier_addr=0x%x, total_count=%d)", barrier.GetAddr(), total_count); - if (!barrier) { return CELL_SYNC_ERROR_NULL_POINTER; @@ -163,6 +166,13 @@ s32 cellSyncBarrierInitialize(mem_ptr_t barrier, u16 total_coun return CELL_OK; } +s32 cellSyncBarrierInitialize(mem_ptr_t barrier, u16 total_count) +{ + cellSync->Log("cellSyncBarrierInitialize(barrier_addr=0x%x, total_count=%d)", barrier.GetAddr(), total_count); + + return syncBarrierInitialize(barrier, total_count); +} + s32 cellSyncBarrierNotify(mem_ptr_t barrier) { cellSync->Log("cellSyncBarrierNotify(barrier_addr=0x%x)", barrier.GetAddr()); @@ -335,10 +345,8 @@ s32 cellSyncBarrierTryWait(mem_ptr_t barrier) return CELL_OK; } -s32 cellSyncRwmInitialize(mem_ptr_t rwm, u32 buffer_addr, u32 buffer_size) +s32 syncRwmInitialize(mem_ptr_t rwm, u32 buffer_addr, u32 buffer_size) { - cellSync->Log("cellSyncRwmInitialize(rwm_addr=0x%x, buffer_addr=0x%x, buffer_size=0x%x)", rwm.GetAddr(), buffer_addr, buffer_size); - if (!rwm || !buffer_addr) { return CELL_SYNC_ERROR_NULL_POINTER; @@ -360,6 +368,13 @@ s32 cellSyncRwmInitialize(mem_ptr_t rwm, u32 buffer_addr, u32 buffe return CELL_OK; } +s32 cellSyncRwmInitialize(mem_ptr_t rwm, u32 buffer_addr, u32 buffer_size) +{ + cellSync->Log("cellSyncRwmInitialize(rwm_addr=0x%x, buffer_addr=0x%x, buffer_size=0x%x)", rwm.GetAddr(), buffer_addr, buffer_size); + + return syncRwmInitialize(rwm, buffer_addr, buffer_size); +} + s32 cellSyncRwmRead(mem_ptr_t rwm, u32 buffer_addr) { cellSync->Log("cellSyncRwmRead(rwm_addr=0x%x, buffer_addr=0x%x)", rwm.GetAddr(), buffer_addr); @@ -545,10 +560,8 @@ s32 cellSyncRwmTryWrite(mem_ptr_t rwm, u32 buffer_addr) return CELL_OK; } -s32 cellSyncQueueInitialize(mem_ptr_t queue, u32 buffer_addr, u32 size, u32 depth) +s32 syncQueueInitialize(mem_ptr_t queue, u32 buffer_addr, u32 size, u32 depth) { - cellSync->Log("cellSyncQueueInitialize(queue_addr=0x%x, buffer_addr=0x%x, size=0x%x, depth=0x%x)", queue.GetAddr(), buffer_addr, size, depth); - if (!queue) { return CELL_SYNC_ERROR_NULL_POINTER; @@ -575,6 +588,13 @@ s32 cellSyncQueueInitialize(mem_ptr_t queue, u32 buffer_addr, u32 return CELL_OK; } +s32 cellSyncQueueInitialize(mem_ptr_t queue, u32 buffer_addr, u32 size, u32 depth) +{ + cellSync->Log("cellSyncQueueInitialize(queue_addr=0x%x, buffer_addr=0x%x, size=0x%x, depth=0x%x)", queue.GetAddr(), buffer_addr, size, depth); + + return syncQueueInitialize(queue, buffer_addr, size, depth); +} + s32 cellSyncQueuePush(mem_ptr_t queue, u32 buffer_addr) { cellSync->Log("cellSyncQueuePush(queue_addr=0x%x, buffer_addr=0x%x)", queue.GetAddr(), buffer_addr); @@ -1008,6 +1028,168 @@ void syncLFQueueDump(mem_ptr_t queue) } } +void syncLFQueueInit(mem_ptr_t queue, u32 buffer_addr, u32 size, u32 depth, CellSyncQueueDirection direction, u32 eaSignal_addr) +{ + queue->m_h1 = 0; + queue->m_h2 = 0; + queue->m_h4 = 0; + queue->m_h5 = 0; + queue->m_h6 = 0; + queue->m_h8 = 0; + queue->m_size = size; + queue->m_depth = depth; + queue->m_buffer = (u64)buffer_addr; + queue->m_direction = direction; + for (u32 i = 0; i < sizeof(queue->m_hs) / sizeof(queue->m_hs[0]); i++) + { + queue->m_hs[i] = 0; + } + queue->m_eaSignal = (u64)eaSignal_addr; + + if (direction == CELL_SYNC_QUEUE_ANY2ANY) + { + queue->m_h3 = 0; + queue->m_h7 = 0; + queue->m_buffer = (u64)buffer_addr | 1; + queue->m_bs[0] = -1; + queue->m_bs[1] = -1; + //m_bs[2] + //m_bs[3] + queue->m_v1 = -1; + queue->m_hs[0] = -1; + queue->m_hs[16] = -1; + queue->m_v2 = 0; + queue->m_v3 = 0; + } + else + { + //m_h3 + //m_h7 + queue->m_bs[0] = -1; // written as u32 + queue->m_bs[1] = -1; + queue->m_bs[2] = -1; + queue->m_bs[3] = -1; + queue->m_v1 = 0; + queue->m_v2 = 0; // written as u64 + queue->m_v3 = 0; + } +} + +s32 syncLFQueueInitialize(mem_ptr_t queue, u32 buffer_addr, u32 size, u32 depth, CellSyncQueueDirection direction, u32 eaSignal_addr) +{ +#ifdef PRX_DEBUG_XXX + return GetCurrentPPUThread().FastCall(libsre + 0x205C, queue.GetAddr(), buffer_addr, size, depth, direction, eaSignal_addr); +#else + + if (!queue) + { + return CELL_SYNC_ERROR_NULL_POINTER; + } + if (size) + { + if (!buffer_addr) + { + return CELL_SYNC_ERROR_NULL_POINTER; + } + if (size > 0x4000 || size % 16) + { + return CELL_SYNC_ERROR_INVAL; + } + } + if (!depth || (depth >> 15) || direction > 3) + { + return CELL_SYNC_ERROR_INVAL; + } + if (queue.GetAddr() % 128 || buffer_addr % 16) + { + return CELL_SYNC_ERROR_ALIGN; + } + + // prx: get sdk version of current process, return non-zero result of sys_process_get_sdk_version + s32 sdk_ver; + s32 ret = process_get_sdk_version(process_getpid(), sdk_ver); + if (ret != CELL_OK) + { + return ret; + } + if (sdk_ver == -1) + { + sdk_ver = 0x460000; + } + + // prx: reserve u32 at 0x2c offset + u32 old_value; + while (true) + { + const u32 old_data = queue->m_data(); + CellSyncLFQueue new_data; + new_data.m_data() = old_data; + + if (old_data) + { + if (sdk_ver > 0x17ffff && old_data != se32(2)) + { + return CELL_SYNC_ERROR_STAT; + } + old_value = old_data; + } + else + { + if (sdk_ver > 0x17ffff) + { + for (u32 i = 0; i < sizeof(CellSyncLFQueue) / sizeof(u64); i++) + { + if ((u64&)Memory[queue.GetAddr() + i * sizeof(u64)]) + { + return CELL_SYNC_ERROR_STAT; + } + } + } + new_data.m_data() = se32(1); + old_value = se32(1); + } + + if (InterlockedCompareExchange(&queue->m_data(), new_data.m_data(), old_data) == old_data) break; + } + + if (old_value == se32(2)) + { + if ((u32)queue->m_size != size || (u32)queue->m_depth != depth || (u64)queue->m_buffer != (u64)buffer_addr) + { + return CELL_SYNC_ERROR_INVAL; + } + if (sdk_ver > 0x17ffff) + { + if ((u64)queue->m_eaSignal != (u64)eaSignal_addr || (u32)queue->m_direction != direction) + { + return CELL_SYNC_ERROR_INVAL; + } + } + } + else + { + // prx: call internal function with same arguments + syncLFQueueInit(queue, buffer_addr, size, depth, direction, eaSignal_addr); + + // prx: sync, zeroize u32 at 0x2c offset + InterlockedCompareExchange(&queue->m_data(), 0, 0); + queue->m_data() = 0; + } + + // prx: sync + InterlockedCompareExchange(&queue->m_data(), 0, 0); + return CELL_OK; +#endif +} + +s32 cellSyncLFQueueInitialize(mem_ptr_t queue, u32 buffer_addr, u32 size, u32 depth, CellSyncQueueDirection direction, u32 eaSignal_addr) +{ + cellSync->Warning("cellSyncLFQueueInitialize(queue_addr=0x%x, buffer_addr=0x%x, size=0x%x, depth=0x%x, direction=%d, eaSignal_addr=0x%x)", + queue.GetAddr(), buffer_addr, size, depth, direction, eaSignal_addr); + + return syncLFQueueInitialize(queue, buffer_addr, size, depth, direction, eaSignal_addr); +} + s32 syncLFQueueGetPushPointer(mem_ptr_t queue, s32& pointer, u32 isBlocking, u32 useEventQueue) { if (queue->m_direction.ToBE() != se32(CELL_SYNC_QUEUE_PPU2SPU)) @@ -1789,163 +1971,6 @@ s32 _cellSyncLFQueuePopBody(mem_ptr_t queue, u32 buffer_addr, u return res; } -void syncLFQueueInitialize(mem_ptr_t queue, u32 buffer_addr, u32 size, u32 depth, CellSyncQueueDirection direction, u32 eaSignal_addr) -{ - queue->m_h1 = 0; - queue->m_h2 = 0; - queue->m_h4 = 0; - queue->m_h5 = 0; - queue->m_h6 = 0; - queue->m_h8 = 0; - queue->m_size = size; - queue->m_depth = depth; - queue->m_buffer = (u64)buffer_addr; - queue->m_direction = direction; - for (u32 i = 0; i < sizeof(queue->m_hs) / sizeof(queue->m_hs[0]); i++) - { - queue->m_hs[i] = 0; - } - queue->m_eaSignal = (u64)eaSignal_addr; - - if (direction == CELL_SYNC_QUEUE_ANY2ANY) - { - queue->m_h3 = 0; - queue->m_h7 = 0; - queue->m_buffer = (u64)buffer_addr | 1; - queue->m_bs[0] = -1; - queue->m_bs[1] = -1; - //m_bs[2] - //m_bs[3] - queue->m_v1 = -1; - queue->m_hs[0] = -1; - queue->m_hs[16] = -1; - queue->m_v2 = 0; - queue->m_v3 = 0; - } - else - { - //m_h3 - //m_h7 - queue->m_bs[0] = -1; // written as u32 - queue->m_bs[1] = -1; - queue->m_bs[2] = -1; - queue->m_bs[3] = -1; - queue->m_v1 = 0; - queue->m_v2 = 0; // written as u64 - queue->m_v3 = 0; - } -} - -s32 cellSyncLFQueueInitialize(mem_ptr_t queue, u32 buffer_addr, u32 size, u32 depth, CellSyncQueueDirection direction, u32 eaSignal_addr) -{ - cellSync->Warning("cellSyncLFQueueInitialize(queue_addr=0x%x, buffer_addr=0x%x, size=0x%x, depth=0x%x, direction=%d, eaSignal_addr=0x%x)", - queue.GetAddr(), buffer_addr, size, depth, direction, eaSignal_addr); - -#ifdef PRX_DEBUG_XXX - return GetCurrentPPUThread().FastCall(libsre + 0x205C, queue.GetAddr(), buffer_addr, size, depth, direction, eaSignal_addr); -#else - - if (!queue) - { - return CELL_SYNC_ERROR_NULL_POINTER; - } - if (size) - { - if (!buffer_addr) - { - return CELL_SYNC_ERROR_NULL_POINTER; - } - if (size > 0x4000 || size % 16) - { - return CELL_SYNC_ERROR_INVAL; - } - } - if (!depth || (depth >> 15) || direction > 3) - { - return CELL_SYNC_ERROR_INVAL; - } - if (queue.GetAddr() % 128 || buffer_addr % 16) - { - return CELL_SYNC_ERROR_ALIGN; - } - - // prx: get sdk version of current process, return non-zero result of sys_process_get_sdk_version - s32 sdk_ver; - s32 ret = process_get_sdk_version(process_getpid(), sdk_ver); - if (ret != CELL_OK) - { - return ret; - } - if (sdk_ver == -1) - { - sdk_ver = 0x460000; - } - - // prx: reserve u32 at 0x2c offset - u32 old_value; - while (true) - { - const u32 old_data = queue->m_data(); - CellSyncLFQueue new_data; - new_data.m_data() = old_data; - - if (old_data) - { - if (sdk_ver > 0x17ffff && old_data != se32(2)) - { - return CELL_SYNC_ERROR_STAT; - } - old_value = old_data; - } - else - { - if (sdk_ver > 0x17ffff) - { - for (u32 i = 0; i < sizeof(CellSyncLFQueue) / sizeof(u64); i++) - { - if ((u64&)Memory[queue.GetAddr() + i * sizeof(u64)]) - { - return CELL_SYNC_ERROR_STAT; - } - } - } - new_data.m_data() = se32(1); - old_value = se32(1); - } - - if (InterlockedCompareExchange(&queue->m_data(), new_data.m_data(), old_data) == old_data) break; - } - - if (old_value == se32(2)) - { - if ((u32)queue->m_size != size || (u32)queue->m_depth != depth || (u64)queue->m_buffer != (u64)buffer_addr) - { - return CELL_SYNC_ERROR_INVAL; - } - if (sdk_ver > 0x17ffff) - { - if ((u64)queue->m_eaSignal != (u64)eaSignal_addr || (u32)queue->m_direction != direction) - { - return CELL_SYNC_ERROR_INVAL; - } - } - } - else - { - // prx: call internal function with same arguments - syncLFQueueInitialize(queue, buffer_addr, size, depth, direction, eaSignal_addr); - - // prx: sync, zeroize u32 at 0x2c offset - InterlockedCompareExchange(&queue->m_data(), 0, 0); - queue->m_data() = 0; - } - - // prx: sync - InterlockedCompareExchange(&queue->m_data(), 0, 0); - return CELL_OK; -#endif -} - s32 cellSyncLFQueueClear(mem_ptr_t queue) { cellSync->Warning("cellSyncLFQueueClear(queue_addr=0x%x)", queue.GetAddr()); @@ -2100,16 +2125,32 @@ s32 cellSyncLFQueueGetEntrySize(mem_ptr_t queue, mem32_t entry_ return CELL_OK; } +s32 syncLFQueueAttachLv2EventQueue(mem32_ptr_t spus, u32 num, mem_ptr_t queue) +{ + // TODO + assert(0); + return CELL_OK; +} + s32 _cellSyncLFQueueAttachLv2EventQueue(mem32_ptr_t spus, u32 num, mem_ptr_t queue) { cellSync->Todo("_cellSyncLFQueueAttachLv2EventQueue(spus_addr=0x%x, num=%d, queue_addr=0x%x)", spus.GetAddr(), num, queue.GetAddr()); + + return syncLFQueueAttachLv2EventQueue(spus, num, queue); +} + +s32 syncLFQueueDetachLv2EventQueue(mem32_ptr_t spus, u32 num, mem_ptr_t queue) +{ + // TODO + assert(0); return CELL_OK; } s32 _cellSyncLFQueueDetachLv2EventQueue(mem32_ptr_t spus, u32 num, mem_ptr_t queue) { cellSync->Todo("_cellSyncLFQueueDetachLv2EventQueue(spus_addr=0x%x, num=%d, queue_addr=0x%x)", spus.GetAddr(), num, queue.GetAddr()); - return CELL_OK; + + return syncLFQueueDetachLv2EventQueue(spus, num, queue); } void cellSync_init() diff --git a/rpcs3/Emu/SysCalls/Modules/cellSync.h b/rpcs3/Emu/SysCalls/Modules/cellSync.h index 505e94d5ec..70d9c7823d 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellSync.h +++ b/rpcs3/Emu/SysCalls/Modules/cellSync.h @@ -153,4 +153,24 @@ struct CellSyncLFQueue } }; -static_assert(sizeof(CellSyncLFQueue) == 128, "CellSyncLFQueue: wrong size"); \ No newline at end of file +static_assert(sizeof(CellSyncLFQueue) == 128, "CellSyncLFQueue: wrong size"); + +s32 syncMutexInitialize(mem_ptr_t mutex); + +s32 syncBarrierInitialize(mem_ptr_t barrier, u16 total_count); + +s32 syncRwmInitialize(mem_ptr_t rwm, u32 buffer_addr, u32 buffer_size); + +s32 syncQueueInitialize(mem_ptr_t queue, u32 buffer_addr, u32 size, u32 depth); + +s32 syncLFQueueInitialize(mem_ptr_t queue, u32 buffer_addr, u32 size, u32 depth, CellSyncQueueDirection direction, u32 eaSignal_addr); +s32 syncLFQueueGetPushPointer(mem_ptr_t queue, s32& pointer, u32 isBlocking, u32 useEventQueue); +s32 syncLFQueueGetPushPointer2(mem_ptr_t queue, s32& pointer, u32 isBlocking, u32 useEventQueue); +s32 syncLFQueueCompletePushPointer(mem_ptr_t queue, s32 pointer, const std::function fpSendSignal); +s32 syncLFQueueCompletePushPointer2(mem_ptr_t queue, s32 pointer, const std::function fpSendSignal); +s32 syncLFQueueGetPopPointer(mem_ptr_t queue, s32& pointer, u32 isBlocking, u32, u32 useEventQueue); +s32 syncLFQueueGetPopPointer2(mem_ptr_t queue, s32& pointer, u32 isBlocking, u32 useEventQueue); +s32 syncLFQueueCompletePopPointer(mem_ptr_t queue, s32 pointer, const std::function fpSendSignal, u32 noQueueFull); +s32 syncLFQueueCompletePopPointer2(mem_ptr_t queue, s32 pointer, const std::function fpSendSignal, u32 noQueueFull); +s32 syncLFQueueAttachLv2EventQueue(mem32_ptr_t spus, u32 num, mem_ptr_t queue); +s32 syncLFQueueDetachLv2EventQueue(mem32_ptr_t spus, u32 num, mem_ptr_t queue);