mirror of
https://github.com/RPCS3/rpcs3.git
synced 2025-03-18 04:21:00 +00:00
Implement sys_dbg_read_process_memory and sys_dbg_write_process_memory
This commit is contained in:
parent
d266a25618
commit
c5dcef52fa
@ -7,6 +7,66 @@
|
||||
|
||||
logs::channel sys_lv2dbg("sys_lv2dbg");
|
||||
|
||||
template <>
|
||||
void fmt_class_string<CellLv2DbgError>::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<sys_dbg_ppu_thread_context_t> ppu_context)
|
||||
{
|
||||
fmt::throw_exception("Unimplemented" HERE);
|
||||
|
@ -12,7 +12,7 @@
|
||||
|
||||
|
||||
// Error Codes
|
||||
enum
|
||||
enum CellLv2DbgError : u32
|
||||
{
|
||||
CELL_LV2DBG_ERROR_DEINVALIDPROCESSID = 0x80010401,
|
||||
CELL_LV2DBG_ERROR_DEINVALIDTHREADID = 0x80010402,
|
||||
|
@ -790,8 +790,8 @@ const std::array<ppu_function_t, 1024> 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)
|
||||
|
@ -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<void> 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<u8>(address, size).get(), size);
|
||||
|
||||
return CELL_OK;
|
||||
}
|
||||
|
||||
error_code sys_dbg_write_process_memory(s32 pid, u32 address, u32 size, vm::cptr<void> 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<u8>(address, size).get(), data.get_ptr(), size);
|
||||
|
||||
return CELL_OK;
|
||||
}
|
||||
|
@ -1 +1,6 @@
|
||||
#pragma once
|
||||
|
||||
// Syscalls
|
||||
|
||||
error_code sys_dbg_read_process_memory(s32 pid, u32 address, u32 size, vm::ptr<void> data);
|
||||
error_code sys_dbg_write_process_memory(s32 pid, u32 address, u32 size, vm::cptr<void> data);
|
||||
|
Loading…
x
Reference in New Issue
Block a user