mirror of
https://github.com/Atmosphere-NX/Atmosphere.git
synced 2025-09-30 22:57:08 +02:00
cs: implement more of the system module's skeleton
This commit is contained in:
parent
070e9fd855
commit
b726119164
@ -58,6 +58,7 @@ namespace ams::scs {
|
|||||||
enum Response {
|
enum Response {
|
||||||
Response_None = 0,
|
Response_None = 0,
|
||||||
Response_Success = 1,
|
Response_Success = 1,
|
||||||
|
Response_Error = 2,
|
||||||
/* ... */
|
/* ... */
|
||||||
};
|
};
|
||||||
public:
|
public:
|
||||||
@ -66,6 +67,17 @@ namespace ams::scs {
|
|||||||
void Initialize();
|
void Initialize();
|
||||||
public:
|
public:
|
||||||
virtual bool ProcessCommand(const CommandHeader &header, const u8 *body, s32 socket);
|
virtual bool ProcessCommand(const CommandHeader &header, const u8 *body, s32 socket);
|
||||||
|
protected:
|
||||||
|
static void SendSuccess(s32 socket, const CommandHeader &header);
|
||||||
|
static void SendErrorResult(s32 socket, const CommandHeader &header, Result result);
|
||||||
|
private:
|
||||||
|
static void SendErrorResult(s32 socket, u64 id, Result result);
|
||||||
|
|
||||||
|
static void OnProcessStart(u64 id, s32 socket, os::ProcessId process_id);
|
||||||
|
static void OnProcessExit(u64 id, s32 socket, os::ProcessId process_id);
|
||||||
|
static void OnProcessJitDebug(u64 id, s32 socket, os::ProcessId process_id);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
os::SdkMutex &GetHtcsSendMutex();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -20,7 +20,7 @@
|
|||||||
|
|
||||||
namespace ams::scs {
|
namespace ams::scs {
|
||||||
|
|
||||||
using ProcessEventHandler = void(*)(s64 command_id, s32 socket, os::ProcessId process_id);
|
using ProcessEventHandler = void(*)(u64 id, s32 socket, os::ProcessId process_id);
|
||||||
|
|
||||||
void InitializeShell();
|
void InitializeShell();
|
||||||
|
|
||||||
@ -29,6 +29,8 @@ namespace ams::scs {
|
|||||||
bool RegisterSocket(s32 socket);
|
bool RegisterSocket(s32 socket);
|
||||||
void UnregisterSocket(s32 socket);
|
void UnregisterSocket(s32 socket);
|
||||||
|
|
||||||
Result SubscribeProcessEvent(s32 socket, bool is_register, s64 command_id);
|
Result LaunchProgram(os::ProcessId *out, ncm::ProgramId program_id, const void *args, size_t args_size, u32 process_flags);
|
||||||
|
|
||||||
|
Result SubscribeProcessEvent(s32 socket, bool is_register, u64 id);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -397,6 +397,7 @@ namespace ams::boot2 {
|
|||||||
/* Device whether to launch tma or htc. */
|
/* Device whether to launch tma or htc. */
|
||||||
if (svc::IsKernelMesosphere() && IsHtcEnabled()) {
|
if (svc::IsKernelMesosphere() && IsHtcEnabled()) {
|
||||||
LaunchProgram(nullptr, ncm::ProgramLocation::Make(ncm::SystemProgramId::Htc, ncm::StorageId::None), 0);
|
LaunchProgram(nullptr, ncm::ProgramLocation::Make(ncm::SystemProgramId::Htc, ncm::StorageId::None), 0);
|
||||||
|
LaunchProgram(nullptr, ncm::ProgramLocation::Make(ncm::SystemProgramId::Cs, ncm::StorageId::None), 0);
|
||||||
} else {
|
} else {
|
||||||
LaunchProgram(nullptr, ncm::ProgramLocation::Make(ncm::SystemProgramId::Tma, ncm::StorageId::BuiltInSystem), 0);
|
LaunchProgram(nullptr, ncm::ProgramLocation::Make(ncm::SystemProgramId::Tma, ncm::StorageId::BuiltInSystem), 0);
|
||||||
}
|
}
|
||||||
|
24
libraries/libstratosphere/source/cs/cs_audio_server.cpp
Normal file
24
libraries/libstratosphere/source/cs/cs_audio_server.cpp
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2018-2020 Atmosphère-NX
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
|
* under the terms and conditions of the GNU General Public License,
|
||||||
|
* version 2, as published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope it will be useful, but WITHOUT
|
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||||
|
* more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
#include <stratosphere.hpp>
|
||||||
|
|
||||||
|
namespace ams::cs {
|
||||||
|
|
||||||
|
void InitializeAudioServer() {
|
||||||
|
/* TODO: Support audio server. */
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
31
libraries/libstratosphere/source/cs/cs_command_processor.cpp
Normal file
31
libraries/libstratosphere/source/cs/cs_command_processor.cpp
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2018-2020 Atmosphère-NX
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
|
* under the terms and conditions of the GNU General Public License,
|
||||||
|
* version 2, as published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope it will be useful, but WITHOUT
|
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||||
|
* more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
#include <stratosphere.hpp>
|
||||||
|
|
||||||
|
namespace ams::cs {
|
||||||
|
|
||||||
|
bool CommandProcessor::ProcessCommand(const CommandHeader &header, const u8 *body, s32 socket) {
|
||||||
|
switch (header.command) {
|
||||||
|
/* TODO: Command support. */
|
||||||
|
default:
|
||||||
|
scs::CommandProcessor::ProcessCommand(header, body, socket);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
24
libraries/libstratosphere/source/cs/cs_hid_server.cpp
Normal file
24
libraries/libstratosphere/source/cs/cs_hid_server.cpp
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2018-2020 Atmosphère-NX
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
|
* under the terms and conditions of the GNU General Public License,
|
||||||
|
* version 2, as published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope it will be useful, but WITHOUT
|
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||||
|
* more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
#include <stratosphere.hpp>
|
||||||
|
|
||||||
|
namespace ams::cs {
|
||||||
|
|
||||||
|
void InitializeHidServer() {
|
||||||
|
/* TODO: Support hid redirection server. */
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,24 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2018-2020 Atmosphère-NX
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
|
* under the terms and conditions of the GNU General Public License,
|
||||||
|
* version 2, as published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope it will be useful, but WITHOUT
|
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||||
|
* more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
#include <stratosphere.hpp>
|
||||||
|
|
||||||
|
namespace ams::cs {
|
||||||
|
|
||||||
|
void InitializeRemoteVideoServer() {
|
||||||
|
/* TODO: Support remote video server. */
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
26
libraries/libstratosphere/source/cs/cs_target_io_server.cpp
Normal file
26
libraries/libstratosphere/source/cs/cs_target_io_server.cpp
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2018-2020 Atmosphère-NX
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
|
* under the terms and conditions of the GNU General Public License,
|
||||||
|
* version 2, as published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope it will be useful, but WITHOUT
|
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||||
|
* more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
#include <stratosphere.hpp>
|
||||||
|
|
||||||
|
namespace ams::cs {
|
||||||
|
|
||||||
|
void InitializeTargetIoServer() {
|
||||||
|
/* Launch target io server. */
|
||||||
|
os::ProcessId process_id;
|
||||||
|
scs::LaunchProgram(std::addressof(process_id), ncm::SystemProgramId::DevServer, nullptr, 0, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
26
libraries/libstratosphere/source/htc/tenv/htc_tenv.cpp
Normal file
26
libraries/libstratosphere/source/htc/tenv/htc_tenv.cpp
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2018-2020 Atmosphère-NX
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
|
* under the terms and conditions of the GNU General Public License,
|
||||||
|
* version 2, as published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope it will be useful, but WITHOUT
|
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||||
|
* more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
#include <stratosphere.hpp>
|
||||||
|
#include "impl/htc_tenv_allocator.hpp"
|
||||||
|
|
||||||
|
namespace ams::htc::tenv {
|
||||||
|
|
||||||
|
void Initialize(AllocateFunction allocate, DeallocateFunction deallocate) {
|
||||||
|
/* Initialize the library allocator. */
|
||||||
|
impl::InitializeAllocator(allocate, deallocate);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,36 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2018-2020 Atmosphère-NX
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
|
* under the terms and conditions of the GNU General Public License,
|
||||||
|
* version 2, as published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope it will be useful, but WITHOUT
|
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||||
|
* more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
#include <stratosphere.hpp>
|
||||||
|
#include "htc_tenv_service.hpp"
|
||||||
|
|
||||||
|
namespace ams::htc::tenv {
|
||||||
|
|
||||||
|
Result Service::GetVariable(sf::Out<s64> out_size, const sf::OutBuffer &out_buffer, const htc::tenv::VariableName &name) {
|
||||||
|
/* TODO */
|
||||||
|
AMS_ABORT("Service::GetVariable");
|
||||||
|
}
|
||||||
|
|
||||||
|
Result Service::GetVariableLength(sf::Out<s64> out_size,const htc::tenv::VariableName &name) {
|
||||||
|
/* TODO */
|
||||||
|
AMS_ABORT("Service::GetVariableLength");
|
||||||
|
}
|
||||||
|
|
||||||
|
Result Service::WaitUntilVariableAvailable(s64 timeout_ms) {
|
||||||
|
/* TODO */
|
||||||
|
AMS_ABORT("Service::WaitUntilVariableAvailable");
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,33 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2018-2020 Atmosphère-NX
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
|
* under the terms and conditions of the GNU General Public License,
|
||||||
|
* version 2, as published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope it will be useful, but WITHOUT
|
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||||
|
* more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
#pragma once
|
||||||
|
#include <stratosphere.hpp>
|
||||||
|
|
||||||
|
namespace ams::htc::tenv {
|
||||||
|
|
||||||
|
class Service {
|
||||||
|
private:
|
||||||
|
os::ProcessId m_process_id;
|
||||||
|
public:
|
||||||
|
constexpr Service(os::ProcessId pid) : m_process_id(pid) { /* ... */ }
|
||||||
|
public:
|
||||||
|
Result GetVariable(sf::Out<s64> out_size, const sf::OutBuffer &out_buffer, const htc::tenv::VariableName &name);
|
||||||
|
Result GetVariableLength(sf::Out<s64> out_size,const htc::tenv::VariableName &name);
|
||||||
|
Result WaitUntilVariableAvailable(s64 timeout_ms);
|
||||||
|
};
|
||||||
|
static_assert(htc::tenv::IsIService<Service>);
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,27 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2018-2020 Atmosphère-NX
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
|
* under the terms and conditions of the GNU General Public License,
|
||||||
|
* version 2, as published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope it will be useful, but WITHOUT
|
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||||
|
* more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
#include <stratosphere.hpp>
|
||||||
|
#include "impl/htc_tenv_allocator.hpp"
|
||||||
|
#include "htc_tenv_service.hpp"
|
||||||
|
|
||||||
|
namespace ams::htc::tenv {
|
||||||
|
|
||||||
|
Result ServiceManager::GetServiceInterface(sf::Out<sf::SharedPointer<htc::tenv::IService>> out, const sf::ClientProcessId &process_id) {
|
||||||
|
*out = impl::SfObjectFactory::CreateSharedEmplaced<htc::tenv::IService, Service>(process_id.GetValue());
|
||||||
|
return ResultSuccess();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,56 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2018-2020 Atmosphère-NX
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
|
* under the terms and conditions of the GNU General Public License,
|
||||||
|
* version 2, as published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope it will be useful, but WITHOUT
|
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||||
|
* more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
#include <stratosphere.hpp>
|
||||||
|
#include "htc_tenv_allocator.hpp"
|
||||||
|
|
||||||
|
namespace ams::htc::tenv::impl {
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
|
||||||
|
constinit AllocateFunction g_allocate = nullptr;
|
||||||
|
constinit DeallocateFunction g_deallocate = nullptr;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void InitializeAllocator(AllocateFunction allocate, DeallocateFunction deallocate) {
|
||||||
|
/* Check that we don't already have allocator functions. */
|
||||||
|
AMS_ASSERT(g_allocate == nullptr);
|
||||||
|
AMS_ASSERT(g_deallocate == nullptr);
|
||||||
|
|
||||||
|
/* Set our allocator functions. */
|
||||||
|
g_allocate = allocate;
|
||||||
|
g_deallocate = deallocate;
|
||||||
|
|
||||||
|
/* Check that we have allocator functions. */
|
||||||
|
AMS_ASSERT(g_allocate != nullptr);
|
||||||
|
AMS_ASSERT(g_deallocate != nullptr);
|
||||||
|
}
|
||||||
|
|
||||||
|
void *Allocate(size_t size) {
|
||||||
|
/* Check that we have an allocator. */
|
||||||
|
AMS_ASSERT(g_allocate != nullptr);
|
||||||
|
|
||||||
|
return g_allocate(size);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Deallocate(void *p, size_t size) {
|
||||||
|
/* Check that we have a deallocator. */
|
||||||
|
AMS_ASSERT(g_deallocate != nullptr);
|
||||||
|
|
||||||
|
return g_deallocate(p, size);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,42 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2018-2020 Atmosphère-NX
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
|
* under the terms and conditions of the GNU General Public License,
|
||||||
|
* version 2, as published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope it will be useful, but WITHOUT
|
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||||
|
* more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
#pragma once
|
||||||
|
#include <stratosphere.hpp>
|
||||||
|
|
||||||
|
namespace ams::htc::tenv::impl {
|
||||||
|
|
||||||
|
void InitializeAllocator(AllocateFunction allocate, DeallocateFunction deallocate);
|
||||||
|
|
||||||
|
void *Allocate(size_t size);
|
||||||
|
void Deallocate(void *p, size_t size);
|
||||||
|
|
||||||
|
class SfAllocator {
|
||||||
|
public:
|
||||||
|
constexpr ALWAYS_INLINE SfAllocator() { /* ... */ }
|
||||||
|
|
||||||
|
void *Allocate(size_t size) {
|
||||||
|
return ::ams::htc::tenv::impl::Allocate(size);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Deallocate(void *p, size_t size) {
|
||||||
|
return ::ams::htc::tenv::impl::Deallocate(p, size);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
using SfPolicy = sf::StatelessAllocationPolicy<SfAllocator>;
|
||||||
|
using SfObjectFactory = sf::ObjectFactory<SfPolicy>;
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,99 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2018-2020 Atmosphère-NX
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
|
* under the terms and conditions of the GNU General Public License,
|
||||||
|
* version 2, as published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope it will be useful, but WITHOUT
|
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||||
|
* more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
#include <stratosphere.hpp>
|
||||||
|
|
||||||
|
namespace ams::scs {
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
|
||||||
|
struct ResponseError {
|
||||||
|
ResponseHeader header;
|
||||||
|
u32 result;
|
||||||
|
};
|
||||||
|
|
||||||
|
constinit os::SdkMutex g_htcs_send_mutex;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
os::SdkMutex &GetHtcsSendMutex() {
|
||||||
|
return g_htcs_send_mutex;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CommandProcessor::SendSuccess(s32 socket, const CommandHeader &header) {
|
||||||
|
/* Build the response. */
|
||||||
|
const ResponseHeader response = {
|
||||||
|
.id = header.id,
|
||||||
|
.response = Response_Success,
|
||||||
|
.body_size = 0,
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Send the response. */
|
||||||
|
std::scoped_lock lk(GetHtcsSendMutex());
|
||||||
|
htcs::Send(socket, std::addressof(response), sizeof(response), 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CommandProcessor::SendErrorResult(s32 socket, const CommandHeader &header, Result result) {
|
||||||
|
return SendErrorResult(socket, header.id, result);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CommandProcessor::SendErrorResult(s32 socket, u64 id, Result result) {
|
||||||
|
/* Build the response. */
|
||||||
|
const ResponseError response = {
|
||||||
|
.header = {
|
||||||
|
.id = id,
|
||||||
|
.response = Response_Error,
|
||||||
|
.body_size = sizeof(response) - sizeof(response.header),
|
||||||
|
},
|
||||||
|
.result = result.GetValue(),
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Send the response. */
|
||||||
|
std::scoped_lock lk(GetHtcsSendMutex());
|
||||||
|
htcs::Send(socket, std::addressof(response), sizeof(response), 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CommandProcessor::OnProcessStart(u64 id, s32 socket, os::ProcessId process_id) {
|
||||||
|
/* TODO */
|
||||||
|
AMS_ABORT("CommandProcessor::OnProcessStart");
|
||||||
|
}
|
||||||
|
|
||||||
|
void CommandProcessor::OnProcessExit(u64 id, s32 socket, os::ProcessId process_id) {
|
||||||
|
/* TODO */
|
||||||
|
AMS_ABORT("CommandProcessor::OnProcessExit");
|
||||||
|
}
|
||||||
|
|
||||||
|
void CommandProcessor::OnProcessJitDebug(u64 id, s32 socket, os::ProcessId process_id) {
|
||||||
|
/* TODO */
|
||||||
|
AMS_ABORT("CommandProcessor::OnProcessJitDebug");
|
||||||
|
}
|
||||||
|
|
||||||
|
void CommandProcessor::Initialize() {
|
||||||
|
/* Register our process event handlers. */
|
||||||
|
scs::RegisterCommonProcessEventHandler(OnProcessStart, OnProcessExit, OnProcessJitDebug);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool CommandProcessor::ProcessCommand(const CommandHeader &header, const u8 *body, s32 socket) {
|
||||||
|
switch (header.command) {
|
||||||
|
/* TODO: Support commands. */
|
||||||
|
default:
|
||||||
|
SendErrorResult(socket, header, scs::ResultUnknownCommand());
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
38
libraries/libstratosphere/source/scs/scs_server_manager.cpp
Normal file
38
libraries/libstratosphere/source/scs/scs_server_manager.cpp
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2018-2020 Atmosphère-NX
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
|
* under the terms and conditions of the GNU General Public License,
|
||||||
|
* version 2, as published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope it will be useful, but WITHOUT
|
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||||
|
* more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
#include <stratosphere.hpp>
|
||||||
|
|
||||||
|
namespace ams::scs {
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
|
||||||
|
ServerManager g_server_manager;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
ServerManager *GetServerManager() {
|
||||||
|
return std::addressof(g_server_manager);
|
||||||
|
}
|
||||||
|
|
||||||
|
void StartServer() {
|
||||||
|
/* Start the server. */
|
||||||
|
g_server_manager.ResumeProcessing();
|
||||||
|
|
||||||
|
/* Loop processing the server. */
|
||||||
|
g_server_manager.LoopProcess();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
152
libraries/libstratosphere/source/scs/scs_shell.cpp
Normal file
152
libraries/libstratosphere/source/scs/scs_shell.cpp
Normal file
@ -0,0 +1,152 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2018-2020 Atmosphère-NX
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
|
* under the terms and conditions of the GNU General Public License,
|
||||||
|
* version 2, as published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope it will be useful, but WITHOUT
|
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||||
|
* more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
#include <stratosphere.hpp>
|
||||||
|
|
||||||
|
namespace ams::scs {
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
|
||||||
|
struct SocketInfo {
|
||||||
|
u64 id;
|
||||||
|
s32 socket;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct ProgramInfo {
|
||||||
|
os::ProcessId process_id;
|
||||||
|
u64 id;
|
||||||
|
s32 socket;
|
||||||
|
s32 info_id;
|
||||||
|
bool _18;
|
||||||
|
bool _19;
|
||||||
|
bool _1A;
|
||||||
|
};
|
||||||
|
|
||||||
|
constexpr inline auto MaxSocketInfo = 2;
|
||||||
|
constexpr inline auto MaxProgramInfo = 64;
|
||||||
|
|
||||||
|
class SocketInfoManager {
|
||||||
|
private:
|
||||||
|
SocketInfo m_infos[MaxProgramInfo];
|
||||||
|
int m_count;
|
||||||
|
public:
|
||||||
|
constexpr SocketInfoManager() = default;
|
||||||
|
|
||||||
|
void Initialize() {
|
||||||
|
/* Clear our count. */
|
||||||
|
m_count = 0;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
class ProgramInfoManager {
|
||||||
|
private:
|
||||||
|
s32 m_next_info_id;
|
||||||
|
ProgramInfo m_infos[MaxProgramInfo];
|
||||||
|
int m_count;
|
||||||
|
public:
|
||||||
|
constexpr ProgramInfoManager() = default;
|
||||||
|
|
||||||
|
void Initialize() {
|
||||||
|
/* Reset our next id. */
|
||||||
|
m_next_info_id = 1;
|
||||||
|
|
||||||
|
/* Clear our count. */
|
||||||
|
m_count = 0;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
alignas(os::ThreadStackAlignment) constinit u8 g_thread_stack[os::MemoryPageSize];
|
||||||
|
constinit os::ThreadType g_thread;
|
||||||
|
|
||||||
|
constinit ProcessEventHandler g_common_start_handler;
|
||||||
|
constinit ProcessEventHandler g_common_exit_handler;
|
||||||
|
constinit ProcessEventHandler g_common_jit_debug_handler;
|
||||||
|
|
||||||
|
constinit SocketInfoManager g_socket_info_manager;
|
||||||
|
constinit ProgramInfoManager g_program_info_manager;
|
||||||
|
|
||||||
|
void EventHandlerThread(void *) {
|
||||||
|
/* TODO */
|
||||||
|
AMS_ABORT("scs::EventHandlerThread");
|
||||||
|
}
|
||||||
|
|
||||||
|
void StartEventHandlerThread() {
|
||||||
|
/* Create the handler thread. */
|
||||||
|
R_ABORT_UNLESS(os::CreateThread(std::addressof(g_thread), EventHandlerThread, nullptr, g_thread_stack, sizeof(g_thread_stack), AMS_GET_SYSTEM_THREAD_PRIORITY(scs, ShellEventHandler)));
|
||||||
|
|
||||||
|
/* Set the handler thread's name. */
|
||||||
|
os::SetThreadNamePointer(std::addressof(g_thread), AMS_GET_SYSTEM_THREAD_NAME(scs, ShellEventHandler));
|
||||||
|
|
||||||
|
/* Start the handler thread. */
|
||||||
|
os::StartThread(std::addressof(g_thread));
|
||||||
|
}
|
||||||
|
|
||||||
|
Result PrepareToLaunchProgram(ncm::ProgramId program_id, const void *args, size_t args_size) {
|
||||||
|
/* Set the arguments. */
|
||||||
|
R_TRY_CATCH(ldr::SetProgramArgument(program_id, args, args_size)) {
|
||||||
|
R_CATCH(ldr::ResultTooManyArguments) {
|
||||||
|
/* There are too many arguments already registered. Flush the arguments queue. */
|
||||||
|
R_TRY(ldr::FlushArguments());
|
||||||
|
|
||||||
|
/* Try again. */
|
||||||
|
R_TRY(ldr::SetProgramArgument(program_id, args, args_size));
|
||||||
|
}
|
||||||
|
} R_END_TRY_CATCH;
|
||||||
|
|
||||||
|
return ResultSuccess();
|
||||||
|
}
|
||||||
|
|
||||||
|
void FlushProgramArgument(ncm::ProgramId program_id) {
|
||||||
|
/* Ensure there are no arguments for the program. */
|
||||||
|
ldr::SetProgramArgument(program_id, "", 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void InitializeShell() {
|
||||||
|
/* Initialize our managers. */
|
||||||
|
g_socket_info_manager.Initialize();
|
||||||
|
g_program_info_manager.Initialize();
|
||||||
|
|
||||||
|
/* Start our event handler. */
|
||||||
|
StartEventHandlerThread();
|
||||||
|
}
|
||||||
|
|
||||||
|
void RegisterCommonProcessEventHandler(ProcessEventHandler on_start, ProcessEventHandler on_exit, ProcessEventHandler on_jit_debug) {
|
||||||
|
g_common_start_handler = on_start;
|
||||||
|
g_common_exit_handler = on_exit;
|
||||||
|
g_common_jit_debug_handler = on_jit_debug;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool RegisterSocket(s32 socket);
|
||||||
|
void UnregisterSocket(s32 socket);
|
||||||
|
|
||||||
|
Result LaunchProgram(os::ProcessId *out, ncm::ProgramId program_id, const void *args, size_t args_size, u32 process_flags) {
|
||||||
|
/* Set up the arguments. */
|
||||||
|
PrepareToLaunchProgram(program_id, args, args_size);
|
||||||
|
|
||||||
|
/* Ensure arguments are managed correctly. */
|
||||||
|
ON_SCOPE_EXIT { FlushProgramArgument(program_id); };
|
||||||
|
|
||||||
|
/* Launch the program. */
|
||||||
|
const ncm::ProgramLocation loc = ncm::ProgramLocation::Make(program_id, ncm::StorageId::BuiltInSystem);
|
||||||
|
R_TRY(pgl::LaunchProgram(out, loc, process_flags | pm::LaunchFlags_SignalOnExit, 0));
|
||||||
|
|
||||||
|
return ResultSuccess();
|
||||||
|
}
|
||||||
|
|
||||||
|
Result SubscribeProcessEvent(s32 socket, bool is_register, u64 id);
|
||||||
|
|
||||||
|
}
|
41
libraries/libstratosphere/source/scs/scs_shell_server.cpp
Normal file
41
libraries/libstratosphere/source/scs/scs_shell_server.cpp
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2018-2020 Atmosphère-NX
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
|
* under the terms and conditions of the GNU General Public License,
|
||||||
|
* version 2, as published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope it will be useful, but WITHOUT
|
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||||
|
* more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
#include <stratosphere.hpp>
|
||||||
|
|
||||||
|
namespace ams::scs {
|
||||||
|
|
||||||
|
void ShellServer::Initialize(const char *port_name, void *stack, size_t stack_size, CommandProcessor *command_processor) {
|
||||||
|
/* Set our variables. */
|
||||||
|
m_command_processor = command_processor;
|
||||||
|
std::strcpy(m_port_name.name, port_name);
|
||||||
|
|
||||||
|
/* Create our thread. */
|
||||||
|
R_ABORT_UNLESS(os::CreateThread(std::addressof(m_thread), ThreadEntry, this, stack, stack_size, AMS_GET_SYSTEM_THREAD_PRIORITY(scs, ShellServer)));
|
||||||
|
|
||||||
|
/* Set our thread's name. */
|
||||||
|
os::SetThreadNamePointer(std::addressof(m_thread), AMS_GET_SYSTEM_THREAD_NAME(scs, ShellServer));
|
||||||
|
}
|
||||||
|
|
||||||
|
void ShellServer::Start() {
|
||||||
|
os::StartThread(std::addressof(m_thread));
|
||||||
|
}
|
||||||
|
|
||||||
|
void ShellServer::DoShellServer() {
|
||||||
|
/* TODO */
|
||||||
|
AMS_ABORT("ShellServer::DoShellServer");
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
52
libraries/libstratosphere/source/scs/scs_tenv.cpp
Normal file
52
libraries/libstratosphere/source/scs/scs_tenv.cpp
Normal file
@ -0,0 +1,52 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2018-2020 Atmosphère-NX
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
|
* under the terms and conditions of the GNU General Public License,
|
||||||
|
* version 2, as published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope it will be useful, but WITHOUT
|
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||||
|
* more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
#include <stratosphere.hpp>
|
||||||
|
|
||||||
|
namespace ams::scs {
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
|
||||||
|
alignas(os::MemoryPageSize) constinit u8 g_tenv_heap_storage[48_KB];
|
||||||
|
constinit lmem::HeapHandle g_tenv_heap_handle = nullptr;
|
||||||
|
constinit os::SdkMutex g_mutex;
|
||||||
|
|
||||||
|
void InitializeExpHeap() {
|
||||||
|
std::scoped_lock lk(g_mutex);
|
||||||
|
g_tenv_heap_handle = lmem::CreateExpHeap(g_tenv_heap_storage, sizeof(g_tenv_heap_storage), lmem::CreateOption_None);
|
||||||
|
}
|
||||||
|
|
||||||
|
void *Allocate(size_t size) {
|
||||||
|
std::scoped_lock lk(g_mutex);
|
||||||
|
void *mem = lmem::AllocateFromExpHeap(g_tenv_heap_handle, size);
|
||||||
|
return mem;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Deallocate(void *p, size_t size) {
|
||||||
|
std::scoped_lock lk(g_mutex);
|
||||||
|
lmem::FreeToExpHeap(g_tenv_heap_handle, p);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void InitializeTenvServiceManager() {
|
||||||
|
/* Initialize the tenv heap. */
|
||||||
|
InitializeExpHeap();
|
||||||
|
|
||||||
|
/* Initialize the tenv library. */
|
||||||
|
htc::tenv::Initialize(Allocate, Deallocate);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -26,6 +26,7 @@
|
|||||||
#include <vapours/results/cal_results.hpp>
|
#include <vapours/results/cal_results.hpp>
|
||||||
#include <vapours/results/capsrv_results.hpp>
|
#include <vapours/results/capsrv_results.hpp>
|
||||||
#include <vapours/results/creport_results.hpp>
|
#include <vapours/results/creport_results.hpp>
|
||||||
|
#include <vapours/results/cs_results.hpp>
|
||||||
#include <vapours/results/dd_results.hpp>
|
#include <vapours/results/dd_results.hpp>
|
||||||
#include <vapours/results/ddsf_results.hpp>
|
#include <vapours/results/ddsf_results.hpp>
|
||||||
#include <vapours/results/debug_results.hpp>
|
#include <vapours/results/debug_results.hpp>
|
||||||
@ -55,6 +56,7 @@
|
|||||||
#include <vapours/results/psc_results.hpp>
|
#include <vapours/results/psc_results.hpp>
|
||||||
#include <vapours/results/pwm_results.hpp>
|
#include <vapours/results/pwm_results.hpp>
|
||||||
#include <vapours/results/ro_results.hpp>
|
#include <vapours/results/ro_results.hpp>
|
||||||
|
#include <vapours/results/scs_results.hpp>
|
||||||
#include <vapours/results/sdmmc_results.hpp>
|
#include <vapours/results/sdmmc_results.hpp>
|
||||||
#include <vapours/results/settings_results.hpp>
|
#include <vapours/results/settings_results.hpp>
|
||||||
#include <vapours/results/sf_results.hpp>
|
#include <vapours/results/sf_results.hpp>
|
||||||
|
28
libraries/libvapours/include/vapours/results/cs_results.hpp
Normal file
28
libraries/libvapours/include/vapours/results/cs_results.hpp
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2018-2020 Atmosphère-NX
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
|
* under the terms and conditions of the GNU General Public License,
|
||||||
|
* version 2, as published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope it will be useful, but WITHOUT
|
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||||
|
* more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
#include <vapours/results/results_common.hpp>
|
||||||
|
|
||||||
|
namespace ams::cs {
|
||||||
|
|
||||||
|
R_DEFINE_NAMESPACE_RESULT_MODULE(204);
|
||||||
|
|
||||||
|
R_DEFINE_ERROR_RESULT(UnknownCommand, 2);
|
||||||
|
R_DEFINE_ERROR_RESULT(OutOfResource, 4);
|
||||||
|
R_DEFINE_ERROR_RESULT(NoSocket, 7);
|
||||||
|
|
||||||
|
}
|
28
libraries/libvapours/include/vapours/results/scs_results.hpp
Normal file
28
libraries/libvapours/include/vapours/results/scs_results.hpp
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2018-2020 Atmosphère-NX
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
|
* under the terms and conditions of the GNU General Public License,
|
||||||
|
* version 2, as published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope it will be useful, but WITHOUT
|
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||||
|
* more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
#include <vapours/results/results_common.hpp>
|
||||||
|
|
||||||
|
namespace ams::scs {
|
||||||
|
|
||||||
|
R_DEFINE_NAMESPACE_RESULT_MODULE(204);
|
||||||
|
|
||||||
|
R_DEFINE_ERROR_RESULT(UnknownCommand, 2);
|
||||||
|
R_DEFINE_ERROR_RESULT(OutOfResource, 4);
|
||||||
|
R_DEFINE_ERROR_RESULT(NoSocket, 7);
|
||||||
|
|
||||||
|
}
|
@ -65,26 +65,30 @@ namespace ams::cs {
|
|||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
|
|
||||||
alignas(os::ThreadStackAlignment) u8 g_shell_stack[4_KB];
|
alignas(os::ThreadStackAlignment) constinit u8 g_shell_stack[4_KB];
|
||||||
alignas(os::ThreadStackAlignment) u8 g_runner_stack[4_KB];
|
alignas(os::ThreadStackAlignment) constinit u8 g_runner_stack[4_KB];
|
||||||
|
|
||||||
alignas(os::MemoryPageSize) u8 g_heap_memory[32_KB];
|
alignas(os::MemoryPageSize) constinit u8 g_heap_memory[32_KB];
|
||||||
|
|
||||||
alignas(0x40) u8 g_htcs_buffer[1_KB];
|
alignas(0x40) constinit u8 g_htcs_buffer[1_KB];
|
||||||
|
|
||||||
lmem::HeapHandle g_heap_handle;
|
constinit os::SdkMutex g_heap_mutex;
|
||||||
|
constinit lmem::HeapHandle g_heap_handle;
|
||||||
|
|
||||||
void *Allocate(size_t size) {
|
void *Allocate(size_t size) {
|
||||||
|
std::scoped_lock lk(g_heap_mutex);
|
||||||
void *mem = lmem::AllocateFromExpHeap(g_heap_handle, size);
|
void *mem = lmem::AllocateFromExpHeap(g_heap_handle, size);
|
||||||
return mem;
|
return mem;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Deallocate(void *p, size_t size) {
|
void Deallocate(void *p, size_t size) {
|
||||||
|
std::scoped_lock lk(g_heap_mutex);
|
||||||
lmem::FreeToExpHeap(g_heap_handle, p);
|
lmem::FreeToExpHeap(g_heap_handle, p);
|
||||||
}
|
}
|
||||||
|
|
||||||
void InitializeHeap() {
|
void InitializeHeap() {
|
||||||
g_heap_handle = lmem::CreateExpHeap(g_heap_memory, sizeof(g_heap_memory), lmem::CreateOption_ThreadSafe);
|
std::scoped_lock lk(g_heap_mutex);
|
||||||
|
g_heap_handle = lmem::CreateExpHeap(g_heap_memory, sizeof(g_heap_memory), lmem::CreateOption_None);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user