diff --git a/rpcs3/Emu/Cell/Modules/cellKb.cpp b/rpcs3/Emu/Cell/Modules/cellKb.cpp index e0ec6d1a43..3679c2a2e0 100644 --- a/rpcs3/Emu/Cell/Modules/cellKb.cpp +++ b/rpcs3/Emu/Cell/Modules/cellKb.cpp @@ -5,6 +5,9 @@ #include "Emu/Io/KeyboardHandler.h" #include "cellKb.h" +extern void libio_sys_config_init(); +extern void libio_sys_config_end(); + LOG_CHANNEL(sys_io); template<> @@ -42,6 +45,7 @@ error_code cellKbInit(u32 max_connect) if (max_connect == 0 || max_connect > CELL_KB_MAX_KEYBOARDS) return CELL_KB_ERROR_INVALID_PARAMETER; + libio_sys_config_init(); handler->Init(std::min(max_connect, 7u)); return CELL_OK; @@ -59,6 +63,7 @@ error_code cellKbEnd() return CELL_KB_ERROR_UNINITIALIZED; // TODO + libio_sys_config_end(); return CELL_OK; } diff --git a/rpcs3/Emu/Cell/Modules/cellMouse.cpp b/rpcs3/Emu/Cell/Modules/cellMouse.cpp index cfb04a2402..a74d1590b6 100644 --- a/rpcs3/Emu/Cell/Modules/cellMouse.cpp +++ b/rpcs3/Emu/Cell/Modules/cellMouse.cpp @@ -6,6 +6,9 @@ #include "cellMouse.h" +extern void libio_sys_config_init(); +extern void libio_sys_config_end(); + LOG_CHANNEL(sys_io); template<> @@ -45,6 +48,7 @@ error_code cellMouseInit(u32 max_connect) return CELL_MOUSE_ERROR_INVALID_PARAMETER; } + libio_sys_config_init(); handler->Init(std::min(max_connect, 7u)); return CELL_OK; @@ -99,6 +103,7 @@ error_code cellMouseEnd() return CELL_MOUSE_ERROR_UNINITIALIZED; // TODO + libio_sys_config_end(); return CELL_OK; } diff --git a/rpcs3/Emu/Cell/Modules/cellPad.cpp b/rpcs3/Emu/Cell/Modules/cellPad.cpp index f00e1790ca..190e37c97b 100644 --- a/rpcs3/Emu/Cell/Modules/cellPad.cpp +++ b/rpcs3/Emu/Cell/Modules/cellPad.cpp @@ -8,6 +8,9 @@ #include "Input/product_info.h" #include "cellPad.h" +extern void libio_sys_config_init(); +extern void libio_sys_config_end(); + LOG_CHANNEL(sys_io); template<> @@ -61,6 +64,7 @@ error_code cellPadInit(u32 max_connect) if (max_connect == 0 || max_connect > CELL_MAX_PADS) return CELL_PAD_ERROR_INVALID_PARAMETER; + libio_sys_config_init(); config->max_connect = std::min(max_connect, CELL_PAD_MAX_PORT_NUM); config->port_setting.fill(CELL_PAD_SETTING_PRESS_OFF | CELL_PAD_SETTING_SENSOR_OFF); return CELL_OK; @@ -77,6 +81,7 @@ error_code cellPadEnd() if (!config->max_connect.exchange(0)) return CELL_PAD_ERROR_UNINITIALIZED; + libio_sys_config_end(); return CELL_OK; } diff --git a/rpcs3/Emu/Cell/Modules/sys_io_.cpp b/rpcs3/Emu/Cell/Modules/sys_io_.cpp index 6dd88ec91d..211e06b9ad 100644 --- a/rpcs3/Emu/Cell/Modules/sys_io_.cpp +++ b/rpcs3/Emu/Cell/Modules/sys_io_.cpp @@ -1,4 +1,6 @@ #include "stdafx.h" +#include "Emu/System.h" +#include "Emu/IdManager.h" #include "Emu/Cell/PPUModule.h" LOG_CHANNEL(sys_io); @@ -7,10 +9,51 @@ extern void cellPad_init(); extern void cellKb_init(); extern void cellMouse_init(); +struct libio_sys_config +{ + shared_mutex mtx; + s32 init_ctr = 0; + u32 stack_addr = 0; + + ~libio_sys_config() noexcept + { + if (stack_addr) + { + vm::dealloc_verbose_nothrow(stack_addr, vm::stack); + } + } +}; + +// Only exists internally (has no name) +extern void libio_sys_config_init() +{ + auto cfg = g_fxo->get(); + + std::lock_guard lock(cfg->mtx); + + if (cfg->init_ctr++ == 0) + { + // Belongs to "_cfg_evt_hndlr" thread (8k stack) + cfg->stack_addr = verify(HERE, vm::alloc(0x2000, vm::stack, 4096)); + } +} + +extern void libio_sys_config_end() +{ + auto cfg = g_fxo->get(); + + std::lock_guard lock(cfg->mtx); + + if (cfg->init_ctr-- == 1) + { + verify(HERE), vm::dealloc(std::exchange(cfg->stack_addr, 0), vm::stack); + } +} error_code sys_config_start() { sys_io.todo("sys_config_start()"); + return CELL_OK; }