From d555eeb0f44fb61bb5404e20fc4ab683bbe2d6a3 Mon Sep 17 00:00:00 2001 From: eladash Date: Sun, 17 Mar 2019 19:51:24 +0200 Subject: [PATCH] Check start status in sys_prx_start/stop_module --- rpcs3/Emu/Cell/lv2/sys_prx.cpp | 10 ++++------ rpcs3/Emu/Cell/lv2/sys_prx.h | 2 +- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/rpcs3/Emu/Cell/lv2/sys_prx.cpp b/rpcs3/Emu/Cell/lv2/sys_prx.cpp index 44980dc627..76e206fbbb 100644 --- a/rpcs3/Emu/Cell/lv2/sys_prx.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_prx.cpp @@ -236,10 +236,9 @@ error_code _sys_prx_start_module(u32 id, u64 flags, vm::ptris_started) - // return CELL_PRX_ERROR_ALREADY_STARTED; + if (prx->is_started.exchange(true)) + return not_an_error(CELL_PRX_ERROR_ALREADY_STARTED); - //prx->is_started = true; pOpt->entry.set(prx->start ? prx->start.addr() : ~0ull); pOpt->entry2.set(prx->prologue ? prx->prologue.addr() : ~0ull); return CELL_OK; @@ -256,10 +255,9 @@ error_code _sys_prx_stop_module(u32 id, u64 flags, vm::ptris_started) - // return CELL_PRX_ERROR_ALREADY_STOPPED; + if (!prx->is_started.exchange(false)) + return not_an_error(CELL_PRX_ERROR_ALREADY_STOPPED); - //prx->is_started = false; pOpt->entry.set(prx->stop ? prx->stop.addr() : ~0ull); pOpt->entry2.set(prx->epilogue ? prx->epilogue.addr() : ~0ull); diff --git a/rpcs3/Emu/Cell/lv2/sys_prx.h b/rpcs3/Emu/Cell/lv2/sys_prx.h index 26643b517d..ffc967e604 100644 --- a/rpcs3/Emu/Cell/lv2/sys_prx.h +++ b/rpcs3/Emu/Cell/lv2/sys_prx.h @@ -119,7 +119,7 @@ struct lv2_prx final : lv2_obj, ppu_module { static const u32 id_base = 0x23000000; - bool is_started = false; + atomic_t is_started = false; std::unordered_map specials; std::unordered_map imports;