diff --git a/rpcs3/Emu/Cell/Modules/sys_lv2dbg.cpp b/rpcs3/Emu/Cell/Modules/sys_lv2dbg.cpp index 57a950cfc2..c461ad1364 100644 --- a/rpcs3/Emu/Cell/Modules/sys_lv2dbg.cpp +++ b/rpcs3/Emu/Cell/Modules/sys_lv2dbg.cpp @@ -7,6 +7,66 @@ logs::channel sys_lv2dbg("sys_lv2dbg"); +template <> +void fmt_class_string::format(std::string& out, u64 arg) +{ + format_enum(out, arg, [](CellLv2DbgError value) + { + switch (value) + { + STR_CASE(CELL_LV2DBG_ERROR_DEINVALIDPROCESSID); + STR_CASE(CELL_LV2DBG_ERROR_DEINVALIDTHREADID); + STR_CASE(CELL_LV2DBG_ERROR_DEILLEGALREGISTERTYPE); + STR_CASE(CELL_LV2DBG_ERROR_DEILLEGALREGISTERNUMBER); + STR_CASE(CELL_LV2DBG_ERROR_DEILLEGALTHREADSTATE); + STR_CASE(CELL_LV2DBG_ERROR_DEINVALIDEFFECTIVEADDRESS); + STR_CASE(CELL_LV2DBG_ERROR_DENOTFOUNDPROCESSID); + STR_CASE(CELL_LV2DBG_ERROR_DENOMEM); + STR_CASE(CELL_LV2DBG_ERROR_DEINVALIDARGUMENTS); + STR_CASE(CELL_LV2DBG_ERROR_DENOTFOUNDFILE); + STR_CASE(CELL_LV2DBG_ERROR_DEINVALIDFILETYPE); + STR_CASE(CELL_LV2DBG_ERROR_DENOTFOUNDTHREADID); + STR_CASE(CELL_LV2DBG_ERROR_DEINVALIDTHREADSTATUS); + STR_CASE(CELL_LV2DBG_ERROR_DENOAVAILABLEPROCESSID); + STR_CASE(CELL_LV2DBG_ERROR_DENOTFOUNDEVENTHANDLER); + STR_CASE(CELL_LV2DBG_ERROR_DESPNOROOM); + STR_CASE(CELL_LV2DBG_ERROR_DESPNOTFOUND); + STR_CASE(CELL_LV2DBG_ERROR_DESPINPROCESS); + STR_CASE(CELL_LV2DBG_ERROR_DEINVALIDPRIMARYSPUTHREADID); + STR_CASE(CELL_LV2DBG_ERROR_DETHREADSTATEISNOTSTOPPED); + STR_CASE(CELL_LV2DBG_ERROR_DEINVALIDTHREADTYPE); + STR_CASE(CELL_LV2DBG_ERROR_DECONTINUEFAILED); + STR_CASE(CELL_LV2DBG_ERROR_DESTOPFAILED); + STR_CASE(CELL_LV2DBG_ERROR_DENOEXCEPTION); + STR_CASE(CELL_LV2DBG_ERROR_DENOMOREEVENTQUE); + STR_CASE(CELL_LV2DBG_ERROR_DEEVENTQUENOTCREATED); + STR_CASE(CELL_LV2DBG_ERROR_DEEVENTQUEOVERFLOWED); + STR_CASE(CELL_LV2DBG_ERROR_DENOTIMPLEMENTED); + STR_CASE(CELL_LV2DBG_ERROR_DEQUENOTREGISTERED); + STR_CASE(CELL_LV2DBG_ERROR_DENOMOREEVENTPROCESS); + STR_CASE(CELL_LV2DBG_ERROR_DEPROCESSNOTREGISTERED); + STR_CASE(CELL_LV2DBG_ERROR_DEEVENTDISCARDED); + STR_CASE(CELL_LV2DBG_ERROR_DENOMORESYNCID); + STR_CASE(CELL_LV2DBG_ERROR_DESYNCIDALREADYADDED); + STR_CASE(CELL_LV2DBG_ERROR_DESYNCIDNOTFOUND); + STR_CASE(CELL_LV2DBG_ERROR_DESYNCIDNOTACQUIRED); + STR_CASE(CELL_LV2DBG_ERROR_DEPROCESSALREADYREGISTERED); + STR_CASE(CELL_LV2DBG_ERROR_DEINVALIDLSADDRESS); + STR_CASE(CELL_LV2DBG_ERROR_DEINVALIDOPERATION); + STR_CASE(CELL_LV2DBG_ERROR_DEINVALIDMODULEID); + STR_CASE(CELL_LV2DBG_ERROR_DEHANDLERALREADYREGISTERED); + STR_CASE(CELL_LV2DBG_ERROR_DEINVALIDHANDLER); + STR_CASE(CELL_LV2DBG_ERROR_DEHANDLENOTREGISTERED); + STR_CASE(CELL_LV2DBG_ERROR_DEOPERATIONDENIED); + STR_CASE(CELL_LV2DBG_ERROR_DEHANDLERNOTINITIALIZED); + STR_CASE(CELL_LV2DBG_ERROR_DEHANDLERALREADYINITIALIZED); + STR_CASE(CELL_LV2DBG_ERROR_DEILLEGALCOREDUMPPARAMETER); + } + + return unknown; + }); +} + s32 sys_dbg_read_ppu_thread_context(u64 id, vm::ptr ppu_context) { fmt::throw_exception("Unimplemented" HERE); diff --git a/rpcs3/Emu/Cell/Modules/sys_lv2dbg.h b/rpcs3/Emu/Cell/Modules/sys_lv2dbg.h index 38a357790c..c903f4db3e 100644 --- a/rpcs3/Emu/Cell/Modules/sys_lv2dbg.h +++ b/rpcs3/Emu/Cell/Modules/sys_lv2dbg.h @@ -12,7 +12,7 @@ // Error Codes -enum +enum CellLv2DbgError : u32 { CELL_LV2DBG_ERROR_DEINVALIDPROCESSID = 0x80010401, CELL_LV2DBG_ERROR_DEINVALIDTHREADID = 0x80010402, diff --git a/rpcs3/Emu/Cell/lv2/lv2.cpp b/rpcs3/Emu/Cell/lv2/lv2.cpp index cd0799f5d9..d0cc4982a8 100644 --- a/rpcs3/Emu/Cell/lv2/lv2.cpp +++ b/rpcs3/Emu/Cell/lv2/lv2.cpp @@ -790,8 +790,8 @@ const std::array s_ppu_syscall_table null_func,//BIND_FUNC(sys_dbg_continue_processes) //901 (0x385) null_func,//BIND_FUNC(sys_dbg_stop_threads) //902 (0x386) null_func,//BIND_FUNC(sys_dbg_continue_threads) //903 (0x387) - null_func,//BIND_FUNC(sys_dbg_read_process_memory) //904 (0x388) - null_func,//BIND_FUNC(sys_dbg_write_process_memory) //905 (0x389) + BIND_FUNC(sys_dbg_read_process_memory), //904 (0x388) + BIND_FUNC(sys_dbg_write_process_memory), //905 (0x389) null_func,//BIND_FUNC(sys_dbg_read_thread_register) //906 (0x38A) null_func,//BIND_FUNC(sys_dbg_write_thread_register) //907 (0x38B) null_func,//BIND_FUNC(sys_dbg_get_process_list) //908 (0x38C) diff --git a/rpcs3/Emu/Cell/lv2/sys_dbg.cpp b/rpcs3/Emu/Cell/lv2/sys_dbg.cpp index a89978ccc3..cbe0320d56 100644 --- a/rpcs3/Emu/Cell/lv2/sys_dbg.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_dbg.cpp @@ -1,11 +1,70 @@ #include "stdafx.h" -#include "Emu/Memory/Memory.h" -#include "Emu/System.h" -#include "Emu/IdManager.h" #include "Emu/Cell/ErrorCodes.h" +#include "Emu/Memory/Memory.h" #include "sys_dbg.h" - - +#include "Emu/Cell/Modules/sys_lv2dbg.h" logs::channel sys_dbg("sys_dbg"); + +error_code sys_dbg_read_process_memory(s32 pid, u32 address, u32 size, vm::ptr data) +{ + sys_dbg.warning("sys_dbg_read_process_memory(pid=0x%x, address=0x%llx, size=0x%x, data=*0x%x)", pid, address, size, data); + + // Todo(TGEnigma): Process lookup (only 1 process exists right now) + if (pid != 1) + { + return CELL_LV2DBG_ERROR_DEINVALIDARGUMENTS; + } + + if (!vm::check_addr(address, size)) + { + return CELL_EFAULT; + } + + if (!size || !data) + { + return CELL_LV2DBG_ERROR_DEINVALIDARGUMENTS; + } + + // Check if data destination is writable + if (!vm::check_addr(data.addr(), size, vm::page_writable)) + { + return CELL_EFAULT; + } + + std::memcpy(data.get_ptr(), vm::get_super_ptr(address, size).get(), size); + + return CELL_OK; +} + +error_code sys_dbg_write_process_memory(s32 pid, u32 address, u32 size, vm::cptr data) +{ + sys_dbg.warning("sys_dbg_write_process_memory(pid=0x%x, address=0x%llx, size=0x%x, data=*0x%x)", pid, address, size, data); + + // Todo(TGEnigma): Process lookup (only 1 process exists right now) + if (pid != 1) + { + return CELL_LV2DBG_ERROR_DEINVALIDARGUMENTS; + } + + if (!vm::check_addr(address, size)) + { + return CELL_EFAULT; + } + + if (!size || !data) + { + return CELL_LV2DBG_ERROR_DEINVALIDARGUMENTS; + } + + // Check if data source is readable + if (!vm::check_addr(data.addr(), size, vm::page_readable)) + { + return CELL_EFAULT; + } + + std::memcpy(vm::get_super_ptr(address, size).get(), data.get_ptr(), size); + + return CELL_OK; +} diff --git a/rpcs3/Emu/Cell/lv2/sys_dbg.h b/rpcs3/Emu/Cell/lv2/sys_dbg.h index 6f70f09bee..0fec0b828a 100644 --- a/rpcs3/Emu/Cell/lv2/sys_dbg.h +++ b/rpcs3/Emu/Cell/lv2/sys_dbg.h @@ -1 +1,6 @@ #pragma once + +// Syscalls + +error_code sys_dbg_read_process_memory(s32 pid, u32 address, u32 size, vm::ptr data); +error_code sys_dbg_write_process_memory(s32 pid, u32 address, u32 size, vm::cptr data);