2020-12-05 13:08:24 +01:00
|
|
|
#include "stdafx.h"
|
2020-09-26 09:08:12 +02:00
|
|
|
#include "Emu/System.h"
|
|
|
|
|
#include "Emu/IdManager.h"
|
2016-03-21 20:42:14 +01:00
|
|
|
#include "Emu/Cell/PPUModule.h"
|
2013-06-30 10:46:29 +02:00
|
|
|
|
2018-08-25 14:39:00 +02:00
|
|
|
LOG_CHANNEL(sys_io);
|
2013-06-30 10:46:29 +02:00
|
|
|
|
2014-09-03 18:33:30 +02:00
|
|
|
extern void cellPad_init();
|
|
|
|
|
extern void cellKb_init();
|
|
|
|
|
extern void cellMouse_init();
|
2014-06-25 00:38:34 +02:00
|
|
|
|
2020-09-26 09:08:12 +02:00
|
|
|
struct libio_sys_config
|
|
|
|
|
{
|
|
|
|
|
shared_mutex mtx;
|
|
|
|
|
s32 init_ctr = 0;
|
|
|
|
|
u32 stack_addr = 0;
|
|
|
|
|
|
|
|
|
|
~libio_sys_config() noexcept
|
|
|
|
|
{
|
|
|
|
|
if (stack_addr)
|
|
|
|
|
{
|
2021-01-09 15:35:54 +01:00
|
|
|
ensure(vm::dealloc(stack_addr, vm::stack));
|
2020-09-26 09:08:12 +02:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
// Only exists internally (has no name)
|
|
|
|
|
extern void libio_sys_config_init()
|
|
|
|
|
{
|
2021-03-02 12:59:19 +01:00
|
|
|
auto& cfg = g_fxo->get<libio_sys_config>();
|
2020-09-26 09:08:12 +02:00
|
|
|
|
2021-03-02 12:59:19 +01:00
|
|
|
std::lock_guard lock(cfg.mtx);
|
2020-09-26 09:08:12 +02:00
|
|
|
|
2021-03-02 12:59:19 +01:00
|
|
|
if (cfg.init_ctr++ == 0)
|
2020-09-26 09:08:12 +02:00
|
|
|
{
|
|
|
|
|
// Belongs to "_cfg_evt_hndlr" thread (8k stack)
|
2021-03-02 12:59:19 +01:00
|
|
|
cfg.stack_addr = ensure(vm::alloc(0x2000, vm::stack, 4096));
|
2020-09-26 09:08:12 +02:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
extern void libio_sys_config_end()
|
|
|
|
|
{
|
2021-03-02 12:59:19 +01:00
|
|
|
auto& cfg = g_fxo->get<libio_sys_config>();
|
2020-09-26 09:08:12 +02:00
|
|
|
|
2021-03-02 12:59:19 +01:00
|
|
|
std::lock_guard lock(cfg.mtx);
|
2020-09-26 09:08:12 +02:00
|
|
|
|
2021-03-02 12:59:19 +01:00
|
|
|
if (cfg.init_ctr-- == 1)
|
2020-09-26 09:08:12 +02:00
|
|
|
{
|
2021-03-02 12:59:19 +01:00
|
|
|
ensure(vm::dealloc(std::exchange(cfg.stack_addr, 0), vm::stack));
|
2020-09-26 09:08:12 +02:00
|
|
|
}
|
|
|
|
|
}
|
2015-08-01 03:46:42 +02:00
|
|
|
|
2020-07-16 12:14:57 +02:00
|
|
|
error_code sys_config_start()
|
2015-08-01 03:46:42 +02:00
|
|
|
{
|
2019-09-02 13:41:57 +02:00
|
|
|
sys_io.todo("sys_config_start()");
|
2020-09-26 09:08:12 +02:00
|
|
|
|
2019-09-02 13:41:57 +02:00
|
|
|
return CELL_OK;
|
2015-08-01 03:46:42 +02:00
|
|
|
}
|
|
|
|
|
|
2020-07-16 12:14:57 +02:00
|
|
|
error_code sys_config_stop()
|
2015-08-01 03:46:42 +02:00
|
|
|
{
|
2019-09-02 13:41:57 +02:00
|
|
|
sys_io.todo("sys_config_stop()");
|
|
|
|
|
return CELL_OK;
|
2015-08-01 03:46:42 +02:00
|
|
|
}
|
|
|
|
|
|
2020-07-16 12:14:57 +02:00
|
|
|
error_code sys_config_add_service_listener()
|
2015-08-01 03:46:42 +02:00
|
|
|
{
|
2019-09-02 13:41:57 +02:00
|
|
|
sys_io.todo("sys_config_add_service_listener()");
|
|
|
|
|
return CELL_OK;
|
2015-08-01 03:46:42 +02:00
|
|
|
}
|
|
|
|
|
|
2020-07-16 12:14:57 +02:00
|
|
|
error_code sys_config_remove_service_listener()
|
2015-08-01 03:46:42 +02:00
|
|
|
{
|
2019-09-02 13:41:57 +02:00
|
|
|
sys_io.todo("sys_config_remove_service_listener()");
|
|
|
|
|
return CELL_OK;
|
2015-08-01 03:46:42 +02:00
|
|
|
}
|
|
|
|
|
|
2020-07-16 12:14:57 +02:00
|
|
|
error_code sys_config_register_io_error_handler()
|
2017-02-13 03:46:02 +01:00
|
|
|
{
|
2019-09-02 13:41:57 +02:00
|
|
|
sys_io.todo("sys_config_register_io_error_handler()");
|
|
|
|
|
return CELL_OK;
|
2017-02-13 03:46:02 +01:00
|
|
|
}
|
|
|
|
|
|
2020-07-16 12:14:57 +02:00
|
|
|
error_code sys_config_register_service()
|
2015-08-01 03:46:42 +02:00
|
|
|
{
|
2019-09-02 13:41:57 +02:00
|
|
|
sys_io.todo("sys_config_register_service()");
|
|
|
|
|
return CELL_OK;
|
2015-08-01 03:46:42 +02:00
|
|
|
}
|
|
|
|
|
|
2020-07-16 12:14:57 +02:00
|
|
|
error_code sys_config_unregister_io_error_handler()
|
2017-02-13 03:46:02 +01:00
|
|
|
{
|
2019-09-02 13:41:57 +02:00
|
|
|
sys_io.todo("sys_config_unregister_io_error_handler()");
|
|
|
|
|
return CELL_OK;
|
2017-02-13 03:46:02 +01:00
|
|
|
}
|
|
|
|
|
|
2020-07-16 12:14:57 +02:00
|
|
|
error_code sys_config_unregister_service()
|
2015-08-01 03:46:42 +02:00
|
|
|
{
|
2019-09-02 13:41:57 +02:00
|
|
|
sys_io.todo("sys_config_unregister_service()");
|
|
|
|
|
return CELL_OK;
|
2015-08-01 03:46:42 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2016-03-21 20:42:14 +01:00
|
|
|
DECLARE(ppu_module_manager::sys_io)("sys_io", []()
|
2013-06-30 10:46:29 +02:00
|
|
|
{
|
2014-09-03 18:33:30 +02:00
|
|
|
cellPad_init();
|
|
|
|
|
cellKb_init();
|
|
|
|
|
cellMouse_init();
|
2015-08-01 03:46:42 +02:00
|
|
|
|
|
|
|
|
REG_FUNC(sys_io, sys_config_start);
|
|
|
|
|
REG_FUNC(sys_io, sys_config_stop);
|
|
|
|
|
REG_FUNC(sys_io, sys_config_add_service_listener);
|
|
|
|
|
REG_FUNC(sys_io, sys_config_remove_service_listener);
|
2017-02-13 03:46:02 +01:00
|
|
|
REG_FUNC(sys_io, sys_config_register_io_error_handler);
|
2015-08-01 03:46:42 +02:00
|
|
|
REG_FUNC(sys_io, sys_config_register_service);
|
2017-02-13 03:46:02 +01:00
|
|
|
REG_FUNC(sys_io, sys_config_unregister_io_error_handler);
|
2015-08-01 03:46:42 +02:00
|
|
|
REG_FUNC(sys_io, sys_config_unregister_service);
|
2015-02-18 17:22:06 +01:00
|
|
|
});
|