From 08d61163eae615172ff89b077893daefb41d3d9c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexandro=20S=C3=A1nchez=20Bach?= Date: Wed, 25 Jun 2014 00:38:34 +0200 Subject: [PATCH 1/3] Removed external functions from SysCalls.h * Replace `int` with `s32` as return type for syscalls. * Renamed `SC_Something.*` files with the proper lv2 name `sys_something.*`. * Moving away from the lv2, those functions and folders that doesn't correspond to lv2 functions. E.g. module functions from sys_io, sysPrxForUser, cellGcmSys. * Splitted some files (memory -> memory+mmapper) and merged other ones (event+event_flag ->event, spu+spu_thread -> spu), according to common sense, PSDevWiki docs, and checking firmware files. * Removed external functions from `SysCalls.h`. NOTE: What should we do about: cellGcmCallback? It's not a lv2 syscall but it appears on the sc_table and it is actually called in games. Is this some kind of hack? --- rpcs3/Emu/Cell/RawSPUThread.cpp | 4 +- rpcs3/Emu/Cell/SPURecompilerCore.cpp | 4 +- rpcs3/Emu/Cell/SPUThread.cpp | 4 +- rpcs3/Emu/Cell/SPUThread.h | 2 +- rpcs3/Emu/GS/RSXThread.cpp | 2 +- .../SysCalls/{lv2 => Modules}/SC_Keyboard.cpp | 0 .../SysCalls/{lv2 => Modules}/SC_Mouse.cpp | 0 .../Emu/SysCalls/{lv2 => Modules}/SC_Pad.cpp | 0 rpcs3/Emu/SysCalls/Modules/cellGcmSys.cpp | 25 + rpcs3/Emu/SysCalls/Modules/cellResc.cpp | 1 + rpcs3/Emu/SysCalls/Modules/cellSysutil.cpp | 2 +- rpcs3/Emu/SysCalls/Modules/cellSysutil.h | 3 + rpcs3/Emu/SysCalls/Modules/sceNpTrophy.cpp | 2 +- rpcs3/Emu/SysCalls/Modules/sysPrxForUser.cpp | 46 +- rpcs3/Emu/SysCalls/Modules/sys_io.cpp | 40 + rpcs3/Emu/SysCalls/SysCalls.cpp | 2 +- rpcs3/Emu/SysCalls/SysCalls.h | 347 +------- rpcs3/Emu/SysCalls/lv2/SC_Interrupt.h | 1 - rpcs3/Emu/SysCalls/lv2/SC_Lwcond.h | 27 - rpcs3/Emu/SysCalls/lv2/SC_SPU_Thread.h | 82 -- rpcs3/Emu/SysCalls/lv2/SC_Spinlock.h | 6 - rpcs3/Emu/SysCalls/lv2/SC_Time.h | 4 - rpcs3/Emu/SysCalls/lv2/SC_Timer.h | 23 - rpcs3/Emu/SysCalls/lv2/SC_sys_spu.cpp | 23 - .../lv2/{SC_FileSystem.cpp => lv2Fs.cpp} | 68 +- .../SysCalls/lv2/{SC_FileSystem.h => lv2Fs.h} | 34 + .../lv2/{SC_Condition.cpp => sys_cond.cpp} | 14 +- .../lv2/{SC_Condition.h => sys_cond.h} | 12 +- rpcs3/Emu/SysCalls/lv2/sys_event.cpp | 751 ++++++++++++++++++ .../lv2/{SC_Event_flag.h => sys_event.h} | 23 + .../{SC_Interrupt.cpp => sys_interrupt.cpp} | 8 +- rpcs3/Emu/SysCalls/lv2/sys_interrupt.h | 7 + .../lv2/{SC_Lwcond.cpp => sys_lwcond.cpp} | 16 +- rpcs3/Emu/SysCalls/lv2/sys_lwcond.h | 35 + .../lv2/{SC_Lwmutex.cpp => sys_lwmutex.cpp} | 12 +- .../lv2/{SC_Lwmutex.h => sys_lwmutex.h} | 7 + rpcs3/Emu/SysCalls/lv2/sys_memory.cpp | 169 ++++ .../lv2/{SC_Memory.h => sys_memory.h} | 130 ++- rpcs3/Emu/SysCalls/lv2/sys_mmapper.cpp | 263 ++++++ rpcs3/Emu/SysCalls/lv2/sys_mmapper.h | 35 + .../lv2/{SC_Mutex.cpp => sys_mutex.cpp} | 12 +- .../SysCalls/lv2/{SC_Mutex.h => sys_mutex.h} | 8 + .../{SC_PPU_Thread.cpp => sys_ppu_thread.cpp} | 33 +- rpcs3/Emu/SysCalls/lv2/sys_ppu_thread.h | 28 + .../lv2/{SC_Process.cpp => sys_process.cpp} | 26 +- .../lv2/{SC_Process.h => sys_process.h} | 24 +- .../SysCalls/lv2/{SC_PRX.cpp => sys_prx.cpp} | 2 +- .../Emu/SysCalls/lv2/{SC_PRX.h => sys_prx.h} | 0 .../SysCalls/lv2/{SC_RSX.cpp => sys_rsx.cpp} | 25 +- rpcs3/Emu/SysCalls/lv2/sys_rsx.h | 15 + .../lv2/{SC_Rwlock.cpp => sys_rwlock.cpp} | 18 +- .../lv2/{SC_Rwlock.h => sys_rwlock.h} | 10 + .../{SC_Semaphore.cpp => sys_semaphore.cpp} | 14 +- .../lv2/{SC_Semaphore.h => sys_semaphore.h} | 10 +- .../lv2/{SC_Spinlock.cpp => sys_spinlock.cpp} | 4 +- rpcs3/Emu/SysCalls/lv2/sys_spinlock.h | 12 + .../lv2/{SC_SPU_Thread.cpp => sys_spu.cpp} | 99 ++- rpcs3/Emu/SysCalls/lv2/sys_spu.h | 121 +++ .../lv2/{SC_Time.cpp => sys_time.cpp} | 6 +- rpcs3/Emu/SysCalls/lv2/sys_time.h | 11 + .../lv2/{SC_Timer.cpp => sys_timer.cpp} | 20 +- rpcs3/Emu/SysCalls/lv2/sys_timer.h | 33 + .../lv2/{SC_Trace.cpp => sys_trace.cpp} | 20 +- rpcs3/Emu/SysCalls/lv2/sys_trace.h | 13 + .../SysCalls/lv2/{SC_TTY.cpp => sys_tty.cpp} | 4 +- rpcs3/Emu/SysCalls/lv2/sys_tty.h | 4 + .../SysCalls/lv2/{SC_VM.cpp => sys_vm.cpp} | 28 +- rpcs3/Emu/SysCalls/lv2/sys_vm.h | 31 + rpcs3/Emu/event.h | 2 +- rpcs3/Gui/DisAsmFrame.cpp | 4 +- rpcs3/Gui/InterpreterDisAsm.cpp | 4 +- rpcs3/emucore.vcxproj | 90 ++- rpcs3/emucore.vcxproj.filters | 246 +++--- 73 files changed, 2243 insertions(+), 968 deletions(-) rename rpcs3/Emu/SysCalls/{lv2 => Modules}/SC_Keyboard.cpp (100%) rename rpcs3/Emu/SysCalls/{lv2 => Modules}/SC_Mouse.cpp (100%) rename rpcs3/Emu/SysCalls/{lv2 => Modules}/SC_Pad.cpp (100%) delete mode 100644 rpcs3/Emu/SysCalls/lv2/SC_Interrupt.h delete mode 100644 rpcs3/Emu/SysCalls/lv2/SC_Lwcond.h delete mode 100644 rpcs3/Emu/SysCalls/lv2/SC_SPU_Thread.h delete mode 100644 rpcs3/Emu/SysCalls/lv2/SC_Spinlock.h delete mode 100644 rpcs3/Emu/SysCalls/lv2/SC_Time.h delete mode 100644 rpcs3/Emu/SysCalls/lv2/SC_Timer.h delete mode 100644 rpcs3/Emu/SysCalls/lv2/SC_sys_spu.cpp rename rpcs3/Emu/SysCalls/lv2/{SC_FileSystem.cpp => lv2Fs.cpp} (90%) rename rpcs3/Emu/SysCalls/lv2/{SC_FileSystem.h => lv2Fs.h} (53%) rename rpcs3/Emu/SysCalls/lv2/{SC_Condition.cpp => sys_cond.cpp} (94%) rename rpcs3/Emu/SysCalls/lv2/{SC_Condition.h => sys_cond.h} (54%) create mode 100644 rpcs3/Emu/SysCalls/lv2/sys_event.cpp rename rpcs3/Emu/SysCalls/lv2/{SC_Event_flag.h => sys_event.h} (50%) rename rpcs3/Emu/SysCalls/lv2/{SC_Interrupt.cpp => sys_interrupt.cpp} (91%) create mode 100644 rpcs3/Emu/SysCalls/lv2/sys_interrupt.h rename rpcs3/Emu/SysCalls/lv2/{SC_Lwcond.cpp => sys_lwcond.cpp} (93%) create mode 100644 rpcs3/Emu/SysCalls/lv2/sys_lwcond.h rename rpcs3/Emu/SysCalls/lv2/{SC_Lwmutex.cpp => sys_lwmutex.cpp} (95%) rename rpcs3/Emu/SysCalls/lv2/{SC_Lwmutex.h => sys_lwmutex.h} (81%) create mode 100644 rpcs3/Emu/SysCalls/lv2/sys_memory.cpp rename rpcs3/Emu/SysCalls/lv2/{SC_Memory.h => sys_memory.h} (55%) create mode 100644 rpcs3/Emu/SysCalls/lv2/sys_mmapper.cpp create mode 100644 rpcs3/Emu/SysCalls/lv2/sys_mmapper.h rename rpcs3/Emu/SysCalls/lv2/{SC_Mutex.cpp => sys_mutex.cpp} (95%) rename rpcs3/Emu/SysCalls/lv2/{SC_Mutex.h => sys_mutex.h} (80%) rename rpcs3/Emu/SysCalls/lv2/{SC_PPU_Thread.cpp => sys_ppu_thread.cpp} (87%) create mode 100644 rpcs3/Emu/SysCalls/lv2/sys_ppu_thread.h rename rpcs3/Emu/SysCalls/lv2/{SC_Process.cpp => sys_process.cpp} (93%) rename rpcs3/Emu/SysCalls/lv2/{SC_Process.h => sys_process.h} (78%) rename rpcs3/Emu/SysCalls/lv2/{SC_PRX.cpp => sys_prx.cpp} (99%) rename rpcs3/Emu/SysCalls/lv2/{SC_PRX.h => sys_prx.h} (100%) rename rpcs3/Emu/SysCalls/lv2/{SC_RSX.cpp => sys_rsx.cpp} (74%) create mode 100644 rpcs3/Emu/SysCalls/lv2/sys_rsx.h rename rpcs3/Emu/SysCalls/lv2/{SC_Rwlock.cpp => sys_rwlock.cpp} (91%) rename rpcs3/Emu/SysCalls/lv2/{SC_Rwlock.h => sys_rwlock.h} (86%) rename rpcs3/Emu/SysCalls/lv2/{SC_Semaphore.cpp => sys_semaphore.cpp} (92%) rename rpcs3/Emu/SysCalls/lv2/{SC_Semaphore.h => sys_semaphore.h} (60%) rename rpcs3/Emu/SysCalls/lv2/{SC_Spinlock.cpp => sys_spinlock.cpp} (94%) create mode 100644 rpcs3/Emu/SysCalls/lv2/sys_spinlock.h rename rpcs3/Emu/SysCalls/lv2/{SC_SPU_Thread.cpp => sys_spu.cpp} (86%) create mode 100644 rpcs3/Emu/SysCalls/lv2/sys_spu.h rename rpcs3/Emu/SysCalls/lv2/{SC_Time.cpp => sys_time.cpp} (92%) create mode 100644 rpcs3/Emu/SysCalls/lv2/sys_time.h rename rpcs3/Emu/SysCalls/lv2/{SC_Timer.cpp => sys_timer.cpp} (86%) create mode 100644 rpcs3/Emu/SysCalls/lv2/sys_timer.h rename rpcs3/Emu/SysCalls/lv2/{SC_Trace.cpp => sys_trace.cpp} (80%) create mode 100644 rpcs3/Emu/SysCalls/lv2/sys_trace.h rename rpcs3/Emu/SysCalls/lv2/{SC_TTY.cpp => sys_tty.cpp} (85%) create mode 100644 rpcs3/Emu/SysCalls/lv2/sys_tty.h rename rpcs3/Emu/SysCalls/lv2/{SC_VM.cpp => sys_vm.cpp} (92%) create mode 100644 rpcs3/Emu/SysCalls/lv2/sys_vm.h diff --git a/rpcs3/Emu/Cell/RawSPUThread.cpp b/rpcs3/Emu/Cell/RawSPUThread.cpp index 2a0097cc3b..9d70b81801 100644 --- a/rpcs3/Emu/Cell/RawSPUThread.cpp +++ b/rpcs3/Emu/Cell/RawSPUThread.cpp @@ -2,8 +2,8 @@ #include "Utilities/Log.h" #include "Emu/Memory/Memory.h" #include "Emu/System.h" -#include "Emu/SysCalls/lv2/SC_Lwmutex.h" -#include "Emu/SysCalls/lv2/SC_Event_flag.h" +#include "Emu/SysCalls/lv2/sys_lwmutex.h" +#include "Emu/SysCalls/lv2/sys_event.h" #include "Emu/Cell/RawSPUThread.h" diff --git a/rpcs3/Emu/Cell/SPURecompilerCore.cpp b/rpcs3/Emu/Cell/SPURecompilerCore.cpp index 85d106e804..d38911b110 100644 --- a/rpcs3/Emu/Cell/SPURecompilerCore.cpp +++ b/rpcs3/Emu/Cell/SPURecompilerCore.cpp @@ -2,8 +2,8 @@ #include "Utilities/Log.h" #include "Emu/Memory/Memory.h" #include "Emu/System.h" -#include "Emu/SysCalls/lv2/SC_Lwmutex.h" -#include "Emu/SysCalls/lv2/SC_Event_flag.h" +#include "Emu/SysCalls/lv2/sys_lwmutex.h" +#include "Emu/SysCalls/lv2/sys_event.h" #include "SPUInstrTable.h" #include "SPUDisAsm.h" diff --git a/rpcs3/Emu/Cell/SPUThread.cpp b/rpcs3/Emu/Cell/SPUThread.cpp index c8fa04746b..57095be048 100644 --- a/rpcs3/Emu/Cell/SPUThread.cpp +++ b/rpcs3/Emu/Cell/SPUThread.cpp @@ -2,8 +2,8 @@ #include "Utilities/Log.h" #include "Emu/Memory/Memory.h" #include "Emu/System.h" -#include "Emu/SysCalls/lv2/SC_Lwmutex.h" -#include "Emu/SysCalls/lv2/SC_Event_flag.h" +#include "Emu/SysCalls/lv2/sys_lwmutex.h" +#include "Emu/SysCalls/lv2/sys_event.h" #include "Emu/Cell/SPUThread.h" diff --git a/rpcs3/Emu/Cell/SPUThread.h b/rpcs3/Emu/Cell/SPUThread.h index 9249311629..0ef23c72ec 100644 --- a/rpcs3/Emu/Cell/SPUThread.h +++ b/rpcs3/Emu/Cell/SPUThread.h @@ -1,7 +1,7 @@ #pragma once #include "PPCThread.h" #include "Emu/event.h" -#include "Emu/SysCalls/lv2/SC_SPU_Thread.h" +#include "Emu/SysCalls/lv2/sys_spu.h" #include "MFC.h" #include "Emu/SysCalls/ErrorCodes.h" #include diff --git a/rpcs3/Emu/GS/RSXThread.cpp b/rpcs3/Emu/GS/RSXThread.cpp index d028acf755..a20fa52c21 100644 --- a/rpcs3/Emu/GS/RSXThread.cpp +++ b/rpcs3/Emu/GS/RSXThread.cpp @@ -3,7 +3,7 @@ #include "Emu/Memory/Memory.h" #include "Emu/System.h" #include "RSXThread.h" -#include "Emu/SysCalls/lv2/SC_Time.h" +#include "Emu/SysCalls/lv2/sys_time.h" #define ARGS(x) (x >= count ? OutOfArgsCount(x, cmd, count) : Memory.Read32(Memory.RSXIOMem.GetStartAddr() + m_ctrl->get + (4*(x+1)))) diff --git a/rpcs3/Emu/SysCalls/lv2/SC_Keyboard.cpp b/rpcs3/Emu/SysCalls/Modules/SC_Keyboard.cpp similarity index 100% rename from rpcs3/Emu/SysCalls/lv2/SC_Keyboard.cpp rename to rpcs3/Emu/SysCalls/Modules/SC_Keyboard.cpp diff --git a/rpcs3/Emu/SysCalls/lv2/SC_Mouse.cpp b/rpcs3/Emu/SysCalls/Modules/SC_Mouse.cpp similarity index 100% rename from rpcs3/Emu/SysCalls/lv2/SC_Mouse.cpp rename to rpcs3/Emu/SysCalls/Modules/SC_Mouse.cpp diff --git a/rpcs3/Emu/SysCalls/lv2/SC_Pad.cpp b/rpcs3/Emu/SysCalls/Modules/SC_Pad.cpp similarity index 100% rename from rpcs3/Emu/SysCalls/lv2/SC_Pad.cpp rename to rpcs3/Emu/SysCalls/Modules/SC_Pad.cpp diff --git a/rpcs3/Emu/SysCalls/Modules/cellGcmSys.cpp b/rpcs3/Emu/SysCalls/Modules/cellGcmSys.cpp index 72f81606ae..0b28f4d773 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellGcmSys.cpp +++ b/rpcs3/Emu/SysCalls/Modules/cellGcmSys.cpp @@ -1149,6 +1149,31 @@ int cellGcmSetTile(u8 index, u8 location, u32 offset, u32 size, u32 pitch, u8 co //---------------------------------------------------------------------------- +// TODO: This function was originally located in lv2/SC_GCM and appears in RPCS3 as a lv2 syscall with id 1023, +// which according to lv2 dumps isn't the case. So, is this a proper place for this function? + +int cellGcmCallback(u32 context_addr, u32 count) +{ + GSLockCurrent gslock(GS_LOCK_WAIT_FLUSH); + + CellGcmContextData& ctx = (CellGcmContextData&)Memory[context_addr]; + CellGcmControl& ctrl = (CellGcmControl&)Memory[gcm_info.control_addr]; + + const s32 res = ctx.current - ctx.begin - ctrl.put; + + if(res > 0) Memory.Copy(ctx.begin, ctx.current - res, res); + + ctx.current = ctx.begin + res; + + //InterlockedExchange64((volatile long long*)((u8*)&ctrl + offsetof(CellGcmControl, put)), (u64)(u32)re(res)); + ctrl.put = res; + ctrl.get = 0; + + return CELL_OK; +} + +//---------------------------------------------------------------------------- + void cellGcmSys_init() { // Data Retrieval diff --git a/rpcs3/Emu/SysCalls/Modules/cellResc.cpp b/rpcs3/Emu/SysCalls/Modules/cellResc.cpp index 66edaf3dfa..fdd633f28d 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellResc.cpp +++ b/rpcs3/Emu/SysCalls/Modules/cellResc.cpp @@ -5,6 +5,7 @@ #include "Emu/Cell/PPUThread.h" #include "Emu/SysCalls/SC_FUNC.h" #include "Emu/SysCalls/Modules.h" +#include "cellSysutil.h" #include "cellResc.h" //void cellResc_init(); diff --git a/rpcs3/Emu/SysCalls/Modules/cellSysutil.cpp b/rpcs3/Emu/SysCalls/Modules/cellSysutil.cpp index 304f2fd22a..9f70053a04 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellSysutil.cpp +++ b/rpcs3/Emu/SysCalls/Modules/cellSysutil.cpp @@ -199,7 +199,7 @@ int cellVideoOutGetResolution(u32 resolutionId, mem_ptr_tWarning("cellVideoOutConfigure(videoOut=%d, config_addr=0x%x, option_addr=0x%x, waitForEvent=0x%x)", videoOut, config_addr, option_addr, waitForEvent); diff --git a/rpcs3/Emu/SysCalls/Modules/cellSysutil.h b/rpcs3/Emu/SysCalls/Modules/cellSysutil.h index c701590692..5a82805bd8 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellSysutil.h +++ b/rpcs3/Emu/SysCalls/Modules/cellSysutil.h @@ -213,3 +213,6 @@ struct CellHddGameCBResult be_t invalidMsg_addr; // char* be_t reserved_addr; // void* }; + +// SysCalls +s32 cellVideoOutConfigure(u32 videoOut, u32 config_addr, u32 option_addr, u32 waitForEvent); diff --git a/rpcs3/Emu/SysCalls/Modules/sceNpTrophy.cpp b/rpcs3/Emu/SysCalls/Modules/sceNpTrophy.cpp index 3f4c4f82c4..48db1ef644 100644 --- a/rpcs3/Emu/SysCalls/Modules/sceNpTrophy.cpp +++ b/rpcs3/Emu/SysCalls/Modules/sceNpTrophy.cpp @@ -13,7 +13,7 @@ #include "Loader/TRP.h" #include "Loader/TROPUSR.h" -#include "Emu/SysCalls/lv2/SC_Time.h" +#include "Emu/SysCalls/lv2/sys_time.h" #include #include diff --git a/rpcs3/Emu/SysCalls/Modules/sysPrxForUser.cpp b/rpcs3/Emu/SysCalls/Modules/sysPrxForUser.cpp index e1d4532319..2908525db2 100644 --- a/rpcs3/Emu/SysCalls/Modules/sysPrxForUser.cpp +++ b/rpcs3/Emu/SysCalls/Modules/sysPrxForUser.cpp @@ -7,7 +7,7 @@ #include "Emu/SysCalls/Modules.h" #include "Emu/FS/vfsFile.h" #include "Emu/FS/vfsStreamMemory.h" -#include "Emu/SysCalls/lv2/SC_SPU_Thread.h" +#include "Emu/SysCalls/lv2/sys_spu.h" #include "Loader/ELF.h" #include "Emu/Cell/RawSPUThread.h" @@ -15,6 +15,49 @@ //Module sysPrxForUser("sysPrxForUser", sysPrxForUser_init); Module *sysPrxForUser = nullptr; +struct HeapInfo +{ + u32 heap_addr; + u32 align; + u32 size; + + HeapInfo(u32 _heap_addr, u32 _align, u32 _size) + : heap_addr(_heap_addr) + , align(_align) + , size(_size) + { + } +}; + +int sys_heap_create_heap(const u32 heap_addr, const u32 align, const u32 size) +{ + sysPrxForUser->Warning("sys_heap_create_heap(heap_addr=0x%x, align=0x%x, size=0x%x)", heap_addr, align, size); + + u32 heap_id = sysPrxForUser->GetNewId(new HeapInfo(heap_addr, align, size)); + sysPrxForUser->Warning("*** sys_heap created: id = %d", heap_id); + return heap_id; +} + +int sys_heap_malloc(const u32 heap_id, const u32 size) +{ + sysPrxForUser->Warning("sys_heap_malloc(heap_id=%d, size=0x%x)", heap_id, size); + + HeapInfo* heap; + if(!sysPrxForUser->CheckId(heap_id, heap)) return CELL_ESRCH; + + return Memory.Alloc(size, 1); +} + +int _sys_heap_memalign(u32 heap_id, u32 align, u32 size) +{ + sysPrxForUser->Warning("_sys_heap_memalign(heap_id=%d, align=0x%x, size=0x%x)", heap_id, align, size); + + HeapInfo* heap; + if(!sysPrxForUser->CheckId(heap_id, heap)) return CELL_ESRCH; + + return Memory.Alloc(size, align); +} + void sys_initialize_tls() { sysPrxForUser->Log("sys_initialize_tls()"); @@ -204,5 +247,4 @@ void sysPrxForUser_init() sysPrxForUser->AddFunc(0x67f9fedb, sys_game_process_exitspawn2); sysPrxForUser->AddFunc(0xfc52a7a9, sys_game_process_exitspawn); - } diff --git a/rpcs3/Emu/SysCalls/Modules/sys_io.cpp b/rpcs3/Emu/SysCalls/Modules/sys_io.cpp index e2343a02bf..60cd11c39b 100644 --- a/rpcs3/Emu/SysCalls/Modules/sys_io.cpp +++ b/rpcs3/Emu/SysCalls/Modules/sys_io.cpp @@ -10,6 +10,46 @@ //Module sys_io(0x0017, sys_io_init); Module *sys_io = nullptr; +//cellPad +extern int cellPadInit(u32 max_connect); +extern int cellPadEnd(); +extern int cellPadClearBuf(u32 port_no); +extern int cellPadGetData(u32 port_no, u32 data_addr); +extern int cellPadGetDataExtra(u32 port_no, u32 device_type_addr, u32 data_addr); +extern int cellPadSetActDirect(u32 port_no, u32 param_addr); +extern int cellPadGetInfo(u32 info_addr); +extern int cellPadGetInfo2(u32 info_addr); +extern int cellPadSetPortSetting(u32 port_no, u32 port_setting); +extern int cellPadInfoPressMode(u32 port_no); +extern int cellPadInfoSensorMode(u32 port_no); +extern int cellPadSetPressMode(u32 port_no, u32 mode); +extern int cellPadSetSensorMode(u32 port_no, u32 mode); +extern int cellPadGetCapabilityInfo(u32 port_no, mem32_t info_addr); + +//cellKb +extern int cellKbInit(u32 max_connect); +extern int cellKbEnd(); +extern int cellKbClearBuf(u32 port_no); +extern u16 cellKbCnvRawCode(u32 arrange, u32 mkey, u32 led, u16 rawcode); +extern int cellKbGetInfo(mem_class_t info); +extern int cellKbRead(u32 port_no, mem_class_t data); +extern int cellKbSetCodeType(u32 port_no, u32 type); +extern int cellKbSetLEDStatus(u32 port_no, u8 led); +extern int cellKbSetReadMode(u32 port_no, u32 rmode); +extern int cellKbGetConfiguration(u32 port_no, mem_class_t config); + +//cellMouse +extern int cellMouseInit(u32 max_connect); +extern int cellMouseClearBuf(u32 port_no); +extern int cellMouseEnd(); +extern int cellMouseGetInfo(mem_class_t info); +extern int cellMouseInfoTabletMode(u32 port_no, mem_class_t info); +extern int cellMouseGetData(u32 port_no, mem_class_t data); +extern int cellMouseGetDataList(u32 port_no, mem_class_t data); +extern int cellMouseSetTabletMode(u32 port_no, u32 mode); +extern int cellMouseGetTabletDataList(u32 port_no, mem_class_t data); +extern int cellMouseGetRawData(u32 port_no, mem_class_t data); + void sys_io_init() { sys_io->AddFunc(0x1cf98800, cellPadInit); diff --git a/rpcs3/Emu/SysCalls/SysCalls.cpp b/rpcs3/Emu/SysCalls/SysCalls.cpp index fadb0b3148..814df0ba97 100644 --- a/rpcs3/Emu/SysCalls/SysCalls.cpp +++ b/rpcs3/Emu/SysCalls/SysCalls.cpp @@ -523,7 +523,7 @@ static func_caller* sc_table[kSyscallTableLength] = null_func, null_func, null_func, null_func, null_func, //1009 null_func, null_func, null_func, null_func, null_func, //1014 null_func, null_func, null_func, null_func, null_func, //1019 - null_func, null_func, null_func, bind_func(cellGcmCallback), //1024 + null_func, null_func, null_func, bind_func(cellGcmCallback), //1023 }; /** HACK: Used to delete func_caller objects that get allocated and stored in sc_table (above). diff --git a/rpcs3/Emu/SysCalls/SysCalls.h b/rpcs3/Emu/SysCalls/SysCalls.h index d470b5a720..2454724db8 100644 --- a/rpcs3/Emu/SysCalls/SysCalls.h +++ b/rpcs3/Emu/SysCalls/SysCalls.h @@ -1,20 +1,31 @@ #pragma once #include "ErrorCodes.h" -#include "lv2/SC_Process.h" -#include "lv2/SC_PRX.h" -#include "lv2/SC_FileSystem.h" -#include "lv2/SC_Memory.h" -#include "lv2/SC_Timer.h" -#include "lv2/SC_Rwlock.h" -#include "lv2/SC_SPU_Thread.h" -#include "lv2/SC_Lwmutex.h" -#include "lv2/SC_Lwcond.h" -#include "lv2/SC_Event_flag.h" -#include "lv2/SC_Condition.h" -#include "lv2/SC_Spinlock.h" -#include "lv2/SC_Semaphore.h" -#include "Emu/event.h" #include "Static.h" + +#include "lv2/lv2Fs.h" +#include "lv2/sys_cond.h" +#include "lv2/sys_event.h" +#include "lv2/sys_interrupt.h" +#include "lv2/sys_lwcond.h" +#include "lv2/sys_lwmutex.h" +#include "lv2/sys_memory.h" +#include "lv2/sys_mmapper.h" +#include "lv2/sys_ppu_thread.h" +#include "lv2/sys_process.h" +#include "lv2/sys_prx.h" +#include "lv2/sys_rsx.h" +#include "lv2/sys_rwlock.h" +#include "lv2/sys_semaphore.h" +#include "lv2/sys_spinlock.h" +#include "lv2/sys_spu.h" +#include "lv2/sys_time.h" +#include "lv2/sys_timer.h" +#include "lv2/sys_trace.h" +#include "lv2/sys_tty.h" +#include "lv2/sys_vm.h" + +#include "Emu/event.h" + //#define SYSCALLS_DEBUG #define declCPU PPUThread& CPU = GetCurrentPPUThread @@ -123,313 +134,9 @@ public: } }; -//sys_event -extern int sys_event_queue_create(mem32_t equeue_id, mem_ptr_t attr, u64 event_queue_key, int size); -extern int sys_event_queue_destroy(u32 equeue_id, int mode); -extern int sys_event_queue_receive(u32 equeue_id, mem_ptr_t event, u64 timeout); -extern int sys_event_queue_tryreceive(u32 equeue_id, mem_ptr_t event_array, int size, mem32_t number); -extern int sys_event_queue_drain(u32 event_queue_id); -extern int sys_event_port_create(mem32_t eport_id, int port_type, u64 name); -extern int sys_event_port_destroy(u32 eport_id); -extern int sys_event_port_connect_local(u32 event_port_id, u32 event_queue_id); -extern int sys_event_port_disconnect(u32 eport_id); -extern int sys_event_port_send(u32 event_port_id, u64 data1, u64 data2, u64 data3); - -//sys_event_flag -extern int sys_event_flag_create(mem32_t eflag_id, mem_ptr_t attr, u64 init); -extern int sys_event_flag_destroy(u32 eflag_id); -extern int sys_event_flag_wait(u32 eflag_id, u64 bitptn, u32 mode, mem64_t result, u64 timeout); -extern int sys_event_flag_trywait(u32 eflag_id, u64 bitptn, u32 mode, mem64_t result); -extern int sys_event_flag_set(u32 eflag_id, u64 bitptn); -extern int sys_event_flag_clear(u32 eflag_id, u64 bitptn); -extern int sys_event_flag_cancel(u32 eflag_id, mem32_t num); -extern int sys_event_flag_get(u32 eflag_id, mem64_t flags); - -//sys_semaphore -extern int sys_semaphore_create(mem32_t sem, mem_ptr_t attr, int initial_count, int max_count); -extern int sys_semaphore_destroy(u32 sem_id); -extern int sys_semaphore_wait(u32 sem_id, u64 timeout); -extern int sys_semaphore_trywait(u32 sem_id); -extern int sys_semaphore_post(u32 sem_id, int count); -extern int sys_semaphore_get_value(u32 sem_id, mem32_t count); - -//sys_lwcond -extern int sys_lwcond_create(mem_ptr_t lwcond, mem_ptr_t lwmutex, mem_ptr_t attr); -extern int sys_lwcond_destroy(mem_ptr_t lwcond); -extern int sys_lwcond_signal(mem_ptr_t lwcond); -extern int sys_lwcond_signal_all(mem_ptr_t lwcond); -extern int sys_lwcond_signal_to(mem_ptr_t lwcond, u32 ppu_thread_id); -extern int sys_lwcond_wait(mem_ptr_t lwcond, u64 timeout); - -//sys_lwmutex -extern int sys_lwmutex_create(mem_ptr_t lwmutex, mem_ptr_t attr); -extern int sys_lwmutex_destroy(mem_ptr_t lwmutex); -extern int sys_lwmutex_lock(mem_ptr_t lwmutex, u64 timeout); -extern int sys_lwmutex_trylock(mem_ptr_t lwmutex); -extern int sys_lwmutex_unlock(mem_ptr_t lwmutex); - -//sys_cond -extern int sys_cond_create(mem32_t cond_id, u32 mutex_id, mem_ptr_t attr); -extern int sys_cond_destroy(u32 cond_id); -extern int sys_cond_wait(u32 cond_id, u64 timeout); -extern int sys_cond_signal(u32 cond_id); -extern int sys_cond_signal_all(u32 cond_id); -extern int sys_cond_signal_to(u32 cond_id, u32 thread_id); - -//sys_mutex -extern int sys_mutex_create(mem32_t mutex_id, mem_ptr_t attr); -extern int sys_mutex_destroy(u32 mutex_id); -extern int sys_mutex_lock(u32 mutex_id, u64 timeout); -extern int sys_mutex_trylock(u32 mutex_id); -extern int sys_mutex_unlock(u32 mutex_id); - -//sys_rwlock -extern int sys_rwlock_create(mem32_t rw_lock_id, mem_ptr_t attr); -extern int sys_rwlock_destroy(u32 rw_lock_id); -extern int sys_rwlock_rlock(u32 rw_lock_id, u64 timeout); -extern int sys_rwlock_tryrlock(u32 rw_lock_id); -extern int sys_rwlock_runlock(u32 rw_lock_id); -extern int sys_rwlock_wlock(u32 rw_lock_id, u64 timeout); -extern int sys_rwlock_trywlock(u32 rw_lock_id); -extern int sys_rwlock_wunlock(u32 rw_lock_id); - -//sys_spinlock -extern void sys_spinlock_initialize(mem_ptr_t lock); -extern void sys_spinlock_lock(mem_ptr_t lock); -extern int sys_spinlock_trylock(mem_ptr_t lock); -extern void sys_spinlock_unlock(mem_ptr_t lock); - -//ppu_thread -extern void sys_ppu_thread_exit(u64 errorcode); -extern int sys_ppu_thread_yield(); -extern int sys_ppu_thread_join(u64 thread_id, mem64_t vptr); -extern int sys_ppu_thread_detach(u64 thread_id); -extern void sys_ppu_thread_get_join_state(u32 isjoinable_addr); -extern int sys_ppu_thread_set_priority(u64 thread_id, int prio); -extern int sys_ppu_thread_get_priority(u64 thread_id, u32 prio_addr); -extern int sys_ppu_thread_get_stack_information(u32 info_addr); -extern int sys_ppu_thread_stop(u64 thread_id); -extern int sys_ppu_thread_restart(u64 thread_id); -extern int sys_ppu_thread_create(mem64_t thread_id, u32 entry, u64 arg, int prio, u32 stacksize, u64 flags, u32 threadname_addr); -extern void sys_ppu_thread_once(u32 once_ctrl_addr, u32 entry); -extern int sys_ppu_thread_get_id(const u32 id_addr); - -//memory -extern int sys_memory_allocate(u32 size, u32 flags, u32 alloc_addr_addr); -extern int sys_memory_allocate_from_container(u32 size, u32 cid, u32 flags, u32 alloc_addr_addr); -extern int sys_memory_free(u32 start_addr); -extern int sys_memory_get_page_attribute(u32 addr, mem_ptr_t attr); -extern int sys_memory_get_user_memory_size(mem_ptr_t mem_info); -extern int sys_memory_container_create(mem32_t cid, u32 yield_size); -extern int sys_memory_container_destroy(u32 cid); -extern int sys_memory_container_get_size(mem_ptr_t mem_info, u32 cid); -extern int sys_mmapper_allocate_address(u32 size, u64 flags, u32 alignment, u32 alloc_addr); -extern int sys_mmapper_allocate_fixed_address(); -extern int sys_mmapper_allocate_memory(u32 size, u64 flags, mem32_t mem_id); -extern int sys_mmapper_allocate_memory_from_container(u32 size, u32 cid, u64 flags, mem32_t mem_id); -extern int sys_mmapper_change_address_access_right(u32 start_addr, u64 flags); -extern int sys_mmapper_free_address(u32 start_addr); -extern int sys_mmapper_free_memory(u32 mem_id); -extern int sys_mmapper_map_memory(u32 start_addr, u32 mem_id, u64 flags); -extern int sys_mmapper_search_and_map(u32 start_addr, u32 mem_id, u64 flags, u32 alloc_addr); -extern int sys_mmapper_unmap_memory(u32 start_addr, u32 mem_id_addr); -extern int sys_mmapper_enable_page_fault_notification(u32 start_addr, u32 q_id); - -//vm -extern int sys_vm_memory_map(u32 vsize, u32 psize, u32 cid, u64 flag, u64 policy, u32 addr); -extern int sys_vm_unmap(u32 addr); -extern int sys_vm_append_memory(u32 addr, u32 size); -extern int sys_vm_return_memory(u32 addr, u32 size); -extern int sys_vm_lock(u32 addr, u32 size); -extern int sys_vm_unlock(u32 addr, u32 size); -extern int sys_vm_touch(u32 addr, u32 size); -extern int sys_vm_flush(u32 addr, u32 size); -extern int sys_vm_invalidate(u32 addr, u32 size); -extern int sys_vm_store(u32 addr, u32 size); -extern int sys_vm_sync(u32 addr, u32 size); -extern int sys_vm_test(u32 addr, u32 size, u32 result_addr); -extern int sys_vm_get_statistics(u32 addr, u32 stat_addr); - -//cellFs -extern int cellFsOpen(u32 path_addr, int flags, mem32_t fd, mem32_t arg, u64 size); -extern int cellFsRead(u32 fd, u32 buf_addr, u64 nbytes, mem64_t nread); -extern int cellFsWrite(u32 fd, u32 buf_addr, u64 nbytes, mem64_t nwrite); -extern int cellFsClose(u32 fd); -extern int cellFsOpendir(u32 path_addr, mem32_t fd); -extern int cellFsReaddir(u32 fd, mem_ptr_t dir, mem64_t nread); -extern int cellFsClosedir(u32 fd); -extern int cellFsStat(u32 path_addr, mem_ptr_t sb); -extern int cellFsFstat(u32 fd, mem_ptr_t sb); -extern int cellFsMkdir(u32 path_addr, u32 mode); -extern int cellFsRename(u32 from_addr, u32 to_addr); -extern int cellFsRmdir(u32 path_addr); -extern int cellFsUnlink(u32 path_addr); -extern int cellFsLseek(u32 fd, s64 offset, u32 whence, mem64_t pos); -extern int cellFsFtruncate(u32 fd, u64 size); -extern int cellFsTruncate(u32 path_addr, u64 size); -extern int cellFsFGetBlockSize(u32 fd, mem64_t sector_size, mem64_t block_size); -extern int cellFsGetBlockSize(u32 path_addr, mem64_t sector_size, mem64_t block_size); -extern int cellFsGetFreeSize(u32 path_addr, mem32_t block_size, mem64_t block_count); -extern int cellFsGetDirectoryEntries(u32 fd, mem_ptr_t entries, u32 entries_size, mem32_t data_count); -extern int cellFsStReadInit(u32 fd, mem_ptr_t ringbuf); -extern int cellFsStReadFinish(u32 fd); -extern int cellFsStReadGetRingBuf(u32 fd, mem_ptr_t ringbuf); -extern int cellFsStReadGetStatus(u32 fd, mem64_t status); -extern int cellFsStReadGetRegid(u32 fd, mem64_t regid); -extern int cellFsStReadStart(u32 fd, u64 offset, u64 size); -extern int cellFsStReadStop(u32 fd); -extern int cellFsStRead(u32 fd, u32 buf_addr, u64 size, mem64_t rsize); -extern int cellFsStReadGetCurrentAddr(u32 fd, mem32_t addr_addr, mem64_t size); -extern int cellFsStReadPutCurrentAddr(u32 fd, u32 addr_addr, u64 size); -extern int cellFsStReadWait(u32 fd, u64 size); -extern int cellFsStReadWaitCallback(u32 fd, u64 size, mem_func_ptr_t func); - -//cellVideo -extern int cellVideoOutGetState(u32 videoOut, u32 deviceIndex, u32 state_addr); -extern int cellVideoOutGetResolution(u32 resolutionId, mem_ptr_t resolution); -extern int cellVideoOutConfigure(u32 videoOut, u32 config_addr, u32 option_addr, u32 waitForEvent); -extern int cellVideoOutGetConfiguration(u32 videoOut, u32 config_addr, u32 option_addr); -extern int cellVideoOutGetNumberOfDevice(u32 videoOut); -extern int cellVideoOutGetResolutionAvailability(u32 videoOut, u32 resolutionId, u32 aspect, u32 option); - -//cellPad -extern int cellPadInit(u32 max_connect); -extern int cellPadEnd(); -extern int cellPadClearBuf(u32 port_no); -extern int cellPadGetData(u32 port_no, u32 data_addr); -extern int cellPadGetDataExtra(u32 port_no, u32 device_type_addr, u32 data_addr); -extern int cellPadSetActDirect(u32 port_no, u32 param_addr); -extern int cellPadGetInfo(u32 info_addr); -extern int cellPadGetInfo2(u32 info_addr); -extern int cellPadSetPortSetting(u32 port_no, u32 port_setting); -extern int cellPadInfoPressMode(u32 port_no); -extern int cellPadInfoSensorMode(u32 port_no); -extern int cellPadSetPressMode(u32 port_no, u32 mode); -extern int cellPadSetSensorMode(u32 port_no, u32 mode); -extern int cellPadGetCapabilityInfo(u32 port_no, mem32_t info_addr); - -//cellKb -extern int cellKbInit(u32 max_connect); -extern int cellKbEnd(); -extern int cellKbClearBuf(u32 port_no); -extern u16 cellKbCnvRawCode(u32 arrange, u32 mkey, u32 led, u16 rawcode); -extern int cellKbGetInfo(mem_class_t info); -extern int cellKbRead(u32 port_no, mem_class_t data); -extern int cellKbSetCodeType(u32 port_no, u32 type); -extern int cellKbSetLEDStatus(u32 port_no, u8 led); -extern int cellKbSetReadMode(u32 port_no, u32 rmode); -extern int cellKbGetConfiguration(u32 port_no, mem_class_t config); - -//cellMouse -extern int cellMouseInit(u32 max_connect); -extern int cellMouseClearBuf(u32 port_no); -extern int cellMouseEnd(); -extern int cellMouseGetInfo(mem_class_t info); -extern int cellMouseInfoTabletMode(u32 port_no, mem_class_t info); -extern int cellMouseGetData(u32 port_no, mem_class_t data); -extern int cellMouseGetDataList(u32 port_no, mem_class_t data); -extern int cellMouseSetTabletMode(u32 port_no, u32 mode); -extern int cellMouseGetTabletDataList(u32 port_no, mem_class_t data); -extern int cellMouseGetRawData(u32 port_no, mem_class_t data); - -//cellGcm +//cellGcm (used as lv2 syscall #1023) extern int cellGcmCallback(u32 context_addr, u32 count); -//sys_tty -extern int sys_tty_read(u32 ch, u64 buf_addr, u32 len, u64 preadlen_addr); -extern int sys_tty_write(u32 ch, u64 buf_addr, u32 len, u64 pwritelen_addr); - -//sys_heap -extern int sys_heap_create_heap(const u32 heap_addr, const u32 start_addr, const u32 size); -extern int sys_heap_malloc(const u32 heap_addr, const u32 size); -extern int _sys_heap_memalign(u32 heap_id, u32 align, u32 size); - -//sys_spu -extern int sys_spu_image_open(mem_ptr_t img, u32 path_addr); -extern int sys_spu_thread_initialize(mem32_t thread, u32 group, u32 spu_num, mem_ptr_t img, mem_ptr_t attr, mem_ptr_t arg); -extern int sys_spu_thread_set_argument(u32 id, mem_ptr_t arg); -extern int sys_spu_thread_group_destroy(u32 id); -extern int sys_spu_thread_group_start(u32 id); -extern int sys_spu_thread_group_suspend(u32 id); -extern int sys_spu_thread_group_resume(u32 id); -extern int sys_spu_thread_group_create(mem32_t id, u32 num, int prio, mem_ptr_t attr); -extern int sys_spu_thread_create(mem32_t thread_id, mem32_t entry, u64 arg, int prio, u32 stacksize, u64 flags, u32 threadname_addr); -extern int sys_spu_thread_group_join(u32 id, mem32_t cause, mem32_t status); -extern int sys_spu_thread_group_connect_event(u32 id, u32 eq, u32 et); -extern int sys_spu_thread_group_disconnect_event(u32 id, u32 et); -extern int sys_spu_thread_group_connect_event_all_threads(u32 id, u32 eq, u64 req, u32 spup_addr); -extern int sys_spu_thread_group_disconnect_event_all_threads(u32 id, u8 spup); -extern int sys_spu_initialize(u32 max_usable_spu, u32 max_raw_spu); -extern int sys_spu_thread_write_ls(u32 id, u32 address, u64 value, u32 type); -extern int sys_spu_thread_read_ls(u32 id, u32 address, mem64_t value, u32 type); -extern int sys_spu_thread_write_spu_mb(u32 id, u32 value); -extern int sys_spu_thread_set_spu_cfg(u32 id, u64 value); -extern int sys_spu_thread_get_spu_cfg(u32 id, mem64_t value); -extern int sys_spu_thread_write_snr(u32 id, u32 number, u32 value); -extern int sys_spu_thread_connect_event(u32 id, u32 eq, u32 et, u8 spup); -extern int sys_spu_thread_disconnect_event(u32 id, u32 event_type, u8 spup); -extern int sys_spu_thread_bind_queue(u32 id, u32 spuq, u32 spuq_num); -extern int sys_spu_thread_unbind_queue(u32 id, u32 spuq_num); -extern int sys_spu_thread_get_exit_status(u32 id, mem32_t status); -extern int sys_raw_spu_create(mem32_t id, u32 attr_addr); -extern int sys_raw_spu_destroy(u32 id); -extern int sys_raw_spu_create_interrupt_tag(u32 id, u32 class_id, u32 hwthread, mem32_t intrtag); -extern int sys_raw_spu_set_int_mask(u32 id, u32 class_id, u64 mask); -extern int sys_raw_spu_get_int_mask(u32 id, u32 class_id, mem64_t mask); -extern int sys_raw_spu_set_int_stat(u32 id, u32 class_id, u64 stat); -extern int sys_raw_spu_get_int_stat(u32 id, u32 class_id, mem64_t stat); -extern int sys_raw_spu_read_puint_mb(u32 id, mem32_t value); -extern int sys_raw_spu_set_spu_cfg(u32 id, u32 value); -extern int sys_raw_spu_get_spu_cfg(u32 id, mem32_t value); - -//sys_interrupt -extern int sys_interrupt_tag_destroy(u32 intrtag); -extern int sys_interrupt_thread_establish(mem32_t ih, u32 intrtag, u64 intrthread, u64 arg); -extern int sys_interrupt_thread_disestablish(u32 ih); -extern void sys_interrupt_thread_eoi(); - -//sys_time -extern int sys_time_get_timezone(mem32_t timezone, mem32_t summertime); -extern int sys_time_get_current_time(u32 sec_addr, u32 nsec_addr); -extern s64 sys_time_get_system_time(); -extern u64 sys_time_get_timebase_frequency(); - -//sys_timer -extern int sys_timer_create(mem32_t timer_id); -extern int sys_timer_destroy(u32 timer_id); -extern int sys_timer_get_information(u32 timer_id, mem_ptr_t info); -extern int sys_timer_start(u32 timer_id, s64 basetime, u64 period); -extern int sys_timer_stop(u32 timer_id); -extern int sys_timer_connect_event_queue(u32 timer_id, u32 queue_id, u64 name, u64 data1, u64 data2); -extern int sys_timer_disconnect_event_queue(u32 timer_id); -extern int sys_timer_sleep(u32 sleep_time); -extern int sys_timer_usleep(u64 sleep_time); - -//sys_trace -extern int sys_trace_create(); -extern int sys_trace_start(); -extern int sys_trace_stop(); -extern int sys_trace_update_top_index(); -extern int sys_trace_destroy(); -extern int sys_trace_drain(); -extern int sys_trace_attach_process(); -extern int sys_trace_allocate_buffer(); -extern int sys_trace_free_buffer(); -extern int sys_trace_create2(); - -//sys_rsx -extern int sys_rsx_device_open(); -extern int sys_rsx_device_close(); -extern int sys_rsx_memory_allocate(); -extern int sys_rsx_memory_free(); -extern int sys_rsx_context_allocate(); -extern int sys_rsx_context_free(); -extern int sys_rsx_context_iomap(); -extern int sys_rsx_context_iounmap(); -extern int sys_rsx_context_attribute(s32 context_id, u64 a2, u64 a3, u64 a4, u64 a5, u64 a6); -extern int sys_rsx_device_map(mem32_t a1, mem32_t a2, u32 a3); -extern int sys_rsx_device_unmap(); -extern int sys_rsx_attribute(); #define UNIMPLEMENTED_FUNC(module) module->Error("Unimplemented function: %s", __FUNCTION__) @@ -481,5 +188,3 @@ public: #define REG_SUB_EMPTY(module, group, name,...) \ static const u64 name ## _table[] = {0}; \ module->AddFuncSub(group, name ## _table, #name, name) - -extern u64 get_system_time(); \ No newline at end of file diff --git a/rpcs3/Emu/SysCalls/lv2/SC_Interrupt.h b/rpcs3/Emu/SysCalls/lv2/SC_Interrupt.h deleted file mode 100644 index 7b9637ef9c..0000000000 --- a/rpcs3/Emu/SysCalls/lv2/SC_Interrupt.h +++ /dev/null @@ -1 +0,0 @@ -#pragma once \ No newline at end of file diff --git a/rpcs3/Emu/SysCalls/lv2/SC_Lwcond.h b/rpcs3/Emu/SysCalls/lv2/SC_Lwcond.h deleted file mode 100644 index 16e92548e6..0000000000 --- a/rpcs3/Emu/SysCalls/lv2/SC_Lwcond.h +++ /dev/null @@ -1,27 +0,0 @@ -#pragma once - -struct sys_lwcond_attribute_t -{ - union - { - char name[8]; - u64 name_u64; - }; -}; - -struct sys_lwcond_t -{ - be_t lwmutex; - be_t lwcond_queue; -}; - -struct Lwcond -{ - SMutex signal; - SleepQueue m_queue; - - Lwcond(u64 name) - : m_queue(name) - { - } -}; \ No newline at end of file diff --git a/rpcs3/Emu/SysCalls/lv2/SC_SPU_Thread.h b/rpcs3/Emu/SysCalls/lv2/SC_SPU_Thread.h deleted file mode 100644 index 12f07ef1d7..0000000000 --- a/rpcs3/Emu/SysCalls/lv2/SC_SPU_Thread.h +++ /dev/null @@ -1,82 +0,0 @@ -#pragma once - -u32 LoadSpuImage(vfsStream& stream, u32& spu_ep); - -enum -{ - SYS_SPU_THREAD_GROUP_JOIN_GROUP_EXIT = 0x0001, - SYS_SPU_THREAD_GROUP_JOIN_ALL_THREADS_EXIT = 0x0002, - SYS_SPU_THREAD_GROUP_JOIN_TERMINATED = 0x0004 -}; - -enum -{ - SYS_SPU_SEGMENT_TYPE_COPY = 0x0001, - SYS_SPU_SEGMENT_TYPE_FILL = 0x0002, - SYS_SPU_SEGMENT_TYPE_INFO = 0x0004, -}; - -struct sys_spu_thread_group_attribute -{ - be_t name_len; - be_t name_addr; - be_t type; - /* struct {} option; */ - be_t ct; // memory container id -}; - -struct sys_spu_thread_attribute -{ - be_t name_addr; - be_t name_len; - be_t option; -}; - -struct sys_spu_thread_argument -{ - be_t arg1; - be_t arg2; - be_t arg3; - be_t arg4; -}; - -struct sys_spu_image -{ - be_t type; - be_t entry_point; - be_t segs_addr; //temporarily used as offset of LS image after elf loading - be_t nsegs; -}; - -struct sys_spu_segment -{ - be_t type; - be_t ls_start; - be_t size; - be_t src; -}; - -struct SpuGroupInfo -{ - std::vector list; - std::atomic lock; - std::string m_name; - int m_prio; - int m_type; - int m_ct; - - SpuGroupInfo(const std::string& name, u32 num, int prio, int type, u32 ct) - : m_name(name) - , m_prio(prio) - , m_type(type) - , m_ct(ct) - , lock(0) - { - num = 256; - list.resize(num); - for (u32 i = 0; i < num; i++) - { - list[i] = 0; - } - } -}; diff --git a/rpcs3/Emu/SysCalls/lv2/SC_Spinlock.h b/rpcs3/Emu/SysCalls/lv2/SC_Spinlock.h deleted file mode 100644 index 0ff4af4029..0000000000 --- a/rpcs3/Emu/SysCalls/lv2/SC_Spinlock.h +++ /dev/null @@ -1,6 +0,0 @@ -#pragma once - -struct spinlock -{ - SMutexBE mutex; -}; \ No newline at end of file diff --git a/rpcs3/Emu/SysCalls/lv2/SC_Time.h b/rpcs3/Emu/SysCalls/lv2/SC_Time.h deleted file mode 100644 index 4d5b326e74..0000000000 --- a/rpcs3/Emu/SysCalls/lv2/SC_Time.h +++ /dev/null @@ -1,4 +0,0 @@ -#pragma once - -u64 get_time(); -u64 get_system_time(); diff --git a/rpcs3/Emu/SysCalls/lv2/SC_Timer.h b/rpcs3/Emu/SysCalls/lv2/SC_Timer.h deleted file mode 100644 index f8749970fe..0000000000 --- a/rpcs3/Emu/SysCalls/lv2/SC_Timer.h +++ /dev/null @@ -1,23 +0,0 @@ -#pragma once - -enum -{ - SYS_TIMER_STATE_STOP = 0x00U, - SYS_TIMER_STATE_RUN = 0x01U, -}; - -struct sys_timer_information_t -{ - s64 next_expiration_time; //system_time_t - u64 period; //usecond_t - u32 timer_state; - u32 pad; -}; - -struct timer -{ - rTimer tmr; - sys_timer_information_t timer_information_t; -}; - -#pragma pack() \ No newline at end of file diff --git a/rpcs3/Emu/SysCalls/lv2/SC_sys_spu.cpp b/rpcs3/Emu/SysCalls/lv2/SC_sys_spu.cpp deleted file mode 100644 index 0565f8bbd8..0000000000 --- a/rpcs3/Emu/SysCalls/lv2/SC_sys_spu.cpp +++ /dev/null @@ -1,23 +0,0 @@ -#if 0 -#include "stdafx.h" -#include "Emu/SysCalls/SysCalls.h" - -static SysCallBase sc_spu("sys_spu"); - -u32 _max_usable_spu = 0; -u32 _max_raw_spu = 0; - -int sys_spu_initialize(u32 max_usable_spu, u32 max_raw_spu) -{ - sc_spu.Log("sys_spu_initialize(max_usable_spu=%d, max_raw_spu=%d)", max_usable_spu, max_raw_spu); - _max_usable_spu = max_usable_spu; - _max_raw_spu = max_raw_spu; - return CELL_OK; -} - -int sys_raw_spu_create(u32 id_addr, u32 attr_addr) -{ - Memory.Write32(id_addr, Emu.GetIdManager().GetNewID("raw_spu")); - return CELL_OK; -} -#endif diff --git a/rpcs3/Emu/SysCalls/lv2/SC_FileSystem.cpp b/rpcs3/Emu/SysCalls/lv2/lv2Fs.cpp similarity index 90% rename from rpcs3/Emu/SysCalls/lv2/SC_FileSystem.cpp rename to rpcs3/Emu/SysCalls/lv2/lv2Fs.cpp index 15fe4a6d86..adebe91563 100644 --- a/rpcs3/Emu/SysCalls/lv2/SC_FileSystem.cpp +++ b/rpcs3/Emu/SysCalls/lv2/lv2Fs.cpp @@ -8,7 +8,7 @@ #include "Emu/FS/vfsFile.h" #include "Emu/FS/vfsDir.h" -#include "SC_FileSystem.h" +#include "lv2Fs.h" #include "Emu/SysCalls/SysCalls.h" extern Module *sys_fs; @@ -52,7 +52,7 @@ struct FsRingBufferConfig } m_fs_config; -int cellFsOpen(u32 path_addr, int flags, mem32_t fd, mem32_t arg, u64 size) +s32 cellFsOpen(u32 path_addr, s32 flags, mem32_t fd, mem32_t arg, u64 size) { const std::string& path = Memory.ReadString(path_addr); sys_fs->Log("cellFsOpen(path=\"%s\", flags=0x%x, fd_addr=0x%x, arg_addr=0x%x, size=0x%llx)", @@ -137,7 +137,7 @@ int cellFsOpen(u32 path_addr, int flags, mem32_t fd, mem32_t arg, u64 size) return CELL_OK; } -int cellFsRead(u32 fd, u32 buf_addr, u64 nbytes, mem64_t nread) +s32 cellFsRead(u32 fd, u32 buf_addr, u64 nbytes, mem64_t nread) { sys_fs->Log("cellFsRead(fd=%d, buf_addr=0x%x, nbytes=0x%llx, nread_addr=0x%x)", fd, buf_addr, nbytes, nread.GetAddr()); @@ -185,7 +185,7 @@ fin: return CELL_OK; } -int cellFsWrite(u32 fd, u32 buf_addr, u64 nbytes, mem64_t nwrite) +s32 cellFsWrite(u32 fd, u32 buf_addr, u64 nbytes, mem64_t nwrite) { sys_fs->Log("cellFsWrite(fd=%d, buf_addr=0x%x, nbytes=0x%llx, nwrite_addr=0x%x)", fd, buf_addr, nbytes, nwrite.GetAddr()); @@ -206,7 +206,7 @@ int cellFsWrite(u32 fd, u32 buf_addr, u64 nbytes, mem64_t nwrite) return CELL_OK; } -int cellFsClose(u32 fd) +s32 cellFsClose(u32 fd) { sys_fs->Warning("cellFsClose(fd=%d)", fd); @@ -216,7 +216,7 @@ int cellFsClose(u32 fd) return CELL_OK; } -int cellFsOpendir(u32 path_addr, mem32_t fd) +s32 cellFsOpendir(u32 path_addr, mem32_t fd) { const std::string& path = Memory.ReadString(path_addr); sys_fs->Warning("cellFsOpendir(path=\"%s\", fd_addr=0x%x)", path.c_str(), fd.GetAddr()); @@ -235,7 +235,7 @@ int cellFsOpendir(u32 path_addr, mem32_t fd) return CELL_OK; } -int cellFsReaddir(u32 fd, mem_ptr_t dir, mem64_t nread) +s32 cellFsReaddir(u32 fd, mem_ptr_t dir, mem64_t nread) { sys_fs->Log("cellFsReaddir(fd=%d, dir_addr=0x%x, nread_addr=0x%x)", fd, dir.GetAddr(), nread.GetAddr()); @@ -261,7 +261,7 @@ int cellFsReaddir(u32 fd, mem_ptr_t dir, mem64_t nread) return CELL_OK; } -int cellFsClosedir(u32 fd) +s32 cellFsClosedir(u32 fd) { sys_fs->Log("cellFsClosedir(fd=%d)", fd); @@ -271,7 +271,7 @@ int cellFsClosedir(u32 fd) return CELL_OK; } -int cellFsStat(const u32 path_addr, mem_ptr_t sb) +s32 cellFsStat(const u32 path_addr, mem_ptr_t sb) { const std::string& path = Memory.ReadString(path_addr); sys_fs->Log("cellFsStat(path=\"%s\", sb_addr: 0x%x)", path.c_str(), sb.GetAddr()); @@ -311,7 +311,7 @@ int cellFsStat(const u32 path_addr, mem_ptr_t sb) return CELL_ENOENT; } -int cellFsFstat(u32 fd, mem_ptr_t sb) +s32 cellFsFstat(u32 fd, mem_ptr_t sb) { sys_fs->Log("cellFsFstat(fd=%d, sb_addr: 0x%x)", fd, sb.GetAddr()); @@ -336,7 +336,7 @@ int cellFsFstat(u32 fd, mem_ptr_t sb) return CELL_OK; } -int cellFsMkdir(u32 path_addr, u32 mode) +s32 cellFsMkdir(u32 path_addr, u32 mode) { const std::string& ps3_path = Memory.ReadString(path_addr); sys_fs->Log("cellFsMkdir(path=\"%s\", mode=0x%x)", ps3_path.c_str(), mode); @@ -355,7 +355,7 @@ int cellFsMkdir(u32 path_addr, u32 mode) return CELL_OK; } -int cellFsRename(u32 from_addr, u32 to_addr) +s32 cellFsRename(u32 from_addr, u32 to_addr) { const std::string& ps3_from = Memory.ReadString(from_addr); const std::string& ps3_to = Memory.ReadString(to_addr); @@ -385,7 +385,7 @@ int cellFsRename(u32 from_addr, u32 to_addr) return CELL_ENOENT; } -int cellFsRmdir(u32 path_addr) +s32 cellFsRmdir(u32 path_addr) { const std::string& ps3_path = Memory.ReadString(path_addr); sys_fs->Log("cellFsRmdir(path=\"%s\")", ps3_path.c_str()); @@ -400,7 +400,7 @@ int cellFsRmdir(u32 path_addr) return CELL_OK; } -int cellFsUnlink(u32 path_addr) +s32 cellFsUnlink(u32 path_addr) { const std::string& ps3_path = Memory.ReadString(path_addr); sys_fs->Warning("cellFsUnlink(path=\"%s\")", ps3_path.c_str()); @@ -420,7 +420,7 @@ int cellFsUnlink(u32 path_addr) return CELL_OK; } -int cellFsLseek(u32 fd, s64 offset, u32 whence, mem64_t pos) +s32 cellFsLseek(u32 fd, s64 offset, u32 whence, mem64_t pos) { vfsSeekMode seek_mode; sys_fs->Log("cellFsLseek(fd=%d, offset=0x%llx, whence=0x%x, pos_addr=0x%x)", fd, offset, whence, pos.GetAddr()); @@ -441,7 +441,7 @@ int cellFsLseek(u32 fd, s64 offset, u32 whence, mem64_t pos) return CELL_OK; } -int cellFsFtruncate(u32 fd, u64 size) +s32 cellFsFtruncate(u32 fd, u64 size) { sys_fs->Log("cellFsFtruncate(fd=%d, size=%lld)", fd, size); u32 attr; @@ -467,7 +467,7 @@ int cellFsFtruncate(u32 fd, u64 size) return CELL_OK; } -int cellFsTruncate(u32 path_addr, u64 size) +s32 cellFsTruncate(u32 path_addr, u64 size) { const std::string& path = Memory.ReadString(path_addr); sys_fs->Log("cellFsTruncate(path=\"%s\", size=%lld)", path.c_str(), size); @@ -498,7 +498,7 @@ int cellFsTruncate(u32 path_addr, u64 size) return CELL_OK; } -int cellFsFGetBlockSize(u32 fd, mem64_t sector_size, mem64_t block_size) +s32 cellFsFGetBlockSize(u32 fd, mem64_t sector_size, mem64_t block_size) { sys_fs->Log("cellFsFGetBlockSize(fd=%d, sector_size_addr: 0x%x, block_size_addr: 0x%x)", fd, sector_size.GetAddr(), block_size.GetAddr()); @@ -511,7 +511,7 @@ int cellFsFGetBlockSize(u32 fd, mem64_t sector_size, mem64_t block_size) return CELL_OK; } -int cellFsGetBlockSize(u32 path_addr, mem64_t sector_size, mem64_t block_size) +s32 cellFsGetBlockSize(u32 path_addr, mem64_t sector_size, mem64_t block_size) { sys_fs->Log("cellFsGetBlockSize(file: %s, sector_size_addr: 0x%x, block_size_addr: 0x%x)", Memory.ReadString(path_addr).c_str(), sector_size.GetAddr(), block_size.GetAddr()); @@ -521,7 +521,7 @@ int cellFsGetBlockSize(u32 path_addr, mem64_t sector_size, mem64_t block_size) return CELL_OK; } -int cellFsGetFreeSize(u32 path_addr, mem32_t block_size, mem64_t block_count) +s32 cellFsGetFreeSize(u32 path_addr, mem32_t block_size, mem64_t block_count) { const std::string& ps3_path = Memory.ReadString(path_addr); sys_fs->Warning("cellFsGetFreeSize(path=\"%s\", block_size_addr=0x%x, block_count_addr=0x%x)", @@ -540,7 +540,7 @@ int cellFsGetFreeSize(u32 path_addr, mem32_t block_size, mem64_t block_count) return CELL_OK; } -int cellFsGetDirectoryEntries(u32 fd, mem_ptr_t entries, u32 entries_size, mem32_t data_count) +s32 cellFsGetDirectoryEntries(u32 fd, mem_ptr_t entries, u32 entries_size, mem32_t data_count) { sys_fs->Log("cellFsGetDirectoryEntries(fd=%d, entries_addr=0x%x, entries_size = 0x%x, data_count_addr=0x%x)", fd, entries.GetAddr(), entries_size, data_count.GetAddr()); @@ -578,7 +578,7 @@ int cellFsGetDirectoryEntries(u32 fd, mem_ptr_t entries, u return CELL_OK; } -int cellFsStReadInit(u32 fd, mem_ptr_t ringbuf) +s32 cellFsStReadInit(u32 fd, mem_ptr_t ringbuf) { sys_fs->Warning("cellFsStReadInit(fd=%d, ringbuf_addr=0x%x)", fd, ringbuf.GetAddr()); @@ -608,7 +608,7 @@ int cellFsStReadInit(u32 fd, mem_ptr_t ringbuf) return CELL_OK; } -int cellFsStReadFinish(u32 fd) +s32 cellFsStReadFinish(u32 fd) { sys_fs->Warning("cellFsStReadFinish(fd=%d)", fd); @@ -621,7 +621,7 @@ int cellFsStReadFinish(u32 fd) return CELL_OK; } -int cellFsStReadGetRingBuf(u32 fd, mem_ptr_t ringbuf) +s32 cellFsStReadGetRingBuf(u32 fd, mem_ptr_t ringbuf) { sys_fs->Warning("cellFsStReadGetRingBuf(fd=%d, ringbuf_addr=0x%x)", fd, ringbuf.GetAddr()); @@ -643,7 +643,7 @@ int cellFsStReadGetRingBuf(u32 fd, mem_ptr_t ringbuf) return CELL_OK; } -int cellFsStReadGetStatus(u32 fd, mem64_t status) +s32 cellFsStReadGetStatus(u32 fd, mem64_t status) { sys_fs->Warning("cellFsStReadGetRingBuf(fd=%d, status_addr=0x%x)", fd, status.GetAddr()); @@ -655,7 +655,7 @@ int cellFsStReadGetStatus(u32 fd, mem64_t status) return CELL_OK; } -int cellFsStReadGetRegid(u32 fd, mem64_t regid) +s32 cellFsStReadGetRegid(u32 fd, mem64_t regid) { sys_fs->Warning("cellFsStReadGetRingBuf(fd=%d, regid_addr=0x%x)", fd, regid.GetAddr()); @@ -667,7 +667,7 @@ int cellFsStReadGetRegid(u32 fd, mem64_t regid) return CELL_OK; } -int cellFsStReadStart(u32 fd, u64 offset, u64 size) +s32 cellFsStReadStart(u32 fd, u64 offset, u64 size) { sys_fs->Warning("TODO: cellFsStReadStart(fd=%d, offset=0x%llx, size=0x%llx)", fd, offset, size); @@ -680,7 +680,7 @@ int cellFsStReadStart(u32 fd, u64 offset, u64 size) return CELL_OK; } -int cellFsStReadStop(u32 fd) +s32 cellFsStReadStop(u32 fd) { sys_fs->Warning("cellFsStReadStop(fd=%d)", fd); @@ -692,7 +692,7 @@ int cellFsStReadStop(u32 fd) return CELL_OK; } -int cellFsStRead(u32 fd, u32 buf_addr, u64 size, mem64_t rsize) +s32 cellFsStRead(u32 fd, u32 buf_addr, u64 size, mem64_t rsize) { sys_fs->Warning("TODO: cellFsStRead(fd=%d, buf_addr=0x%x, size=0x%llx, rsize_addr = 0x%x)", fd, buf_addr, size, rsize.GetAddr()); @@ -707,7 +707,7 @@ int cellFsStRead(u32 fd, u32 buf_addr, u64 size, mem64_t rsize) return CELL_OK; } -int cellFsStReadGetCurrentAddr(u32 fd, mem32_t addr_addr, mem64_t size) +s32 cellFsStReadGetCurrentAddr(u32 fd, mem32_t addr_addr, mem64_t size) { sys_fs->Warning("TODO: cellFsStReadGetCurrentAddr(fd=%d, addr_addr=0x%x, size_addr = 0x%x)", fd, addr_addr.GetAddr(), size.GetAddr()); @@ -719,7 +719,7 @@ int cellFsStReadGetCurrentAddr(u32 fd, mem32_t addr_addr, mem64_t size) return CELL_OK; } -int cellFsStReadPutCurrentAddr(u32 fd, u32 addr_addr, u64 size) +s32 cellFsStReadPutCurrentAddr(u32 fd, u32 addr_addr, u64 size) { sys_fs->Warning("TODO: cellFsStReadPutCurrentAddr(fd=%d, addr_addr=0x%x, size = 0x%llx)", fd, addr_addr, size); @@ -731,7 +731,7 @@ int cellFsStReadPutCurrentAddr(u32 fd, u32 addr_addr, u64 size) return CELL_OK; } -int cellFsStReadWait(u32 fd, u64 size) +s32 cellFsStReadWait(u32 fd, u64 size) { sys_fs->Warning("TODO: cellFsStReadWait(fd=%d, size = 0x%llx)", fd, size); @@ -741,7 +741,7 @@ int cellFsStReadWait(u32 fd, u64 size) return CELL_OK; } -int cellFsStReadWaitCallback(u32 fd, u64 size, mem_func_ptr_t func) +s32 cellFsStReadWaitCallback(u32 fd, u64 size, mem_func_ptr_t func) { sys_fs->Warning("TODO: cellFsStReadWaitCallback(fd=%d, size = 0x%llx, func_addr = 0x%x)", fd, size, func.GetAddr()); @@ -752,4 +752,4 @@ int cellFsStReadWaitCallback(u32 fd, u64 size, mem_func_ptr_tCheckId(fd, file)) return CELL_ESRCH; return CELL_OK; -} \ No newline at end of file +} diff --git a/rpcs3/Emu/SysCalls/lv2/SC_FileSystem.h b/rpcs3/Emu/SysCalls/lv2/lv2Fs.h similarity index 53% rename from rpcs3/Emu/SysCalls/lv2/SC_FileSystem.h rename to rpcs3/Emu/SysCalls/lv2/lv2Fs.h index d705b37d6f..1ab23595b3 100644 --- a/rpcs3/Emu/SysCalls/lv2/SC_FileSystem.h +++ b/rpcs3/Emu/SysCalls/lv2/lv2Fs.h @@ -122,3 +122,37 @@ struct CellFsRingBuffer be_t transfer_rate; be_t copy; }; + +// SysCalls +s32 cellFsOpen(u32 path_addr, s32 flags, mem32_t fd, mem32_t arg, u64 size); +s32 cellFsRead(u32 fd, u32 buf_addr, u64 nbytes, mem64_t nread); +s32 cellFsWrite(u32 fd, u32 buf_addr, u64 nbytes, mem64_t nwrite); +s32 cellFsClose(u32 fd); +s32 cellFsOpendir(u32 path_addr, mem32_t fd); +s32 cellFsReaddir(u32 fd, mem_ptr_t dir, mem64_t nread); +s32 cellFsClosedir(u32 fd); +s32 cellFsStat(u32 path_addr, mem_ptr_t sb); +s32 cellFsFstat(u32 fd, mem_ptr_t sb); +s32 cellFsMkdir(u32 path_addr, u32 mode); +s32 cellFsRename(u32 from_addr, u32 to_addr); +s32 cellFsRmdir(u32 path_addr); +s32 cellFsUnlink(u32 path_addr); +s32 cellFsLseek(u32 fd, s64 offset, u32 whence, mem64_t pos); +s32 cellFsFtruncate(u32 fd, u64 size); +s32 cellFsTruncate(u32 path_addr, u64 size); +s32 cellFsFGetBlockSize(u32 fd, mem64_t sector_size, mem64_t block_size); +s32 cellFsGetBlockSize(u32 path_addr, mem64_t sector_size, mem64_t block_size); +s32 cellFsGetFreeSize(u32 path_addr, mem32_t block_size, mem64_t block_count); +s32 cellFsGetDirectoryEntries(u32 fd, mem_ptr_t entries, u32 entries_size, mem32_t data_count); +s32 cellFsStReadInit(u32 fd, mem_ptr_t ringbuf); +s32 cellFsStReadFinish(u32 fd); +s32 cellFsStReadGetRingBuf(u32 fd, mem_ptr_t ringbuf); +s32 cellFsStReadGetStatus(u32 fd, mem64_t status); +s32 cellFsStReadGetRegid(u32 fd, mem64_t regid); +s32 cellFsStReadStart(u32 fd, u64 offset, u64 size); +s32 cellFsStReadStop(u32 fd); +s32 cellFsStRead(u32 fd, u32 buf_addr, u64 size, mem64_t rsize); +s32 cellFsStReadGetCurrentAddr(u32 fd, mem32_t addr_addr, mem64_t size); +s32 cellFsStReadPutCurrentAddr(u32 fd, u32 addr_addr, u64 size); +s32 cellFsStReadWait(u32 fd, u64 size); +s32 cellFsStReadWaitCallback(u32 fd, u64 size, mem_func_ptr_t func); diff --git a/rpcs3/Emu/SysCalls/lv2/SC_Condition.cpp b/rpcs3/Emu/SysCalls/lv2/sys_cond.cpp similarity index 94% rename from rpcs3/Emu/SysCalls/lv2/SC_Condition.cpp rename to rpcs3/Emu/SysCalls/lv2/sys_cond.cpp index 1e06dcd5d7..de61193d45 100644 --- a/rpcs3/Emu/SysCalls/lv2/SC_Condition.cpp +++ b/rpcs3/Emu/SysCalls/lv2/sys_cond.cpp @@ -5,11 +5,11 @@ #include "Emu/Cell/PPUThread.h" #include "Emu/SysCalls/SysCalls.h" -#include "Emu/SysCalls/lv2/SC_Condition.h" +#include "sys_cond.h" SysCallBase sys_cond("sys_cond"); -int sys_cond_create(mem32_t cond_id, u32 mutex_id, mem_ptr_t attr) +s32 sys_cond_create(mem32_t cond_id, u32 mutex_id, mem_ptr_t attr) { sys_cond.Log("sys_cond_create(cond_id_addr=0x%x, mutex_id=%d, attr_addr=0x%x)", cond_id.GetAddr(), mutex_id, attr.GetAddr()); @@ -45,7 +45,7 @@ int sys_cond_create(mem32_t cond_id, u32 mutex_id, mem_ptr_t return CELL_OK; } -int sys_cond_destroy(u32 cond_id) +s32 sys_cond_destroy(u32 cond_id) { sys_cond.Warning("sys_cond_destroy(cond_id=%d)", cond_id); @@ -65,7 +65,7 @@ int sys_cond_destroy(u32 cond_id) return CELL_OK; } -int sys_cond_signal(u32 cond_id) +s32 sys_cond_signal(u32 cond_id) { sys_cond.Log("sys_cond_signal(cond_id=%d)", cond_id); @@ -92,7 +92,7 @@ int sys_cond_signal(u32 cond_id) return CELL_OK; } -int sys_cond_signal_all(u32 cond_id) +s32 sys_cond_signal_all(u32 cond_id) { sys_cond.Log("sys_cond_signal_all(cond_id=%d)", cond_id); @@ -122,7 +122,7 @@ int sys_cond_signal_all(u32 cond_id) return CELL_OK; } -int sys_cond_signal_to(u32 cond_id, u32 thread_id) +s32 sys_cond_signal_to(u32 cond_id, u32 thread_id) { sys_cond.Log("sys_cond_signal_to(cond_id=%d, thread_id=%d)", cond_id, thread_id); @@ -159,7 +159,7 @@ int sys_cond_signal_to(u32 cond_id, u32 thread_id) return CELL_OK; } -int sys_cond_wait(u32 cond_id, u64 timeout) +s32 sys_cond_wait(u32 cond_id, u64 timeout) { sys_cond.Log("sys_cond_wait(cond_id=%d, timeout=%lld)", cond_id, timeout); diff --git a/rpcs3/Emu/SysCalls/lv2/SC_Condition.h b/rpcs3/Emu/SysCalls/lv2/sys_cond.h similarity index 54% rename from rpcs3/Emu/SysCalls/lv2/SC_Condition.h rename to rpcs3/Emu/SysCalls/lv2/sys_cond.h index d4b64c12cd..c934f4fd9f 100644 --- a/rpcs3/Emu/SysCalls/lv2/SC_Condition.h +++ b/rpcs3/Emu/SysCalls/lv2/sys_cond.h @@ -1,5 +1,5 @@ #pragma once -#include "SC_Mutex.h" +#include "sys_mutex.h" struct sys_cond_attribute { @@ -28,4 +28,12 @@ struct Cond , signaler(0) { } -}; \ No newline at end of file +}; + +// SysCalls +s32 sys_cond_create(mem32_t cond_id, u32 mutex_id, mem_ptr_t attr); +s32 sys_cond_destroy(u32 cond_id); +s32 sys_cond_wait(u32 cond_id, u64 timeout); +s32 sys_cond_signal(u32 cond_id); +s32 sys_cond_signal_all(u32 cond_id); +s32 sys_cond_signal_to(u32 cond_id, u32 thread_id); diff --git a/rpcs3/Emu/SysCalls/lv2/sys_event.cpp b/rpcs3/Emu/SysCalls/lv2/sys_event.cpp new file mode 100644 index 0000000000..f49afa78dd --- /dev/null +++ b/rpcs3/Emu/SysCalls/lv2/sys_event.cpp @@ -0,0 +1,751 @@ +#include "stdafx.h" +#include "Utilities/Log.h" +#include "Emu/Memory/Memory.h" +#include "Emu/System.h" +#include "Emu/Cell/PPUThread.h" + +#include "Emu/SysCalls/SysCalls.h" +#include "Emu/Cell/SPUThread.h" +#include "Emu/event.h" + +#include "sys_lwmutex.h" +#include "sys_event.h" + +SysCallBase sys_event("sys_event"); + +s32 sys_event_queue_create(mem32_t equeue_id, mem_ptr_t attr, u64 event_queue_key, int size) +{ + sys_event.Warning("sys_event_queue_create(equeue_id_addr=0x%x, attr_addr=0x%x, event_queue_key=0x%llx, size=%d)", + equeue_id.GetAddr(), attr.GetAddr(), event_queue_key, size); + + if(size <= 0 || size > 127) + { + return CELL_EINVAL; + } + + if(!equeue_id.IsGood() || !attr.IsGood()) + { + return CELL_EFAULT; + } + + switch (attr->protocol.ToBE()) + { + case se32(SYS_SYNC_PRIORITY): break; + case se32(SYS_SYNC_RETRY): sys_event.Error("Invalid SYS_SYNC_RETRY protocol attr"); return CELL_EINVAL; + case se32(SYS_SYNC_PRIORITY_INHERIT): sys_event.Error("Invalid SYS_SYNC_PRIORITY_INHERIT protocol attr"); return CELL_EINVAL; + case se32(SYS_SYNC_FIFO): break; + default: sys_event.Error("Unknown 0x%x protocol attr", (u32)attr->protocol); return CELL_EINVAL; + } + + switch (attr->type.ToBE()) + { + case se32(SYS_PPU_QUEUE): break; + case se32(SYS_SPU_QUEUE): break; + default: sys_event.Error("Unknown 0x%x type attr", (u32)attr->type); return CELL_EINVAL; + } + + if (event_queue_key && Emu.GetEventManager().CheckKey(event_queue_key)) + { + return CELL_EEXIST; + } + + EventQueue* eq = new EventQueue((u32)attr->protocol, (int)attr->type, attr->name_u64, event_queue_key, size); + + if (event_queue_key && !Emu.GetEventManager().RegisterKey(eq, event_queue_key)) + { + delete eq; + return CELL_EAGAIN; + } + + equeue_id = sys_event.GetNewId(eq); + sys_event.Warning("*** event_queue created [%s] (protocol=0x%x, type=0x%x): id = %d", + std::string(attr->name, 8).c_str(), (u32)attr->protocol, (int)attr->type, equeue_id.GetValue()); + + return CELL_OK; +} + +s32 sys_event_queue_destroy(u32 equeue_id, int mode) +{ + sys_event.Error("sys_event_queue_destroy(equeue_id=%d, mode=0x%x)", equeue_id, mode); + + EventQueue* eq; + if (!Emu.GetIdManager().GetIDData(equeue_id, eq)) + { + return CELL_ESRCH; + } + + if (mode && mode != SYS_EVENT_QUEUE_DESTROY_FORCE) + { + return CELL_EINVAL; + } + + u32 tid = GetCurrentPPUThread().GetId(); + + eq->sq.m_mutex.lock(); + eq->owner.lock(tid); + // check if some threads are waiting for an event + if (!mode && eq->sq.list.size()) + { + eq->owner.unlock(tid); + eq->sq.m_mutex.unlock(); + return CELL_EBUSY; + } + eq->owner.unlock(tid, ~0); + eq->sq.m_mutex.unlock(); + while (eq->sq.list.size()) + { + Sleep(1); + if (Emu.IsStopped()) + { + LOG_WARNING(HLE, "sys_event_queue_destroy(equeue=%d) aborted", equeue_id); + break; + } + } + + Emu.GetEventManager().UnregisterKey(eq->key); + eq->ports.clear(); + Emu.GetIdManager().RemoveID(equeue_id); + + return CELL_OK; +} + +s32 sys_event_queue_tryreceive(u32 equeue_id, mem_ptr_t event_array, int size, mem32_t number) +{ + sys_event.Error("sys_event_queue_tryreceive(equeue_id=%d, event_array_addr=0x%x, size=%d, number_addr=0x%x)", + equeue_id, event_array.GetAddr(), size, number.GetAddr()); + + if (size < 0 || !number.IsGood()) + { + return CELL_EFAULT; + } + + if (size && !Memory.IsGoodAddr(event_array.GetAddr(), sizeof(sys_event_data) * size)) + { + return CELL_EFAULT; + } + + EventQueue* eq; + if (!Emu.GetIdManager().GetIDData(equeue_id, eq)) + { + return CELL_ESRCH; + } + + if (eq->type != SYS_PPU_QUEUE) + { + return CELL_EINVAL; + } + + if (size == 0) + { + number = 0; + return CELL_OK; + } + + u32 tid = GetCurrentPPUThread().GetId(); + + eq->sq.m_mutex.lock(); + eq->owner.lock(tid); + if (eq->sq.list.size()) + { + number = 0; + eq->owner.unlock(tid); + eq->sq.m_mutex.unlock(); + return CELL_OK; + } + number = eq->events.pop_all((sys_event_data*)(Memory + event_array.GetAddr()), size); + eq->owner.unlock(tid); + eq->sq.m_mutex.unlock(); + return CELL_OK; +} + +s32 sys_event_queue_receive(u32 equeue_id, mem_ptr_t event, u64 timeout) +{ + sys_event.Log("sys_event_queue_receive(equeue_id=%d, event_addr=0x%x, timeout=%lld)", + equeue_id, event.GetAddr(), timeout); + + if (!event.IsGood()) + { + return CELL_EFAULT; + } + + EventQueue* eq; + if (!Emu.GetIdManager().GetIDData(equeue_id, eq)) + { + return CELL_ESRCH; + } + + if (eq->type != SYS_PPU_QUEUE) + { + return CELL_EINVAL; + } + + u32 tid = GetCurrentPPUThread().GetId(); + + eq->sq.push(tid); // add thread to sleep queue + + timeout = timeout ? (timeout / 1000) : ~0; + u64 counter = 0; + while (true) + { + switch (eq->owner.trylock(tid)) + { + case SMR_OK: + if (!eq->events.count()) + { + eq->owner.unlock(tid); + break; + } + else + { + u32 next = (eq->protocol == SYS_SYNC_FIFO) ? eq->sq.pop() : eq->sq.pop_prio(); + if (next != tid) + { + eq->owner.unlock(tid, next); + break; + } + } + case SMR_SIGNAL: + { + eq->events.pop(*event); + eq->owner.unlock(tid); + sys_event.Log(" *** event received: source=0x%llx, d1=0x%llx, d2=0x%llx, d3=0x%llx", + (u64)event->source, (u64)event->data1, (u64)event->data2, (u64)event->data3); + /* passing event data in registers */ + PPUThread& t = GetCurrentPPUThread(); + t.GPR[4] = event->source; + t.GPR[5] = event->data1; + t.GPR[6] = event->data2; + t.GPR[7] = event->data3; + return CELL_OK; + } + case SMR_FAILED: break; + default: eq->sq.invalidate(tid); return CELL_ECANCELED; + } + + Sleep(1); + if (counter++ > timeout || Emu.IsStopped()) + { + if (Emu.IsStopped()) LOG_WARNING(HLE, "sys_event_queue_receive(equeue=%d) aborted", equeue_id); + eq->sq.invalidate(tid); + return CELL_ETIMEDOUT; + } + } +} + +s32 sys_event_queue_drain(u32 equeue_id) +{ + sys_event.Log("sys_event_queue_drain(equeue_id=%d)", equeue_id); + + EventQueue* eq; + if (!Emu.GetIdManager().GetIDData(equeue_id, eq)) + { + return CELL_ESRCH; + } + + eq->events.clear(); + + return CELL_OK; +} + +s32 sys_event_port_create(mem32_t eport_id, int port_type, u64 name) +{ + sys_event.Warning("sys_event_port_create(eport_id_addr=0x%x, port_type=0x%x, name=0x%llx)", + eport_id.GetAddr(), port_type, name); + + if (!eport_id.IsGood()) + { + return CELL_EFAULT; + } + + if (port_type != SYS_EVENT_PORT_LOCAL) + { + sys_event.Error("sys_event_port_create: invalid port_type(0x%x)", port_type); + return CELL_EINVAL; + } + + EventPort* eport = new EventPort(); + u32 id = sys_event.GetNewId(eport); + eport->name = name ? name : ((u64)sys_process_getpid() << 32) | (u64)id; + eport_id = id; + sys_event.Warning("*** sys_event_port created: id = %d", id); + + return CELL_OK; +} + +s32 sys_event_port_destroy(u32 eport_id) +{ + sys_event.Warning("sys_event_port_destroy(eport_id=%d)", eport_id); + + EventPort* eport; + if (!Emu.GetIdManager().GetIDData(eport_id, eport)) + { + return CELL_ESRCH; + } + + if (!eport->m_mutex.try_lock()) + { + return CELL_EISCONN; + } + + if (eport->eq) + { + eport->m_mutex.unlock(); + return CELL_EISCONN; + } + + eport->m_mutex.unlock(); + Emu.GetIdManager().RemoveID(eport_id); + return CELL_OK; +} + +s32 sys_event_port_connect_local(u32 eport_id, u32 equeue_id) +{ + sys_event.Warning("sys_event_port_connect_local(eport_id=%d, equeue_id=%d)", eport_id, equeue_id); + + EventPort* eport; + if (!Emu.GetIdManager().GetIDData(eport_id, eport)) + { + return CELL_ESRCH; + } + + if (!eport->m_mutex.try_lock()) + { + return CELL_EISCONN; + } + + if (eport->eq) + { + eport->m_mutex.unlock(); + return CELL_EISCONN; + } + + EventQueue* equeue; + if (!Emu.GetIdManager().GetIDData(equeue_id, equeue)) + { + sys_event.Error("sys_event_port_connect_local: event_queue(%d) not found!", equeue_id); + eport->m_mutex.unlock(); + return CELL_ESRCH; + } + else + { + equeue->ports.add(eport); + } + + eport->eq = equeue; + eport->m_mutex.unlock(); + return CELL_OK; +} + +s32 sys_event_port_disconnect(u32 eport_id) +{ + sys_event.Warning("sys_event_port_disconnect(eport_id=%d)", eport_id); + + EventPort* eport; + if (!Emu.GetIdManager().GetIDData(eport_id, eport)) + { + return CELL_ESRCH; + } + + if (!eport->eq) + { + return CELL_ENOTCONN; + } + + if (!eport->m_mutex.try_lock()) + { + return CELL_EBUSY; + } + + eport->eq->ports.remove(eport); + eport->eq = nullptr; + eport->m_mutex.unlock(); + return CELL_OK; +} + +s32 sys_event_port_send(u32 eport_id, u64 data1, u64 data2, u64 data3) +{ + sys_event.Log("sys_event_port_send(eport_id=%d, data1=0x%llx, data2=0x%llx, data3=0x%llx)", + eport_id, data1, data2, data3); + + EventPort* eport; + if (!Emu.GetIdManager().GetIDData(eport_id, eport)) + { + return CELL_ESRCH; + } + + std::lock_guard lock(eport->m_mutex); + + EventQueue* eq = eport->eq; + if (!eq) + { + return CELL_ENOTCONN; + } + + if (!eq->events.push(eport->name, data1, data2, data3)) + { + return CELL_EBUSY; + } + + return CELL_OK; +} + +// sys_event_flag +s32 sys_event_flag_create(mem32_t eflag_id, mem_ptr_t attr, u64 init) +{ + sys_event.Warning("sys_event_flag_create(eflag_id_addr=0x%x, attr_addr=0x%x, init=0x%llx)", + eflag_id.GetAddr(), attr.GetAddr(), init); + + if(!eflag_id.IsGood() || !attr.IsGood()) + { + return CELL_EFAULT; + } + + switch (attr->protocol.ToBE()) + { + case se32(SYS_SYNC_PRIORITY): break; + case se32(SYS_SYNC_RETRY): sys_event.Warning("TODO: SYS_SYNC_RETRY attr"); break; + case se32(SYS_SYNC_PRIORITY_INHERIT): sys_event.Warning("TODO: SYS_SYNC_PRIORITY_INHERIT attr"); break; + case se32(SYS_SYNC_FIFO): break; + default: return CELL_EINVAL; + } + + if (attr->pshared.ToBE() != se32(0x200)) + { + return CELL_EINVAL; + } + + switch (attr->type.ToBE()) + { + case se32(SYS_SYNC_WAITER_SINGLE): break; + case se32(SYS_SYNC_WAITER_MULTIPLE): break; + default: return CELL_EINVAL; + } + + eflag_id = sys_event.GetNewId(new EventFlag(init, (u32)attr->protocol, (int)attr->type)); + + sys_event.Warning("*** event_flag created [%s] (protocol=0x%x, type=0x%x): id = %d", + std::string(attr->name, 8).c_str(), (u32)attr->protocol, (int)attr->type, eflag_id.GetValue()); + + return CELL_OK; +} + +s32 sys_event_flag_destroy(u32 eflag_id) +{ + sys_event.Warning("sys_event_flag_destroy(eflag_id=%d)", eflag_id); + + EventFlag* ef; + if(!sys_event.CheckId(eflag_id, ef)) return CELL_ESRCH; + + if (ef->waiters.size()) // ??? + { + return CELL_EBUSY; + } + + Emu.GetIdManager().RemoveID(eflag_id); + + return CELL_OK; +} + +s32 sys_event_flag_wait(u32 eflag_id, u64 bitptn, u32 mode, mem64_t result, u64 timeout) +{ + sys_event.Log("sys_event_flag_wait(eflag_id=%d, bitptn=0x%llx, mode=0x%x, result_addr=0x%x, timeout=%lld)", + eflag_id, bitptn, mode, result.GetAddr(), timeout); + + if (result.IsGood()) result = 0; + + switch (mode & 0xf) + { + case SYS_EVENT_FLAG_WAIT_AND: break; + case SYS_EVENT_FLAG_WAIT_OR: break; + default: return CELL_EINVAL; + } + + switch (mode & ~0xf) + { + case 0: break; // ??? + case SYS_EVENT_FLAG_WAIT_CLEAR: break; + case SYS_EVENT_FLAG_WAIT_CLEAR_ALL: break; + default: return CELL_EINVAL; + } + + EventFlag* ef; + if(!sys_event.CheckId(eflag_id, ef)) return CELL_ESRCH; + + u32 tid = GetCurrentPPUThread().GetId(); + + { + SMutexLocker lock(ef->m_mutex); + if (ef->m_type == SYS_SYNC_WAITER_SINGLE && ef->waiters.size() > 0) + { + return CELL_EPERM; + } + EventFlagWaiter rec; + rec.bitptn = bitptn; + rec.mode = mode; + rec.tid = tid; + ef->waiters.push_back(rec); + + if (ef->check() == tid) + { + u64 flags = ef->flags; + + ef->waiters.erase(ef->waiters.end() - 1); + + if (mode & SYS_EVENT_FLAG_WAIT_CLEAR) + { + ef->flags &= ~bitptn; + } + else if (mode & SYS_EVENT_FLAG_WAIT_CLEAR_ALL) + { + ef->flags = 0; + } + + if (result.IsGood()) + { + result = flags; + return CELL_OK; + } + + if (!result.GetAddr()) + { + return CELL_OK; + } + return CELL_EFAULT; + } + } + + u32 counter = 0; + const u32 max_counter = timeout ? (timeout / 1000) : ~0; + + while (true) + { + if (ef->signal.unlock(tid, tid) == SMR_OK) + { + SMutexLocker lock(ef->m_mutex); + + u64 flags = ef->flags; + + for (u32 i = 0; i < ef->waiters.size(); i++) + { + if (ef->waiters[i].tid == tid) + { + ef->waiters.erase(ef->waiters.begin() +i); + + if (mode & SYS_EVENT_FLAG_WAIT_CLEAR) + { + ef->flags &= ~bitptn; + } + else if (mode & SYS_EVENT_FLAG_WAIT_CLEAR_ALL) + { + ef->flags = 0; + } + + if (u32 target = ef->check()) + { + // if signal, leave both mutexes locked... + ef->signal.unlock(tid, target); + ef->m_mutex.unlock(tid, target); + } + else + { + ef->signal.unlock(tid); + } + + if (result.IsGood()) + { + result = flags; + return CELL_OK; + } + + if (!result.GetAddr()) + { + return CELL_OK; + } + return CELL_EFAULT; + } + } + + ef->signal.unlock(tid); + return CELL_ECANCELED; + } + + Sleep(1); + + if (counter++ > max_counter) + { + SMutexLocker lock(ef->m_mutex); + + for (u32 i = 0; i < ef->waiters.size(); i++) + { + if (ef->waiters[i].tid == tid) + { + ef->waiters.erase(ef->waiters.begin() + i); + break; + } + } + + return CELL_ETIMEDOUT; + } + if (Emu.IsStopped()) + { + LOG_WARNING(HLE, "sys_event_flag_wait(id=%d) aborted", eflag_id); + return CELL_OK; + } + } +} + +s32 sys_event_flag_trywait(u32 eflag_id, u64 bitptn, u32 mode, mem64_t result) +{ + sys_event.Log("sys_event_flag_trywait(eflag_id=%d, bitptn=0x%llx, mode=0x%x, result_addr=0x%x)", + eflag_id, bitptn, mode, result.GetAddr()); + + if (result.IsGood()) result = 0; + + switch (mode & 0xf) + { + case SYS_EVENT_FLAG_WAIT_AND: break; + case SYS_EVENT_FLAG_WAIT_OR: break; + default: return CELL_EINVAL; + } + + switch (mode & ~0xf) + { + case 0: break; // ??? + case SYS_EVENT_FLAG_WAIT_CLEAR: break; + case SYS_EVENT_FLAG_WAIT_CLEAR_ALL: break; + default: return CELL_EINVAL; + } + + EventFlag* ef; + if(!sys_event.CheckId(eflag_id, ef)) return CELL_ESRCH; + + SMutexLocker lock(ef->m_mutex); + + u64 flags = ef->flags; + + if (((mode & SYS_EVENT_FLAG_WAIT_AND) && (flags & bitptn) == bitptn) || + ((mode & SYS_EVENT_FLAG_WAIT_OR) && (flags & bitptn))) + { + if (mode & SYS_EVENT_FLAG_WAIT_CLEAR) + { + ef->flags &= ~bitptn; + } + else if (mode & SYS_EVENT_FLAG_WAIT_CLEAR_ALL) + { + ef->flags = 0; + } + + if (result.IsGood()) + { + result = flags; + return CELL_OK; + } + + if (!result.GetAddr()) + { + return CELL_OK; + } + return CELL_EFAULT; + } + + return CELL_EBUSY; +} + +s32 sys_event_flag_set(u32 eflag_id, u64 bitptn) +{ + sys_event.Log("sys_event_flag_set(eflag_id=%d, bitptn=0x%llx)", eflag_id, bitptn); + + EventFlag* ef; + if(!sys_event.CheckId(eflag_id, ef)) return CELL_ESRCH; + + u32 tid = GetCurrentPPUThread().GetId(); + + ef->m_mutex.lock(tid); + ef->flags |= bitptn; + if (u32 target = ef->check()) + { + // if signal, leave both mutexes locked... + ef->signal.lock(target); + ef->m_mutex.unlock(tid, target); + } + else + { + ef->m_mutex.unlock(tid); + } + + return CELL_OK; +} + +s32 sys_event_flag_clear(u32 eflag_id, u64 bitptn) +{ + sys_event.Log("sys_event_flag_clear(eflag_id=%d, bitptn=0x%llx)", eflag_id, bitptn); + + EventFlag* ef; + if(!sys_event.CheckId(eflag_id, ef)) return CELL_ESRCH; + + SMutexLocker lock(ef->m_mutex); + ef->flags &= bitptn; + + return CELL_OK; +} + +s32 sys_event_flag_cancel(u32 eflag_id, mem32_t num) +{ + sys_event.Log("sys_event_flag_cancel(eflag_id=%d, num_addr=0x%x)", eflag_id, num.GetAddr()); + + EventFlag* ef; + if(!sys_event.CheckId(eflag_id, ef)) return CELL_ESRCH; + + std::vector tids; + + { + SMutexLocker lock(ef->m_mutex); + tids.resize(ef->waiters.size()); + for (u32 i = 0; i < ef->waiters.size(); i++) + { + tids[i] = ef->waiters[i].tid; + } + ef->waiters.clear(); + } + + for (u32 i = 0; i < tids.size(); i++) + { + ef->signal.lock(tids[i]); + } + + if (Emu.IsStopped()) + { + LOG_WARNING(HLE, "sys_event_flag_cancel(id=%d) aborted", eflag_id); + return CELL_OK; + } + + if (num.IsGood()) + { + num = tids.size(); + return CELL_OK; + } + + if (!num.GetAddr()) + { + return CELL_OK; + } + return CELL_EFAULT; +} + +s32 sys_event_flag_get(u32 eflag_id, mem64_t flags) +{ + sys_event.Log("sys_event_flag_get(eflag_id=%d, flags_addr=0x%x)", eflag_id, flags.GetAddr()); + + EventFlag* ef; + if(!sys_event.CheckId(eflag_id, ef)) return CELL_ESRCH; + + if (!flags.IsGood()) + { + return CELL_EFAULT; + } + + SMutexLocker lock(ef->m_mutex); + flags = ef->flags; + + return CELL_OK; +} diff --git a/rpcs3/Emu/SysCalls/lv2/SC_Event_flag.h b/rpcs3/Emu/SysCalls/lv2/sys_event.h similarity index 50% rename from rpcs3/Emu/SysCalls/lv2/SC_Event_flag.h rename to rpcs3/Emu/SysCalls/lv2/sys_event.h index 4cc1539d8d..000775900f 100644 --- a/rpcs3/Emu/SysCalls/lv2/SC_Event_flag.h +++ b/rpcs3/Emu/SysCalls/lv2/sys_event.h @@ -1,4 +1,5 @@ #pragma once +#include "Emu/event.h" enum { @@ -73,3 +74,25 @@ struct EventFlag return target; } }; + +// SysCalls +s32 sys_event_queue_create(mem32_t equeue_id, mem_ptr_t attr, u64 event_queue_key, int size); +s32 sys_event_queue_destroy(u32 equeue_id, int mode); +s32 sys_event_queue_receive(u32 equeue_id, mem_ptr_t event, u64 timeout); +s32 sys_event_queue_tryreceive(u32 equeue_id, mem_ptr_t event_array, int size, mem32_t number); +s32 sys_event_queue_drain(u32 event_queue_id); + +s32 sys_event_port_create(mem32_t eport_id, int port_type, u64 name); +s32 sys_event_port_destroy(u32 eport_id); +s32 sys_event_port_connect_local(u32 event_port_id, u32 event_queue_id); +s32 sys_event_port_disconnect(u32 eport_id); +s32 sys_event_port_send(u32 event_port_id, u64 data1, u64 data2, u64 data3); + +s32 sys_event_flag_create(mem32_t eflag_id, mem_ptr_t attr, u64 init); +s32 sys_event_flag_destroy(u32 eflag_id); +s32 sys_event_flag_wait(u32 eflag_id, u64 bitptn, u32 mode, mem64_t result, u64 timeout); +s32 sys_event_flag_trywait(u32 eflag_id, u64 bitptn, u32 mode, mem64_t result); +s32 sys_event_flag_set(u32 eflag_id, u64 bitptn); +s32 sys_event_flag_clear(u32 eflag_id, u64 bitptn); +s32 sys_event_flag_cancel(u32 eflag_id, mem32_t num); +s32 sys_event_flag_get(u32 eflag_id, mem64_t flags); \ No newline at end of file diff --git a/rpcs3/Emu/SysCalls/lv2/SC_Interrupt.cpp b/rpcs3/Emu/SysCalls/lv2/sys_interrupt.cpp similarity index 91% rename from rpcs3/Emu/SysCalls/lv2/SC_Interrupt.cpp rename to rpcs3/Emu/SysCalls/lv2/sys_interrupt.cpp index 0914d8e39c..ba0c995a91 100644 --- a/rpcs3/Emu/SysCalls/lv2/SC_Interrupt.cpp +++ b/rpcs3/Emu/SysCalls/lv2/sys_interrupt.cpp @@ -7,11 +7,11 @@ #include "Emu/SysCalls/SC_FUNC.h" #include "Emu/SysCalls/Modules.h" #include "Emu/SysCalls/SysCalls.h" -#include "SC_Interrupt.h" +#include "sys_interrupt.h" static SysCallBase sc_int("sys_interrupt"); -int sys_interrupt_tag_destroy(u32 intrtag) +s32 sys_interrupt_tag_destroy(u32 intrtag) { sc_int.Warning("sys_interrupt_tag_destroy(intrtag=%d)", intrtag); @@ -38,7 +38,7 @@ int sys_interrupt_tag_destroy(u32 intrtag) return CELL_OK; } -int sys_interrupt_thread_establish(mem32_t ih, u32 intrtag, u64 intrthread, u64 arg) +s32 sys_interrupt_thread_establish(mem32_t ih, u32 intrtag, u64 intrthread, u64 arg) { sc_int.Warning("sys_interrupt_thread_establish(ih_addr=0x%x, intrtag=%d, intrthread=%lld, arg=0x%llx)", ih.GetAddr(), intrtag, intrthread, arg); @@ -82,7 +82,7 @@ int sys_interrupt_thread_establish(mem32_t ih, u32 intrtag, u64 intrthread, u64 return CELL_OK; } -int sys_interrupt_thread_disestablish(u32 ih) +s32 sys_interrupt_thread_disestablish(u32 ih) { sc_int.Error("sys_interrupt_thread_disestablish(ih=%d)", ih); diff --git a/rpcs3/Emu/SysCalls/lv2/sys_interrupt.h b/rpcs3/Emu/SysCalls/lv2/sys_interrupt.h new file mode 100644 index 0000000000..2254b7e607 --- /dev/null +++ b/rpcs3/Emu/SysCalls/lv2/sys_interrupt.h @@ -0,0 +1,7 @@ +#pragma once + +// SysCalls +s32 sys_interrupt_tag_destroy(u32 intrtag); +s32 sys_interrupt_thread_establish(mem32_t ih, u32 intrtag, u64 intrthread, u64 arg); +s32 sys_interrupt_thread_disestablish(u32 ih); +void sys_interrupt_thread_eoi(); diff --git a/rpcs3/Emu/SysCalls/lv2/SC_Lwcond.cpp b/rpcs3/Emu/SysCalls/lv2/sys_lwcond.cpp similarity index 93% rename from rpcs3/Emu/SysCalls/lv2/SC_Lwcond.cpp rename to rpcs3/Emu/SysCalls/lv2/sys_lwcond.cpp index 170c665068..b4778707da 100644 --- a/rpcs3/Emu/SysCalls/lv2/SC_Lwcond.cpp +++ b/rpcs3/Emu/SysCalls/lv2/sys_lwcond.cpp @@ -4,12 +4,12 @@ #include "Emu/System.h" #include "Emu/Cell/PPUThread.h" #include "Emu/SysCalls/SysCalls.h" -#include "SC_Lwmutex.h" -#include "SC_Lwcond.h" +#include "sys_lwmutex.h" +#include "sys_lwcond.h" SysCallBase sys_lwcond("sys_lwcond"); -int sys_lwcond_create(mem_ptr_t lwcond, mem_ptr_t lwmutex, mem_ptr_t attr) +s32 sys_lwcond_create(mem_ptr_t lwcond, mem_ptr_t lwmutex, mem_ptr_t attr) { sys_lwcond.Log("sys_lwcond_create(lwcond_addr=0x%x, lwmutex_addr=0x%x, attr_addr=0x%x)", lwcond.GetAddr(), lwmutex.GetAddr(), attr.GetAddr()); @@ -46,7 +46,7 @@ int sys_lwcond_create(mem_ptr_t lwcond, mem_ptr_t l return CELL_OK; } -int sys_lwcond_destroy(mem_ptr_t lwcond) +s32 sys_lwcond_destroy(mem_ptr_t lwcond) { sys_lwcond.Warning("sys_lwcond_destroy(lwcond_addr=0x%x)", lwcond.GetAddr()); @@ -72,7 +72,7 @@ int sys_lwcond_destroy(mem_ptr_t lwcond) return CELL_OK; } -int sys_lwcond_signal(mem_ptr_t lwcond) +s32 sys_lwcond_signal(mem_ptr_t lwcond) { sys_lwcond.Log("sys_lwcond_signal(lwcond_addr=0x%x)", lwcond.GetAddr()); @@ -103,7 +103,7 @@ int sys_lwcond_signal(mem_ptr_t lwcond) return CELL_OK; } -int sys_lwcond_signal_all(mem_ptr_t lwcond) +s32 sys_lwcond_signal_all(mem_ptr_t lwcond) { sys_lwcond.Log("sys_lwcond_signal_all(lwcond_addr=0x%x)", lwcond.GetAddr()); @@ -134,7 +134,7 @@ int sys_lwcond_signal_all(mem_ptr_t lwcond) return CELL_OK; } -int sys_lwcond_signal_to(mem_ptr_t lwcond, u32 ppu_thread_id) +s32 sys_lwcond_signal_to(mem_ptr_t lwcond, u32 ppu_thread_id) { sys_lwcond.Log("sys_lwcond_signal_to(lwcond_addr=0x%x, ppu_thread_id=%d)", lwcond.GetAddr(), ppu_thread_id); @@ -173,7 +173,7 @@ int sys_lwcond_signal_to(mem_ptr_t lwcond, u32 ppu_thread_id) return CELL_OK; } -int sys_lwcond_wait(mem_ptr_t lwcond, u64 timeout) +s32 sys_lwcond_wait(mem_ptr_t lwcond, u64 timeout) { sys_lwcond.Log("sys_lwcond_wait(lwcond_addr=0x%x, timeout=%lld)", lwcond.GetAddr(), timeout); diff --git a/rpcs3/Emu/SysCalls/lv2/sys_lwcond.h b/rpcs3/Emu/SysCalls/lv2/sys_lwcond.h new file mode 100644 index 0000000000..5d5584395a --- /dev/null +++ b/rpcs3/Emu/SysCalls/lv2/sys_lwcond.h @@ -0,0 +1,35 @@ +#pragma once + +struct sys_lwcond_attribute_t +{ + union + { + char name[8]; + u64 name_u64; + }; +}; + +struct sys_lwcond_t +{ + be_t lwmutex; + be_t lwcond_queue; +}; + +struct Lwcond +{ + SMutex signal; + SleepQueue m_queue; + + Lwcond(u64 name) + : m_queue(name) + { + } +}; + +// SysCalls +s32 sys_lwcond_create(mem_ptr_t lwcond, mem_ptr_t lwmutex, mem_ptr_t attr); +s32 sys_lwcond_destroy(mem_ptr_t lwcond); +s32 sys_lwcond_signal(mem_ptr_t lwcond); +s32 sys_lwcond_signal_all(mem_ptr_t lwcond); +s32 sys_lwcond_signal_to(mem_ptr_t lwcond, u32 ppu_thread_id); +s32 sys_lwcond_wait(mem_ptr_t lwcond, u64 timeout); diff --git a/rpcs3/Emu/SysCalls/lv2/SC_Lwmutex.cpp b/rpcs3/Emu/SysCalls/lv2/sys_lwmutex.cpp similarity index 95% rename from rpcs3/Emu/SysCalls/lv2/SC_Lwmutex.cpp rename to rpcs3/Emu/SysCalls/lv2/sys_lwmutex.cpp index f5ee08bef8..e33893ce81 100644 --- a/rpcs3/Emu/SysCalls/lv2/SC_Lwmutex.cpp +++ b/rpcs3/Emu/SysCalls/lv2/sys_lwmutex.cpp @@ -4,11 +4,11 @@ #include "Emu/System.h" #include "Emu/Cell/PPUThread.h" #include "Emu/SysCalls/SysCalls.h" -#include "Emu/SysCalls/lv2/SC_Lwmutex.h" +#include "sys_lwmutex.h" SysCallBase sc_lwmutex("sys_lwmutex"); -int sys_lwmutex_create(mem_ptr_t lwmutex, mem_ptr_t attr) +s32 sys_lwmutex_create(mem_ptr_t lwmutex, mem_ptr_t attr) { sc_lwmutex.Log("sys_lwmutex_create(lwmutex_addr=0x%x, lwmutex_attr_addr=0x%x)", lwmutex.GetAddr(), attr.GetAddr()); @@ -48,7 +48,7 @@ int sys_lwmutex_create(mem_ptr_t lwmutex, mem_ptr_t lwmutex) +s32 sys_lwmutex_destroy(mem_ptr_t lwmutex) { sc_lwmutex.Warning("sys_lwmutex_destroy(lwmutex_addr=0x%x)", lwmutex.GetAddr()); @@ -69,7 +69,7 @@ int sys_lwmutex_destroy(mem_ptr_t lwmutex) } } -int sys_lwmutex_lock(mem_ptr_t lwmutex, u64 timeout) +s32 sys_lwmutex_lock(mem_ptr_t lwmutex, u64 timeout) { sc_lwmutex.Log("sys_lwmutex_lock(lwmutex_addr=0x%x, timeout=%lld)", lwmutex.GetAddr(), timeout); @@ -81,7 +81,7 @@ int sys_lwmutex_lock(mem_ptr_t lwmutex, u64 timeout) return lwmutex->lock(GetCurrentPPUThread().GetId(), timeout ? ((timeout < 1000) ? 1 : (timeout / 1000)) : 0); } -int sys_lwmutex_trylock(mem_ptr_t lwmutex) +s32 sys_lwmutex_trylock(mem_ptr_t lwmutex) { sc_lwmutex.Log("sys_lwmutex_trylock(lwmutex_addr=0x%x)", lwmutex.GetAddr()); @@ -90,7 +90,7 @@ int sys_lwmutex_trylock(mem_ptr_t lwmutex) return lwmutex->trylock(GetCurrentPPUThread().GetId()); } -int sys_lwmutex_unlock(mem_ptr_t lwmutex) +s32 sys_lwmutex_unlock(mem_ptr_t lwmutex) { sc_lwmutex.Log("sys_lwmutex_unlock(lwmutex_addr=0x%x)", lwmutex.GetAddr()); diff --git a/rpcs3/Emu/SysCalls/lv2/SC_Lwmutex.h b/rpcs3/Emu/SysCalls/lv2/sys_lwmutex.h similarity index 81% rename from rpcs3/Emu/SysCalls/lv2/SC_Lwmutex.h rename to rpcs3/Emu/SysCalls/lv2/sys_lwmutex.h index ed24e07047..ab02592b9f 100644 --- a/rpcs3/Emu/SysCalls/lv2/SC_Lwmutex.h +++ b/rpcs3/Emu/SysCalls/lv2/sys_lwmutex.h @@ -78,3 +78,10 @@ struct sys_lwmutex_t int unlock(be_t tid); int lock(be_t tid, u64 timeout); }; + +// SysCalls +s32 sys_lwmutex_create(mem_ptr_t lwmutex, mem_ptr_t attr); +s32 sys_lwmutex_destroy(mem_ptr_t lwmutex); +s32 sys_lwmutex_lock(mem_ptr_t lwmutex, u64 timeout); +s32 sys_lwmutex_trylock(mem_ptr_t lwmutex); +s32 sys_lwmutex_unlock(mem_ptr_t lwmutex); diff --git a/rpcs3/Emu/SysCalls/lv2/sys_memory.cpp b/rpcs3/Emu/SysCalls/lv2/sys_memory.cpp new file mode 100644 index 0000000000..480f0c5d7d --- /dev/null +++ b/rpcs3/Emu/SysCalls/lv2/sys_memory.cpp @@ -0,0 +1,169 @@ +#include "stdafx.h" +#include "Utilities/Log.h" +#include "Emu/Memory/Memory.h" +#include "Emu/System.h" +#include "Emu/SysCalls/SysCalls.h" +#include "sys_memory.h" +#include + +SysCallBase sc_mem("memory"); + +s32 sys_memory_allocate(u32 size, u32 flags, u32 alloc_addr_addr) +{ + sc_mem.Log("sys_memory_allocate(size=0x%x, flags=0x%x)", size, flags); + + // Check page size. + u32 addr; + switch(flags) + { + case SYS_MEMORY_PAGE_SIZE_1M: + if(size & 0xfffff) return CELL_EALIGN; + addr = Memory.Alloc(size, 0x100000); + break; + + case SYS_MEMORY_PAGE_SIZE_64K: + if(size & 0xffff) return CELL_EALIGN; + addr = Memory.Alloc(size, 0x10000); + break; + + default: return CELL_EINVAL; + } + + if(!addr) + return CELL_ENOMEM; + + // Write back the start address of the allocated area. + sc_mem.Log("Memory allocated! [addr: 0x%x, size: 0x%x]", addr, size); + Memory.Write32(alloc_addr_addr, addr); + + return CELL_OK; +} + +s32 sys_memory_allocate_from_container(u32 size, u32 cid, u32 flags, u32 alloc_addr_addr) +{ + sc_mem.Log("sys_memory_allocate_from_container(size=0x%x, cid=0x%x, flags=0x%x)", size, cid, flags); + + // Check if this container ID is valid. + MemoryContainerInfo* ct; + if(!sc_mem.CheckId(cid, ct)) + return CELL_ESRCH; + + // Check page size. + switch(flags) + { + case SYS_MEMORY_PAGE_SIZE_1M: + if(size & 0xfffff) return CELL_EALIGN; + ct->addr = Memory.Alloc(size, 0x100000); + break; + + case SYS_MEMORY_PAGE_SIZE_64K: + if(size & 0xffff) return CELL_EALIGN; + ct->addr = Memory.Alloc(size, 0x10000); + break; + + default: return CELL_EINVAL; + } + + // Store the address and size in the container. + if(!ct->addr) + return CELL_ENOMEM; + ct->size = size; + + // Write back the start address of the allocated area. + sc_mem.Log("Memory allocated! [addr: 0x%x, size: 0x%x]", ct->addr, ct->size); + Memory.Write32(alloc_addr_addr, ct->addr); + + return CELL_OK; +} + +s32 sys_memory_free(u32 start_addr) +{ + sc_mem.Log("sys_memory_free(start_addr=0x%x)", start_addr); + + // Release the allocated memory. + if(!Memory.Free(start_addr)) + return CELL_EFAULT; + + return CELL_OK; +} + +s32 sys_memory_get_page_attribute(u32 addr, mem_ptr_t attr) +{ + sc_mem.Warning("sys_memory_get_page_attribute(addr=0x%x, attr_addr=0x%x)", addr, attr.GetAddr()); + + if (!attr.IsGood()) + return CELL_EFAULT; + + // TODO: Implement per thread page attribute setting. + attr->attribute = 0; + attr->page_size = 0; + attr->access_right = 0; + attr->pad = 0; + + return CELL_OK; +} + +s32 sys_memory_get_user_memory_size(mem_ptr_t mem_info) +{ + sc_mem.Warning("sys_memory_get_user_memory_size(mem_info_addr=0x%x)", mem_info.GetAddr()); + + // Fetch the user memory available. + mem_info->total_user_memory = Memory.GetUserMemTotalSize(); + mem_info->available_user_memory = Memory.GetUserMemAvailSize(); + return CELL_OK; +} + +s32 sys_memory_container_create(mem32_t cid, u32 yield_size) +{ + sc_mem.Warning("sys_memory_container_create(cid_addr=0x%x, yield_size=0x%x)", cid.GetAddr(), yield_size); + + if (!cid.IsGood()) + return CELL_EFAULT; + + yield_size &= ~0xfffff; //round down to 1 MB granularity + u64 addr = Memory.Alloc(yield_size, 0x100000); //1 MB alignment + + if(!addr) + return CELL_ENOMEM; + + // Wrap the allocated memory in a memory container. + MemoryContainerInfo *ct = new MemoryContainerInfo(addr, yield_size); + cid = sc_mem.GetNewId(ct); + procObjects.mem_objects.insert(cid); + + sc_mem.Warning("*** memory_container created(addr=0x%llx): id = %d", addr, cid.GetValue()); + + return CELL_OK; +} + +s32 sys_memory_container_destroy(u32 cid) +{ + sc_mem.Warning("sys_memory_container_destroy(cid=%d)", cid); + + // Check if this container ID is valid. + MemoryContainerInfo* ct; + if(!sc_mem.CheckId(cid, ct)) + return CELL_ESRCH; + + // Release the allocated memory and remove the ID. + Memory.Free(ct->addr); + Emu.GetIdManager().RemoveID(cid); + + return CELL_OK; +} + +s32 sys_memory_container_get_size(mem_ptr_t mem_info, u32 cid) +{ + sc_mem.Warning("sys_memory_container_get_size(mem_info_addr=0x%x, cid=%d)", mem_info.GetAddr(), cid); + + // Check if this container ID is valid. + MemoryContainerInfo* ct; + if(!sc_mem.CheckId(cid, ct)) + return CELL_ESRCH; + + // HACK: Return all memory. + sys_memory_info_t info; + mem_info->total_user_memory = ct->size; + mem_info->available_user_memory = ct->size; + return CELL_OK; +} diff --git a/rpcs3/Emu/SysCalls/lv2/SC_Memory.h b/rpcs3/Emu/SysCalls/lv2/sys_memory.h similarity index 55% rename from rpcs3/Emu/SysCalls/lv2/SC_Memory.h rename to rpcs3/Emu/SysCalls/lv2/sys_memory.h index e8d37d3905..3cd28d32cb 100644 --- a/rpcs3/Emu/SysCalls/lv2/SC_Memory.h +++ b/rpcs3/Emu/SysCalls/lv2/sys_memory.h @@ -1,77 +1,53 @@ -#pragma once - -#define SYS_MEMORY_CONTAINER_ID_INVALID 0xFFFFFFFF -#define SYS_MEMORY_ACCESS_RIGHT_NONE 0x00000000000000F0ULL -#define SYS_MEMORY_ACCESS_RIGHT_PPU_THREAD 0x0000000000000008ULL -#define SYS_MEMORY_ACCESS_RIGHT_HANDLER 0x0000000000000004ULL -#define SYS_MEMORY_ACCESS_RIGHT_SPU_THREAD 0x0000000000000002ULL -#define SYS_MEMORY_ACCESS_RIGHT_SPU_RAW 0x0000000000000001ULL -#define SYS_MEMORY_ATTR_READ_ONLY 0x0000000000080000ULL -#define SYS_MEMORY_ATTR_READ_WRITE 0x0000000000040000ULL -#define SYS_MMAPPER_FIXED_ADDR 0xB0000000 -#define SYS_MMAPPER_FIXED_SIZE 0x10000000 -#define SYS_VM_TEST_INVALID 0x0000ULL -#define SYS_VM_TEST_UNUSED 0x0001ULL -#define SYS_VM_TEST_ALLOCATED 0x0002ULL -#define SYS_VM_TEST_STORED 0x0004ULL - -enum -{ - SYS_MEMORY_PAGE_SIZE_1M = 0x400, - SYS_MEMORY_PAGE_SIZE_64K = 0x200, -}; - -struct sys_memory_info_t -{ - be_t total_user_memory; - be_t available_user_memory; -}; - - -struct sys_page_attr_t -{ - u64 attribute; - u64 access_right; - u32 page_size; - u32 pad; -}; - -struct MemoryContainerInfo -{ - u64 addr; - u32 size; - - MemoryContainerInfo(u64 addr, u32 size) - : addr(addr) - , size(size) - { - } -}; - -struct mmapper_info -{ - u64 addr; - u32 size; - u32 flags; - - mmapper_info(u64 _addr, u32 _size, u32 _flags) - : addr(_addr) - , size(_size) - , flags(_flags) - { - } - - mmapper_info() - { - } -}; - -struct sys_vm_statistics { - u64 vm_crash_ppu; - u64 vm_crash_spu; - u64 vm_read; - u64 vm_write; - u32 physical_mem_size; - u32 physical_mem_used; - u64 timestamp; -}; \ No newline at end of file +#pragma once + +#define SYS_MEMORY_CONTAINER_ID_INVALID 0xFFFFFFFF +#define SYS_MEMORY_ACCESS_RIGHT_NONE 0x00000000000000F0ULL +#define SYS_MEMORY_ACCESS_RIGHT_PPU_THREAD 0x0000000000000008ULL +#define SYS_MEMORY_ACCESS_RIGHT_HANDLER 0x0000000000000004ULL +#define SYS_MEMORY_ACCESS_RIGHT_SPU_THREAD 0x0000000000000002ULL +#define SYS_MEMORY_ACCESS_RIGHT_SPU_RAW 0x0000000000000001ULL +#define SYS_MEMORY_ATTR_READ_ONLY 0x0000000000080000ULL +#define SYS_MEMORY_ATTR_READ_WRITE 0x0000000000040000ULL + +enum +{ + SYS_MEMORY_PAGE_SIZE_1M = 0x400, + SYS_MEMORY_PAGE_SIZE_64K = 0x200, +}; + +struct sys_memory_info_t +{ + be_t total_user_memory; + be_t available_user_memory; +}; + + +struct sys_page_attr_t +{ + u64 attribute; + u64 access_right; + u32 page_size; + u32 pad; +}; + +struct MemoryContainerInfo +{ + u64 addr; + u32 size; + + MemoryContainerInfo(u64 addr, u32 size) + : addr(addr) + , size(size) + { + } +}; + +// SysCalls +s32 sys_memory_allocate(u32 size, u32 flags, u32 alloc_addr_addr); +s32 sys_memory_allocate_from_container(u32 size, u32 cid, u32 flags, u32 alloc_addr_addr); +s32 sys_memory_free(u32 start_addr); +s32 sys_memory_get_page_attribute(u32 addr, mem_ptr_t attr); +s32 sys_memory_get_user_memory_size(mem_ptr_t mem_info); +s32 sys_memory_container_create(mem32_t cid, u32 yield_size); +s32 sys_memory_container_destroy(u32 cid); +s32 sys_memory_container_get_size(mem_ptr_t mem_info, u32 cid); diff --git a/rpcs3/Emu/SysCalls/lv2/sys_mmapper.cpp b/rpcs3/Emu/SysCalls/lv2/sys_mmapper.cpp new file mode 100644 index 0000000000..edd1226fc7 --- /dev/null +++ b/rpcs3/Emu/SysCalls/lv2/sys_mmapper.cpp @@ -0,0 +1,263 @@ +#include "stdafx.h" +#include "Utilities/Log.h" +#include "Emu/Memory/Memory.h" +#include "Emu/System.h" +#include "Emu/SysCalls/SysCalls.h" +#include "sys_mmapper.h" +#include + +SysCallBase sys_mmapper("sys_mmapper"); +std::map mmapper_info_map; + +s32 sys_mmapper_allocate_address(u32 size, u64 flags, u32 alignment, u32 alloc_addr) +{ + sys_mmapper.Warning("sys_mmapper_allocate_address(size=0x%x, flags=0x%llx, alignment=0x%x, alloc_addr=0x%x)", + size, flags, alignment, alloc_addr); + + if(!Memory.IsGoodAddr(alloc_addr)) + return CELL_EFAULT; + + // Check for valid alignment. + if(alignment > 0x80000000) + return CELL_EALIGN; + + // Check page size. + u32 addr; + switch(flags & (SYS_MEMORY_PAGE_SIZE_1M | SYS_MEMORY_PAGE_SIZE_64K)) + { + default: + case SYS_MEMORY_PAGE_SIZE_1M: + if(Memory.AlignAddr(size, alignment) & 0xfffff) + return CELL_EALIGN; + addr = Memory.Alloc(size, 0x100000); + break; + + case SYS_MEMORY_PAGE_SIZE_64K: + if(Memory.AlignAddr(size, alignment) & 0xffff) + return CELL_EALIGN; + addr = Memory.Alloc(size, 0x10000); + break; + } + + // Write back the start address of the allocated area. + Memory.Write32(alloc_addr, addr); + + return CELL_OK; +} + +s32 sys_mmapper_allocate_fixed_address() +{ + sys_mmapper.Warning("sys_mmapper_allocate_fixed_address"); + + // Allocate a fixed size from user memory. + if (!Memory.Alloc(SYS_MMAPPER_FIXED_SIZE, 0x100000)) + return CELL_EEXIST; + + return CELL_OK; +} + +s32 sys_mmapper_allocate_memory(u32 size, u64 flags, mem32_t mem_id) +{ + sys_mmapper.Warning("sys_mmapper_allocate_memory(size=0x%x, flags=0x%llx, mem_id_addr=0x%x)", size, flags, mem_id.GetAddr()); + + if(!mem_id.IsGood()) + return CELL_EFAULT; + + // Check page granularity. + u32 addr; + switch(flags & (SYS_MEMORY_PAGE_SIZE_1M | SYS_MEMORY_PAGE_SIZE_64K)) + { + case SYS_MEMORY_PAGE_SIZE_1M: + if(size & 0xfffff) + return CELL_EALIGN; + addr = Memory.Alloc(size, 0x100000); + break; + + case SYS_MEMORY_PAGE_SIZE_64K: + if(size & 0xffff) + return CELL_EALIGN; + addr = Memory.Alloc(size, 0x10000); + break; + + default: + return CELL_EINVAL; + } + + if(!addr) + return CELL_ENOMEM; + + // Generate a new mem ID. + mem_id = sys_mmapper.GetNewId(new mmapper_info(addr, size, flags)); + + return CELL_OK; +} + +s32 sys_mmapper_allocate_memory_from_container(u32 size, u32 cid, u64 flags, mem32_t mem_id) +{ + sys_mmapper.Warning("sys_mmapper_allocate_memory_from_container(size=0x%x, cid=%d, flags=0x%llx, mem_id_addr=0x%x)", + size, cid, flags, mem_id.GetAddr()); + + if(!mem_id.IsGood()) + return CELL_EFAULT; + + // Check if this container ID is valid. + MemoryContainerInfo* ct; + if(!sys_mmapper.CheckId(cid, ct)) + return CELL_ESRCH; + + // Check page granularity. + switch(flags & (SYS_MEMORY_PAGE_SIZE_1M | SYS_MEMORY_PAGE_SIZE_64K)) + { + case SYS_MEMORY_PAGE_SIZE_1M: + if(size & 0xfffff) + return CELL_EALIGN; + ct->addr = Memory.Alloc(size, 0x100000); + break; + + case SYS_MEMORY_PAGE_SIZE_64K: + if(size & 0xffff) + return CELL_EALIGN; + ct->addr = Memory.Alloc(size, 0x10000); + break; + + default: + return CELL_EINVAL; + } + + if(!ct->addr) + return CELL_ENOMEM; + ct->size = size; + + // Generate a new mem ID. + mem_id = sys_mmapper.GetNewId(new mmapper_info(ct->addr, ct->size, flags)); + + return CELL_OK; +} + +s32 sys_mmapper_change_address_access_right(u32 start_addr, u64 flags) +{ + sys_mmapper.Warning("sys_mmapper_change_address_access_right(start_addr=0x%x, flags=0x%llx)", start_addr, flags); + + if (!Memory.IsGoodAddr(start_addr)) + return CELL_EINVAL; + + // TODO + + return CELL_OK; +} + +s32 sys_mmapper_free_address(u32 start_addr) +{ + sys_mmapper.Warning("sys_mmapper_free_address(start_addr=0x%x)", start_addr); + + if(!Memory.IsGoodAddr(start_addr)) + return CELL_EINVAL; + + // Free the address. + Memory.Free(start_addr); + return CELL_OK; +} + +s32 sys_mmapper_free_memory(u32 mem_id) +{ + sys_mmapper.Warning("sys_mmapper_free_memory(mem_id=0x%x)", mem_id); + + // Check if this mem ID is valid. + mmapper_info* info; + if(!sys_mmapper.CheckId(mem_id, info)) + return CELL_ESRCH; + + // Release the allocated memory and remove the ID. + Memory.Free(info->addr); + Emu.GetIdManager().RemoveID(mem_id); + + return CELL_OK; +} + +s32 sys_mmapper_map_memory(u32 start_addr, u32 mem_id, u64 flags) +{ + sys_mmapper.Warning("sys_mmapper_map_memory(start_addr=0x%x, mem_id=0x%x, flags=0x%llx)", start_addr, mem_id, flags); + + // Check if this mem ID is valid. + mmapper_info* info; + if(!sys_mmapper.CheckId(mem_id, info)) + return CELL_ESRCH; + + // Map the memory into the process address. + if(!Memory.Map(start_addr, info->addr, info->size)) + sys_mmapper.Error("sys_mmapper_map_memory failed!"); + + // Keep track of mapped addresses. + mmapper_info_map[mem_id] = start_addr; + + return CELL_OK; +} + +s32 sys_mmapper_search_and_map(u32 start_addr, u32 mem_id, u64 flags, u32 alloc_addr) +{ + sys_mmapper.Warning("sys_mmapper_search_and_map(start_addr=0x%x, mem_id=0x%x, flags=0x%llx, alloc_addr=0x%x)", + start_addr, mem_id, flags, alloc_addr); + + if(!Memory.IsGoodAddr(alloc_addr)) + return CELL_EFAULT; + + // Check if this mem ID is valid. + mmapper_info* info; + if(!sys_mmapper.CheckId(mem_id, info)) + return CELL_ESRCH; + + // Search for a mappable address. + u32 addr; + bool found; + for (int i = 0; i < SYS_MMAPPER_FIXED_SIZE; i += 0x100000) + { + addr = start_addr + i; + found = Memory.Map(addr, info->addr, info->size); + if(found) + { + sys_mmapper.Warning("Found and mapped address 0x%x", addr); + break; + } + } + + // Check if the address is valid. + if (!Memory.IsGoodAddr(addr) || !found) + return CELL_ENOMEM; + + // Write back the start address of the allocated area. + Memory.Write32(alloc_addr, addr); + + // Keep track of mapped addresses. + mmapper_info_map[mem_id] = addr; + + return CELL_OK; +} + +s32 sys_mmapper_unmap_memory(u32 start_addr, u32 mem_id_addr) +{ + sys_mmapper.Warning("sys_mmapper_unmap_memory(start_addr=0x%x, mem_id_addr=0x%x)", start_addr, mem_id_addr); + + if (!Memory.IsGoodAddr(start_addr)) + return CELL_EINVAL; + + if (!Memory.IsGoodAddr(mem_id_addr)) + return CELL_EFAULT; + + // Write back the mem ID of the unmapped area. + u32 mem_id = mmapper_info_map.find(start_addr)->first; + Memory.Write32(mem_id_addr, mem_id); + + return CELL_OK; +} + +s32 sys_mmapper_enable_page_fault_notification(u32 start_addr, u32 q_id) +{ + sys_mmapper.Warning("sys_mmapper_enable_page_fault_notification(start_addr=0x%x, q_id=0x%x)", start_addr, q_id); + + if (!Memory.IsGoodAddr(start_addr)) + return CELL_EINVAL; + + // TODO + + return CELL_OK; +} diff --git a/rpcs3/Emu/SysCalls/lv2/sys_mmapper.h b/rpcs3/Emu/SysCalls/lv2/sys_mmapper.h new file mode 100644 index 0000000000..6a7a71d0e0 --- /dev/null +++ b/rpcs3/Emu/SysCalls/lv2/sys_mmapper.h @@ -0,0 +1,35 @@ +#pragma once + +#define SYS_MMAPPER_FIXED_ADDR 0xB0000000 +#define SYS_MMAPPER_FIXED_SIZE 0x10000000 + +struct mmapper_info +{ + u64 addr; + u32 size; + u32 flags; + + mmapper_info(u64 _addr, u32 _size, u32 _flags) + : addr(_addr) + , size(_size) + , flags(_flags) + { + } + + mmapper_info() + { + } +}; + +// SysCalls +s32 sys_mmapper_allocate_address(u32 size, u64 flags, u32 alignment, u32 alloc_addr); +s32 sys_mmapper_allocate_fixed_address(); +s32 sys_mmapper_allocate_memory(u32 size, u64 flags, mem32_t mem_id); +s32 sys_mmapper_allocate_memory_from_container(u32 size, u32 cid, u64 flags, mem32_t mem_id); +s32 sys_mmapper_change_address_access_right(u32 start_addr, u64 flags); +s32 sys_mmapper_free_address(u32 start_addr); +s32 sys_mmapper_free_memory(u32 mem_id); +s32 sys_mmapper_map_memory(u32 start_addr, u32 mem_id, u64 flags); +s32 sys_mmapper_search_and_map(u32 start_addr, u32 mem_id, u64 flags, u32 alloc_addr); +s32 sys_mmapper_unmap_memory(u32 start_addr, u32 mem_id_addr); +s32 sys_mmapper_enable_page_fault_notification(u32 start_addr, u32 q_id); diff --git a/rpcs3/Emu/SysCalls/lv2/SC_Mutex.cpp b/rpcs3/Emu/SysCalls/lv2/sys_mutex.cpp similarity index 95% rename from rpcs3/Emu/SysCalls/lv2/SC_Mutex.cpp rename to rpcs3/Emu/SysCalls/lv2/sys_mutex.cpp index 635f3cbaa0..524dea7ef6 100644 --- a/rpcs3/Emu/SysCalls/lv2/SC_Mutex.cpp +++ b/rpcs3/Emu/SysCalls/lv2/sys_mutex.cpp @@ -4,12 +4,12 @@ #include "Emu/System.h" #include "Emu/Cell/PPUThread.h" #include "Emu/SysCalls/SysCalls.h" -#include "SC_Mutex.h" #include "Utilities/SMutex.h" +#include "sys_mutex.h" SysCallBase sys_mtx("sys_mutex"); -int sys_mutex_create(mem32_t mutex_id, mem_ptr_t attr) +s32 sys_mutex_create(mem32_t mutex_id, mem_ptr_t attr) { sys_mtx.Log("sys_mutex_create(mutex_id_addr=0x%x, attr_addr=0x%x)", mutex_id.GetAddr(), attr.GetAddr()); @@ -58,7 +58,7 @@ int sys_mutex_create(mem32_t mutex_id, mem_ptr_t attr) return CELL_OK; } -int sys_mutex_destroy(u32 mutex_id) +s32 sys_mutex_destroy(u32 mutex_id) { sys_mtx.Warning("sys_mutex_destroy(mutex_id=%d)", mutex_id); @@ -91,7 +91,7 @@ int sys_mutex_destroy(u32 mutex_id) return CELL_OK; } -int sys_mutex_lock(u32 mutex_id, u64 timeout) +s32 sys_mutex_lock(u32 mutex_id, u64 timeout) { sys_mtx.Log("sys_mutex_lock(mutex_id=%d, timeout=%lld)", mutex_id, timeout); @@ -160,7 +160,7 @@ abort: return CELL_ESRCH; } -int sys_mutex_trylock(u32 mutex_id) +s32 sys_mutex_trylock(u32 mutex_id) { sys_mtx.Log("sys_mutex_trylock(mutex_id=%d)", mutex_id); @@ -207,7 +207,7 @@ int sys_mutex_trylock(u32 mutex_id) return CELL_EBUSY; } -int sys_mutex_unlock(u32 mutex_id) +s32 sys_mutex_unlock(u32 mutex_id) { sys_mtx.Log("sys_mutex_unlock(mutex_id=%d)", mutex_id); diff --git a/rpcs3/Emu/SysCalls/lv2/SC_Mutex.h b/rpcs3/Emu/SysCalls/lv2/sys_mutex.h similarity index 80% rename from rpcs3/Emu/SysCalls/lv2/SC_Mutex.h rename to rpcs3/Emu/SysCalls/lv2/sys_mutex.h index 59efee8ffb..fb91773145 100644 --- a/rpcs3/Emu/SysCalls/lv2/SC_Mutex.h +++ b/rpcs3/Emu/SysCalls/lv2/sys_mutex.h @@ -1,4 +1,5 @@ #pragma once +#include "sys_lwmutex.h" struct sys_mutex_attribute { @@ -52,3 +53,10 @@ struct Mutex m_queue.m_mutex.unlock(); } }; + +// SysCalls +s32 sys_mutex_create(mem32_t mutex_id, mem_ptr_t attr); +s32 sys_mutex_destroy(u32 mutex_id); +s32 sys_mutex_lock(u32 mutex_id, u64 timeout); +s32 sys_mutex_trylock(u32 mutex_id); +s32 sys_mutex_unlock(u32 mutex_id); diff --git a/rpcs3/Emu/SysCalls/lv2/SC_PPU_Thread.cpp b/rpcs3/Emu/SysCalls/lv2/sys_ppu_thread.cpp similarity index 87% rename from rpcs3/Emu/SysCalls/lv2/SC_PPU_Thread.cpp rename to rpcs3/Emu/SysCalls/lv2/sys_ppu_thread.cpp index 1db72cb2df..4761e13cd2 100644 --- a/rpcs3/Emu/SysCalls/lv2/SC_PPU_Thread.cpp +++ b/rpcs3/Emu/SysCalls/lv2/sys_ppu_thread.cpp @@ -6,23 +6,12 @@ #include "Emu/SysCalls/SC_FUNC.h" #include "Emu/SysCalls/Modules.h" #include "Emu/SysCalls/SysCalls.h" +#include "sys_ppu_thread.h" extern Module *sysPrxForUser; static const u32 PPU_THREAD_ID_INVALID = 0xFFFFFFFFU; -enum -{ - SYS_PPU_THREAD_ONCE_INIT, - SYS_PPU_THREAD_DONE_INIT, -}; - -enum ppu_thread_flags : u64 -{ - SYS_PPU_THREAD_CREATE_JOINABLE = 0x1, - SYS_PPU_THREAD_CREATE_INTERRUPT = 0x2, -}; - void sys_ppu_thread_exit(u64 errorcode) { sysPrxForUser->Log("sys_ppu_thread_exit(0x%llx)", errorcode); @@ -40,14 +29,14 @@ void sys_ppu_thread_exit(u64 errorcode) thr.Stop(); } -int sys_ppu_thread_yield() +s32 sys_ppu_thread_yield() { sysPrxForUser->Log("sys_ppu_thread_yield()"); Sleep(1); return CELL_OK; } -int sys_ppu_thread_join(u64 thread_id, mem64_t vptr) +s32 sys_ppu_thread_join(u64 thread_id, mem64_t vptr) { sysPrxForUser->Warning("sys_ppu_thread_join(thread_id=%lld, vptr_addr=0x%x)", thread_id, vptr.GetAddr()); @@ -68,7 +57,7 @@ int sys_ppu_thread_join(u64 thread_id, mem64_t vptr) return CELL_OK; } -int sys_ppu_thread_detach(u64 thread_id) +s32 sys_ppu_thread_detach(u64 thread_id) { sysPrxForUser->Error("sys_ppu_thread_detach(thread_id=%lld)", thread_id); @@ -88,7 +77,7 @@ void sys_ppu_thread_get_join_state(u32 isjoinable_addr) Memory.Write32(isjoinable_addr, GetCurrentPPUThread().IsJoinable()); } -int sys_ppu_thread_set_priority(u64 thread_id, int prio) +s32 sys_ppu_thread_set_priority(u64 thread_id, s32 prio) { sysPrxForUser->Log("sys_ppu_thread_set_priority(thread_id=%lld, prio=%d)", thread_id, prio); @@ -100,7 +89,7 @@ int sys_ppu_thread_set_priority(u64 thread_id, int prio) return CELL_OK; } -int sys_ppu_thread_get_priority(u64 thread_id, u32 prio_addr) +s32 sys_ppu_thread_get_priority(u64 thread_id, u32 prio_addr) { sysPrxForUser->Log("sys_ppu_thread_get_priority(thread_id=%lld, prio_addr=0x%x)", thread_id, prio_addr); @@ -113,7 +102,7 @@ int sys_ppu_thread_get_priority(u64 thread_id, u32 prio_addr) return CELL_OK; } -int sys_ppu_thread_get_stack_information(u32 info_addr) +s32 sys_ppu_thread_get_stack_information(u32 info_addr) { sysPrxForUser->Log("sys_ppu_thread_get_stack_information(info_addr=0x%x)", info_addr); @@ -127,7 +116,7 @@ int sys_ppu_thread_get_stack_information(u32 info_addr) return CELL_OK; } -int sys_ppu_thread_stop(u64 thread_id) +s32 sys_ppu_thread_stop(u64 thread_id) { sysPrxForUser->Warning("sys_ppu_thread_stop(thread_id=%lld)", thread_id); @@ -139,7 +128,7 @@ int sys_ppu_thread_stop(u64 thread_id) return CELL_OK; } -int sys_ppu_thread_restart(u64 thread_id) +s32 sys_ppu_thread_restart(u64 thread_id) { sysPrxForUser->Warning("sys_ppu_thread_restart(thread_id=%lld)", thread_id); @@ -152,7 +141,7 @@ int sys_ppu_thread_restart(u64 thread_id) return CELL_OK; } -int sys_ppu_thread_create(mem64_t thread_id, u32 entry, u64 arg, int prio, u32 stacksize, u64 flags, u32 threadname_addr) +s32 sys_ppu_thread_create(mem64_t thread_id, u32 entry, u64 arg, s32 prio, u32 stacksize, u64 flags, u32 threadname_addr) { std::string threadname = ""; if (Memory.IsGoodAddr(threadname_addr)) @@ -232,7 +221,7 @@ void sys_ppu_thread_once(u32 once_ctrl_addr, u32 entry) } } -int sys_ppu_thread_get_id(const u32 id_addr) +s32 sys_ppu_thread_get_id(const u32 id_addr) { sysPrxForUser->Log("sys_ppu_thread_get_id(id_addr=0x%x)", id_addr); diff --git a/rpcs3/Emu/SysCalls/lv2/sys_ppu_thread.h b/rpcs3/Emu/SysCalls/lv2/sys_ppu_thread.h new file mode 100644 index 0000000000..5256a9a5dc --- /dev/null +++ b/rpcs3/Emu/SysCalls/lv2/sys_ppu_thread.h @@ -0,0 +1,28 @@ +#pragma once + +enum +{ + SYS_PPU_THREAD_ONCE_INIT, + SYS_PPU_THREAD_DONE_INIT, +}; + +enum ppu_thread_flags : u64 +{ + SYS_PPU_THREAD_CREATE_JOINABLE = 0x1, + SYS_PPU_THREAD_CREATE_INTERRUPT = 0x2, +}; + +// SysCalls +void sys_ppu_thread_exit(u64 errorcode); +s32 sys_ppu_thread_yield(); +s32 sys_ppu_thread_join(u64 thread_id, mem64_t vptr); +s32 sys_ppu_thread_detach(u64 thread_id); +void sys_ppu_thread_get_join_state(u32 isjoinable_addr); +s32 sys_ppu_thread_set_priority(u64 thread_id, s32 prio); +s32 sys_ppu_thread_get_priority(u64 thread_id, u32 prio_addr); +s32 sys_ppu_thread_get_stack_information(u32 info_addr); +s32 sys_ppu_thread_stop(u64 thread_id); +s32 sys_ppu_thread_restart(u64 thread_id); +s32 sys_ppu_thread_create(mem64_t thread_id, u32 entry, u64 arg, s32 prio, u32 stacksize, u64 flags, u32 threadname_addr); +void sys_ppu_thread_once(u32 once_ctrl_addr, u32 entry); +s32 sys_ppu_thread_get_id(const u32 id_addr); diff --git a/rpcs3/Emu/SysCalls/lv2/SC_Process.cpp b/rpcs3/Emu/SysCalls/lv2/sys_process.cpp similarity index 93% rename from rpcs3/Emu/SysCalls/lv2/SC_Process.cpp rename to rpcs3/Emu/SysCalls/lv2/sys_process.cpp index 007bd5b8f8..da26b14349 100644 --- a/rpcs3/Emu/SysCalls/lv2/SC_Process.cpp +++ b/rpcs3/Emu/SysCalls/lv2/sys_process.cpp @@ -3,24 +3,24 @@ #include "Emu/Memory/Memory.h" #include "Emu/System.h" #include "Emu/SysCalls/SysCalls.h" -#include "SC_Process.h" +#include "sys_process.h" SysCallBase sc_p("Process"); sysProcessObjects_t procObjects; -int sys_process_getpid() +s32 sys_process_getpid() { return 1; } -int sys_process_getppid() +s32 sys_process_getppid() { sc_p.Warning("TODO: sys_process_getppid() returns 0"); return 0; } -int sys_process_exit(s32 errorcode) +s32 sys_process_exit(s32 errorcode) { sc_p.Warning("sys_process_exit(%d)", errorcode); Emu.Pause(); // Emu.Stop() does crash @@ -130,7 +130,7 @@ void sys_game_process_exitspawn2( return; } -int sys_process_get_number_of_object(u32 object, mem32_t nump) +s32 sys_process_get_number_of_object(u32 object, mem32_t nump) { sc_p.Warning("sys_process_get_number_of_object(object=%d, nump_addr=0x%x)", object, nump.GetAddr()); @@ -165,7 +165,7 @@ int sys_process_get_number_of_object(u32 object, mem32_t nump) return CELL_OK; } -int sys_process_get_id(u32 object, mem32_ptr_t buffer, u32 size, mem32_t set_size) +s32 sys_process_get_id(u32 object, mem32_ptr_t buffer, u32 size, mem32_t set_size) { sc_p.Warning("TODO: sys_process_get_id(object=%d, buffer_addr=0x%x, size=%d, set_size_addr=0x%x)", object, buffer.GetAddr(), size, set_size.GetAddr()); @@ -208,7 +208,7 @@ int sys_process_get_id(u32 object, mem32_ptr_t buffer, u32 size, mem32_t set_siz return CELL_OK; } -int sys_process_get_paramsfo(mem8_ptr_t buffer) +s32 sys_process_get_paramsfo(mem8_ptr_t buffer) { sc_p.Warning("TODO: sys_process_get_paramsfo(buffer_addr=0x%x) returns CELL_ENOENT", buffer.GetAddr()); return CELL_ENOENT; @@ -227,7 +227,7 @@ int sys_process_get_paramsfo(mem8_ptr_t buffer) return CELL_OK;*/ } -int sys_process_get_sdk_version(u32 pid, mem32_t version) +s32 sys_process_get_sdk_version(u32 pid, mem32_t version) { sc_p.Warning("sys_process_get_sdk_version(pid=%d, version_addr=0x%x)", pid, version.GetAddr()); @@ -238,34 +238,34 @@ int sys_process_get_sdk_version(u32 pid, mem32_t version) return CELL_OK; } -int sys_process_kill(u32 pid) +s32 sys_process_kill(u32 pid) { sc_p.Error("TODO: sys_process_kill(pid=%d)", pid); return CELL_OK; } -int sys_process_wait_for_child(u32 pid, mem32_t status, u64 unk) +s32 sys_process_wait_for_child(u32 pid, mem32_t status, u64 unk) { sc_p.Error("TODO: sys_process_wait_for_child(pid=%d, status_addr=0x%x, unk=0x%llx", pid, status.GetAddr(), unk); return CELL_OK; } -int sys_process_wait_for_child2(u64 unk1, u64 unk2, u64 unk3, u64 unk4, u64 unk5, u64 unk6) +s32 sys_process_wait_for_child2(u64 unk1, u64 unk2, u64 unk3, u64 unk4, u64 unk5, u64 unk6) { sc_p.Error("TODO: sys_process_wait_for_child2(unk1=0x%llx, unk2=0x%llx, unk3=0x%llx, unk4=0x%llx, unk5=0x%llx, unk6=0x%llx)", unk1, unk2, unk3, unk4, unk5, unk6); return CELL_OK; } -int sys_process_get_status(u64 unk) +s32 sys_process_get_status(u64 unk) { sc_p.Error("TODO: sys_process_get_status(unk=0x%llx)", unk); //Memory.Write32(CPU.GPR[4], GetPPUThreadStatus(CPU)); return CELL_OK; } -int sys_process_detach_child(u64 unk) +s32 sys_process_detach_child(u64 unk) { sc_p.Error("TODO: sys_process_detach_child(unk=0x%llx)", unk); return CELL_OK; diff --git a/rpcs3/Emu/SysCalls/lv2/SC_Process.h b/rpcs3/Emu/SysCalls/lv2/sys_process.h similarity index 78% rename from rpcs3/Emu/SysCalls/lv2/SC_Process.h rename to rpcs3/Emu/SysCalls/lv2/sys_process.h index 86803fc8d4..3ec275818b 100644 --- a/rpcs3/Emu/SysCalls/lv2/SC_Process.h +++ b/rpcs3/Emu/SysCalls/lv2/sys_process.h @@ -52,18 +52,18 @@ struct sysProcessObjects_t extern sysProcessObjects_t procObjects; // SysCalls -int sys_process_getpid(); -int sys_process_getppid(); -int sys_process_get_number_of_object(u32 object, mem32_t nump); -int sys_process_get_id(u32 object, mem32_ptr_t buffer, u32 size, mem32_t set_size); -int sys_process_get_paramsfo(mem8_ptr_t buffer); -int sys_process_get_sdk_version(u32 pid, mem32_t version); -int sys_process_get_status(u64 unk); -int sys_process_exit(s32 errorcode); -int sys_process_kill(u32 pid); -int sys_process_wait_for_child(u32 pid, mem32_t status, u64 unk); -int sys_process_wait_for_child2(u64 unk1, u64 unk2, u64 unk3, u64 unk4, u64 unk5, u64 unk6); -int sys_process_detach_child(u64 unk); +s32 sys_process_getpid(); +s32 sys_process_getppid(); +s32 sys_process_get_number_of_object(u32 object, mem32_t nump); +s32 sys_process_get_id(u32 object, mem32_ptr_t buffer, u32 size, mem32_t set_size); +s32 sys_process_get_paramsfo(mem8_ptr_t buffer); +s32 sys_process_get_sdk_version(u32 pid, mem32_t version); +s32 sys_process_get_status(u64 unk); +s32 sys_process_exit(s32 errorcode); +s32 sys_process_kill(u32 pid); +s32 sys_process_wait_for_child(u32 pid, mem32_t status, u64 unk); +s32 sys_process_wait_for_child2(u64 unk1, u64 unk2, u64 unk3, u64 unk4, u64 unk5, u64 unk6); +s32 sys_process_detach_child(u64 unk); void sys_game_process_exitspawn(u32 path_addr, u32 argv_addr, u32 envp_addr, u32 data_addr, u32 data_size, u32 prio, u64 flags); void sys_game_process_exitspawn2(u32 path_addr, u32 argv_addr, u32 envp_addr, diff --git a/rpcs3/Emu/SysCalls/lv2/SC_PRX.cpp b/rpcs3/Emu/SysCalls/lv2/sys_prx.cpp similarity index 99% rename from rpcs3/Emu/SysCalls/lv2/SC_PRX.cpp rename to rpcs3/Emu/SysCalls/lv2/sys_prx.cpp index 40075871ad..bea1e06449 100644 --- a/rpcs3/Emu/SysCalls/lv2/SC_PRX.cpp +++ b/rpcs3/Emu/SysCalls/lv2/sys_prx.cpp @@ -3,7 +3,7 @@ #include "Emu/Memory/Memory.h" #include "Emu/System.h" #include "Emu/SysCalls/SysCalls.h" -#include "SC_PRX.h" +#include "sys_prx.h" SysCallBase sys_prx("sys_prx"); diff --git a/rpcs3/Emu/SysCalls/lv2/SC_PRX.h b/rpcs3/Emu/SysCalls/lv2/sys_prx.h similarity index 100% rename from rpcs3/Emu/SysCalls/lv2/SC_PRX.h rename to rpcs3/Emu/SysCalls/lv2/sys_prx.h diff --git a/rpcs3/Emu/SysCalls/lv2/SC_RSX.cpp b/rpcs3/Emu/SysCalls/lv2/sys_rsx.cpp similarity index 74% rename from rpcs3/Emu/SysCalls/lv2/SC_RSX.cpp rename to rpcs3/Emu/SysCalls/lv2/sys_rsx.cpp index d36e96f846..7f19dfd9ad 100644 --- a/rpcs3/Emu/SysCalls/lv2/SC_RSX.cpp +++ b/rpcs3/Emu/SysCalls/lv2/sys_rsx.cpp @@ -3,76 +3,77 @@ #include "Emu/Memory/Memory.h" #include "Emu/System.h" #include "Emu/SysCalls/SysCalls.h" +#include "sys_rsx.h" SysCallBase sys_rsx("sys_rsx"); -int sys_rsx_device_open() +s32 sys_rsx_device_open() { sys_rsx.Error("TODO: sys_rsx_device_open()"); return CELL_OK; } -int sys_rsx_device_close() +s32 sys_rsx_device_close() { sys_rsx.Error("TODO: sys_rsx_device_close()"); return CELL_OK; } -int sys_rsx_memory_allocate() +s32 sys_rsx_memory_allocate() { sys_rsx.Error("TODO: sys_rsx_memory_allocate()"); return CELL_OK; } -int sys_rsx_memory_free() +s32 sys_rsx_memory_free() { sys_rsx.Error("TODO: sys_rsx_memory_free()"); return CELL_OK; } -int sys_rsx_context_allocate() +s32 sys_rsx_context_allocate() { sys_rsx.Error("TODO: sys_rsx_context_allocate()"); return CELL_OK; } -int sys_rsx_context_free() +s32 sys_rsx_context_free() { sys_rsx.Error("TODO: sys_rsx_context_free()"); return CELL_OK; } -int sys_rsx_context_iomap() +s32 sys_rsx_context_iomap() { sys_rsx.Error("TODO: sys_rsx_context_iomap()"); return CELL_OK; } -int sys_rsx_context_iounmap() +s32 sys_rsx_context_iounmap() { sys_rsx.Error("TODO: sys_rsx_context_iounmap()"); return CELL_OK; } -int sys_rsx_context_attribute(s32 context_id, u64 a2, u64 a3, u64 a4, u64 a5, u64 a6) +s32 sys_rsx_context_attribute(s32 context_id, u64 a2, u64 a3, u64 a4, u64 a5, u64 a6) { sys_rsx.Error("TODO: sys_rsx_context_attribute(context_id=%d, a2=%llu, a3=%llu, a4=%llu, a5=%llu, a6=%llu)", context_id, a2, a3, a4, a5, a6); return CELL_OK; } -int sys_rsx_device_map(mem32_t a1, mem32_t a2, u32 a3) +s32 sys_rsx_device_map(mem32_t a1, mem32_t a2, u32 a3) { sys_rsx.Error("TODO: sys_rsx_device_map(a1_addr=0x%x, a2_addr=0x%x, a3=%d)", a1.GetAddr(), a2.GetAddr(), a3); return CELL_OK; } -int sys_rsx_device_unmap() +s32 sys_rsx_device_unmap() { sys_rsx.Error("TODO: sys_rsx_device_unmap()"); return CELL_OK; } -int sys_rsx_attribute() +s32 sys_rsx_attribute() { sys_rsx.Error("TODO: sys_rsx_attribute()"); return CELL_OK; diff --git a/rpcs3/Emu/SysCalls/lv2/sys_rsx.h b/rpcs3/Emu/SysCalls/lv2/sys_rsx.h new file mode 100644 index 0000000000..f51043315a --- /dev/null +++ b/rpcs3/Emu/SysCalls/lv2/sys_rsx.h @@ -0,0 +1,15 @@ +#pragma once + +// SysCalls +s32 sys_rsx_device_open(); +s32 sys_rsx_device_close(); +s32 sys_rsx_memory_allocate(); +s32 sys_rsx_memory_free(); +s32 sys_rsx_context_allocate(); +s32 sys_rsx_context_free(); +s32 sys_rsx_context_iomap(); +s32 sys_rsx_context_iounmap(); +s32 sys_rsx_context_attribute(s32 context_id, u64 a2, u64 a3, u64 a4, u64 a5, u64 a6); +s32 sys_rsx_device_map(mem32_t a1, mem32_t a2, u32 a3); +s32 sys_rsx_device_unmap(); +s32 sys_rsx_attribute(); diff --git a/rpcs3/Emu/SysCalls/lv2/SC_Rwlock.cpp b/rpcs3/Emu/SysCalls/lv2/sys_rwlock.cpp similarity index 91% rename from rpcs3/Emu/SysCalls/lv2/SC_Rwlock.cpp rename to rpcs3/Emu/SysCalls/lv2/sys_rwlock.cpp index 6ba8d00461..3db2e9c6e7 100644 --- a/rpcs3/Emu/SysCalls/lv2/SC_Rwlock.cpp +++ b/rpcs3/Emu/SysCalls/lv2/sys_rwlock.cpp @@ -3,12 +3,12 @@ #include "Emu/Memory/Memory.h" #include "Emu/System.h" #include "Emu/Cell/PPUThread.h" -#include "SC_Rwlock.h" +#include "sys_rwlock.h" #include "Emu/SysCalls/SysCalls.h" SysCallBase sys_rwlock("sys_rwlock"); -int sys_rwlock_create(mem32_t rw_lock_id, mem_ptr_t attr) +s32 sys_rwlock_create(mem32_t rw_lock_id, mem_ptr_t attr) { sys_rwlock.Warning("sys_rwlock_create(rw_lock_id_addr=0x%x, attr_addr=0x%x)", rw_lock_id.GetAddr(), attr.GetAddr()); @@ -37,7 +37,7 @@ int sys_rwlock_create(mem32_t rw_lock_id, mem_ptr_t attr return CELL_OK; } -int sys_rwlock_destroy(u32 rw_lock_id) +s32 sys_rwlock_destroy(u32 rw_lock_id) { sys_rwlock.Warning("sys_rwlock_destroy(rw_lock_id=%d)", rw_lock_id); @@ -53,7 +53,7 @@ int sys_rwlock_destroy(u32 rw_lock_id) return CELL_OK; } -int sys_rwlock_rlock(u32 rw_lock_id, u64 timeout) +s32 sys_rwlock_rlock(u32 rw_lock_id, u64 timeout) { sys_rwlock.Log("sys_rwlock_rlock(rw_lock_id=%d, timeout=%lld)", rw_lock_id, timeout); @@ -90,7 +90,7 @@ int sys_rwlock_rlock(u32 rw_lock_id, u64 timeout) } while (true); } -int sys_rwlock_tryrlock(u32 rw_lock_id) +s32 sys_rwlock_tryrlock(u32 rw_lock_id) { sys_rwlock.Log("sys_rwlock_tryrlock(rw_lock_id=%d)", rw_lock_id); @@ -102,7 +102,7 @@ int sys_rwlock_tryrlock(u32 rw_lock_id) return CELL_OK; } -int sys_rwlock_runlock(u32 rw_lock_id) +s32 sys_rwlock_runlock(u32 rw_lock_id) { sys_rwlock.Log("sys_rwlock_runlock(rw_lock_id=%d)", rw_lock_id); @@ -114,7 +114,7 @@ int sys_rwlock_runlock(u32 rw_lock_id) return CELL_OK; } -int sys_rwlock_wlock(u32 rw_lock_id, u64 timeout) +s32 sys_rwlock_wlock(u32 rw_lock_id, u64 timeout) { sys_rwlock.Log("sys_rwlock_wlock(rw_lock_id=%d, timeout=%lld)", rw_lock_id, timeout); @@ -153,7 +153,7 @@ int sys_rwlock_wlock(u32 rw_lock_id, u64 timeout) } while (true); } -int sys_rwlock_trywlock(u32 rw_lock_id) +s32 sys_rwlock_trywlock(u32 rw_lock_id) { sys_rwlock.Log("sys_rwlock_trywlock(rw_lock_id=%d)", rw_lock_id); @@ -168,7 +168,7 @@ int sys_rwlock_trywlock(u32 rw_lock_id) return CELL_OK; } -int sys_rwlock_wunlock(u32 rw_lock_id) +s32 sys_rwlock_wunlock(u32 rw_lock_id) { sys_rwlock.Log("sys_rwlock_wunlock(rw_lock_id=%d)", rw_lock_id); diff --git a/rpcs3/Emu/SysCalls/lv2/SC_Rwlock.h b/rpcs3/Emu/SysCalls/lv2/sys_rwlock.h similarity index 86% rename from rpcs3/Emu/SysCalls/lv2/SC_Rwlock.h rename to rpcs3/Emu/SysCalls/lv2/sys_rwlock.h index c80baa9606..4097ff4cd5 100644 --- a/rpcs3/Emu/SysCalls/lv2/SC_Rwlock.h +++ b/rpcs3/Emu/SysCalls/lv2/sys_rwlock.h @@ -150,3 +150,13 @@ struct RWLock return false; } }; + +// SysCalls +s32 sys_rwlock_create(mem32_t rw_lock_id, mem_ptr_t attr); +s32 sys_rwlock_destroy(u32 rw_lock_id); +s32 sys_rwlock_rlock(u32 rw_lock_id, u64 timeout); +s32 sys_rwlock_tryrlock(u32 rw_lock_id); +s32 sys_rwlock_runlock(u32 rw_lock_id); +s32 sys_rwlock_wlock(u32 rw_lock_id, u64 timeout); +s32 sys_rwlock_trywlock(u32 rw_lock_id); +s32 sys_rwlock_wunlock(u32 rw_lock_id); diff --git a/rpcs3/Emu/SysCalls/lv2/SC_Semaphore.cpp b/rpcs3/Emu/SysCalls/lv2/sys_semaphore.cpp similarity index 92% rename from rpcs3/Emu/SysCalls/lv2/SC_Semaphore.cpp rename to rpcs3/Emu/SysCalls/lv2/sys_semaphore.cpp index 66fbe8ad6e..66be62ee2c 100644 --- a/rpcs3/Emu/SysCalls/lv2/SC_Semaphore.cpp +++ b/rpcs3/Emu/SysCalls/lv2/sys_semaphore.cpp @@ -3,11 +3,11 @@ #include "Emu/Memory/Memory.h" #include "Emu/System.h" #include "Emu/SysCalls/SysCalls.h" -#include "SC_Semaphore.h" +#include "sys_semaphore.h" SysCallBase sys_sem("sys_semaphore"); -int sys_semaphore_create(mem32_t sem, mem_ptr_t attr, int initial_count, int max_count) +s32 sys_semaphore_create(mem32_t sem, mem_ptr_t attr, int initial_count, int max_count) { sys_sem.Warning("sys_semaphore_create(sem_addr=0x%x, attr_addr=0x%x, initial_count=%d, max_count=%d)", sem.GetAddr(), attr.GetAddr(), initial_count, max_count); @@ -45,7 +45,7 @@ int sys_semaphore_create(mem32_t sem, mem_ptr_t attr, i return CELL_OK; } -int sys_semaphore_destroy(u32 sem_id) +s32 sys_semaphore_destroy(u32 sem_id) { sys_sem.Warning("sys_semaphore_destroy(sem_id=%d)", sem_id); @@ -64,7 +64,7 @@ int sys_semaphore_destroy(u32 sem_id) return CELL_OK; } -int sys_semaphore_wait(u32 sem_id, u64 timeout) +s32 sys_semaphore_wait(u32 sem_id, u64 timeout) { sys_sem.Log("sys_semaphore_wait(sem_id=%d, timeout=%lld)", sem_id, timeout); @@ -118,7 +118,7 @@ int sys_semaphore_wait(u32 sem_id, u64 timeout) } } -int sys_semaphore_trywait(u32 sem_id) +s32 sys_semaphore_trywait(u32 sem_id) { sys_sem.Log("sys_semaphore_trywait(sem_id=%d)", sem_id); @@ -141,7 +141,7 @@ int sys_semaphore_trywait(u32 sem_id) } } -int sys_semaphore_post(u32 sem_id, int count) +s32 sys_semaphore_post(u32 sem_id, int count) { sys_sem.Log("sys_semaphore_post(sem_id=%d, count=%d)", sem_id, count); @@ -193,7 +193,7 @@ int sys_semaphore_post(u32 sem_id, int count) return CELL_OK; } -int sys_semaphore_get_value(u32 sem_id, mem32_t count) +s32 sys_semaphore_get_value(u32 sem_id, mem32_t count) { sys_sem.Log("sys_semaphore_get_value(sem_id=%d, count_addr=0x%x)", sem_id, count.GetAddr()); diff --git a/rpcs3/Emu/SysCalls/lv2/SC_Semaphore.h b/rpcs3/Emu/SysCalls/lv2/sys_semaphore.h similarity index 60% rename from rpcs3/Emu/SysCalls/lv2/SC_Semaphore.h rename to rpcs3/Emu/SysCalls/lv2/sys_semaphore.h index 4531041312..653f46502a 100644 --- a/rpcs3/Emu/SysCalls/lv2/SC_Semaphore.h +++ b/rpcs3/Emu/SysCalls/lv2/sys_semaphore.h @@ -33,4 +33,12 @@ struct Semaphore , name(name) { } -}; \ No newline at end of file +}; + +// SysCalls +s32 sys_semaphore_create(mem32_t sem, mem_ptr_t attr, int initial_count, int max_count); +s32 sys_semaphore_destroy(u32 sem_id); +s32 sys_semaphore_wait(u32 sem_id, u64 timeout); +s32 sys_semaphore_trywait(u32 sem_id); +s32 sys_semaphore_post(u32 sem_id, int count); +s32 sys_semaphore_get_value(u32 sem_id, mem32_t count); diff --git a/rpcs3/Emu/SysCalls/lv2/SC_Spinlock.cpp b/rpcs3/Emu/SysCalls/lv2/sys_spinlock.cpp similarity index 94% rename from rpcs3/Emu/SysCalls/lv2/SC_Spinlock.cpp rename to rpcs3/Emu/SysCalls/lv2/sys_spinlock.cpp index cf3900b72a..23a618ad48 100644 --- a/rpcs3/Emu/SysCalls/lv2/SC_Spinlock.cpp +++ b/rpcs3/Emu/SysCalls/lv2/sys_spinlock.cpp @@ -4,7 +4,7 @@ #include "Emu/System.h" #include "Emu/Cell/PPUThread.h" #include "Emu/SysCalls/SysCalls.h" -#include "Emu/SysCalls/lv2/SC_Spinlock.h" +#include "sys_spinlock.h" SysCallBase sys_spinlock("sys_spinlock"); @@ -28,7 +28,7 @@ void sys_spinlock_lock(mem_ptr_t lock) } } -int sys_spinlock_trylock(mem_ptr_t lock) +s32 sys_spinlock_trylock(mem_ptr_t lock) { sys_spinlock.Log("sys_spinlock_trylock(lock_addr=0x%x)", lock.GetAddr()); diff --git a/rpcs3/Emu/SysCalls/lv2/sys_spinlock.h b/rpcs3/Emu/SysCalls/lv2/sys_spinlock.h new file mode 100644 index 0000000000..ed81750400 --- /dev/null +++ b/rpcs3/Emu/SysCalls/lv2/sys_spinlock.h @@ -0,0 +1,12 @@ +#pragma once + +struct spinlock +{ + SMutexBE mutex; +}; + +// SysCalls +void sys_spinlock_initialize(mem_ptr_t lock); +void sys_spinlock_lock(mem_ptr_t lock); +s32 sys_spinlock_trylock(mem_ptr_t lock); +void sys_spinlock_unlock(mem_ptr_t lock); diff --git a/rpcs3/Emu/SysCalls/lv2/SC_SPU_Thread.cpp b/rpcs3/Emu/SysCalls/lv2/sys_spu.cpp similarity index 86% rename from rpcs3/Emu/SysCalls/lv2/SC_SPU_Thread.cpp rename to rpcs3/Emu/SysCalls/lv2/sys_spu.cpp index 207c579a80..e5492be6f5 100644 --- a/rpcs3/Emu/SysCalls/lv2/SC_SPU_Thread.cpp +++ b/rpcs3/Emu/SysCalls/lv2/sys_spu.cpp @@ -4,7 +4,7 @@ #include "Emu/System.h" #include "Emu/Cell/PPUThread.h" #include "Emu/FS/vfsFile.h" -#include "SC_SPU_Thread.h" +#include "sys_spu.h" #include "Emu/SysCalls/SysCalls.h" #include "Emu/SysCalls/SC_FUNC.h" #include "Loader/ELF.h" @@ -42,8 +42,25 @@ u32 LoadSpuImage(vfsStream& stream) return LoadSpuImage(stream, g_last_spu_offset); }*/ +/*u32 _max_usable_spu = 0; +u32 _max_raw_spu = 0; + +s32 sys_spu_initialize(u32 max_usable_spu, u32 max_raw_spu) +{ + sc_spu.Log("sys_spu_initialize(max_usable_spu=%d, max_raw_spu=%d)", max_usable_spu, max_raw_spu); + _max_usable_spu = max_usable_spu; + _max_raw_spu = max_raw_spu; + return CELL_OK; +} + +s32 sys_raw_spu_create(u32 id_addr, u32 attr_addr) +{ + Memory.Write32(id_addr, Emu.GetIdManager().GetNewID("raw_spu")); + return CELL_OK; +}*/ + //156 -int sys_spu_image_open(mem_ptr_t img, u32 path_addr) +s32 sys_spu_image_open(mem_ptr_t img, u32 path_addr) { const std::string path = Memory.ReadString(path_addr).c_str(); sc_spu.Warning("sys_spu_image_open(img_addr=0x%x, path_addr=0x%x [%s])", img.GetAddr(), path_addr, path.c_str()); @@ -72,7 +89,7 @@ int sys_spu_image_open(mem_ptr_t img, u32 path_addr) } //172 -int sys_spu_thread_initialize(mem32_t thread, u32 group, u32 spu_num, mem_ptr_t img, mem_ptr_t attr, mem_ptr_t arg) +s32 sys_spu_thread_initialize(mem32_t thread, u32 group, u32 spu_num, mem_ptr_t img, mem_ptr_t attr, mem_ptr_t arg) { sc_spu.Warning("sys_spu_thread_initialize(thread_addr=0x%x, group=0x%x, spu_num=%d, img_addr=0x%x, attr_addr=0x%x, arg_addr=0x%x)", thread.GetAddr(), group, spu_num, img.GetAddr(), attr.GetAddr(), arg.GetAddr()); @@ -143,7 +160,7 @@ int sys_spu_thread_initialize(mem32_t thread, u32 group, u32 spu_num, mem_ptr_t< } //166 -int sys_spu_thread_set_argument(u32 id, mem_ptr_t arg) +s32 sys_spu_thread_set_argument(u32 id, mem_ptr_t arg) { sc_spu.Warning("sys_spu_thread_set_argument(id=%d, arg_addr=0x%x)", id, arg.GetAddr()); CPUThread* thr = Emu.GetCPU().GetThread(id); @@ -167,7 +184,7 @@ int sys_spu_thread_set_argument(u32 id, mem_ptr_t arg) } //165 -int sys_spu_thread_get_exit_status(u32 id, mem32_t status) +s32 sys_spu_thread_get_exit_status(u32 id, mem32_t status) { sc_spu.Warning("sys_spu_thread_get_exit_status(id=%d, status_addr=0x%x)", id, status.GetAddr()); @@ -194,7 +211,7 @@ int sys_spu_thread_get_exit_status(u32 id, mem32_t status) } //171 -int sys_spu_thread_group_destroy(u32 id) +s32 sys_spu_thread_group_destroy(u32 id) { sc_spu.Warning("sys_spu_thread_group_destroy(id=%d)", id); @@ -221,7 +238,7 @@ int sys_spu_thread_group_destroy(u32 id) } //173 -int sys_spu_thread_group_start(u32 id) +s32 sys_spu_thread_group_start(u32 id) { sc_spu.Warning("sys_spu_thread_group_start(id=%d)", id); @@ -246,7 +263,7 @@ int sys_spu_thread_group_start(u32 id) } //174 -int sys_spu_thread_group_suspend(u32 id) +s32 sys_spu_thread_group_suspend(u32 id) { sc_spu.Log("sys_spu_thread_group_suspend(id=%d)", id); @@ -270,7 +287,7 @@ int sys_spu_thread_group_suspend(u32 id) } //175 -int sys_spu_thread_group_resume(u32 id) +s32 sys_spu_thread_group_resume(u32 id) { sc_spu.Log("sys_spu_thread_group_resume(id=%d)", id); @@ -294,7 +311,7 @@ int sys_spu_thread_group_resume(u32 id) } //170 -int sys_spu_thread_group_create(mem32_t id, u32 num, int prio, mem_ptr_t attr) +s32 sys_spu_thread_group_create(mem32_t id, u32 num, int prio, mem_ptr_t attr) { sc_spu.Warning("sys_spu_thread_group_create(id_addr=0x%x, num=%d, prio=%d, attr_addr=0x%x)", id.GetAddr(), num, prio, attr.GetAddr()); @@ -318,7 +335,7 @@ int sys_spu_thread_group_create(mem32_t id, u32 num, int prio, mem_ptr_t name_len; + be_t name_addr; + be_t type; + /* struct {} option; */ + be_t ct; // memory container id +}; + +struct sys_spu_thread_attribute +{ + be_t name_addr; + be_t name_len; + be_t option; +}; + +struct sys_spu_thread_argument +{ + be_t arg1; + be_t arg2; + be_t arg3; + be_t arg4; +}; + +struct sys_spu_image +{ + be_t type; + be_t entry_point; + be_t segs_addr; //temporarily used as offset of LS image after elf loading + be_t nsegs; +}; + +struct sys_spu_segment +{ + be_t type; + be_t ls_start; + be_t size; + be_t src; +}; + +struct SpuGroupInfo +{ + std::vector list; + std::atomic lock; + std::string m_name; + int m_prio; + int m_type; + int m_ct; + + SpuGroupInfo(const std::string& name, u32 num, int prio, int type, u32 ct) + : m_name(name) + , m_prio(prio) + , m_type(type) + , m_ct(ct) + , lock(0) + { + num = 256; + list.resize(num); + for (u32 i = 0; i < num; i++) + { + list[i] = 0; + } + } +}; + +// SysCalls +s32 sys_spu_initialize(u32 max_usable_spu, u32 max_raw_spu); +s32 sys_spu_image_open(mem_ptr_t img, u32 path_addr); +s32 sys_spu_thread_initialize(mem32_t thread, u32 group, u32 spu_num, mem_ptr_t img, mem_ptr_t attr, mem_ptr_t arg); +s32 sys_spu_thread_set_argument(u32 id, mem_ptr_t arg); +s32 sys_spu_thread_group_destroy(u32 id); +s32 sys_spu_thread_group_start(u32 id); +s32 sys_spu_thread_group_suspend(u32 id); +s32 sys_spu_thread_group_resume(u32 id); +s32 sys_spu_thread_group_create(mem32_t id, u32 num, int prio, mem_ptr_t attr); +s32 sys_spu_thread_create(mem32_t thread_id, mem32_t entry, u64 arg, int prio, u32 stacksize, u64 flags, u32 threadname_addr); +s32 sys_spu_thread_group_join(u32 id, mem32_t cause, mem32_t status); +s32 sys_spu_thread_group_connect_event(u32 id, u32 eq, u32 et); +s32 sys_spu_thread_group_disconnect_event(u32 id, u32 et); +s32 sys_spu_thread_group_connect_event_all_threads(u32 id, u32 eq, u64 req, u32 spup_addr); +s32 sys_spu_thread_group_disconnect_event_all_threads(u32 id, u8 spup); +s32 sys_spu_thread_write_ls(u32 id, u32 address, u64 value, u32 type); +s32 sys_spu_thread_read_ls(u32 id, u32 address, mem64_t value, u32 type); +s32 sys_spu_thread_write_spu_mb(u32 id, u32 value); +s32 sys_spu_thread_set_spu_cfg(u32 id, u64 value); +s32 sys_spu_thread_get_spu_cfg(u32 id, mem64_t value); +s32 sys_spu_thread_write_snr(u32 id, u32 number, u32 value); +s32 sys_spu_thread_connect_event(u32 id, u32 eq, u32 et, u8 spup); +s32 sys_spu_thread_disconnect_event(u32 id, u32 event_type, u8 spup); +s32 sys_spu_thread_bind_queue(u32 id, u32 spuq, u32 spuq_num); +s32 sys_spu_thread_unbind_queue(u32 id, u32 spuq_num); +s32 sys_spu_thread_get_exit_status(u32 id, mem32_t status); + +s32 sys_raw_spu_create(mem32_t id, u32 attr_addr); +s32 sys_raw_spu_destroy(u32 id); +s32 sys_raw_spu_create_interrupt_tag(u32 id, u32 class_id, u32 hwthread, mem32_t intrtag); +s32 sys_raw_spu_set_int_mask(u32 id, u32 class_id, u64 mask); +s32 sys_raw_spu_get_int_mask(u32 id, u32 class_id, mem64_t mask); +s32 sys_raw_spu_set_int_stat(u32 id, u32 class_id, u64 stat); +s32 sys_raw_spu_get_int_stat(u32 id, u32 class_id, mem64_t stat); +s32 sys_raw_spu_read_puint_mb(u32 id, mem32_t value); +s32 sys_raw_spu_set_spu_cfg(u32 id, u32 value); +s32 sys_raw_spu_get_spu_cfg(u32 id, mem32_t value); diff --git a/rpcs3/Emu/SysCalls/lv2/SC_Time.cpp b/rpcs3/Emu/SysCalls/lv2/sys_time.cpp similarity index 92% rename from rpcs3/Emu/SysCalls/lv2/SC_Time.cpp rename to rpcs3/Emu/SysCalls/lv2/sys_time.cpp index 5b14c233b3..0a5ded0ce9 100644 --- a/rpcs3/Emu/SysCalls/lv2/SC_Time.cpp +++ b/rpcs3/Emu/SysCalls/lv2/sys_time.cpp @@ -10,7 +10,7 @@ #include "Emu/Memory/Memory.h" #include "Emu/System.h" #include "Emu/SysCalls/SysCalls.h" -#include "SC_Time.h" +#include "sys_time.h" SysCallBase sys_time("sys_time"); @@ -45,7 +45,7 @@ u64 get_system_time() // Functions -int sys_time_get_timezone(mem32_t timezone, mem32_t summertime) +s32 sys_time_get_timezone(mem32_t timezone, mem32_t summertime) { int ret; ret = cellSysutilGetSystemParamInt(0x0116, timezone); //0x0116 = CELL_SYSUTIL_SYSTEMPARAM_ID_TIMEZONE @@ -55,7 +55,7 @@ int sys_time_get_timezone(mem32_t timezone, mem32_t summertime) return CELL_OK; } -int sys_time_get_current_time(u32 sec_addr, u32 nsec_addr) +s32 sys_time_get_current_time(u32 sec_addr, u32 nsec_addr) { sys_time.Log("sys_time_get_current_time(sec_addr=0x%x, nsec_addr=0x%x)", sec_addr, nsec_addr); diff --git a/rpcs3/Emu/SysCalls/lv2/sys_time.h b/rpcs3/Emu/SysCalls/lv2/sys_time.h new file mode 100644 index 0000000000..921504cb42 --- /dev/null +++ b/rpcs3/Emu/SysCalls/lv2/sys_time.h @@ -0,0 +1,11 @@ +#pragma once + +// Auxiliary functions +u64 get_time(); +u64 get_system_time(); + +// SysCalls +s32 sys_time_get_timezone(mem32_t timezone, mem32_t summertime); +s32 sys_time_get_current_time(u32 sec_addr, u32 nsec_addr); +s64 sys_time_get_system_time(); +u64 sys_time_get_timebase_frequency(); diff --git a/rpcs3/Emu/SysCalls/lv2/SC_Timer.cpp b/rpcs3/Emu/SysCalls/lv2/sys_timer.cpp similarity index 86% rename from rpcs3/Emu/SysCalls/lv2/SC_Timer.cpp rename to rpcs3/Emu/SysCalls/lv2/sys_timer.cpp index 3a212ad74d..e7fbc7f63b 100644 --- a/rpcs3/Emu/SysCalls/lv2/SC_Timer.cpp +++ b/rpcs3/Emu/SysCalls/lv2/sys_timer.cpp @@ -2,13 +2,13 @@ #include "Utilities/Log.h" #include "Emu/Memory/Memory.h" #include "Emu/System.h" -#include "SC_Timer.h" +#include "sys_timer.h" #include "Emu/SysCalls/SysCalls.h" #include "Emu/event.h" SysCallBase sys_timer("sys_timer"); -int sys_timer_create(mem32_t timer_id) +s32 sys_timer_create(mem32_t timer_id) { sys_timer.Warning("sys_timer_create(timer_id_addr=0x%x)", timer_id.GetAddr()); @@ -18,7 +18,7 @@ int sys_timer_create(mem32_t timer_id) return CELL_OK; } -int sys_timer_destroy(u32 timer_id) +s32 sys_timer_destroy(u32 timer_id) { sys_timer.Warning("TODO: sys_timer_destroy(timer_id=%d)", timer_id); @@ -28,7 +28,7 @@ int sys_timer_destroy(u32 timer_id) return CELL_OK; } -int sys_timer_get_information(u32 timer_id, mem_ptr_t info) +s32 sys_timer_get_information(u32 timer_id, mem_ptr_t info) { sys_timer.Warning("sys_timer_get_information(timer_id=%d, info_addr=0x%x)", timer_id, info.GetAddr()); @@ -39,7 +39,7 @@ int sys_timer_get_information(u32 timer_id, mem_ptr_t i return CELL_OK; } -int sys_timer_start(u32 timer_id, s64 base_time, u64 period) +s32 sys_timer_start(u32 timer_id, s64 base_time, u64 period) { sys_timer.Warning("sys_timer_start_periodic_absolute(timer_id=%d, basetime=%lld, period=%llu)", timer_id, base_time, period); @@ -58,7 +58,7 @@ int sys_timer_start(u32 timer_id, s64 base_time, u64 period) return CELL_OK; } -int sys_timer_stop(u32 timer_id) +s32 sys_timer_stop(u32 timer_id) { sys_timer.Warning("TODO: sys_timer_stop()"); @@ -70,7 +70,7 @@ int sys_timer_stop(u32 timer_id) return CELL_OK; } -int sys_timer_connect_event_queue(u32 timer_id, u32 queue_id, u64 name, u64 data1, u64 data2) +s32 sys_timer_connect_event_queue(u32 timer_id, u32 queue_id, u64 name, u64 data1, u64 data2) { sys_timer.Warning("sys_timer_connect_event_queue(timer_id=%d, queue_id=%d, name=%llu, data1=%llu, data2=%llu)", timer_id, queue_id, name, data1, data2); @@ -85,7 +85,7 @@ int sys_timer_connect_event_queue(u32 timer_id, u32 queue_id, u64 name, u64 data return CELL_OK; } -int sys_timer_disconnect_event_queue(u32 timer_id) +s32 sys_timer_disconnect_event_queue(u32 timer_id) { sys_timer.Warning("TODO: sys_timer_disconnect_event_queue(timer_id=%d)", timer_id); @@ -97,14 +97,14 @@ int sys_timer_disconnect_event_queue(u32 timer_id) return CELL_OK; } -int sys_timer_sleep(u32 sleep_time) +s32 sys_timer_sleep(u32 sleep_time) { sys_timer.Warning("sys_timer_sleep(sleep_time=%d)", sleep_time); rSleep(sleep_time); return CELL_OK; } -int sys_timer_usleep(u64 sleep_time) +s32 sys_timer_usleep(u64 sleep_time) { sys_timer.Log("sys_timer_usleep(sleep_time=%lld)", sleep_time); if (sleep_time > 0xFFFFFFFFFFFF) sleep_time = 0xFFFFFFFFFFFF; //2^48-1 diff --git a/rpcs3/Emu/SysCalls/lv2/sys_timer.h b/rpcs3/Emu/SysCalls/lv2/sys_timer.h new file mode 100644 index 0000000000..16739e9542 --- /dev/null +++ b/rpcs3/Emu/SysCalls/lv2/sys_timer.h @@ -0,0 +1,33 @@ +#pragma once + +enum +{ + SYS_TIMER_STATE_STOP = 0x00U, + SYS_TIMER_STATE_RUN = 0x01U, +}; + +struct sys_timer_information_t +{ + s64 next_expiration_time; //system_time_t + u64 period; //usecond_t + u32 timer_state; + u32 pad; +}; + +struct timer +{ + rTimer tmr; + sys_timer_information_t timer_information_t; +}; + +#pragma pack() + +s32 sys_timer_create(mem32_t timer_id); +s32 sys_timer_destroy(u32 timer_id); +s32 sys_timer_get_information(u32 timer_id, mem_ptr_t info); +s32 sys_timer_start(u32 timer_id, s64 basetime, u64 period); +s32 sys_timer_stop(u32 timer_id); +s32 sys_timer_connect_event_queue(u32 timer_id, u32 queue_id, u64 name, u64 data1, u64 data2); +s32 sys_timer_disconnect_event_queue(u32 timer_id); +s32 sys_timer_sleep(u32 sleep_time); +s32 sys_timer_usleep(u64 sleep_time); diff --git a/rpcs3/Emu/SysCalls/lv2/SC_Trace.cpp b/rpcs3/Emu/SysCalls/lv2/sys_trace.cpp similarity index 80% rename from rpcs3/Emu/SysCalls/lv2/SC_Trace.cpp rename to rpcs3/Emu/SysCalls/lv2/sys_trace.cpp index 190e3b1d7d..776d34f779 100644 --- a/rpcs3/Emu/SysCalls/lv2/SC_Trace.cpp +++ b/rpcs3/Emu/SysCalls/lv2/sys_trace.cpp @@ -6,61 +6,61 @@ SysCallBase sys_trace("sys_trace"); -int sys_trace_create() +s32 sys_trace_create() { sys_trace.Warning("Unimplemented function: sys_trace_create()"); return CELL_OK; } -int sys_trace_start() +s32 sys_trace_start() { sys_trace.Warning("Unimplemented function: sys_trace_start()"); return CELL_OK; } -int sys_trace_stop() +s32 sys_trace_stop() { sys_trace.Warning("Unimplemented function: sys_trace_stop()"); return CELL_OK; } -int sys_trace_update_top_index() +s32 sys_trace_update_top_index() { sys_trace.Warning("Unimplemented function: sys_trace_update_top_index()"); return CELL_OK; } -int sys_trace_destroy() +s32 sys_trace_destroy() { sys_trace.Warning("Unimplemented function: sys_trace_destroy()"); return CELL_OK; } -int sys_trace_drain() +s32 sys_trace_drain() { sys_trace.Warning("Unimplemented function: sys_trace_drain()"); return CELL_OK; } -int sys_trace_attach_process() +s32 sys_trace_attach_process() { sys_trace.Warning("Unimplemented function: sys_trace_attach_process()"); return CELL_OK; } -int sys_trace_allocate_buffer() +s32 sys_trace_allocate_buffer() { sys_trace.Warning("Unimplemented function: sys_trace_allocate_buffer()"); return CELL_OK; } -int sys_trace_free_buffer() +s32 sys_trace_free_buffer() { sys_trace.Warning("Unimplemented function: sys_trace_free_buffer()"); return CELL_OK; } -int sys_trace_create2() +s32 sys_trace_create2() { sys_trace.Warning("Unimplemented function: sys_trace_create2()"); return CELL_OK; diff --git a/rpcs3/Emu/SysCalls/lv2/sys_trace.h b/rpcs3/Emu/SysCalls/lv2/sys_trace.h new file mode 100644 index 0000000000..5b253893c3 --- /dev/null +++ b/rpcs3/Emu/SysCalls/lv2/sys_trace.h @@ -0,0 +1,13 @@ +#pragma once + +// SysCalls +s32 sys_trace_create(); +s32 sys_trace_start(); +s32 sys_trace_stop(); +s32 sys_trace_update_top_index(); +s32 sys_trace_destroy(); +s32 sys_trace_drain(); +s32 sys_trace_attach_process(); +s32 sys_trace_allocate_buffer(); +s32 sys_trace_free_buffer(); +s32 sys_trace_create2(); diff --git a/rpcs3/Emu/SysCalls/lv2/SC_TTY.cpp b/rpcs3/Emu/SysCalls/lv2/sys_tty.cpp similarity index 85% rename from rpcs3/Emu/SysCalls/lv2/SC_TTY.cpp rename to rpcs3/Emu/SysCalls/lv2/sys_tty.cpp index 1ca49fac73..0ecf0f3b5a 100644 --- a/rpcs3/Emu/SysCalls/lv2/SC_TTY.cpp +++ b/rpcs3/Emu/SysCalls/lv2/sys_tty.cpp @@ -4,7 +4,7 @@ #include "Emu/System.h" #include "Emu/SysCalls/SysCalls.h" -int sys_tty_read(u32 ch, u64 buf_addr, u32 len, u64 preadlen_addr) +s32 sys_tty_read(u32 ch, u64 buf_addr, u32 len, u64 preadlen_addr) { //we currently do not support reading from the Console LOG_WARNING(HLE, "sys_tty_read: ch: %d, buf addr: %llx, len: %d", ch, buf_addr, len); @@ -14,7 +14,7 @@ int sys_tty_read(u32 ch, u64 buf_addr, u32 len, u64 preadlen_addr) return CELL_OK; } -int sys_tty_write(u32 ch, u64 buf_addr, u32 len, u64 pwritelen_addr) +s32 sys_tty_write(u32 ch, u64 buf_addr, u32 len, u64 pwritelen_addr) { if(ch > 15 || (s32)len <= 0) return CELL_EINVAL; if(!Memory.IsGoodAddr(buf_addr)) return CELL_EFAULT; diff --git a/rpcs3/Emu/SysCalls/lv2/sys_tty.h b/rpcs3/Emu/SysCalls/lv2/sys_tty.h new file mode 100644 index 0000000000..b65e72ea90 --- /dev/null +++ b/rpcs3/Emu/SysCalls/lv2/sys_tty.h @@ -0,0 +1,4 @@ +#pragma once + +s32 sys_tty_read(u32 ch, u64 buf_addr, u32 len, u64 preadlen_addr); +s32 sys_tty_write(u32 ch, u64 buf_addr, u32 len, u64 pwritelen_addr); diff --git a/rpcs3/Emu/SysCalls/lv2/SC_VM.cpp b/rpcs3/Emu/SysCalls/lv2/sys_vm.cpp similarity index 92% rename from rpcs3/Emu/SysCalls/lv2/SC_VM.cpp rename to rpcs3/Emu/SysCalls/lv2/sys_vm.cpp index d7c9f58d40..6495255fad 100644 --- a/rpcs3/Emu/SysCalls/lv2/SC_VM.cpp +++ b/rpcs3/Emu/SysCalls/lv2/sys_vm.cpp @@ -3,12 +3,12 @@ #include "Emu/Memory/Memory.h" #include "Emu/System.h" #include "Emu/SysCalls/SysCalls.h" -#include "SC_Memory.h" +#include "sys_memory.h" SysCallBase sc_vm("vm"); MemoryContainerInfo* current_ct; -int sys_vm_memory_map(u32 vsize, u32 psize, u32 cid, u64 flag, u64 policy, u32 addr) +s32 sys_vm_memory_map(u32 vsize, u32 psize, u32 cid, u64 flag, u64 policy, u32 addr) { sc_vm.Warning("sys_vm_memory_map(vsize=0x%x,psize=0x%x,cidr=0x%x,flags=0x%llx,policy=0x%llx,addr=0x%x)", vsize, psize, cid, flag, policy, addr); @@ -68,7 +68,7 @@ int sys_vm_memory_map(u32 vsize, u32 psize, u32 cid, u64 flag, u64 policy, u32 a return CELL_OK; } -int sys_vm_unmap(u32 addr) +s32 sys_vm_unmap(u32 addr) { sc_vm.Warning("sys_vm_unmap(addr=0x%x)", addr); @@ -78,7 +78,7 @@ int sys_vm_unmap(u32 addr) return CELL_OK; } -int sys_vm_append_memory(u32 addr, u32 size) +s32 sys_vm_append_memory(u32 addr, u32 size) { sc_vm.Warning("sys_vm_append_memory(addr=0x%x,size=0x%x)", addr, size); @@ -100,7 +100,7 @@ int sys_vm_append_memory(u32 addr, u32 size) return CELL_OK; } -int sys_vm_return_memory(u32 addr, u32 size) +s32 sys_vm_return_memory(u32 addr, u32 size) { sc_vm.Warning("sys_vm_return_memory(addr=0x%x,size=0x%x)", addr, size); @@ -122,7 +122,7 @@ int sys_vm_return_memory(u32 addr, u32 size) return CELL_OK; } -int sys_vm_lock(u32 addr, u32 size) +s32 sys_vm_lock(u32 addr, u32 size) { sc_vm.Warning("sys_vm_lock(addr=0x%x,size=0x%x)", addr, size); @@ -144,7 +144,7 @@ int sys_vm_lock(u32 addr, u32 size) return CELL_OK; } -int sys_vm_unlock(u32 addr, u32 size) +s32 sys_vm_unlock(u32 addr, u32 size) { sc_vm.Warning("sys_vm_unlock(addr=0x%x,size=0x%x)", addr, size); @@ -159,7 +159,7 @@ int sys_vm_unlock(u32 addr, u32 size) return CELL_OK; } -int sys_vm_touch(u32 addr, u32 size) +s32 sys_vm_touch(u32 addr, u32 size) { sc_vm.Warning("Unimplemented function: sys_vm_touch(addr=0x%x,size=0x%x)", addr, size); @@ -176,7 +176,7 @@ int sys_vm_touch(u32 addr, u32 size) return CELL_OK; } -int sys_vm_flush(u32 addr, u32 size) +s32 sys_vm_flush(u32 addr, u32 size) { sc_vm.Warning("Unimplemented function: sys_vm_flush(addr=0x%x,size=0x%x)", addr, size); @@ -193,7 +193,7 @@ int sys_vm_flush(u32 addr, u32 size) return CELL_OK; } -int sys_vm_invalidate(u32 addr, u32 size) +s32 sys_vm_invalidate(u32 addr, u32 size) { sc_vm.Warning("Unimplemented function: sys_vm_invalidate(addr=0x%x,size=0x%x)", addr, size); @@ -210,7 +210,7 @@ int sys_vm_invalidate(u32 addr, u32 size) return CELL_OK; } -int sys_vm_store(u32 addr, u32 size) +s32 sys_vm_store(u32 addr, u32 size) { sc_vm.Warning("Unimplemented function: sys_vm_store(addr=0x%x,size=0x%x)", addr, size); @@ -227,7 +227,7 @@ int sys_vm_store(u32 addr, u32 size) return CELL_OK; } -int sys_vm_sync(u32 addr, u32 size) +s32 sys_vm_sync(u32 addr, u32 size) { sc_vm.Warning("Unimplemented function: sys_vm_sync(addr=0x%x,size=0x%x)", addr, size); @@ -243,7 +243,7 @@ int sys_vm_sync(u32 addr, u32 size) return CELL_OK; } -int sys_vm_test(u32 addr, u32 size, u32 result_addr) +s32 sys_vm_test(u32 addr, u32 size, u32 result_addr) { sc_vm.Warning("Unimplemented function: sys_vm_test(addr=0x%x,size=0x%x,result_addr=0x%x)", addr, size, result_addr); @@ -262,7 +262,7 @@ int sys_vm_test(u32 addr, u32 size, u32 result_addr) return CELL_OK; } -int sys_vm_get_statistics(u32 addr, u32 stat_addr) +s32 sys_vm_get_statistics(u32 addr, u32 stat_addr) { sc_vm.Warning("Unimplemented function: sys_vm_get_statistics(addr=0x%x,stat_addr=0x%x)", addr, stat_addr); diff --git a/rpcs3/Emu/SysCalls/lv2/sys_vm.h b/rpcs3/Emu/SysCalls/lv2/sys_vm.h new file mode 100644 index 0000000000..c4e7d74f36 --- /dev/null +++ b/rpcs3/Emu/SysCalls/lv2/sys_vm.h @@ -0,0 +1,31 @@ +#pragma pack + +#define SYS_VM_TEST_INVALID 0x0000ULL +#define SYS_VM_TEST_UNUSED 0x0001ULL +#define SYS_VM_TEST_ALLOCATED 0x0002ULL +#define SYS_VM_TEST_STORED 0x0004ULL + +struct sys_vm_statistics { + u64 vm_crash_ppu; + u64 vm_crash_spu; + u64 vm_read; + u64 vm_write; + u32 physical_mem_size; + u32 physical_mem_used; + u64 timestamp; +}; + +// SysCalls +s32 sys_vm_memory_map(u32 vsize, u32 psize, u32 cid, u64 flag, u64 policy, u32 addr); +s32 sys_vm_unmap(u32 addr); +s32 sys_vm_append_memory(u32 addr, u32 size); +s32 sys_vm_return_memory(u32 addr, u32 size); +s32 sys_vm_lock(u32 addr, u32 size); +s32 sys_vm_unlock(u32 addr, u32 size); +s32 sys_vm_touch(u32 addr, u32 size); +s32 sys_vm_flush(u32 addr, u32 size); +s32 sys_vm_invalidate(u32 addr, u32 size); +s32 sys_vm_store(u32 addr, u32 size); +s32 sys_vm_sync(u32 addr, u32 size); +s32 sys_vm_test(u32 addr, u32 size, u32 result_addr); +s32 sys_vm_get_statistics(u32 addr, u32 stat_addr); diff --git a/rpcs3/Emu/event.h b/rpcs3/Emu/event.h index cb0e0a77c1..235b924daf 100644 --- a/rpcs3/Emu/event.h +++ b/rpcs3/Emu/event.h @@ -1,5 +1,5 @@ #pragma once -#include "Emu/SysCalls/lv2/SC_Lwmutex.h" +#include "Emu/SysCalls/lv2/sys_lwmutex.h" #define FIX_SPUQ(x) ((u64)x | 0x5350555100000000ULL) // arbitrary code to prevent "special" zero value in key argument diff --git a/rpcs3/Gui/DisAsmFrame.cpp b/rpcs3/Gui/DisAsmFrame.cpp index 046faedc72..edc42b0741 100644 --- a/rpcs3/Gui/DisAsmFrame.cpp +++ b/rpcs3/Gui/DisAsmFrame.cpp @@ -2,8 +2,8 @@ #include "Utilities/Log.h" #include "Emu/Memory/Memory.h" #include "Emu/System.h" -#include "Emu/SysCalls/lv2/SC_Lwmutex.h" -#include "Emu/SysCalls/lv2/SC_Event_flag.h" +#include "Emu/SysCalls/lv2/sys_lwmutex.h" +#include "Emu/SysCalls/lv2/sys_event.h" #include "DisAsmFrame.h" #include "Emu/FS/vfsLocalFile.h" #include "Emu/Cell/PPCThread.h" diff --git a/rpcs3/Gui/InterpreterDisAsm.cpp b/rpcs3/Gui/InterpreterDisAsm.cpp index 170fe8a915..ee1ffdb535 100644 --- a/rpcs3/Gui/InterpreterDisAsm.cpp +++ b/rpcs3/Gui/InterpreterDisAsm.cpp @@ -3,8 +3,8 @@ #include "Emu/Memory/Memory.h" #include "Emu/System.h" #include "rpcs3.h" -#include "Emu/SysCalls/lv2/SC_Lwmutex.h" -#include "Emu/SysCalls/lv2/SC_Event_flag.h" +#include "Emu/SysCalls/lv2/sys_lwmutex.h" +#include "Emu/SysCalls/lv2/sys_event.h" #include "InterpreterDisAsm.h" #include "Emu/Cell/PPUDecoder.h" #include "Emu/Cell/PPUDisAsm.h" diff --git a/rpcs3/emucore.vcxproj b/rpcs3/emucore.vcxproj index 0e7ffa8e21..15ffbd0baa 100644 --- a/rpcs3/emucore.vcxproj +++ b/rpcs3/emucore.vcxproj @@ -92,33 +92,28 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + @@ -184,6 +179,9 @@ + + + @@ -318,22 +316,28 @@ - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + diff --git a/rpcs3/emucore.vcxproj.filters b/rpcs3/emucore.vcxproj.filters index 377aeab4d4..d791a5101e 100644 --- a/rpcs3/emucore.vcxproj.filters +++ b/rpcs3/emucore.vcxproj.filters @@ -128,81 +128,6 @@ Emu\SysCalls - - Emu\SysCalls\lv2 - - - Emu\SysCalls\lv2 - - - Emu\SysCalls\lv2 - - - Emu\SysCalls\lv2 - - - Emu\SysCalls\lv2 - - - Emu\SysCalls\lv2 - - - Emu\SysCalls\lv2 - - - Emu\SysCalls\lv2 - - - Emu\SysCalls\lv2 - - - Emu\SysCalls\lv2 - - - Emu\SysCalls\lv2 - - - Emu\SysCalls\lv2 - - - Emu\SysCalls\lv2 - - - Emu\SysCalls\lv2 - - - Emu\SysCalls\lv2 - - - Emu\SysCalls\lv2 - - - Emu\SysCalls\lv2 - - - Emu\SysCalls\lv2 - - - Emu\SysCalls\lv2 - - - Emu\SysCalls\lv2 - - - Emu\SysCalls\lv2 - - - Emu\SysCalls\lv2 - - - Emu\SysCalls\lv2 - - - Emu\SysCalls\lv2 - - - Emu\SysCalls\lv2 - Emu\SysCalls\Modules @@ -578,10 +503,79 @@ Utilities - + Emu\SysCalls\lv2 - + + Emu\SysCalls\lv2 + + + Emu\SysCalls\lv2 + + + Emu\SysCalls\lv2 + + + Emu\SysCalls\lv2 + + + Emu\SysCalls\lv2 + + + Emu\SysCalls\lv2 + + + Emu\SysCalls\lv2 + + + Emu\SysCalls\lv2 + + + Emu\SysCalls\lv2 + + + Emu\SysCalls\lv2 + + + Emu\SysCalls\lv2 + + + Emu\SysCalls\lv2 + + + Emu\SysCalls\lv2 + + + Emu\SysCalls\lv2 + + + Emu\SysCalls\lv2 + + + Emu\SysCalls\lv2 + + + Emu\SysCalls\lv2 + + + Emu\SysCalls\lv2 + + + Emu\SysCalls\lv2 + + + Emu\SysCalls\lv2 + + + Emu\SysCalls\Modules + + + Emu\SysCalls\Modules + + + Emu\SysCalls\Modules + + Emu\SysCalls\lv2 @@ -637,42 +631,6 @@ Emu\SysCalls - - Emu\SysCalls\lv2 - - - Emu\SysCalls\lv2 - - - Emu\SysCalls\lv2 - - - Emu\SysCalls\lv2 - - - Emu\SysCalls\lv2 - - - Emu\SysCalls\lv2 - - - Emu\SysCalls\lv2 - - - Emu\SysCalls\lv2 - - - Emu\SysCalls\lv2 - - - Emu\SysCalls\lv2 - - - Emu\SysCalls\lv2 - - - Emu\SysCalls\lv2 - Emu\SysCalls\Modules @@ -1057,16 +1015,70 @@ Utilities - + Emu\SysCalls\lv2 - + Emu\SysCalls\lv2 - + Emu\SysCalls\lv2 - + + Emu\SysCalls\lv2 + + + Emu\SysCalls\lv2 + + + Emu\SysCalls\lv2 + + + Emu\SysCalls\lv2 + + + Emu\SysCalls\lv2 + + + Emu\SysCalls\lv2 + + + Emu\SysCalls\lv2 + + + Emu\SysCalls\lv2 + + + Emu\SysCalls\lv2 + + + Emu\SysCalls\lv2 + + + Emu\SysCalls\lv2 + + + Emu\SysCalls\lv2 + + + Emu\SysCalls\lv2 + + + Emu\SysCalls\lv2 + + + Emu\SysCalls\lv2 + + + Emu\SysCalls\lv2 + + + Emu\SysCalls\lv2 + + + Emu\SysCalls\lv2 + + Emu\SysCalls\lv2 From 0002cc0af3daaf36316dbaba1ea50cb730b5d4d2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexandro=20S=C3=A1nchez=20Bach?= Date: Sun, 6 Jul 2014 01:30:28 +0200 Subject: [PATCH 2/3] Removed old / unnecessary code * Removed Plugins.h file as I assume setting up a plugin hell is a bad idea (does anyone disagree?). * Removed FnIdGenerator, and moved FnIdGenerator::GenerateFnId to getFunctionId in Modules.cpp * Disabled RSX Debugger and Memory Viewer when the emulator is stopped. * ELF64Loader::LoadPhdrData refactored. --- rpcs3/Emu/SysCalls/Modules.cpp | 11 +- rpcs3/Emu/SysCalls/Modules.h | 13 +- rpcs3/Emu/SysCalls/SysCalls.h | 2 - rpcs3/Emu/SysCalls/lv2/sys_lwcond.cpp | 1 - rpcs3/Emu/SysCalls/lv2/sys_lwmutex.cpp | 1 - rpcs3/Emu/SysCalls/lv2/sys_memory.cpp | 1 - rpcs3/Emu/SysCalls/lv2/sys_mmapper.cpp | 1 + rpcs3/Emu/SysCalls/lv2/sys_mutex.cpp | 1 - rpcs3/Emu/SysCalls/lv2/sys_rwlock.cpp | 2 +- rpcs3/Emu/SysCalls/lv2/sys_semaphore.cpp | 1 + rpcs3/Emu/SysCalls/lv2/sys_timer.cpp | 2 +- rpcs3/Emu/SysCalls/lv2/sys_trace.cpp | 1 + rpcs3/Emu/SysCalls/lv2/sys_tty.cpp | 1 + rpcs3/Emu/System.cpp | 1 - rpcs3/Gui/FnIdGenerator.cpp | 102 ------- rpcs3/Gui/FnIdGenerator.h | 23 -- rpcs3/Gui/MainFrame.cpp | 32 +- rpcs3/Gui/Plugins.h | 362 ----------------------- rpcs3/Loader/ELF64.cpp | 237 +++++++-------- rpcs3/Loader/Loader.h | 64 ++-- rpcs3/emucore.vcxproj | 4 +- rpcs3/rpcs3.vcxproj | 2 - rpcs3/rpcs3.vcxproj.filters | 6 - 23 files changed, 175 insertions(+), 696 deletions(-) delete mode 100644 rpcs3/Gui/FnIdGenerator.cpp delete mode 100644 rpcs3/Gui/FnIdGenerator.h delete mode 100644 rpcs3/Gui/Plugins.h diff --git a/rpcs3/Emu/SysCalls/Modules.cpp b/rpcs3/Emu/SysCalls/Modules.cpp index 20a5669c5d..ecbdb085de 100644 --- a/rpcs3/Emu/SysCalls/Modules.cpp +++ b/rpcs3/Emu/SysCalls/Modules.cpp @@ -5,12 +5,20 @@ #include "Emu/Cell/PPUThread.h" #include "Emu/SysCalls/SC_FUNC.h" #include "Emu/SysCalls/Modules.h" +#include "Crypto/sha1.h" #include #include "Emu/System.h" #include "ModuleManager.h" +u32 getFunctionId(const std::string& name) +{ + const char* suffix = "\x67\x59\x65\x99\x04\x25\x04\x90\x56\x64\x27\x49\x94\x89\x74\x1A"; // Symbol name suffix + std::string input = name + suffix; + unsigned char output[20]; - + sha1((unsigned char*)input.c_str(), input.length(), output); // Compute SHA-1 hash + return (u32&)output[0]; +} Module::Module(u16 id, const char* name) : m_is_loaded(false) @@ -217,4 +225,3 @@ bool Module::CheckID(u32 id, ID*& _id) const { return Emu.GetIdManager().CheckID(id) && (_id = &Emu.GetIdManager().GetID(id))->m_name == GetName(); } - diff --git a/rpcs3/Emu/SysCalls/Modules.h b/rpcs3/Emu/SysCalls/Modules.h index a558246faf..ee55d8de93 100644 --- a/rpcs3/Emu/SysCalls/Modules.h +++ b/rpcs3/Emu/SysCalls/Modules.h @@ -2,7 +2,6 @@ #define declCPU PPUThread& CPU = GetCurrentPPUThread - //TODO struct ModuleFunc { @@ -120,16 +119,24 @@ public: } template __forceinline void AddFunc(u32 id, T func); - + template __forceinline void AddFunc(const std::string& name, T func); template __forceinline void AddFuncSub(const char group[8], const u64 ops[], const char* name, T func); }; +u32 getFunctionId(const std::string& name); + template __forceinline void Module::AddFunc(u32 id, T func) { m_funcs_list.emplace_back(new ModuleFunc(id, bind_func(func))); } +template +__forceinline void Module::AddFunc(const std::string& name, T func) +{ + AddFunc(getFunctionId(name), func); +} + template __forceinline void Module::AddFuncSub(const char group[8], const u64 ops[], const char* name, T func) { @@ -144,7 +151,6 @@ __forceinline void Module::AddFuncSub(const char group[8], const u64 ops[], cons sf->found = 0; // TODO: check for self-inclusions, use CRC - for (u32 i = 0; ops[i]; i++) { SFuncOp op; @@ -157,4 +163,3 @@ __forceinline void Module::AddFuncSub(const char group[8], const u64 ops[], cons } Emu.GetSFuncManager().push_back(sf); } - diff --git a/rpcs3/Emu/SysCalls/SysCalls.h b/rpcs3/Emu/SysCalls/SysCalls.h index 2454724db8..759078de8d 100644 --- a/rpcs3/Emu/SysCalls/SysCalls.h +++ b/rpcs3/Emu/SysCalls/SysCalls.h @@ -179,8 +179,6 @@ public: static std::string GetHLEFuncName(const u32 fid); }; -//extern SysCalls SysCallsManager; - #define REG_SUB(module, group, name, ...) \ static const u64 name ## _table[] = {__VA_ARGS__ , 0}; \ module->AddFuncSub(group, name ## _table, #name, name) diff --git a/rpcs3/Emu/SysCalls/lv2/sys_lwcond.cpp b/rpcs3/Emu/SysCalls/lv2/sys_lwcond.cpp index b4778707da..7bc6377c62 100644 --- a/rpcs3/Emu/SysCalls/lv2/sys_lwcond.cpp +++ b/rpcs3/Emu/SysCalls/lv2/sys_lwcond.cpp @@ -22,7 +22,6 @@ s32 sys_lwcond_create(mem_ptr_t lwcond, mem_ptr_t l u32 id = sys_lwcond.GetNewId(new Lwcond(attr->name_u64)); lwcond->lwmutex = lwmutex.GetAddr(); lwcond->lwcond_queue = id; - procObjects.lwcond_objects.insert(id); if (lwmutex.IsGood()) { diff --git a/rpcs3/Emu/SysCalls/lv2/sys_lwmutex.cpp b/rpcs3/Emu/SysCalls/lv2/sys_lwmutex.cpp index e33893ce81..1708e2770a 100644 --- a/rpcs3/Emu/SysCalls/lv2/sys_lwmutex.cpp +++ b/rpcs3/Emu/SysCalls/lv2/sys_lwmutex.cpp @@ -40,7 +40,6 @@ s32 sys_lwmutex_create(mem_ptr_t lwmutex, mem_ptr_tname_u64)); lwmutex->sleep_queue = sq_id; - procObjects.lwmutex_objects.insert(sq_id); sc_lwmutex.Warning("*** lwmutex created [%s] (attribute=0x%x): sq_id = %d", std::string(attr->name, 8).c_str(), (u32) lwmutex->attribute, sq_id); diff --git a/rpcs3/Emu/SysCalls/lv2/sys_memory.cpp b/rpcs3/Emu/SysCalls/lv2/sys_memory.cpp index 480f0c5d7d..9815223f86 100644 --- a/rpcs3/Emu/SysCalls/lv2/sys_memory.cpp +++ b/rpcs3/Emu/SysCalls/lv2/sys_memory.cpp @@ -129,7 +129,6 @@ s32 sys_memory_container_create(mem32_t cid, u32 yield_size) // Wrap the allocated memory in a memory container. MemoryContainerInfo *ct = new MemoryContainerInfo(addr, yield_size); cid = sc_mem.GetNewId(ct); - procObjects.mem_objects.insert(cid); sc_mem.Warning("*** memory_container created(addr=0x%llx): id = %d", addr, cid.GetValue()); diff --git a/rpcs3/Emu/SysCalls/lv2/sys_mmapper.cpp b/rpcs3/Emu/SysCalls/lv2/sys_mmapper.cpp index edd1226fc7..1660ce5b3d 100644 --- a/rpcs3/Emu/SysCalls/lv2/sys_mmapper.cpp +++ b/rpcs3/Emu/SysCalls/lv2/sys_mmapper.cpp @@ -3,6 +3,7 @@ #include "Emu/Memory/Memory.h" #include "Emu/System.h" #include "Emu/SysCalls/SysCalls.h" +#include "sys_memory.h" #include "sys_mmapper.h" #include diff --git a/rpcs3/Emu/SysCalls/lv2/sys_mutex.cpp b/rpcs3/Emu/SysCalls/lv2/sys_mutex.cpp index 524dea7ef6..ab5b870efc 100644 --- a/rpcs3/Emu/SysCalls/lv2/sys_mutex.cpp +++ b/rpcs3/Emu/SysCalls/lv2/sys_mutex.cpp @@ -44,7 +44,6 @@ s32 sys_mutex_create(mem32_t mutex_id, mem_ptr_t attr) u32 tid = GetCurrentPPUThread().GetId(); Mutex* mutex = new Mutex((u32)attr->protocol, is_recursive, attr->name_u64); u32 id = sys_mtx.GetNewId(mutex); - procObjects.mutex_objects.insert(id); mutex->m_mutex.lock(tid); mutex->id = id; mutex_id = id; diff --git a/rpcs3/Emu/SysCalls/lv2/sys_rwlock.cpp b/rpcs3/Emu/SysCalls/lv2/sys_rwlock.cpp index 3db2e9c6e7..2ad0524cee 100644 --- a/rpcs3/Emu/SysCalls/lv2/sys_rwlock.cpp +++ b/rpcs3/Emu/SysCalls/lv2/sys_rwlock.cpp @@ -3,8 +3,8 @@ #include "Emu/Memory/Memory.h" #include "Emu/System.h" #include "Emu/Cell/PPUThread.h" -#include "sys_rwlock.h" #include "Emu/SysCalls/SysCalls.h" +#include "sys_rwlock.h" SysCallBase sys_rwlock("sys_rwlock"); diff --git a/rpcs3/Emu/SysCalls/lv2/sys_semaphore.cpp b/rpcs3/Emu/SysCalls/lv2/sys_semaphore.cpp index 66be62ee2c..08f3c73915 100644 --- a/rpcs3/Emu/SysCalls/lv2/sys_semaphore.cpp +++ b/rpcs3/Emu/SysCalls/lv2/sys_semaphore.cpp @@ -4,6 +4,7 @@ #include "Emu/System.h" #include "Emu/SysCalls/SysCalls.h" #include "sys_semaphore.h" +#include "sys_time.h" SysCallBase sys_sem("sys_semaphore"); diff --git a/rpcs3/Emu/SysCalls/lv2/sys_timer.cpp b/rpcs3/Emu/SysCalls/lv2/sys_timer.cpp index e7fbc7f63b..cb94b404e6 100644 --- a/rpcs3/Emu/SysCalls/lv2/sys_timer.cpp +++ b/rpcs3/Emu/SysCalls/lv2/sys_timer.cpp @@ -2,9 +2,9 @@ #include "Utilities/Log.h" #include "Emu/Memory/Memory.h" #include "Emu/System.h" -#include "sys_timer.h" #include "Emu/SysCalls/SysCalls.h" #include "Emu/event.h" +#include "sys_timer.h" SysCallBase sys_timer("sys_timer"); diff --git a/rpcs3/Emu/SysCalls/lv2/sys_trace.cpp b/rpcs3/Emu/SysCalls/lv2/sys_trace.cpp index 776d34f779..6df868f1aa 100644 --- a/rpcs3/Emu/SysCalls/lv2/sys_trace.cpp +++ b/rpcs3/Emu/SysCalls/lv2/sys_trace.cpp @@ -3,6 +3,7 @@ #include "Emu/Memory/Memory.h" #include "Emu/System.h" #include "Emu/SysCalls/SysCalls.h" +#include "sys_trace.h" SysCallBase sys_trace("sys_trace"); diff --git a/rpcs3/Emu/SysCalls/lv2/sys_tty.cpp b/rpcs3/Emu/SysCalls/lv2/sys_tty.cpp index 0ecf0f3b5a..de64701a6d 100644 --- a/rpcs3/Emu/SysCalls/lv2/sys_tty.cpp +++ b/rpcs3/Emu/SysCalls/lv2/sys_tty.cpp @@ -3,6 +3,7 @@ #include "Emu/Memory/Memory.h" #include "Emu/System.h" #include "Emu/SysCalls/SysCalls.h" +#include "sys_tty.h" s32 sys_tty_read(u32 ch, u64 buf_addr, u32 len, u64 preadlen_addr) { diff --git a/rpcs3/Emu/System.cpp b/rpcs3/Emu/System.cpp index 857b172e86..54254c4f62 100644 --- a/rpcs3/Emu/System.cpp +++ b/rpcs3/Emu/System.cpp @@ -407,7 +407,6 @@ void Emulator::Stop() GetAudioManager().Close(); GetEventManager().Clear(); GetCPU().Close(); - //SysCallsManager.Close(); GetIdManager().Clear(); GetPadManager().Close(); GetKeyboardManager().Close(); diff --git a/rpcs3/Gui/FnIdGenerator.cpp b/rpcs3/Gui/FnIdGenerator.cpp deleted file mode 100644 index 100e0b8e50..0000000000 --- a/rpcs3/Gui/FnIdGenerator.cpp +++ /dev/null @@ -1,102 +0,0 @@ -#include "stdafx.h" -#include "Utilities/Log.h" -#include "Emu/Memory/Memory.h" -#include "FnIdGenerator.h" - -FnIdGenerator::FnIdGenerator(wxWindow* parent) - : wxDialog(parent, wxID_ANY, "FunctionID Generator") - , m_list(nullptr) -{ - wxBoxSizer* s_panel = new wxBoxSizer(wxHORIZONTAL); - wxBoxSizer* s_subpanel = new wxBoxSizer(wxVERTICAL); - wxBoxSizer* s_subpanel2 = new wxBoxSizer(wxHORIZONTAL); - - m_list = new wxListView(this, wxID_ANY, wxDefaultPosition, wxSize(300, 450)); - m_list->InsertColumn(0, "Function Name", 0, 200); - m_list->InsertColumn(1, "Function ID", 0, 100); - - wxButton *b_input_name = new wxButton(this, wxID_ANY, "Input Function Name", wxDefaultPosition, wxSize(140, -1)); - b_input_name->Bind(wxEVT_BUTTON, &FnIdGenerator::OnInput, this); - - wxButton *b_clear = new wxButton(this, wxID_ANY, "Clear List", wxDefaultPosition, wxSize(140, -1)); - b_clear->Bind(wxEVT_BUTTON, &FnIdGenerator::OnClear, this); - - s_subpanel2->Add(b_input_name); - s_subpanel2->AddSpacer(10); - s_subpanel2->Add(b_clear); - - s_subpanel->AddSpacer(5); - s_subpanel->Add(m_list); - s_subpanel->AddSpacer(5); - s_subpanel->Add(s_subpanel2); - - s_panel->AddSpacer(5); - s_panel->Add(s_subpanel); - s_panel->AddSpacer(5); - - SetSizerAndFit(s_panel); -} - -FnIdGenerator::~FnIdGenerator() -{ - delete m_list; - m_list = nullptr; -} - -void FnIdGenerator::OnInput(wxCommandEvent &event) -{ - PrintId(); - event.Skip(); -} - -void FnIdGenerator::OnClear(wxCommandEvent &event) -{ - m_list->DeleteAllItems(); - m_func_name.clear(); - m_func_id.clear(); - event.Skip(); -} - -u32 FnIdGenerator::GenerateFnId(const std::string& func_name) -{ - static const char* suffix = "\x67\x59\x65\x99\x04\x25\x04\x90\x56\x64\x27\x49\x94\x89\x74\x1A"; //symbol name suffix - std::string input = func_name + suffix; - unsigned char output[20]; - - sha1((unsigned char*)input.c_str(), input.length(), output); //compute SHA-1 hash - - return (be_t&) output[0]; -} - -void FnIdGenerator::PrintId() -{ - TextInputDialog dial(0, "", "Please input function name"); - if (dial.ShowModal() == wxID_OK) - { - const std::string& func_name = dial.GetResult(); - - if (func_name.length() == 0) - return; - - const be_t result = GenerateFnId(func_name); - m_func_name.push_back(func_name); - m_func_id.push_back(result); - - LOG_NOTICE(HLE, "Function: %s, Id: 0x%08x ", func_name.c_str(), result); - UpdateInformation(); - } - - return; -} - -void FnIdGenerator::UpdateInformation() -{ - m_list->DeleteAllItems(); - - for(u32 i = 0; i < m_func_name.size(); i++) - { - m_list->InsertItem(m_func_name.size(), wxEmptyString); - m_list->SetItem(i, 0, m_func_name[i]); - m_list->SetItem(i, 1, wxString::Format("0x%08x", re(m_func_id[i]))); - } -} diff --git a/rpcs3/Gui/FnIdGenerator.h b/rpcs3/Gui/FnIdGenerator.h deleted file mode 100644 index c2fd448510..0000000000 --- a/rpcs3/Gui/FnIdGenerator.h +++ /dev/null @@ -1,23 +0,0 @@ -#pragma once - -#include "TextInputDialog.h" -#include "../Crypto/aes.h" -#include "../Crypto/sha1.h" - -class FnIdGenerator : public wxDialog -{ -private: - std::vector m_func_name; - std::vector m_func_id; - wxListView* m_list; - -public: - FnIdGenerator(wxWindow* parent); - ~FnIdGenerator(); - - void OnInput(wxCommandEvent &event); - void OnClear(wxCommandEvent &event); - u32 GenerateFnId(const std::string& func_name); - void UpdateInformation(); - void PrintId(); -}; \ No newline at end of file diff --git a/rpcs3/Gui/MainFrame.cpp b/rpcs3/Gui/MainFrame.cpp index 648c61838e..20c6a55274 100644 --- a/rpcs3/Gui/MainFrame.cpp +++ b/rpcs3/Gui/MainFrame.cpp @@ -9,7 +9,6 @@ #include "MemoryViewer.h" #include "RSXDebugger.h" #include "PADManager.h" -#include "FnIdGenerator.h" #include "git-version.h" #include "Ini.h" @@ -96,9 +95,8 @@ MainFrame::MainFrame() wxMenu* menu_tools = new wxMenu(); menubar->Append(menu_tools, "Tools"); menu_tools->Append(id_tools_compiler, "ELF Compiler"); - menu_tools->Append(id_tools_memory_viewer, "Memory Viewer"); - menu_tools->Append(id_tools_rsx_debugger, "RSX Debugger"); - menu_tools->Append(id_tools_fnid_generator, "FunctionID Generator"); + menu_tools->Append(id_tools_memory_viewer, "Memory Viewer")->Enable(false); + menu_tools->Append(id_tools_rsx_debugger, "RSX Debugger")->Enable(false); wxMenu* menu_help = new wxMenu(); menubar->Append(menu_help, "Help"); @@ -134,7 +132,6 @@ MainFrame::MainFrame() Bind(wxEVT_MENU, &MainFrame::OpenELFCompiler, this, id_tools_compiler); Bind(wxEVT_MENU, &MainFrame::OpenMemoryViewer, this, id_tools_memory_viewer); Bind(wxEVT_MENU, &MainFrame::OpenRSXDebugger, this, id_tools_rsx_debugger); - Bind(wxEVT_MENU, &MainFrame::OpenFnIdGenerator, this, id_tools_fnid_generator); Bind(wxEVT_MENU, &MainFrame::AboutDialogHandler, this, id_help_about); @@ -656,11 +653,6 @@ void MainFrame::OpenRSXDebugger(wxCommandEvent& WXUNUSED(event)) (new RSXDebugger(this)) -> Show(); } -void MainFrame::OpenFnIdGenerator(wxCommandEvent& WXUNUSED(event)) -{ - FnIdGenerator(this).ShowModal(); -} - void MainFrame::AboutDialogHandler(wxCommandEvent& WXUNUSED(event)) { @@ -729,21 +721,31 @@ void MainFrame::UpdateUI(wxCommandEvent& event) is_ready = Emu.IsReady(); } + // Update menu items based on the state of the emulator wxMenuBar& menubar( *GetMenuBar() ); + + // Emulation wxMenuItem& pause = *menubar.FindItem( id_sys_pause ); wxMenuItem& stop = *menubar.FindItem( id_sys_stop ); - wxMenuItem& send_exit = *menubar.FindItem( id_sys_send_exit ); - wxMenuItem& send_open_menu = *menubar.FindItem( id_sys_send_open_menu ); - pause.SetItemLabel(is_running ? "Pause\tCtrl + P" : is_ready ? "Start\tCtrl + C" : "Resume\tCtrl + C"); + pause.SetItemLabel(is_running ? "Pause\tCtrl + P" : is_ready ? "Start\tCtrl + E" : "Resume\tCtrl + E"); pause.Enable(!is_stopped); stop.Enable(!is_stopped); - //send_exit.Enable(false); - bool enable_commands = !is_stopped && Emu.GetCallbackManager().m_exit_callback.m_callbacks.size(); + // PS3 Commands + wxMenuItem& send_exit = *menubar.FindItem( id_sys_send_exit ); + wxMenuItem& send_open_menu = *menubar.FindItem( id_sys_send_open_menu ); + bool enable_commands = !is_stopped && Emu.GetCallbackManager().m_exit_callback.m_callbacks.size(); send_open_menu.SetItemLabel(wxString::Format("Send %s system menu cmd", (m_sys_menu_opened ? "close" : "open"))); send_open_menu.Enable(enable_commands); send_exit.Enable(enable_commands); + // Tools + wxMenuItem& memory_viewer = *menubar.FindItem( id_tools_memory_viewer ); + wxMenuItem& rsx_debugger = *menubar.FindItem( id_tools_rsx_debugger); + memory_viewer.Enable(!is_stopped); + rsx_debugger.Enable(!is_stopped); + + //m_aui_mgr.Update(); //wxCommandEvent refit( wxEVT_COMMAND_MENU_SELECTED, id_update_dbg ); diff --git a/rpcs3/Gui/Plugins.h b/rpcs3/Gui/Plugins.h deleted file mode 100644 index d3e10c8728..0000000000 --- a/rpcs3/Gui/Plugins.h +++ /dev/null @@ -1,362 +0,0 @@ -#pragma once - -#define LOAD_SYMBOL(x) if(m_dll.HasSymbol(#x)) x = (_##x)m_dll.GetSymbol(#x) -struct Ps3EmuPlugin -{ - enum PS3EMULIB_TYPE - { - LIB_PAD = (1 << 0), - LIB_KB = (1 << 1), - LIB_MOUSE = (1 << 2), - LIB_FS = (1 << 3), - }; - - typedef u32 (*_Ps3EmuLibGetType)(); - typedef u32 (*_Ps3EmuLibGetVersion)(); - typedef const char* (*_Ps3EmuLibGetName)(); - typedef const char* (*_Ps3EmuLibGetFullName)(); - typedef void (*_Ps3EmuLibSetSettingsPath)(const char* path); - typedef void (*_Ps3EmuLibSetLogPath)(const char* path); - typedef const char* (*_Ps3EmuLibGetSettingsName)(); - typedef const char* (*_Ps3EmuLibGetLogName)(); - typedef void (*_Ps3EmuLibConfigure)(PS3EMULIB_TYPE type); - typedef void (*_Ps3EmuLibAbout)(); - typedef u32 (*_Ps3EmuLibTest)(PS3EMULIB_TYPE type); - - _Ps3EmuLibGetType Ps3EmuLibGetType; - _Ps3EmuLibGetVersion Ps3EmuLibGetVersion; - _Ps3EmuLibGetName Ps3EmuLibGetName; - _Ps3EmuLibGetFullName Ps3EmuLibGetFullName; - _Ps3EmuLibSetSettingsPath Ps3EmuLibSetSettingsPath; - _Ps3EmuLibSetLogPath Ps3EmuLibSetLogPath; - _Ps3EmuLibGetSettingsName Ps3EmuLibGetSettingsName; - _Ps3EmuLibGetLogName Ps3EmuLibGetLogName; - _Ps3EmuLibConfigure Ps3EmuLibConfigure; - _Ps3EmuLibAbout Ps3EmuLibAbout; - _Ps3EmuLibTest Ps3EmuLibTest; - - wxDynamicLibrary m_dll; - - Ps3EmuPlugin() - { - Reset(); - } - - Ps3EmuPlugin(const wxString& path) - { - Load(path); - } - - virtual ~Ps3EmuPlugin() throw() - { - Unload(); - } - - wxString FormatVersion() - { - if(!Ps3EmuLibGetVersion) return wxEmptyString; - - const u32 v = Ps3EmuLibGetVersion(); - - const u8 v0 = v >> 24; - const u8 v1 = v >> 16; - const u8 v2 = v >> 8; - const u8 v3 = v; - - if(!v2 && !v3) return wxString::Format("%d.%d", v0, v1); - if(!v3) return wxString::Format("%d.%d.%d", v0, v1, v2); - - return wxString::Format("%d.%d.%d.%d", v0, v1, v2, v3); - } - - void Load(const wxString& path) - { - if(m_dll.Load(path)) - { - Init(); - } - else - { - Reset(); - } - } - - void Unload() - { - Reset(); - - if(m_dll.IsLoaded()) m_dll.Unload(); - } - - virtual bool Test() - { - return - m_dll.IsLoaded() && - Ps3EmuLibGetType && - Ps3EmuLibGetVersion && - Ps3EmuLibGetName && - Ps3EmuLibGetFullName && - Ps3EmuLibSetSettingsPath && - Ps3EmuLibSetLogPath && - Ps3EmuLibGetSettingsName && - Ps3EmuLibGetLogName && - Ps3EmuLibConfigure && - Ps3EmuLibAbout && - Ps3EmuLibTest; - } - -protected: - virtual void Init() - { - LOAD_SYMBOL(Ps3EmuLibGetType); - LOAD_SYMBOL(Ps3EmuLibGetVersion); - LOAD_SYMBOL(Ps3EmuLibGetName); - LOAD_SYMBOL(Ps3EmuLibGetFullName); - LOAD_SYMBOL(Ps3EmuLibSetSettingsPath); - LOAD_SYMBOL(Ps3EmuLibSetLogPath); - LOAD_SYMBOL(Ps3EmuLibGetSettingsName); - LOAD_SYMBOL(Ps3EmuLibGetLogName); - LOAD_SYMBOL(Ps3EmuLibConfigure); - LOAD_SYMBOL(Ps3EmuLibAbout); - LOAD_SYMBOL(Ps3EmuLibTest); - } - - virtual void Reset() - { - Ps3EmuLibGetType = nullptr; - Ps3EmuLibGetVersion = nullptr; - Ps3EmuLibGetName = nullptr; - Ps3EmuLibGetFullName = nullptr; - Ps3EmuLibSetSettingsPath = nullptr; - Ps3EmuLibSetLogPath = nullptr; - Ps3EmuLibGetSettingsName = nullptr; - Ps3EmuLibGetLogName = nullptr; - Ps3EmuLibConfigure = nullptr; - Ps3EmuLibAbout = nullptr; - Ps3EmuLibTest = nullptr; - } -}; - -struct Ps3EmuPluginPAD : public Ps3EmuPlugin -{ - typedef int (*_PadInit)(u32 max_connect); - typedef int (*_PadEnd)(); - typedef int (*_PadClearBuf)(u32 port_no); - typedef int (*_PadGetData)(u32 port_no, void* data); - typedef int (*_PadGetDataExtra)(u32 port_no, u32* device_type, void* data); - typedef int (*_PadSetActDirect)(u32 port_no, void* param); - typedef int (*_PadGetInfo)(void* info); - typedef int (*_PadGetInfo2)(void* info); - typedef int (*_PadSetPortSetting)(u32 port_no, u32 port_setting); - typedef int (*_PadLddRegisterController)(); - typedef int (*_PadLddUnregisterController)(int handle); - typedef int (*_PadLddDataInsert)(int handle, void* data); - typedef int (*_PadLddGetPortNo)(int handle); - typedef int (*_PadPeriphGetInfo)(void* info); - typedef int (*_PadPeriphGetData)(u32 port_no, void* data); - typedef int (*_PadInfoPressMode)(u32 port_no); - typedef int (*_PadSetPressMode)(u32 port_no, u8 mode); - typedef int (*_PadInfoSensorMode)(u32 port_no); - typedef int (*_PadSetSensorMode)(u32 port_no, u8 mode); - typedef int (*_PadGetRawData)(u32 port_no, void* data); - typedef int (*_PadDbgLddRegisterController)(u32 device_capability); - typedef int (*_PadDbgLddSetDataInsertMode)(int handle, u8 mode); - typedef int (*_PadDbgPeriphRegisterDevice)(u16 vid, u16 pid, u32 pclass_type, u32 pclass_profile, void* mapping); - typedef int (*_PadDbgGetData)(u32 port_no, void* data); - - _PadInit PadInit; - _PadEnd PadEnd; - _PadClearBuf PadClearBuf; - _PadGetData PadGetData; - _PadGetDataExtra PadGetDataExtra; - _PadSetActDirect PadSetActDirect; - _PadGetInfo PadGetInfo; - _PadGetInfo2 PadGetInfo2; - _PadSetPortSetting PadSetPortSetting; - _PadLddRegisterController PadLddRegisterController; - _PadLddUnregisterController PadLddUnregisterController; - _PadLddDataInsert PadLddDataInsert; - _PadLddGetPortNo PadLddGetPortNo; - _PadPeriphGetInfo PadPeriphGetInfo; - _PadPeriphGetData PadPeriphGetData; - _PadInfoPressMode PadInfoPressMode; - _PadSetPressMode PadSetPressMode; - _PadInfoSensorMode PadInfoSensorMode; - _PadSetSensorMode PadSetSensorMode; - _PadGetRawData PadGetRawData; - _PadDbgLddRegisterController PadDbgLddRegisterController; - _PadDbgLddSetDataInsertMode PadDbgLddSetDataInsertMode; - _PadDbgPeriphRegisterDevice PadDbgPeriphRegisterDevice; - _PadDbgGetData PadDbgGetData; - - Ps3EmuPluginPAD() - { - Reset(); - } - - Ps3EmuPluginPAD(const wxString& path) - { - Load(path); - } - - virtual bool Test() - { - return Ps3EmuPlugin::Test() && - PadInit && - PadEnd && - PadClearBuf && - PadGetData && - PadGetDataExtra && - PadSetActDirect && - PadGetInfo && - PadGetInfo2 && - PadSetPortSetting && - PadLddRegisterController && - PadLddUnregisterController && - PadLddDataInsert && - PadLddGetPortNo && - PadPeriphGetInfo && - PadPeriphGetData && - PadInfoPressMode && - PadSetPressMode && - PadInfoSensorMode && - PadSetSensorMode && - PadGetRawData && - PadDbgLddRegisterController && - PadDbgLddSetDataInsertMode && - PadDbgPeriphRegisterDevice && - PadDbgGetData; - } - -protected: - virtual void Init() - { - LOAD_SYMBOL(PadInit); - LOAD_SYMBOL(PadEnd); - LOAD_SYMBOL(PadClearBuf); - LOAD_SYMBOL(PadGetData); - LOAD_SYMBOL(PadGetDataExtra); - LOAD_SYMBOL(PadSetActDirect); - LOAD_SYMBOL(PadGetInfo); - LOAD_SYMBOL(PadGetInfo2); - LOAD_SYMBOL(PadSetPortSetting); - LOAD_SYMBOL(PadLddRegisterController); - LOAD_SYMBOL(PadLddUnregisterController); - LOAD_SYMBOL(PadLddDataInsert); - LOAD_SYMBOL(PadLddGetPortNo); - LOAD_SYMBOL(PadPeriphGetInfo); - LOAD_SYMBOL(PadPeriphGetData); - LOAD_SYMBOL(PadInfoPressMode); - LOAD_SYMBOL(PadSetPressMode); - LOAD_SYMBOL(PadInfoSensorMode); - LOAD_SYMBOL(PadSetSensorMode); - LOAD_SYMBOL(PadGetRawData); - LOAD_SYMBOL(PadDbgLddRegisterController); - LOAD_SYMBOL(PadDbgLddSetDataInsertMode); - LOAD_SYMBOL(PadDbgPeriphRegisterDevice); - LOAD_SYMBOL(PadDbgGetData); - - Ps3EmuPlugin::Init(); - } - - virtual void Reset() - { - PadInit = nullptr; - PadEnd = nullptr; - PadClearBuf = nullptr; - PadGetData = nullptr; - PadGetDataExtra = nullptr; - PadSetActDirect = nullptr; - PadGetInfo = nullptr; - PadGetInfo2 = nullptr; - PadSetPortSetting = nullptr; - PadLddRegisterController = nullptr; - PadLddUnregisterController = nullptr; - PadLddDataInsert = nullptr; - PadLddGetPortNo = nullptr; - PadPeriphGetInfo = nullptr; - PadPeriphGetData = nullptr; - PadInfoPressMode = nullptr; - PadSetPressMode = nullptr; - PadInfoSensorMode = nullptr; - PadSetSensorMode = nullptr; - PadGetRawData = nullptr; - PadDbgLddRegisterController = nullptr; - PadDbgLddSetDataInsertMode = nullptr; - PadDbgPeriphRegisterDevice = nullptr; - PadDbgGetData = nullptr; - - Ps3EmuPlugin::Reset(); - } -}; - -struct PluginsManager -{ - struct PluginInfo - { - wxString path; - wxString name; - u32 type; - }; - - std::vector m_plugins; - std::vector m_pad_plugins; - - void Load(const wxString& path) - { - if(!wxDirExists(path)) return; - - m_plugins.clear(); - wxDir dir(path); - - wxArrayString res; - wxDir::GetAllFiles(path, &res, "*.dll", wxDIR_FILES); - - for(u32 i=0; iAdd(new wxStaticText(parent, wxID_ANY, name), wxSizerFlags().Border(wxRIGHT, 5).Center().Left()); - s_panel->Add(cb = new wxComboBox(parent, wxID_ANY), wxSizerFlags().Center().Right()); - - return s_panel; - } - - void Dialog() - { - wxDialog dial(nullptr, wxID_ANY, "Select plugins...", wxDefaultPosition); - - wxBoxSizer& s_panel(*new wxBoxSizer(wxVERTICAL)); - - wxComboBox* cbox_pad_plugins; - s_panel.Add(GetNewComboBox(&dial, "Pad", cbox_pad_plugins), wxSizerFlags().Border(wxALL, 5).Expand()); - - for(u32 i=0; iAppend(m_plugins[i].name + " (" + wxFileName(m_plugins[i].path).GetName() + ")"); - } - } - - if(cbox_pad_plugins->GetCount()) cbox_pad_plugins->Select(0); - - dial.SetSizerAndFit(&s_panel); - dial.ShowModal(); - } -}; diff --git a/rpcs3/Loader/ELF64.cpp b/rpcs3/Loader/ELF64.cpp index 857b24759a..1736ecf163 100644 --- a/rpcs3/Loader/ELF64.cpp +++ b/rpcs3/Loader/ELF64.cpp @@ -210,31 +210,27 @@ bool ELF64Loader::LoadEhdrData(u64 offset) bool ELF64Loader::LoadPhdrData(u64 offset) { - for(u32 i=0; i max_addr) + if (phdr.p_vaddr + phdr.p_memsz > max_addr) { - max_addr = phdr_arr[i].p_vaddr + phdr_arr[i].p_memsz; + max_addr = phdr.p_vaddr + phdr.p_memsz; } - if(phdr_arr[i].p_vaddr != phdr_arr[i].p_paddr) + if (phdr.p_vaddr != phdr.p_paddr) { - LOG_WARNING - ( - LOADER, - "ElfProgram different load addrs: paddr=0x%8.8x, vaddr=0x%8.8x", - phdr_arr[i].p_paddr, phdr_arr[i].p_vaddr - ); + LOG_WARNING(LOADER, "ElfProgram different load addrs: paddr=0x%8.8x, vaddr=0x%8.8x", + phdr.p_paddr, phdr.p_vaddr); } - if(!Memory.MainMem.IsInMyRange(offset + phdr_arr[i].p_vaddr, phdr_arr[i].p_memsz)) + if(!Memory.MainMem.IsInMyRange(offset + phdr.p_vaddr, phdr.p_memsz)) { #ifdef LOADER_DEBUG LOG_WARNING(LOADER, "Skipping..."); @@ -243,57 +239,48 @@ bool ELF64Loader::LoadPhdrData(u64 offset) continue; } - switch(phdr_arr[i].p_type) + switch(phdr.p_type) { case 0x00000001: //LOAD - if(phdr_arr[i].p_memsz) + if(phdr.p_memsz) { - Memory.MainMem.AllocFixed(offset + phdr_arr[i].p_vaddr, phdr_arr[i].p_memsz); + Memory.MainMem.AllocFixed(offset + phdr.p_vaddr, phdr.p_memsz); - if(phdr_arr[i].p_filesz) + if(phdr.p_filesz) { - elf64_f.Seek(phdr_arr[i].p_offset); - elf64_f.Read(&Memory[offset + phdr_arr[i].p_vaddr], phdr_arr[i].p_filesz); - Emu.GetSFuncManager().StaticAnalyse(&Memory[offset + phdr_arr[i].p_vaddr], phdr_arr[i].p_filesz, phdr_arr[i].p_vaddr); + elf64_f.Seek(phdr.p_offset); + elf64_f.Read(&Memory[offset + phdr.p_vaddr], phdr.p_filesz); + Emu.GetSFuncManager().StaticAnalyse(&Memory[offset + phdr.p_vaddr], phdr.p_filesz, phdr.p_vaddr); } } break; case 0x00000007: //TLS - Emu.SetTLSData(offset + phdr_arr[i].p_vaddr, phdr_arr[i].p_filesz, phdr_arr[i].p_memsz); + Emu.SetTLSData(offset + phdr.p_vaddr, phdr.p_filesz, phdr.p_memsz); break; case 0x60000001: //LOOS+1 { - if(!phdr_arr[i].p_filesz) break; + if(!phdr.p_filesz) + break; - const sys_process_param& proc_param = *(sys_process_param*)&Memory[offset + phdr_arr[i].p_vaddr]; + const sys_process_param& proc_param = *(sys_process_param*)&Memory[offset + phdr.p_vaddr]; - if(re(proc_param.size) < sizeof(sys_process_param)) - { - LOG_WARNING(LOADER, "Bad proc param size! [0x%x : 0x%x]", re(proc_param.size), sizeof(sys_process_param)); + if (proc_param.size < sizeof(sys_process_param)) { + LOG_WARNING(LOADER, "Bad proc param size! [0x%x : 0x%x]", proc_param.size, sizeof(sys_process_param)); } - - if(re(proc_param.magic) != 0x13bcc5f6) - { - LOG_ERROR(LOADER, "Bad magic! [0x%x]", Memory.Reverse32(proc_param.magic)); + if (proc_param.magic != 0x13bcc5f6) { + LOG_ERROR(LOADER, "Bad magic! [0x%x]", proc_param.magic); } - else - { - sys_process_param_info& info = Emu.GetInfo().GetProcParam(); - info.sdk_version = re(proc_param.info.sdk_version); - info.primary_prio = re(proc_param.info.primary_prio); - info.primary_stacksize = re(proc_param.info.primary_stacksize); - info.malloc_pagesize = re(proc_param.info.malloc_pagesize); - info.ppc_seg = re(proc_param.info.ppc_seg); - //info.crash_dump_param_addr = re(proc_param.info.crash_dump_param_addr); + else { #ifdef LOADER_DEBUG - LOG_NOTICE(LOADER, "*** sdk version: 0x%x", info.sdk_version); - LOG_NOTICE(LOADER, "*** primary prio: %d", info.primary_prio); - LOG_NOTICE(LOADER, "*** primary stacksize: 0x%x", info.primary_stacksize); - LOG_NOTICE(LOADER, "*** malloc pagesize: 0x%x", info.malloc_pagesize); - LOG_NOTICE(LOADER, "*** ppc seg: 0x%x", info.ppc_seg); - //LOG_NOTICE(LOADER, "*** crash dump param addr: 0x%x", info.crash_dump_param_addr); + sys_process_param_info& info = Emu.GetInfo().GetProcParam(); + LOG_NOTICE(LOADER, "*** sdk version: 0x%x", info.sdk_version.ToLE()); + LOG_NOTICE(LOADER, "*** primary prio: %d", info.primary_prio.ToLE()); + LOG_NOTICE(LOADER, "*** primary stacksize: 0x%x", info.primary_stacksize.ToLE()); + LOG_NOTICE(LOADER, "*** malloc pagesize: 0x%x", info.malloc_pagesize.ToLE()); + LOG_NOTICE(LOADER, "*** ppc seg: 0x%x", info.ppc_seg.ToLE()); + //LOG_NOTICE(LOADER, "*** crash dump param addr: 0x%x", info.crash_dump_param_addr.ToLE()); #endif } } @@ -301,113 +288,89 @@ bool ELF64Loader::LoadPhdrData(u64 offset) case 0x60000002: //LOOS+2 { - if(!phdr_arr[i].p_filesz) break; + if(!phdr.p_filesz) + break; - sys_proc_prx_param proc_prx_param = *(sys_proc_prx_param*)&Memory[offset + phdr_arr[i].p_vaddr]; + sys_proc_prx_param proc_prx_param = *(sys_proc_prx_param*)&Memory[offset + phdr.p_vaddr]; - proc_prx_param.size = re(proc_prx_param.size); - proc_prx_param.magic = re(proc_prx_param.magic); - proc_prx_param.version = re(proc_prx_param.version); - proc_prx_param.libentstart = re(proc_prx_param.libentstart); - proc_prx_param.libentend = re(proc_prx_param.libentend); - proc_prx_param.libstubstart = re(proc_prx_param.libstubstart); - proc_prx_param.libstubend = re(proc_prx_param.libstubend); - proc_prx_param.ver = re(proc_prx_param.ver); #ifdef LOADER_DEBUG - LOG_NOTICE(LOADER, "*** size: 0x%x", proc_prx_param.size); - LOG_NOTICE(LOADER, "*** magic: 0x%x", proc_prx_param.magic); - LOG_NOTICE(LOADER, "*** version: 0x%x", proc_prx_param.version); - LOG_NOTICE(LOADER, "*** libentstart: 0x%x", proc_prx_param.libentstart); - LOG_NOTICE(LOADER, "*** libentend: 0x%x", proc_prx_param.libentend); - LOG_NOTICE(LOADER, "*** libstubstart: 0x%x", proc_prx_param.libstubstart); - LOG_NOTICE(LOADER, "*** libstubend: 0x%x", proc_prx_param.libstubend); - LOG_NOTICE(LOADER, "*** ver: 0x%x", proc_prx_param.ver); + LOG_NOTICE(LOADER, "*** size: 0x%x", proc_prx_param.size.ToLE()); + LOG_NOTICE(LOADER, "*** magic: 0x%x", proc_prx_param.magic.ToLE()); + LOG_NOTICE(LOADER, "*** version: 0x%x", proc_prx_param.version.ToLE()); + LOG_NOTICE(LOADER, "*** libentstart: 0x%x", proc_prx_param.libentstart.ToLE()); + LOG_NOTICE(LOADER, "*** libentend: 0x%x", proc_prx_param.libentend.ToLE()); + LOG_NOTICE(LOADER, "*** libstubstart: 0x%x", proc_prx_param.libstubstart.ToLE()); + LOG_NOTICE(LOADER, "*** libstubend: 0x%x", proc_prx_param.libstubend.ToLE()); + LOG_NOTICE(LOADER, "*** ver: 0x%x", proc_prx_param.ver.ToLE()); #endif - if(proc_prx_param.magic != 0x1b434cec) - { - LOG_ERROR(LOADER, "Bad magic! (0x%x)", proc_prx_param.magic); + if (proc_prx_param.magic != 0x1b434cec) { + LOG_ERROR(LOADER, "Bad magic! (0x%x)", proc_prx_param.magic.ToLE()); + break; } - else + + for(u32 s=proc_prx_param.libstubstart; sSetLoaded(); - } - else - { - LOG_WARNING(LOADER, "Unknown module '%s'", module_name.c_str()); - } - -#ifdef LOADER_DEBUG - LOG_NOTICE(LOADER, ""); - LOG_NOTICE(LOADER, "*** size: 0x%x", stub.s_size); - LOG_NOTICE(LOADER, "*** version: 0x%x", stub.s_version); - LOG_NOTICE(LOADER, "*** unk0: 0x%x", stub.s_unk0); - LOG_NOTICE(LOADER, "*** unk1: 0x%x", stub.s_unk1); - LOG_NOTICE(LOADER, "*** imports: %d", stub.s_imports); - LOG_NOTICE(LOADER, "*** module name: %s [0x%x]", module_name.c_str(), stub.s_modulename); - LOG_NOTICE(LOADER, "*** nid: 0x%x", stub.s_nid); - LOG_NOTICE(LOADER, "*** text: 0x%x", stub.s_text); -#endif - static const u32 section = 4 * 3; - u64 tbl = Memory.MainMem.AllocAlign(stub.s_imports * 4 * 2); - u64 dst = Memory.MainMem.AllocAlign(stub.s_imports * section); - - for(u32 i=0; iLoad(nid)) - { - LOG_WARNING(LOADER, "Unimplemented function '%s' in '%s' module", SysCalls::GetHLEFuncName(nid).c_str(), module_name.c_str()); - } - } -#ifdef LOADER_DEBUG - LOG_NOTICE(LOADER, "import %d:", i+1); - LOG_NOTICE(LOADER, "*** nid: 0x%x (0x%x)", nid, stub.s_nid + i*4); - LOG_NOTICE(LOADER, "*** text: 0x%x (0x%x)", text, stub.s_text + i*4); -#endif - Memory.Write32(stub.s_text + i*4, tbl + i*8); - - mem32_ptr_t out_tbl(tbl + i*8); - out_tbl += dst + i*section; - out_tbl += Emu.GetModuleManager().GetFuncNumById(nid); - - mem32_ptr_t out_dst(dst + i*section); - out_dst += OR(11, 2, 2, 0); - out_dst += SC(2); - out_dst += BCLR(0x10 | 0x04, 0, 0, 0); - } + const std::string& module_name = Memory.ReadString(stub.s_modulename); + Module* module = Emu.GetModuleManager().GetModuleByName(module_name); + if (module) { + //module->SetLoaded(); } + else { + LOG_WARNING(LOADER, "Unknown module '%s'", module_name.c_str()); + } + #ifdef LOADER_DEBUG - LOG_NOTICE(LOADER, " "); + LOG_NOTICE(LOADER, ""); + LOG_NOTICE(LOADER, "*** size: 0x%x", stub.s_size); + LOG_NOTICE(LOADER, "*** version: 0x%x", stub.s_version.ToLE()); + LOG_NOTICE(LOADER, "*** unk0: 0x%x", stub.s_unk0); + LOG_NOTICE(LOADER, "*** unk1: 0x%x", stub.s_unk1.ToLE()); + LOG_NOTICE(LOADER, "*** imports: %d", stub.s_imports.ToLE()); + LOG_NOTICE(LOADER, "*** module name: %s [0x%x]", module_name.c_str(), stub.s_modulename.ToLE()); + LOG_NOTICE(LOADER, "*** nid: 0x%016llx [0x%x]", Memory.Read64(stub.s_nid), stub.s_nid.ToLE()); + LOG_NOTICE(LOADER, "*** text: 0x%x", stub.s_text.ToLE()); #endif + static const u32 section = 4 * 3; + u64 tbl = Memory.MainMem.AllocAlign(stub.s_imports * 4 * 2); + u64 dst = Memory.MainMem.AllocAlign(stub.s_imports * section); + + for(u32 i=0; iLoad(nid)) { + LOG_WARNING(LOADER, "Unimplemented function '%s' in '%s' module", SysCalls::GetHLEFuncName(nid).c_str(), module_name.c_str()); + } +#ifdef LOADER_DEBUG + LOG_NOTICE(LOADER, "import %d:", i+1); + LOG_NOTICE(LOADER, "*** nid: 0x%x (0x%x)", nid, stub.s_nid + i*4); + LOG_NOTICE(LOADER, "*** text: 0x%x (0x%x)", text, stub.s_text + i*4); +#endif + Memory.Write32(stub.s_text + i*4, tbl + i*8); + + mem32_ptr_t out_tbl(tbl + i*8); + out_tbl += dst + i*section; + out_tbl += Emu.GetModuleManager().GetFuncNumById(nid); + + mem32_ptr_t out_dst(dst + i*section); + out_dst += OR(11, 2, 2, 0); + out_dst += SC(2); + out_dst += BCLR(0x10 | 0x04, 0, 0, 0); + } } +#ifdef LOADER_DEBUG + LOG_NOTICE(LOADER, ""); +#endif } break; } #ifdef LOADER_DEBUG - LOG_NOTICE(LOADER, " "); + LOG_NOTICE(LOADER, ""); #endif } @@ -461,7 +424,7 @@ bool ELF64Loader::LoadShdrData(u64 offset) switch(shdr.sh_type) { case SHT_NOBITS: - //ConLog.Warning("SHT_NOBITS: addr=0x%llx, size=0x%llx", offset + addr, size); + //LOG_WARNING(LOADER, "SHT_NOBITS: addr=0x%llx, size=0x%llx", offset + addr, size); //memset(&Memory[offset + addr], 0, size); break; diff --git a/rpcs3/Loader/Loader.h b/rpcs3/Loader/Loader.h index 9112eddc41..96134a3e34 100644 --- a/rpcs3/Loader/Loader.h +++ b/rpcs3/Loader/Loader.h @@ -125,53 +125,53 @@ const std::string Phdr_TypeToString(const u32 type); struct sys_process_param_info { - u32 sdk_version; - s32 primary_prio; - u32 primary_stacksize; - u32 malloc_pagesize; - u32 ppc_seg; - //u32 crash_dump_param_addr; + be_t sdk_version; + be_t primary_prio; + be_t primary_stacksize; + be_t malloc_pagesize; + be_t ppc_seg; + //be_t crash_dump_param_addr; }; struct sys_process_param { - u32 size; - u32 magic; - u32 version; + be_t size; + be_t magic; + be_t version; sys_process_param_info info; }; struct sys_proc_prx_param { - u32 size; - u32 magic; - u32 version; - u32 pad0; - u32 libentstart; - u32 libentend; - u32 libstubstart; - u32 libstubend; - u16 ver; - u16 pad1; - u32 pad2; + be_t size; + be_t magic; + be_t version; + be_t pad0; + be_t libentstart; + be_t libentend; + be_t libstubstart; + be_t libstubend; + be_t ver; + be_t pad1; + be_t pad2; }; struct Elf64_StubHeader { u8 s_size; // = 0x2c u8 s_unk0; - u16 s_version; // = 0x1 - u16 s_unk1; // = 0x9 // flags? - u16 s_imports; - u32 s_unk2; // = 0x0 - u32 s_unk3; // = 0x0 - u32 s_modulename; - u32 s_nid; - u32 s_text; - u32 s_unk4; // = 0x0 - u32 s_unk5; // = 0x0 - u32 s_unk6; // = 0x0 - u32 s_unk7; // = 0x0 + be_t s_version; // = 0x1 + be_t s_unk1; // = 0x9 // flags? + be_t s_imports; + be_t s_unk2; // = 0x0 + be_t s_unk3; // = 0x0 + be_t s_modulename; + be_t s_nid; + be_t s_text; + be_t s_unk4; // = 0x0 + be_t s_unk5; // = 0x0 + be_t s_unk6; // = 0x0 + be_t s_unk7; // = 0x0 }; class LoaderBase diff --git a/rpcs3/emucore.vcxproj b/rpcs3/emucore.vcxproj index 15ffbd0baa..20178ef443 100644 --- a/rpcs3/emucore.vcxproj +++ b/rpcs3/emucore.vcxproj @@ -92,9 +92,9 @@ + - @@ -316,9 +316,9 @@ + - diff --git a/rpcs3/rpcs3.vcxproj b/rpcs3/rpcs3.vcxproj index a791fc8435..a7d200071c 100644 --- a/rpcs3/rpcs3.vcxproj +++ b/rpcs3/rpcs3.vcxproj @@ -175,7 +175,6 @@ - @@ -224,7 +223,6 @@ - diff --git a/rpcs3/rpcs3.vcxproj.filters b/rpcs3/rpcs3.vcxproj.filters index 15476df48d..950a606fba 100644 --- a/rpcs3/rpcs3.vcxproj.filters +++ b/rpcs3/rpcs3.vcxproj.filters @@ -60,9 +60,6 @@ Gui - - Gui - Gui @@ -158,9 +155,6 @@ Gui - - Gui - Gui From 230ba0d360403929f89dec429ef640fe0b202cad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexandro=20S=C3=A1nchez=20Bach?= Date: Sun, 6 Jul 2014 18:05:52 +0200 Subject: [PATCH 3/3] Fixed conflicts and minor changes (2) --- rpcs3/Emu/Cell/RawSPUThread.h | 2 +- rpcs3/Emu/Cell/SPUThread.h | 2 +- rpcs3/Emu/Event.cpp | 2 +- rpcs3/Emu/{event.h => Event.h} | 0 rpcs3/Emu/SysCalls/SysCalls.h | 2 +- rpcs3/Emu/SysCalls/lv2/SC_Event.cpp | 388 --------------------- rpcs3/Emu/SysCalls/lv2/SC_Event_flag.cpp | 370 -------------------- rpcs3/Emu/SysCalls/lv2/SC_GCM.cpp | 32 -- rpcs3/Emu/SysCalls/lv2/SC_Heap.cpp | 50 --- rpcs3/Emu/SysCalls/lv2/SC_Memory.cpp | 423 ----------------------- rpcs3/Emu/SysCalls/lv2/sys_event.cpp | 2 +- rpcs3/Emu/SysCalls/lv2/sys_event.h | 2 +- rpcs3/Emu/SysCalls/lv2/sys_timer.cpp | 2 +- rpcs3/Emu/SysCalls/lv2/sys_tty.cpp | 13 +- rpcs3/Emu/SysCalls/lv2/sys_tty.h | 23 ++ 15 files changed, 35 insertions(+), 1278 deletions(-) rename rpcs3/Emu/{event.h => Event.h} (100%) delete mode 100644 rpcs3/Emu/SysCalls/lv2/SC_Event.cpp delete mode 100644 rpcs3/Emu/SysCalls/lv2/SC_Event_flag.cpp delete mode 100644 rpcs3/Emu/SysCalls/lv2/SC_GCM.cpp delete mode 100644 rpcs3/Emu/SysCalls/lv2/SC_Heap.cpp delete mode 100644 rpcs3/Emu/SysCalls/lv2/SC_Memory.cpp diff --git a/rpcs3/Emu/Cell/RawSPUThread.h b/rpcs3/Emu/Cell/RawSPUThread.h index 78a3bb297d..ccccad25a6 100644 --- a/rpcs3/Emu/Cell/RawSPUThread.h +++ b/rpcs3/Emu/Cell/RawSPUThread.h @@ -1,6 +1,6 @@ #pragma once #include "SPUThread.h" -#include "Emu/event.h" +#include "Emu/Event.h" __forceinline static u32 GetRawSPURegAddrByNum(int num, int offset) { diff --git a/rpcs3/Emu/Cell/SPUThread.h b/rpcs3/Emu/Cell/SPUThread.h index 0ef23c72ec..b71263c1b1 100644 --- a/rpcs3/Emu/Cell/SPUThread.h +++ b/rpcs3/Emu/Cell/SPUThread.h @@ -1,6 +1,6 @@ #pragma once #include "PPCThread.h" -#include "Emu/event.h" +#include "Emu/Event.h" #include "Emu/SysCalls/lv2/sys_spu.h" #include "MFC.h" #include "Emu/SysCalls/ErrorCodes.h" diff --git a/rpcs3/Emu/Event.cpp b/rpcs3/Emu/Event.cpp index d36bc08bc6..d5065e2a98 100644 --- a/rpcs3/Emu/Event.cpp +++ b/rpcs3/Emu/Event.cpp @@ -2,7 +2,7 @@ #include "Utilities/Log.h" #include "Emu/Memory/Memory.h" #include "Emu/System.h" -#include "event.h" +#include "Event.h" void EventManager::Init() { diff --git a/rpcs3/Emu/event.h b/rpcs3/Emu/Event.h similarity index 100% rename from rpcs3/Emu/event.h rename to rpcs3/Emu/Event.h diff --git a/rpcs3/Emu/SysCalls/SysCalls.h b/rpcs3/Emu/SysCalls/SysCalls.h index 759078de8d..95a6267464 100644 --- a/rpcs3/Emu/SysCalls/SysCalls.h +++ b/rpcs3/Emu/SysCalls/SysCalls.h @@ -24,7 +24,7 @@ #include "lv2/sys_tty.h" #include "lv2/sys_vm.h" -#include "Emu/event.h" +#include "Emu/Event.h" //#define SYSCALLS_DEBUG diff --git a/rpcs3/Emu/SysCalls/lv2/SC_Event.cpp b/rpcs3/Emu/SysCalls/lv2/SC_Event.cpp deleted file mode 100644 index f0ceecdc7f..0000000000 --- a/rpcs3/Emu/SysCalls/lv2/SC_Event.cpp +++ /dev/null @@ -1,388 +0,0 @@ -#include "stdafx.h" -#include "Utilities/Log.h" -#include "Emu/Memory/Memory.h" -#include "Emu/System.h" -#include "Emu/Cell/PPUThread.h" - -#include "Emu/SysCalls/SysCalls.h" -#include "Emu/Cell/SPUThread.h" -#include "Emu/event.h" - -SysCallBase sys_event("sys_event"); - -//128 -int sys_event_queue_create(mem32_t equeue_id, mem_ptr_t attr, u64 event_queue_key, int size) -{ - sys_event.Warning("sys_event_queue_create(equeue_id_addr=0x%x, attr_addr=0x%x, event_queue_key=0x%llx, size=%d)", - equeue_id.GetAddr(), attr.GetAddr(), event_queue_key, size); - - if(size <= 0 || size > 127) - { - return CELL_EINVAL; - } - - if(!equeue_id.IsGood() || !attr.IsGood()) - { - return CELL_EFAULT; - } - - switch (attr->protocol.ToBE()) - { - case se32(SYS_SYNC_PRIORITY): break; - case se32(SYS_SYNC_RETRY): sys_event.Error("Invalid SYS_SYNC_RETRY protocol attr"); return CELL_EINVAL; - case se32(SYS_SYNC_PRIORITY_INHERIT): sys_event.Error("Invalid SYS_SYNC_PRIORITY_INHERIT protocol attr"); return CELL_EINVAL; - case se32(SYS_SYNC_FIFO): break; - default: sys_event.Error("Unknown 0x%x protocol attr", (u32)attr->protocol); return CELL_EINVAL; - } - - switch (attr->type.ToBE()) - { - case se32(SYS_PPU_QUEUE): break; - case se32(SYS_SPU_QUEUE): break; - default: sys_event.Error("Unknown 0x%x type attr", (u32)attr->type); return CELL_EINVAL; - } - - if (event_queue_key && Emu.GetEventManager().CheckKey(event_queue_key)) - { - return CELL_EEXIST; - } - - EventQueue* eq = new EventQueue((u32)attr->protocol, (int)attr->type, attr->name_u64, event_queue_key, size); - - if (event_queue_key && !Emu.GetEventManager().RegisterKey(eq, event_queue_key)) - { - delete eq; - return CELL_EAGAIN; - } - - equeue_id = sys_event.GetNewId(eq); - sys_event.Warning("*** event_queue created [%s] (protocol=0x%x, type=0x%x): id = %d", - std::string(attr->name, 8).c_str(), (u32)attr->protocol, (int)attr->type, equeue_id.GetValue()); - - return CELL_OK; -} - -int sys_event_queue_destroy(u32 equeue_id, int mode) -{ - sys_event.Error("sys_event_queue_destroy(equeue_id=%d, mode=0x%x)", equeue_id, mode); - - EventQueue* eq; - if (!Emu.GetIdManager().GetIDData(equeue_id, eq)) - { - return CELL_ESRCH; - } - - if (mode && mode != SYS_EVENT_QUEUE_DESTROY_FORCE) - { - return CELL_EINVAL; - } - - u32 tid = GetCurrentPPUThread().GetId(); - - eq->sq.m_mutex.lock(); - eq->owner.lock(tid); - // check if some threads are waiting for an event - if (!mode && eq->sq.list.size()) - { - eq->owner.unlock(tid); - eq->sq.m_mutex.unlock(); - return CELL_EBUSY; - } - eq->owner.unlock(tid, ~0); - eq->sq.m_mutex.unlock(); - while (eq->sq.list.size()) - { - Sleep(1); - if (Emu.IsStopped()) - { - LOG_WARNING(HLE, "sys_event_queue_destroy(equeue=%d) aborted", equeue_id); - break; - } - } - - Emu.GetEventManager().UnregisterKey(eq->key); - eq->ports.clear(); - Emu.GetIdManager().RemoveID(equeue_id); - - return CELL_OK; -} - -int sys_event_queue_tryreceive(u32 equeue_id, mem_ptr_t event_array, int size, mem32_t number) -{ - sys_event.Error("sys_event_queue_tryreceive(equeue_id=%d, event_array_addr=0x%x, size=%d, number_addr=0x%x)", - equeue_id, event_array.GetAddr(), size, number.GetAddr()); - - if (size < 0 || !number.IsGood()) - { - return CELL_EFAULT; - } - - if (size && !Memory.IsGoodAddr(event_array.GetAddr(), sizeof(sys_event_data) * size)) - { - return CELL_EFAULT; - } - - EventQueue* eq; - if (!Emu.GetIdManager().GetIDData(equeue_id, eq)) - { - return CELL_ESRCH; - } - - if (eq->type != SYS_PPU_QUEUE) - { - return CELL_EINVAL; - } - - if (size == 0) - { - number = 0; - return CELL_OK; - } - - u32 tid = GetCurrentPPUThread().GetId(); - - eq->sq.m_mutex.lock(); - eq->owner.lock(tid); - if (eq->sq.list.size()) - { - number = 0; - eq->owner.unlock(tid); - eq->sq.m_mutex.unlock(); - return CELL_OK; - } - number = eq->events.pop_all((sys_event_data*)(Memory + event_array.GetAddr()), size); - eq->owner.unlock(tid); - eq->sq.m_mutex.unlock(); - return CELL_OK; -} - -int sys_event_queue_receive(u32 equeue_id, mem_ptr_t event, u64 timeout) -{ - sys_event.Log("sys_event_queue_receive(equeue_id=%d, event_addr=0x%x, timeout=%lld)", - equeue_id, event.GetAddr(), timeout); - - if (!event.IsGood()) - { - return CELL_EFAULT; - } - - EventQueue* eq; - if (!Emu.GetIdManager().GetIDData(equeue_id, eq)) - { - return CELL_ESRCH; - } - - if (eq->type != SYS_PPU_QUEUE) - { - return CELL_EINVAL; - } - - u32 tid = GetCurrentPPUThread().GetId(); - - eq->sq.push(tid); // add thread to sleep queue - - timeout = timeout ? (timeout / 1000) : ~0; - u64 counter = 0; - while (true) - { - switch (eq->owner.trylock(tid)) - { - case SMR_OK: - if (!eq->events.count()) - { - eq->owner.unlock(tid); - break; - } - else - { - u32 next = (eq->protocol == SYS_SYNC_FIFO) ? eq->sq.pop() : eq->sq.pop_prio(); - if (next != tid) - { - eq->owner.unlock(tid, next); - break; - } - } - case SMR_SIGNAL: - { - eq->events.pop(*event); - eq->owner.unlock(tid); - sys_event.Log(" *** event received: source=0x%llx, d1=0x%llx, d2=0x%llx, d3=0x%llx", - (u64)event->source, (u64)event->data1, (u64)event->data2, (u64)event->data3); - /* passing event data in registers */ - PPUThread& t = GetCurrentPPUThread(); - t.GPR[4] = event->source; - t.GPR[5] = event->data1; - t.GPR[6] = event->data2; - t.GPR[7] = event->data3; - return CELL_OK; - } - case SMR_FAILED: break; - default: eq->sq.invalidate(tid); return CELL_ECANCELED; - } - - Sleep(1); - if (counter++ > timeout || Emu.IsStopped()) - { - if (Emu.IsStopped()) LOG_WARNING(HLE, "sys_event_queue_receive(equeue=%d) aborted", equeue_id); - eq->sq.invalidate(tid); - return CELL_ETIMEDOUT; - } - } -} - -int sys_event_queue_drain(u32 equeue_id) -{ - sys_event.Log("sys_event_queue_drain(equeue_id=%d)", equeue_id); - - EventQueue* eq; - if (!Emu.GetIdManager().GetIDData(equeue_id, eq)) - { - return CELL_ESRCH; - } - - eq->events.clear(); - - return CELL_OK; -} - -int sys_event_port_create(mem32_t eport_id, int port_type, u64 name) -{ - sys_event.Warning("sys_event_port_create(eport_id_addr=0x%x, port_type=0x%x, name=0x%llx)", - eport_id.GetAddr(), port_type, name); - - if (!eport_id.IsGood()) - { - return CELL_EFAULT; - } - - if (port_type != SYS_EVENT_PORT_LOCAL) - { - sys_event.Error("sys_event_port_create: invalid port_type(0x%x)", port_type); - return CELL_EINVAL; - } - - EventPort* eport = new EventPort(); - u32 id = sys_event.GetNewId(eport); - eport->name = name ? name : ((u64)sys_process_getpid() << 32) | (u64)id; - eport_id = id; - sys_event.Warning("*** sys_event_port created: id = %d", id); - - return CELL_OK; -} - -int sys_event_port_destroy(u32 eport_id) -{ - sys_event.Warning("sys_event_port_destroy(eport_id=%d)", eport_id); - - EventPort* eport; - if (!Emu.GetIdManager().GetIDData(eport_id, eport)) - { - return CELL_ESRCH; - } - - if (!eport->m_mutex.try_lock()) - { - return CELL_EISCONN; - } - - if (eport->eq) - { - eport->m_mutex.unlock(); - return CELL_EISCONN; - } - - eport->m_mutex.unlock(); - Emu.GetIdManager().RemoveID(eport_id); - return CELL_OK; -} - -int sys_event_port_connect_local(u32 eport_id, u32 equeue_id) -{ - sys_event.Warning("sys_event_port_connect_local(eport_id=%d, equeue_id=%d)", eport_id, equeue_id); - - EventPort* eport; - if (!Emu.GetIdManager().GetIDData(eport_id, eport)) - { - return CELL_ESRCH; - } - - if (!eport->m_mutex.try_lock()) - { - return CELL_EISCONN; - } - - if (eport->eq) - { - eport->m_mutex.unlock(); - return CELL_EISCONN; - } - - EventQueue* equeue; - if (!Emu.GetIdManager().GetIDData(equeue_id, equeue)) - { - sys_event.Error("sys_event_port_connect_local: event_queue(%d) not found!", equeue_id); - eport->m_mutex.unlock(); - return CELL_ESRCH; - } - else - { - equeue->ports.add(eport); - } - - eport->eq = equeue; - eport->m_mutex.unlock(); - return CELL_OK; -} - -int sys_event_port_disconnect(u32 eport_id) -{ - sys_event.Warning("sys_event_port_disconnect(eport_id=%d)", eport_id); - - EventPort* eport; - if (!Emu.GetIdManager().GetIDData(eport_id, eport)) - { - return CELL_ESRCH; - } - - if (!eport->eq) - { - return CELL_ENOTCONN; - } - - if (!eport->m_mutex.try_lock()) - { - return CELL_EBUSY; - } - - eport->eq->ports.remove(eport); - eport->eq = nullptr; - eport->m_mutex.unlock(); - return CELL_OK; -} - -int sys_event_port_send(u32 eport_id, u64 data1, u64 data2, u64 data3) -{ - sys_event.Log("sys_event_port_send(eport_id=%d, data1=0x%llx, data2=0x%llx, data3=0x%llx)", - eport_id, data1, data2, data3); - - EventPort* eport; - if (!Emu.GetIdManager().GetIDData(eport_id, eport)) - { - return CELL_ESRCH; - } - - std::lock_guard lock(eport->m_mutex); - - EventQueue* eq = eport->eq; - if (!eq) - { - return CELL_ENOTCONN; - } - - if (!eq->events.push(eport->name, data1, data2, data3)) - { - return CELL_EBUSY; - } - - return CELL_OK; -} diff --git a/rpcs3/Emu/SysCalls/lv2/SC_Event_flag.cpp b/rpcs3/Emu/SysCalls/lv2/SC_Event_flag.cpp deleted file mode 100644 index 743c37beb9..0000000000 --- a/rpcs3/Emu/SysCalls/lv2/SC_Event_flag.cpp +++ /dev/null @@ -1,370 +0,0 @@ -#include "stdafx.h" -#include "Utilities/Log.h" -#include "Emu/Memory/Memory.h" -#include "Emu/System.h" -#include "Emu/Cell/PPUThread.h" - -#include "Emu/SysCalls/SysCalls.h" -#include "Emu/SysCalls/lv2/SC_Event_flag.h" - -SysCallBase sys_event_flag("sys_event_flag"); - -int sys_event_flag_create(mem32_t eflag_id, mem_ptr_t attr, u64 init) -{ - sys_event_flag.Warning("sys_event_flag_create(eflag_id_addr=0x%x, attr_addr=0x%x, init=0x%llx)", - eflag_id.GetAddr(), attr.GetAddr(), init); - - if(!eflag_id.IsGood() || !attr.IsGood()) - { - return CELL_EFAULT; - } - - switch (attr->protocol.ToBE()) - { - case se32(SYS_SYNC_PRIORITY): break; - case se32(SYS_SYNC_RETRY): sys_event_flag.Warning("TODO: SYS_SYNC_RETRY attr"); break; - case se32(SYS_SYNC_PRIORITY_INHERIT): sys_event_flag.Warning("TODO: SYS_SYNC_PRIORITY_INHERIT attr"); break; - case se32(SYS_SYNC_FIFO): break; - default: return CELL_EINVAL; - } - - if (attr->pshared.ToBE() != se32(0x200)) - { - return CELL_EINVAL; - } - - switch (attr->type.ToBE()) - { - case se32(SYS_SYNC_WAITER_SINGLE): break; - case se32(SYS_SYNC_WAITER_MULTIPLE): break; - default: return CELL_EINVAL; - } - - eflag_id = sys_event_flag.GetNewId(new EventFlag(init, (u32)attr->protocol, (int)attr->type)); - - sys_event_flag.Warning("*** event_flag created [%s] (protocol=0x%x, type=0x%x): id = %d", - std::string(attr->name, 8).c_str(), (u32)attr->protocol, (int)attr->type, eflag_id.GetValue()); - - return CELL_OK; -} - -int sys_event_flag_destroy(u32 eflag_id) -{ - sys_event_flag.Warning("sys_event_flag_destroy(eflag_id=%d)", eflag_id); - - EventFlag* ef; - if(!sys_event_flag.CheckId(eflag_id, ef)) return CELL_ESRCH; - - if (ef->waiters.size()) // ??? - { - return CELL_EBUSY; - } - - Emu.GetIdManager().RemoveID(eflag_id); - - return CELL_OK; -} - -int sys_event_flag_wait(u32 eflag_id, u64 bitptn, u32 mode, mem64_t result, u64 timeout) -{ - sys_event_flag.Log("sys_event_flag_wait(eflag_id=%d, bitptn=0x%llx, mode=0x%x, result_addr=0x%x, timeout=%lld)", - eflag_id, bitptn, mode, result.GetAddr(), timeout); - - if (result.IsGood()) result = 0; - - switch (mode & 0xf) - { - case SYS_EVENT_FLAG_WAIT_AND: break; - case SYS_EVENT_FLAG_WAIT_OR: break; - default: return CELL_EINVAL; - } - - switch (mode & ~0xf) - { - case 0: break; // ??? - case SYS_EVENT_FLAG_WAIT_CLEAR: break; - case SYS_EVENT_FLAG_WAIT_CLEAR_ALL: break; - default: return CELL_EINVAL; - } - - EventFlag* ef; - if(!sys_event_flag.CheckId(eflag_id, ef)) return CELL_ESRCH; - - u32 tid = GetCurrentPPUThread().GetId(); - - { - SMutexLocker lock(ef->m_mutex); - if (ef->m_type == SYS_SYNC_WAITER_SINGLE && ef->waiters.size() > 0) - { - return CELL_EPERM; - } - EventFlagWaiter rec; - rec.bitptn = bitptn; - rec.mode = mode; - rec.tid = tid; - ef->waiters.push_back(rec); - - if (ef->check() == tid) - { - u64 flags = ef->flags; - - ef->waiters.erase(ef->waiters.end() - 1); - - if (mode & SYS_EVENT_FLAG_WAIT_CLEAR) - { - ef->flags &= ~bitptn; - } - else if (mode & SYS_EVENT_FLAG_WAIT_CLEAR_ALL) - { - ef->flags = 0; - } - - if (result.IsGood()) - { - result = flags; - return CELL_OK; - } - - if (!result.GetAddr()) - { - return CELL_OK; - } - return CELL_EFAULT; - } - } - - u32 counter = 0; - const u32 max_counter = timeout ? (timeout / 1000) : ~0; - - while (true) - { - if (ef->signal.unlock(tid, tid) == SMR_OK) - { - SMutexLocker lock(ef->m_mutex); - - u64 flags = ef->flags; - - for (u32 i = 0; i < ef->waiters.size(); i++) - { - if (ef->waiters[i].tid == tid) - { - ef->waiters.erase(ef->waiters.begin() +i); - - if (mode & SYS_EVENT_FLAG_WAIT_CLEAR) - { - ef->flags &= ~bitptn; - } - else if (mode & SYS_EVENT_FLAG_WAIT_CLEAR_ALL) - { - ef->flags = 0; - } - - if (u32 target = ef->check()) - { - // if signal, leave both mutexes locked... - ef->signal.unlock(tid, target); - ef->m_mutex.unlock(tid, target); - } - else - { - ef->signal.unlock(tid); - } - - if (result.IsGood()) - { - result = flags; - return CELL_OK; - } - - if (!result.GetAddr()) - { - return CELL_OK; - } - return CELL_EFAULT; - } - } - - ef->signal.unlock(tid); - return CELL_ECANCELED; - } - - Sleep(1); - - if (counter++ > max_counter) - { - SMutexLocker lock(ef->m_mutex); - - for (u32 i = 0; i < ef->waiters.size(); i++) - { - if (ef->waiters[i].tid == tid) - { - ef->waiters.erase(ef->waiters.begin() + i); - break; - } - } - - return CELL_ETIMEDOUT; - } - if (Emu.IsStopped()) - { - LOG_WARNING(HLE, "sys_event_flag_wait(id=%d) aborted", eflag_id); - return CELL_OK; - } - } -} - -int sys_event_flag_trywait(u32 eflag_id, u64 bitptn, u32 mode, mem64_t result) -{ - sys_event_flag.Log("sys_event_flag_trywait(eflag_id=%d, bitptn=0x%llx, mode=0x%x, result_addr=0x%x)", - eflag_id, bitptn, mode, result.GetAddr()); - - if (result.IsGood()) result = 0; - - switch (mode & 0xf) - { - case SYS_EVENT_FLAG_WAIT_AND: break; - case SYS_EVENT_FLAG_WAIT_OR: break; - default: return CELL_EINVAL; - } - - switch (mode & ~0xf) - { - case 0: break; // ??? - case SYS_EVENT_FLAG_WAIT_CLEAR: break; - case SYS_EVENT_FLAG_WAIT_CLEAR_ALL: break; - default: return CELL_EINVAL; - } - - EventFlag* ef; - if(!sys_event_flag.CheckId(eflag_id, ef)) return CELL_ESRCH; - - SMutexLocker lock(ef->m_mutex); - - u64 flags = ef->flags; - - if (((mode & SYS_EVENT_FLAG_WAIT_AND) && (flags & bitptn) == bitptn) || - ((mode & SYS_EVENT_FLAG_WAIT_OR) && (flags & bitptn))) - { - if (mode & SYS_EVENT_FLAG_WAIT_CLEAR) - { - ef->flags &= ~bitptn; - } - else if (mode & SYS_EVENT_FLAG_WAIT_CLEAR_ALL) - { - ef->flags = 0; - } - - if (result.IsGood()) - { - result = flags; - return CELL_OK; - } - - if (!result.GetAddr()) - { - return CELL_OK; - } - return CELL_EFAULT; - } - - return CELL_EBUSY; -} - -int sys_event_flag_set(u32 eflag_id, u64 bitptn) -{ - sys_event_flag.Log("sys_event_flag_set(eflag_id=%d, bitptn=0x%llx)", eflag_id, bitptn); - - EventFlag* ef; - if(!sys_event_flag.CheckId(eflag_id, ef)) return CELL_ESRCH; - - u32 tid = GetCurrentPPUThread().GetId(); - - ef->m_mutex.lock(tid); - ef->flags |= bitptn; - if (u32 target = ef->check()) - { - // if signal, leave both mutexes locked... - ef->signal.lock(target); - ef->m_mutex.unlock(tid, target); - } - else - { - ef->m_mutex.unlock(tid); - } - - return CELL_OK; -} - -int sys_event_flag_clear(u32 eflag_id, u64 bitptn) -{ - sys_event_flag.Log("sys_event_flag_clear(eflag_id=%d, bitptn=0x%llx)", eflag_id, bitptn); - - EventFlag* ef; - if(!sys_event_flag.CheckId(eflag_id, ef)) return CELL_ESRCH; - - SMutexLocker lock(ef->m_mutex); - ef->flags &= bitptn; - - return CELL_OK; -} - -int sys_event_flag_cancel(u32 eflag_id, mem32_t num) -{ - sys_event_flag.Log("sys_event_flag_cancel(eflag_id=%d, num_addr=0x%x)", eflag_id, num.GetAddr()); - - EventFlag* ef; - if(!sys_event_flag.CheckId(eflag_id, ef)) return CELL_ESRCH; - - std::vector tids; - - { - SMutexLocker lock(ef->m_mutex); - tids.resize(ef->waiters.size()); - for (u32 i = 0; i < ef->waiters.size(); i++) - { - tids[i] = ef->waiters[i].tid; - } - ef->waiters.clear(); - } - - for (u32 i = 0; i < tids.size(); i++) - { - ef->signal.lock(tids[i]); - } - - if (Emu.IsStopped()) - { - LOG_WARNING(HLE, "sys_event_flag_cancel(id=%d) aborted", eflag_id); - return CELL_OK; - } - - if (num.IsGood()) - { - num = tids.size(); - return CELL_OK; - } - - if (!num.GetAddr()) - { - return CELL_OK; - } - return CELL_EFAULT; -} - -int sys_event_flag_get(u32 eflag_id, mem64_t flags) -{ - sys_event_flag.Log("sys_event_flag_get(eflag_id=%d, flags_addr=0x%x)", eflag_id, flags.GetAddr()); - - EventFlag* ef; - if(!sys_event_flag.CheckId(eflag_id, ef)) return CELL_ESRCH; - - if (!flags.IsGood()) - { - return CELL_EFAULT; - } - - SMutexLocker lock(ef->m_mutex); - flags = ef->flags; - - return CELL_OK; -} diff --git a/rpcs3/Emu/SysCalls/lv2/SC_GCM.cpp b/rpcs3/Emu/SysCalls/lv2/SC_GCM.cpp deleted file mode 100644 index d0f80fcc90..0000000000 --- a/rpcs3/Emu/SysCalls/lv2/SC_GCM.cpp +++ /dev/null @@ -1,32 +0,0 @@ -#include "stdafx.h" -#include "Utilities/Log.h" -#include "Emu/Memory/Memory.h" -#include "Emu/System.h" -#include "Emu/Cell/PPUThread.h" -#include "Emu/SysCalls/SC_FUNC.h" -#include "Emu/SysCalls/Modules.h" -#include "Emu/SysCalls/SysCalls.h" -#include "Emu/GS/GCM.h" - -extern Module cellGcmSys; -extern gcmInfo gcm_info; - -int cellGcmCallback(u32 context_addr, u32 count) -{ - GSLockCurrent gslock(GS_LOCK_WAIT_FLUSH); - - CellGcmContextData& ctx = (CellGcmContextData&)Memory[context_addr]; - CellGcmControl& ctrl = (CellGcmControl&)Memory[gcm_info.control_addr]; - - const s32 res = ctx.current - ctx.begin - ctrl.put; - - if(res > 0) Memory.Copy(ctx.begin, ctx.current - res, res); - - ctx.current = ctx.begin + res; - - //InterlockedExchange64((volatile long long*)((u8*)&ctrl + offsetof(CellGcmControl, put)), (u64)(u32)re(res)); - ctrl.put = res; - ctrl.get = 0; - - return CELL_OK; -} diff --git a/rpcs3/Emu/SysCalls/lv2/SC_Heap.cpp b/rpcs3/Emu/SysCalls/lv2/SC_Heap.cpp deleted file mode 100644 index ca0d633251..0000000000 --- a/rpcs3/Emu/SysCalls/lv2/SC_Heap.cpp +++ /dev/null @@ -1,50 +0,0 @@ -#include "stdafx.h" -#include "Utilities/Log.h" -#include "Emu/Memory/Memory.h" -#include "Emu/System.h" -#include "Emu/SysCalls/SysCalls.h" - -SysCallBase sc_heap("sys_heap"); - -struct HeapInfo -{ - u32 heap_addr; - u32 align; - u32 size; - - HeapInfo(u32 _heap_addr, u32 _align, u32 _size) - : heap_addr(_heap_addr) - , align(_align) - , size(_size) - { - } -}; - -int sys_heap_create_heap(const u32 heap_addr, const u32 align, const u32 size) -{ - sc_heap.Warning("sys_heap_create_heap(heap_addr=0x%x, align=0x%x, size=0x%x)", heap_addr, align, size); - - u32 heap_id = sc_heap.GetNewId(new HeapInfo(heap_addr, align, size)); - sc_heap.Warning("*** sys_heap created: id = %d", heap_id); - return heap_id; -} - -int sys_heap_malloc(const u32 heap_id, const u32 size) -{ - sc_heap.Warning("sys_heap_malloc(heap_id=%d, size=0x%x)", heap_id, size); - - HeapInfo* heap; - if(!sc_heap.CheckId(heap_id, heap)) return CELL_ESRCH; - - return Memory.Alloc(size, 1); -} - -int _sys_heap_memalign(u32 heap_id, u32 align, u32 size) -{ - sc_heap.Warning("_sys_heap_memalign(heap_id=%d, align=0x%x, size=0x%x)", heap_id, align, size); - - HeapInfo* heap; - if(!sc_heap.CheckId(heap_id, heap)) return CELL_ESRCH; - - return Memory.Alloc(size, align); -} \ No newline at end of file diff --git a/rpcs3/Emu/SysCalls/lv2/SC_Memory.cpp b/rpcs3/Emu/SysCalls/lv2/SC_Memory.cpp deleted file mode 100644 index b82ab31570..0000000000 --- a/rpcs3/Emu/SysCalls/lv2/SC_Memory.cpp +++ /dev/null @@ -1,423 +0,0 @@ -#include "stdafx.h" -#include "Utilities/Log.h" -#include "Emu/Memory/Memory.h" -#include "Emu/System.h" -#include "Emu/SysCalls/SysCalls.h" -#include "SC_Memory.h" -#include - -SysCallBase sc_mem("memory"); -std::map mmapper_info_map; - -int sys_memory_allocate(u32 size, u32 flags, u32 alloc_addr_addr) -{ - sc_mem.Log("sys_memory_allocate(size=0x%x, flags=0x%x)", size, flags); - - // Check page size. - u32 addr; - switch(flags) - { - case SYS_MEMORY_PAGE_SIZE_1M: - if(size & 0xfffff) return CELL_EALIGN; - addr = Memory.Alloc(size, 0x100000); - break; - - case SYS_MEMORY_PAGE_SIZE_64K: - if(size & 0xffff) return CELL_EALIGN; - addr = Memory.Alloc(size, 0x10000); - break; - - default: return CELL_EINVAL; - } - - if(!addr) - return CELL_ENOMEM; - - // Write back the start address of the allocated area. - sc_mem.Log("Memory allocated! [addr: 0x%x, size: 0x%x]", addr, size); - Memory.Write32(alloc_addr_addr, addr); - - return CELL_OK; -} - -int sys_memory_allocate_from_container(u32 size, u32 cid, u32 flags, u32 alloc_addr_addr) -{ - sc_mem.Log("sys_memory_allocate_from_container(size=0x%x, cid=0x%x, flags=0x%x)", size, cid, flags); - - // Check if this container ID is valid. - MemoryContainerInfo* ct; - if(!sc_mem.CheckId(cid, ct)) - return CELL_ESRCH; - - // Check page size. - switch(flags) - { - case SYS_MEMORY_PAGE_SIZE_1M: - if(size & 0xfffff) return CELL_EALIGN; - ct->addr = Memory.Alloc(size, 0x100000); - break; - - case SYS_MEMORY_PAGE_SIZE_64K: - if(size & 0xffff) return CELL_EALIGN; - ct->addr = Memory.Alloc(size, 0x10000); - break; - - default: return CELL_EINVAL; - } - - // Store the address and size in the container. - if(!ct->addr) - return CELL_ENOMEM; - ct->size = size; - - // Write back the start address of the allocated area. - sc_mem.Log("Memory allocated! [addr: 0x%x, size: 0x%x]", ct->addr, ct->size); - Memory.Write32(alloc_addr_addr, ct->addr); - - return CELL_OK; -} - -int sys_memory_free(u32 start_addr) -{ - sc_mem.Log("sys_memory_free(start_addr=0x%x)", start_addr); - - // Release the allocated memory. - if(!Memory.Free(start_addr)) - return CELL_EFAULT; - - return CELL_OK; -} - -int sys_memory_get_page_attribute(u32 addr, mem_ptr_t attr) -{ - sc_mem.Warning("sys_memory_get_page_attribute(addr=0x%x, attr_addr=0x%x)", addr, attr.GetAddr()); - - if (!attr.IsGood()) - return CELL_EFAULT; - - // TODO: Implement per thread page attribute setting. - attr->attribute = 0; - attr->page_size = 0; - attr->access_right = 0; - attr->pad = 0; - - return CELL_OK; -} - -int sys_memory_get_user_memory_size(mem_ptr_t mem_info) -{ - sc_mem.Warning("sys_memory_get_user_memory_size(mem_info_addr=0x%x)", mem_info.GetAddr()); - - // Fetch the user memory available. - mem_info->total_user_memory = Memory.GetUserMemTotalSize(); - mem_info->available_user_memory = Memory.GetUserMemAvailSize(); - return CELL_OK; -} - -int sys_memory_container_create(mem32_t cid, u32 yield_size) -{ - sc_mem.Warning("sys_memory_container_create(cid_addr=0x%x, yield_size=0x%x)", cid.GetAddr(), yield_size); - - if (!cid.IsGood()) - return CELL_EFAULT; - - yield_size &= ~0xfffff; //round down to 1 MB granularity - u64 addr = Memory.Alloc(yield_size, 0x100000); //1 MB alignment - - if(!addr) - return CELL_ENOMEM; - - // Wrap the allocated memory in a memory container. - MemoryContainerInfo *ct = new MemoryContainerInfo(addr, yield_size); - cid = sc_mem.GetNewId(ct); - procObjects.mem_objects.insert(cid); - - sc_mem.Warning("*** memory_container created(addr=0x%llx): id = %d", addr, cid.GetValue()); - - return CELL_OK; -} - -int sys_memory_container_destroy(u32 cid) -{ - sc_mem.Warning("sys_memory_container_destroy(cid=%d)", cid); - - // Check if this container ID is valid. - MemoryContainerInfo* ct; - if(!sc_mem.CheckId(cid, ct)) - return CELL_ESRCH; - - // Release the allocated memory and remove the ID. - Memory.Free(ct->addr); - Emu.GetIdManager().RemoveID(cid); - - return CELL_OK; -} - -int sys_memory_container_get_size(mem_ptr_t mem_info, u32 cid) -{ - sc_mem.Warning("sys_memory_container_get_size(mem_info_addr=0x%x, cid=%d)", mem_info.GetAddr(), cid); - - // Check if this container ID is valid. - MemoryContainerInfo* ct; - if(!sc_mem.CheckId(cid, ct)) - return CELL_ESRCH; - - // HACK: Return all memory. - sys_memory_info_t info; - mem_info->total_user_memory = ct->size; - mem_info->available_user_memory = ct->size; - return CELL_OK; -} - -int sys_mmapper_allocate_address(u32 size, u64 flags, u32 alignment, u32 alloc_addr) -{ - sc_mem.Warning("sys_mmapper_allocate_address(size=0x%x, flags=0x%llx, alignment=0x%x, alloc_addr=0x%x)", - size, flags, alignment, alloc_addr); - - if(!Memory.IsGoodAddr(alloc_addr)) - return CELL_EFAULT; - - // Check for valid alignment. - if(alignment > 0x80000000) - return CELL_EALIGN; - - // Check page size. - u32 addr; - switch(flags & (SYS_MEMORY_PAGE_SIZE_1M | SYS_MEMORY_PAGE_SIZE_64K)) - { - default: - case SYS_MEMORY_PAGE_SIZE_1M: - if(Memory.AlignAddr(size, alignment) & 0xfffff) - return CELL_EALIGN; - addr = Memory.Alloc(size, 0x100000); - break; - - case SYS_MEMORY_PAGE_SIZE_64K: - if(Memory.AlignAddr(size, alignment) & 0xffff) - return CELL_EALIGN; - addr = Memory.Alloc(size, 0x10000); - break; - } - - // Write back the start address of the allocated area. - Memory.Write32(alloc_addr, addr); - - return CELL_OK; -} - -int sys_mmapper_allocate_fixed_address() -{ - sc_mem.Warning("sys_mmapper_allocate_fixed_address"); - - // Allocate a fixed size from user memory. - if (!Memory.Alloc(SYS_MMAPPER_FIXED_SIZE, 0x100000)) - return CELL_EEXIST; - - return CELL_OK; -} - -int sys_mmapper_allocate_memory(u32 size, u64 flags, mem32_t mem_id) -{ - sc_mem.Warning("sys_mmapper_allocate_memory(size=0x%x, flags=0x%llx, mem_id_addr=0x%x)", size, flags, mem_id.GetAddr()); - - if(!mem_id.IsGood()) - return CELL_EFAULT; - - // Check page granularity. - u32 addr; - switch(flags & (SYS_MEMORY_PAGE_SIZE_1M | SYS_MEMORY_PAGE_SIZE_64K)) - { - case SYS_MEMORY_PAGE_SIZE_1M: - if(size & 0xfffff) - return CELL_EALIGN; - addr = Memory.Alloc(size, 0x100000); - break; - - case SYS_MEMORY_PAGE_SIZE_64K: - if(size & 0xffff) - return CELL_EALIGN; - addr = Memory.Alloc(size, 0x10000); - break; - - default: - return CELL_EINVAL; - } - - if(!addr) - return CELL_ENOMEM; - - // Generate a new mem ID. - mem_id = sc_mem.GetNewId(new mmapper_info(addr, size, flags)); - - return CELL_OK; -} - -int sys_mmapper_allocate_memory_from_container(u32 size, u32 cid, u64 flags, mem32_t mem_id) -{ - sc_mem.Warning("sys_mmapper_allocate_memory_from_container(size=0x%x, cid=%d, flags=0x%llx, mem_id_addr=0x%x)", - size, cid, flags, mem_id.GetAddr()); - - if(!mem_id.IsGood()) - return CELL_EFAULT; - - // Check if this container ID is valid. - MemoryContainerInfo* ct; - if(!sc_mem.CheckId(cid, ct)) - return CELL_ESRCH; - - // Check page granularity. - switch(flags & (SYS_MEMORY_PAGE_SIZE_1M | SYS_MEMORY_PAGE_SIZE_64K)) - { - case SYS_MEMORY_PAGE_SIZE_1M: - if(size & 0xfffff) - return CELL_EALIGN; - ct->addr = Memory.Alloc(size, 0x100000); - break; - - case SYS_MEMORY_PAGE_SIZE_64K: - if(size & 0xffff) - return CELL_EALIGN; - ct->addr = Memory.Alloc(size, 0x10000); - break; - - default: - return CELL_EINVAL; - } - - if(!ct->addr) - return CELL_ENOMEM; - ct->size = size; - - // Generate a new mem ID. - mem_id = sc_mem.GetNewId(new mmapper_info(ct->addr, ct->size, flags)); - - return CELL_OK; -} - -int sys_mmapper_change_address_access_right(u32 start_addr, u64 flags) -{ - sc_mem.Warning("sys_mmapper_change_address_access_right(start_addr=0x%x, flags=0x%llx)", start_addr, flags); - - if (!Memory.IsGoodAddr(start_addr)) - return CELL_EINVAL; - - // TODO - - return CELL_OK; -} - -int sys_mmapper_free_address(u32 start_addr) -{ - sc_mem.Warning("sys_mmapper_free_address(start_addr=0x%x)", start_addr); - - if(!Memory.IsGoodAddr(start_addr)) - return CELL_EINVAL; - - // Free the address. - Memory.Free(start_addr); - return CELL_OK; -} - -int sys_mmapper_free_memory(u32 mem_id) -{ - sc_mem.Warning("sys_mmapper_free_memory(mem_id=0x%x)", mem_id); - - // Check if this mem ID is valid. - mmapper_info* info; - if(!sc_mem.CheckId(mem_id, info)) - return CELL_ESRCH; - - // Release the allocated memory and remove the ID. - Memory.Free(info->addr); - Emu.GetIdManager().RemoveID(mem_id); - - return CELL_OK; -} - -int sys_mmapper_map_memory(u32 start_addr, u32 mem_id, u64 flags) -{ - sc_mem.Warning("sys_mmapper_map_memory(start_addr=0x%x, mem_id=0x%x, flags=0x%llx)", start_addr, mem_id, flags); - - // Check if this mem ID is valid. - mmapper_info* info; - if(!sc_mem.CheckId(mem_id, info)) - return CELL_ESRCH; - - // Map the memory into the process address. - if(!Memory.Map(start_addr, info->addr, info->size)) - sc_mem.Error("sys_mmapper_map_memory failed!"); - - // Keep track of mapped addresses. - mmapper_info_map[mem_id] = start_addr; - - return CELL_OK; -} - -int sys_mmapper_search_and_map(u32 start_addr, u32 mem_id, u64 flags, u32 alloc_addr) -{ - sc_mem.Warning("sys_mmapper_search_and_map(start_addr=0x%x, mem_id=0x%x, flags=0x%llx, alloc_addr=0x%x)", - start_addr, mem_id, flags, alloc_addr); - - if(!Memory.IsGoodAddr(alloc_addr)) - return CELL_EFAULT; - - // Check if this mem ID is valid. - mmapper_info* info; - if(!sc_mem.CheckId(mem_id, info)) - return CELL_ESRCH; - - // Search for a mappable address. - u32 addr; - bool found; - for (int i = 0; i < SYS_MMAPPER_FIXED_SIZE; i += 0x100000) - { - addr = start_addr + i; - found = Memory.Map(addr, info->addr, info->size); - if(found) - { - sc_mem.Warning("Found and mapped address 0x%x", addr); - break; - } - } - - // Check if the address is valid. - if (!Memory.IsGoodAddr(addr) || !found) - return CELL_ENOMEM; - - // Write back the start address of the allocated area. - Memory.Write32(alloc_addr, addr); - - // Keep track of mapped addresses. - mmapper_info_map[mem_id] = addr; - - return CELL_OK; -} - -int sys_mmapper_unmap_memory(u32 start_addr, u32 mem_id_addr) -{ - sc_mem.Warning("sys_mmapper_unmap_memory(start_addr=0x%x, mem_id_addr=0x%x)", start_addr, mem_id_addr); - - if (!Memory.IsGoodAddr(start_addr)) - return CELL_EINVAL; - - if (!Memory.IsGoodAddr(mem_id_addr)) - return CELL_EFAULT; - - // Write back the mem ID of the unmapped area. - u32 mem_id = mmapper_info_map.find(start_addr)->first; - Memory.Write32(mem_id_addr, mem_id); - - return CELL_OK; -} - -int sys_mmapper_enable_page_fault_notification(u32 start_addr, u32 q_id) -{ - sc_mem.Warning("sys_mmapper_enable_page_fault_notification(start_addr=0x%x, q_id=0x%x)", start_addr, q_id); - - if (!Memory.IsGoodAddr(start_addr)) - return CELL_EINVAL; - - // TODO - - return CELL_OK; -} diff --git a/rpcs3/Emu/SysCalls/lv2/sys_event.cpp b/rpcs3/Emu/SysCalls/lv2/sys_event.cpp index f49afa78dd..3ecaa3295d 100644 --- a/rpcs3/Emu/SysCalls/lv2/sys_event.cpp +++ b/rpcs3/Emu/SysCalls/lv2/sys_event.cpp @@ -6,7 +6,7 @@ #include "Emu/SysCalls/SysCalls.h" #include "Emu/Cell/SPUThread.h" -#include "Emu/event.h" +#include "Emu/Event.h" #include "sys_lwmutex.h" #include "sys_event.h" diff --git a/rpcs3/Emu/SysCalls/lv2/sys_event.h b/rpcs3/Emu/SysCalls/lv2/sys_event.h index 000775900f..e823c7832b 100644 --- a/rpcs3/Emu/SysCalls/lv2/sys_event.h +++ b/rpcs3/Emu/SysCalls/lv2/sys_event.h @@ -1,5 +1,5 @@ #pragma once -#include "Emu/event.h" +#include "Emu/Event.h" enum { diff --git a/rpcs3/Emu/SysCalls/lv2/sys_timer.cpp b/rpcs3/Emu/SysCalls/lv2/sys_timer.cpp index cb94b404e6..276c5a6474 100644 --- a/rpcs3/Emu/SysCalls/lv2/sys_timer.cpp +++ b/rpcs3/Emu/SysCalls/lv2/sys_timer.cpp @@ -3,7 +3,7 @@ #include "Emu/Memory/Memory.h" #include "Emu/System.h" #include "Emu/SysCalls/SysCalls.h" -#include "Emu/event.h" +#include "Emu/Event.h" #include "sys_timer.h" SysCallBase sys_timer("sys_timer"); diff --git a/rpcs3/Emu/SysCalls/lv2/sys_tty.cpp b/rpcs3/Emu/SysCalls/lv2/sys_tty.cpp index de64701a6d..630f00a959 100644 --- a/rpcs3/Emu/SysCalls/lv2/sys_tty.cpp +++ b/rpcs3/Emu/SysCalls/lv2/sys_tty.cpp @@ -7,7 +7,7 @@ s32 sys_tty_read(u32 ch, u64 buf_addr, u32 len, u64 preadlen_addr) { - //we currently do not support reading from the Console + // We currently do not support reading from the Console LOG_WARNING(HLE, "sys_tty_read: ch: %d, buf addr: %llx, len: %d", ch, buf_addr, len); Memory.Write32NN(preadlen_addr, len); Emu.Pause(); @@ -20,15 +20,12 @@ s32 sys_tty_write(u32 ch, u64 buf_addr, u32 len, u64 pwritelen_addr) if(ch > 15 || (s32)len <= 0) return CELL_EINVAL; if(!Memory.IsGoodAddr(buf_addr)) return CELL_EFAULT; - //ch 0 seems to be stdout and ch 1 stderr - if (ch == 1) - { - LOG_ERROR(TTY, Memory.ReadString(buf_addr, len)); - } - else - { + if (ch == SYS_TTYP_PPU_STDOUT || ch == SYS_TTYP_SPU_STDOUT || (ch >= SYS_TTYP_USER1 && ch <= SYS_TTYP_USER13)) { LOG_NOTICE(TTY, Memory.ReadString(buf_addr, len)); } + if (ch == SYS_TTYP_PPU_STDERR) { + LOG_ERROR(TTY, Memory.ReadString(buf_addr, len)); + } if(!Memory.IsGoodAddr(pwritelen_addr)) return CELL_EFAULT; diff --git a/rpcs3/Emu/SysCalls/lv2/sys_tty.h b/rpcs3/Emu/SysCalls/lv2/sys_tty.h index b65e72ea90..47a6e8a930 100644 --- a/rpcs3/Emu/SysCalls/lv2/sys_tty.h +++ b/rpcs3/Emu/SysCalls/lv2/sys_tty.h @@ -1,4 +1,27 @@ #pragma once +// TTY channels +enum +{ + SYS_TTYP_PPU_STDIN = 0, + SYS_TTYP_PPU_STDOUT = 0, + SYS_TTYP_PPU_STDERR = 1, + SYS_TTYP_SPU_STDOUT = 2, + SYS_TTYP_USER1 = 3, + SYS_TTYP_USER2 = 4, + SYS_TTYP_USER3 = 5, + SYS_TTYP_USER4 = 6, + SYS_TTYP_USER5 = 7, + SYS_TTYP_USER6 = 8, + SYS_TTYP_USER7 = 9, + SYS_TTYP_USER8 = 10, + SYS_TTYP_USER9 = 11, + SYS_TTYP_USER10 = 12, + SYS_TTYP_USER11 = 13, + SYS_TTYP_USER12 = 14, + SYS_TTYP_USER13 = 15, +}; + +// SysCalls s32 sys_tty_read(u32 ch, u64 buf_addr, u32 len, u64 preadlen_addr); s32 sys_tty_write(u32 ch, u64 buf_addr, u32 len, u64 pwritelen_addr);