mirror of
https://github.com/Atmosphere-NX/Atmosphere
synced 2024-11-10 07:06:34 +00:00
loader: update for new-ipc
This commit is contained in:
parent
88a86a3363
commit
2f959785e1
13 changed files with 124 additions and 84 deletions
|
@ -16,6 +16,7 @@
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
#include <switch.h>
|
#include <switch.h>
|
||||||
|
#include "../os/os_common_types.hpp"
|
||||||
#include "../ncm/ncm_types.hpp"
|
#include "../ncm/ncm_types.hpp"
|
||||||
|
|
||||||
namespace sts::cfg {
|
namespace sts::cfg {
|
||||||
|
|
|
@ -20,11 +20,12 @@
|
||||||
#include <switch.h>
|
#include <switch.h>
|
||||||
#include "../svc/svc_types.hpp"
|
#include "../svc/svc_types.hpp"
|
||||||
#include "../ncm/ncm_types.hpp"
|
#include "../ncm/ncm_types.hpp"
|
||||||
|
#include "../sf/sf_buffer_tags.hpp"
|
||||||
|
|
||||||
namespace sts::ldr {
|
namespace sts::ldr {
|
||||||
|
|
||||||
/* General types. */
|
/* General types. */
|
||||||
struct ProgramInfo {
|
struct ProgramInfo : sf::LargeData {
|
||||||
u8 main_thread_priority;
|
u8 main_thread_priority;
|
||||||
u8 default_cpu_id;
|
u8 default_cpu_id;
|
||||||
u16 flags;
|
u16 flags;
|
||||||
|
@ -36,7 +37,7 @@ namespace sts::ldr {
|
||||||
u32 aci_fah_size;
|
u32 aci_fah_size;
|
||||||
u8 ac_buffer[0x3E0];
|
u8 ac_buffer[0x3E0];
|
||||||
};
|
};
|
||||||
static_assert(sizeof(ProgramInfo) == 0x400, "ProgramInfo definition!");
|
static_assert(std::is_pod<ProgramInfo>::value && sizeof(ProgramInfo) == 0x400, "ProgramInfo definition!");
|
||||||
|
|
||||||
enum ProgramInfoFlag {
|
enum ProgramInfoFlag {
|
||||||
ProgramInfoFlag_SystemModule = (0 << 0),
|
ProgramInfoFlag_SystemModule = (0 << 0),
|
||||||
|
|
|
@ -15,6 +15,8 @@
|
||||||
*/
|
*/
|
||||||
#pragma once
|
#pragma once
|
||||||
#include <switch.h>
|
#include <switch.h>
|
||||||
|
#include "../results.hpp"
|
||||||
|
#include "../util.hpp"
|
||||||
|
|
||||||
namespace sts::os {
|
namespace sts::os {
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,30 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2018-2019 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
|
||||||
|
|
||||||
|
namespace sts::sf {
|
||||||
|
|
||||||
|
/* Helper structs for serialization of buffers. */
|
||||||
|
struct LargeData{};
|
||||||
|
|
||||||
|
struct PrefersMapAliasTransferMode{};
|
||||||
|
|
||||||
|
struct PrefersPointerTransferMode{};
|
||||||
|
|
||||||
|
struct PrefersAutoSelectTransferMode{};
|
||||||
|
|
||||||
|
}
|
|
@ -18,6 +18,7 @@
|
||||||
#include "sf_common.hpp"
|
#include "sf_common.hpp"
|
||||||
#include "sf_out.hpp"
|
#include "sf_out.hpp"
|
||||||
#include "cmif/sf_cmif_pointer_and_size.hpp"
|
#include "cmif/sf_cmif_pointer_and_size.hpp"
|
||||||
|
#include "sf_buffer_tags.hpp"
|
||||||
|
|
||||||
namespace sts::sf {
|
namespace sts::sf {
|
||||||
|
|
||||||
|
@ -47,15 +48,6 @@ namespace sts::sf {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Helper structs for serialization of buffers. */
|
|
||||||
struct LargeData{};
|
|
||||||
|
|
||||||
struct PrefersMapAliasTransferMode{};
|
|
||||||
|
|
||||||
struct PrefersPointerTransferMode{};
|
|
||||||
|
|
||||||
struct PrefersAutoSelectTransferMode{};
|
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
constexpr inline bool IsLargeData = std::is_base_of<sf::LargeData, T>::value;
|
constexpr inline bool IsLargeData = std::is_base_of<sf::LargeData, T>::value;
|
||||||
|
|
||||||
|
|
|
@ -32,8 +32,8 @@ namespace sts::ldr::ecs {
|
||||||
private:
|
private:
|
||||||
char device_name[DeviceNameSizeMax];
|
char device_name[DeviceNameSizeMax];
|
||||||
public:
|
public:
|
||||||
ExternalContentSource(const char *dn){
|
ExternalContentSource(const char *dn) {
|
||||||
std::strncpy(this->device_name, dn, sizeof(this->device_name) - 1);
|
std::strncpy(this->device_name, dn, sizeof(this->device_name));
|
||||||
this->device_name[sizeof(this->device_name) - 1] = '\0';
|
this->device_name[sizeof(this->device_name) - 1] = '\0';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -26,8 +26,8 @@
|
||||||
namespace sts::ldr {
|
namespace sts::ldr {
|
||||||
|
|
||||||
/* Official commands. */
|
/* Official commands. */
|
||||||
Result LoaderService::CreateProcess(Out<MovedHandle> proc_h, PinId id, u32 flags, CopiedHandle reslimit) {
|
Result LoaderService::CreateProcess(sf::OutMoveHandle proc_h, PinId id, u32 flags, sf::CopyHandle reslimit_h) {
|
||||||
os::ManagedHandle reslimit_holder(reslimit.GetValue());
|
os::ManagedHandle reslimit_holder(reslimit_h.GetValue());
|
||||||
ncm::TitleLocation loc;
|
ncm::TitleLocation loc;
|
||||||
char path[FS_MAX_PATH];
|
char path[FS_MAX_PATH];
|
||||||
|
|
||||||
|
@ -41,12 +41,11 @@ namespace sts::ldr {
|
||||||
return ldr::CreateProcess(proc_h.GetHandlePointer(), id, loc, path, flags, reslimit_holder.Get());
|
return ldr::CreateProcess(proc_h.GetHandlePointer(), id, loc, path, flags, reslimit_holder.Get());
|
||||||
}
|
}
|
||||||
|
|
||||||
Result LoaderService::GetProgramInfo(OutPointerWithServerSize<ProgramInfo, 0x1> out_program_info, ncm::TitleLocation loc) {
|
Result LoaderService::GetProgramInfo(sf::Out<ProgramInfo> out, const ncm::TitleLocation &loc) {
|
||||||
/* Zero output. */
|
/* Zero output. */
|
||||||
ProgramInfo *out = out_program_info.pointer;
|
std::memset(out.GetPointer(), 0, sizeof(*out.GetPointer()));
|
||||||
std::memset(out, 0, sizeof(*out));
|
|
||||||
|
|
||||||
R_TRY(ldr::GetProgramInfo(out, loc));
|
R_TRY(ldr::GetProgramInfo(out.GetPointer(), loc));
|
||||||
|
|
||||||
if (loc.storage_id != static_cast<u8>(ncm::StorageId::None) && loc.title_id != out->title_id) {
|
if (loc.storage_id != static_cast<u8>(ncm::StorageId::None) && loc.title_id != out->title_id) {
|
||||||
char path[FS_MAX_PATH];
|
char path[FS_MAX_PATH];
|
||||||
|
@ -64,7 +63,7 @@ namespace sts::ldr {
|
||||||
return ResultSuccess;
|
return ResultSuccess;
|
||||||
}
|
}
|
||||||
|
|
||||||
Result LoaderService::PinTitle(Out<PinId> out_id, ncm::TitleLocation loc) {
|
Result LoaderService::PinTitle(sf::Out<PinId> out_id, const ncm::TitleLocation &loc) {
|
||||||
return ldr::ro::PinTitle(out_id.GetPointer(), loc);
|
return ldr::ro::PinTitle(out_id.GetPointer(), loc);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -72,24 +71,24 @@ namespace sts::ldr {
|
||||||
return ldr::ro::UnpinTitle(id);
|
return ldr::ro::UnpinTitle(id);
|
||||||
}
|
}
|
||||||
|
|
||||||
Result LoaderService::SetTitleArguments(ncm::TitleId title_id, InPointer<char> args, u32 args_size) {
|
Result LoaderService::SetTitleArguments(ncm::TitleId title_id, const sf::InPointerBuffer &args, u32 args_size) {
|
||||||
return args::Set(title_id, args.pointer, std::min(args.num_elements, size_t(args_size)));
|
return args::Set(title_id, args.GetPointer(), std::min(args.GetSize(), size_t(args_size)));
|
||||||
}
|
}
|
||||||
|
|
||||||
Result LoaderService::ClearArguments() {
|
Result LoaderService::ClearArguments() {
|
||||||
return args::Clear();
|
return args::Clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
Result LoaderService::GetProcessModuleInfo(Out<u32> count, OutPointerWithClientSize<ModuleInfo> out, u64 process_id) {
|
Result LoaderService::GetProcessModuleInfo(sf::Out<u32> count, const sf::OutPointerArray<ModuleInfo> &out, os::ProcessId process_id) {
|
||||||
if (out.num_elements > std::numeric_limits<s32>::max()) {
|
if (out.GetSize() > std::numeric_limits<s32>::max()) {
|
||||||
return ResultLoaderInvalidSize;
|
return ResultLoaderInvalidSize;
|
||||||
}
|
}
|
||||||
|
|
||||||
return ldr::ro::GetProcessModuleInfo(count.GetPointer(), out.pointer, out.num_elements, process_id);
|
return ldr::ro::GetProcessModuleInfo(count.GetPointer(), out.GetPointer(), out.GetSize(), process_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Atmosphere commands. */
|
/* Atmosphere commands. */
|
||||||
Result LoaderService::AtmosphereSetExternalContentSource(Out<MovedHandle> out, ncm::TitleId title_id) {
|
Result LoaderService::AtmosphereSetExternalContentSource(sf::OutMoveHandle out, ncm::TitleId title_id) {
|
||||||
return ecs::Set(out.GetHandlePointer(), title_id);
|
return ecs::Set(out.GetHandlePointer(), title_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -97,7 +96,7 @@ namespace sts::ldr {
|
||||||
R_ASSERT(ecs::Clear(title_id));
|
R_ASSERT(ecs::Clear(title_id));
|
||||||
}
|
}
|
||||||
|
|
||||||
void LoaderService::AtmosphereHasLaunchedTitle(Out<bool> out, ncm::TitleId title_id) {
|
void LoaderService::AtmosphereHasLaunchedTitle(sf::Out<bool> out, ncm::TitleId title_id) {
|
||||||
out.SetValue(ldr::HasLaunchedTitle(title_id));
|
out.SetValue(ldr::HasLaunchedTitle(title_id));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -21,25 +21,21 @@
|
||||||
|
|
||||||
namespace sts::ldr {
|
namespace sts::ldr {
|
||||||
|
|
||||||
class LoaderService : public IServiceObject {
|
class LoaderService : public sf::IServiceObject {
|
||||||
protected:
|
protected:
|
||||||
/* Official commands. */
|
/* Official commands. */
|
||||||
virtual Result CreateProcess(Out<MovedHandle> proc_h, PinId id, u32 flags, CopiedHandle reslimit_h);
|
virtual Result CreateProcess(sf::OutMoveHandle proc_h, PinId id, u32 flags, sf::CopyHandle reslimit_h);
|
||||||
virtual Result GetProgramInfo(OutPointerWithServerSize<ProgramInfo, 0x1> out_program_info, ncm::TitleLocation loc);
|
virtual Result GetProgramInfo(sf::Out<ProgramInfo> out_program_info, const ncm::TitleLocation &loc);
|
||||||
virtual Result PinTitle(Out<PinId> out_id, ncm::TitleLocation loc);
|
virtual Result PinTitle(sf::Out<PinId> out_id, const ncm::TitleLocation &loc);
|
||||||
virtual Result UnpinTitle(PinId id);
|
virtual Result UnpinTitle(PinId id);
|
||||||
virtual Result SetTitleArguments(ncm::TitleId title_id, InPointer<char> args, u32 args_size);
|
virtual Result SetTitleArguments(ncm::TitleId title_id, const sf::InPointerBuffer &args, u32 args_size);
|
||||||
virtual Result ClearArguments();
|
virtual Result ClearArguments();
|
||||||
virtual Result GetProcessModuleInfo(Out<u32> count, OutPointerWithClientSize<ModuleInfo> out, u64 process_id);
|
virtual Result GetProcessModuleInfo(sf::Out<u32> count, const sf::OutPointerArray<ModuleInfo> &out, os::ProcessId process_id);
|
||||||
|
|
||||||
/* Atmosphere commands. */
|
/* Atmosphere commands. */
|
||||||
virtual Result AtmosphereSetExternalContentSource(Out<MovedHandle> out, ncm::TitleId title_id);
|
virtual Result AtmosphereSetExternalContentSource(sf::OutMoveHandle out, ncm::TitleId title_id);
|
||||||
virtual void AtmosphereClearExternalContentSource(ncm::TitleId title_id);
|
virtual void AtmosphereClearExternalContentSource(ncm::TitleId title_id);
|
||||||
virtual void AtmosphereHasLaunchedTitle(Out<bool> out, ncm::TitleId title_id);
|
virtual void AtmosphereHasLaunchedTitle(sf::Out<bool> out, ncm::TitleId title_id);
|
||||||
public:
|
|
||||||
DEFINE_SERVICE_DISPATCH_TABLE {
|
|
||||||
/* No commands callable, as LoaderService is abstract. */
|
|
||||||
};
|
|
||||||
};
|
};
|
||||||
|
|
||||||
namespace pm {
|
namespace pm {
|
||||||
|
@ -56,12 +52,12 @@ namespace sts::ldr {
|
||||||
};
|
};
|
||||||
public:
|
public:
|
||||||
DEFINE_SERVICE_DISPATCH_TABLE {
|
DEFINE_SERVICE_DISPATCH_TABLE {
|
||||||
MAKE_SERVICE_COMMAND_META(ProcessManagerInterface, CreateProcess),
|
MAKE_SERVICE_COMMAND_META(CreateProcess),
|
||||||
MAKE_SERVICE_COMMAND_META(ProcessManagerInterface, GetProgramInfo),
|
MAKE_SERVICE_COMMAND_META(GetProgramInfo),
|
||||||
MAKE_SERVICE_COMMAND_META(ProcessManagerInterface, PinTitle),
|
MAKE_SERVICE_COMMAND_META(PinTitle),
|
||||||
MAKE_SERVICE_COMMAND_META(ProcessManagerInterface, UnpinTitle),
|
MAKE_SERVICE_COMMAND_META(UnpinTitle),
|
||||||
|
|
||||||
MAKE_SERVICE_COMMAND_META(ProcessManagerInterface, AtmosphereHasLaunchedTitle),
|
MAKE_SERVICE_COMMAND_META(AtmosphereHasLaunchedTitle),
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -80,11 +76,11 @@ namespace sts::ldr {
|
||||||
};
|
};
|
||||||
public:
|
public:
|
||||||
DEFINE_SERVICE_DISPATCH_TABLE {
|
DEFINE_SERVICE_DISPATCH_TABLE {
|
||||||
MAKE_SERVICE_COMMAND_META(DebugMonitorInterface, SetTitleArguments),
|
MAKE_SERVICE_COMMAND_META(SetTitleArguments),
|
||||||
MAKE_SERVICE_COMMAND_META(DebugMonitorInterface, ClearArguments),
|
MAKE_SERVICE_COMMAND_META(ClearArguments),
|
||||||
MAKE_SERVICE_COMMAND_META(DebugMonitorInterface, GetProcessModuleInfo),
|
MAKE_SERVICE_COMMAND_META(GetProcessModuleInfo),
|
||||||
|
|
||||||
MAKE_SERVICE_COMMAND_META(DebugMonitorInterface, AtmosphereHasLaunchedTitle),
|
MAKE_SERVICE_COMMAND_META(AtmosphereHasLaunchedTitle),
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -103,11 +99,11 @@ namespace sts::ldr {
|
||||||
};
|
};
|
||||||
public:
|
public:
|
||||||
DEFINE_SERVICE_DISPATCH_TABLE {
|
DEFINE_SERVICE_DISPATCH_TABLE {
|
||||||
MAKE_SERVICE_COMMAND_META(ShellInterface, SetTitleArguments),
|
MAKE_SERVICE_COMMAND_META(SetTitleArguments),
|
||||||
MAKE_SERVICE_COMMAND_META(ShellInterface, ClearArguments),
|
MAKE_SERVICE_COMMAND_META(ClearArguments),
|
||||||
|
|
||||||
MAKE_SERVICE_COMMAND_META(ShellInterface, AtmosphereSetExternalContentSource),
|
MAKE_SERVICE_COMMAND_META(AtmosphereSetExternalContentSource),
|
||||||
MAKE_SERVICE_COMMAND_META(ShellInterface, AtmosphereClearExternalContentSource),
|
MAKE_SERVICE_COMMAND_META(AtmosphereClearExternalContentSource),
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -31,8 +31,9 @@ extern "C" {
|
||||||
extern u32 __start__;
|
extern u32 __start__;
|
||||||
|
|
||||||
u32 __nx_applet_type = AppletType_None;
|
u32 __nx_applet_type = AppletType_None;
|
||||||
|
u32 __nx_fs_num_sessions = 1;
|
||||||
|
|
||||||
#define INNER_HEAP_SIZE 0x30000
|
#define INNER_HEAP_SIZE 0x4000
|
||||||
size_t nx_inner_heap_size = INNER_HEAP_SIZE;
|
size_t nx_inner_heap_size = INNER_HEAP_SIZE;
|
||||||
char nx_inner_heap[INNER_HEAP_SIZE];
|
char nx_inner_heap[INNER_HEAP_SIZE];
|
||||||
|
|
||||||
|
@ -66,8 +67,10 @@ void __libnx_initheap(void) {
|
||||||
fake_heap_end = (char*)addr + size;
|
fake_heap_end = (char*)addr + size;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
using namespace sts;
|
||||||
|
|
||||||
void __appInit(void) {
|
void __appInit(void) {
|
||||||
SetFirmwareVersionForLibnx();
|
hos::SetVersionForLibnx();
|
||||||
|
|
||||||
/* Initialize services we need. */
|
/* Initialize services we need. */
|
||||||
DoWithSmSession([&]() {
|
DoWithSmSession([&]() {
|
||||||
|
@ -87,23 +90,39 @@ void __appExit(void) {
|
||||||
fsExit();
|
fsExit();
|
||||||
}
|
}
|
||||||
|
|
||||||
struct LoaderServerOptions {
|
namespace {
|
||||||
static constexpr size_t PointerBufferSize = 0x400;
|
|
||||||
static constexpr size_t MaxDomains = 0;
|
struct ServerOptions {
|
||||||
static constexpr size_t MaxDomainObjects = 0;
|
static constexpr size_t PointerBufferSize = 0x400;
|
||||||
};
|
static constexpr size_t MaxDomains = 0;
|
||||||
|
static constexpr size_t MaxDomainObjects = 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
constexpr sm::ServiceName ProcessManagerServiceName = sm::ServiceName::Encode("ldr:pm");
|
||||||
|
constexpr size_t ProcessManagerMaxSessions = 2;
|
||||||
|
|
||||||
|
constexpr sm::ServiceName ShellServiceName = sm::ServiceName::Encode("ldr:shel");
|
||||||
|
constexpr size_t ShellMaxSessions = 3;
|
||||||
|
|
||||||
|
constexpr sm::ServiceName DebugMonitorServiceName = sm::ServiceName::Encode("ldr:dmnt");
|
||||||
|
constexpr size_t DebugMonitorMaxSessions = 3;
|
||||||
|
|
||||||
|
/* ldr:pm, ldr:shel, ldr:dmnt. */
|
||||||
|
constexpr size_t NumServers = 3;
|
||||||
|
constexpr size_t MaxSessions = ProcessManagerMaxSessions + ShellMaxSessions + DebugMonitorMaxSessions + 1;
|
||||||
|
sf::hipc::ServerManager<NumServers, ServerOptions, MaxSessions> g_server_manager;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
int main(int argc, char **argv)
|
int main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
static auto s_server_manager = WaitableManager<LoaderServerOptions>(1);
|
|
||||||
|
|
||||||
/* Add services to manager. */
|
/* Add services to manager. */
|
||||||
s_server_manager.AddWaitable(new ServiceServer<sts::ldr::pm::ProcessManagerInterface>("ldr:pm", 1));
|
R_ASSERT((g_server_manager.RegisterServer<ldr::pm::ProcessManagerInterface>(ProcessManagerServiceName, ProcessManagerMaxSessions)));
|
||||||
s_server_manager.AddWaitable(new ServiceServer<sts::ldr::shell::ShellInterface>("ldr:shel", 3));
|
R_ASSERT((g_server_manager.RegisterServer<ldr::shell::ShellInterface>(ShellServiceName, ShellMaxSessions)));
|
||||||
s_server_manager.AddWaitable(new ServiceServer<sts::ldr::dmnt::DebugMonitorInterface>("ldr:dmnt", 2));
|
R_ASSERT((g_server_manager.RegisterServer<ldr::dmnt::DebugMonitorInterface>(DebugMonitorServiceName, DebugMonitorMaxSessions)));
|
||||||
|
|
||||||
/* Loop forever, servicing our services. */
|
/* Loop forever, servicing our services. */
|
||||||
s_server_manager.Process();
|
g_server_manager.LoopProcess();
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -53,7 +53,7 @@ namespace sts::ldr {
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Validate flags. */
|
/* Validate flags. */
|
||||||
if (GetRuntimeFirmwareVersion() >= FirmwareVersion_700) {
|
if (hos::GetVersion() >= hos::Version_700) {
|
||||||
/* 7.0.0 added 0x10 as a valid bit to NPDM flags. */
|
/* 7.0.0 added 0x10 as a valid bit to NPDM flags. */
|
||||||
if (npdm->flags & ~0x1F) {
|
if (npdm->flags & ~0x1F) {
|
||||||
return ResultLoaderInvalidMeta;
|
return ResultLoaderInvalidMeta;
|
||||||
|
@ -182,7 +182,7 @@ namespace sts::ldr {
|
||||||
Meta *o_meta = &g_original_meta_cache.meta;
|
Meta *o_meta = &g_original_meta_cache.meta;
|
||||||
|
|
||||||
/* Fix pool partition. */
|
/* Fix pool partition. */
|
||||||
if (GetRuntimeFirmwareVersion() >= FirmwareVersion_500) {
|
if (hos::GetVersion() >= hos::Version_500) {
|
||||||
meta->acid->flags = (meta->acid->flags & 0xFFFFFFC3) | (o_meta->acid->flags & 0x0000003C);
|
meta->acid->flags = (meta->acid->flags & 0xFFFFFFC3) | (o_meta->acid->flags & 0x0000003C);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -196,18 +196,18 @@ namespace sts::ldr {
|
||||||
constexpr size_t g_MinimumTitleVersionsCount900 = util::size(g_MinimumTitleVersions900);
|
constexpr size_t g_MinimumTitleVersionsCount900 = util::size(g_MinimumTitleVersions900);
|
||||||
|
|
||||||
Result ValidateTitleVersion(ncm::TitleId title_id, u32 version) {
|
Result ValidateTitleVersion(ncm::TitleId title_id, u32 version) {
|
||||||
if (GetRuntimeFirmwareVersion() < FirmwareVersion_810) {
|
if (hos::GetVersion() < hos::Version_810) {
|
||||||
return ResultSuccess;
|
return ResultSuccess;
|
||||||
} else {
|
} else {
|
||||||
#ifdef LDR_VALIDATE_PROCESS_VERSION
|
#ifdef LDR_VALIDATE_PROCESS_VERSION
|
||||||
const MinimumTitleVersion *entries = nullptr;
|
const MinimumTitleVersion *entries = nullptr;
|
||||||
size_t num_entries = 0;
|
size_t num_entries = 0;
|
||||||
switch (GetRuntimeFirmwareVersion()) {
|
switch (hos::GetVersion()) {
|
||||||
case FirmwareVersion_810:
|
case hos::Version_810:
|
||||||
entries = g_MinimumTitleVersions810;
|
entries = g_MinimumTitleVersions810;
|
||||||
num_entries = g_MinimumTitleVersionsCount810;
|
num_entries = g_MinimumTitleVersionsCount810;
|
||||||
break;
|
break;
|
||||||
case FirmwareVersion_900:
|
case hos::Version_900:
|
||||||
entries = g_MinimumTitleVersions900;
|
entries = g_MinimumTitleVersions900;
|
||||||
num_entries = g_MinimumTitleVersionsCount900;
|
num_entries = g_MinimumTitleVersionsCount900;
|
||||||
break;
|
break;
|
||||||
|
@ -383,7 +383,7 @@ namespace sts::ldr {
|
||||||
flags |= svc::CreateProcessFlag_IsApplication;
|
flags |= svc::CreateProcessFlag_IsApplication;
|
||||||
|
|
||||||
/* 7.0.0+: Set OptimizeMemoryAllocation if relevant. */
|
/* 7.0.0+: Set OptimizeMemoryAllocation if relevant. */
|
||||||
if (GetRuntimeFirmwareVersion() >= FirmwareVersion_700) {
|
if (hos::GetVersion() >= hos::Version_700) {
|
||||||
if (meta_flags & Npdm::MetaFlag_OptimizeMemoryAllocation) {
|
if (meta_flags & Npdm::MetaFlag_OptimizeMemoryAllocation) {
|
||||||
flags |= svc::CreateProcessFlag_OptimizeMemoryAllocation;
|
flags |= svc::CreateProcessFlag_OptimizeMemoryAllocation;
|
||||||
}
|
}
|
||||||
|
@ -391,7 +391,7 @@ namespace sts::ldr {
|
||||||
}
|
}
|
||||||
|
|
||||||
/* 5.0.0+ Set Pool Partition. */
|
/* 5.0.0+ Set Pool Partition. */
|
||||||
if (GetRuntimeFirmwareVersion() >= FirmwareVersion_500) {
|
if (hos::GetVersion() >= hos::Version_500) {
|
||||||
switch (GetPoolPartition(meta)) {
|
switch (GetPoolPartition(meta)) {
|
||||||
case Acid::PoolPartition_Application:
|
case Acid::PoolPartition_Application:
|
||||||
if (IsApplet(meta)) {
|
if (IsApplet(meta)) {
|
||||||
|
@ -412,7 +412,7 @@ namespace sts::ldr {
|
||||||
default:
|
default:
|
||||||
return ResultLoaderInvalidMeta;
|
return ResultLoaderInvalidMeta;
|
||||||
}
|
}
|
||||||
} else if (GetRuntimeFirmwareVersion() >= FirmwareVersion_400) {
|
} else if (hos::GetVersion() >= hos::Version_400) {
|
||||||
/* On 4.0.0+, the corresponding bit was simply "UseSecureMemory". */
|
/* On 4.0.0+, the corresponding bit was simply "UseSecureMemory". */
|
||||||
if (meta->acid->flags & Acid::AcidFlag_DeprecatedUseSecureMemory) {
|
if (meta->acid->flags & Acid::AcidFlag_DeprecatedUseSecureMemory) {
|
||||||
flags |= svc::CreateProcessFlag_DeprecatedUseSecureMemory;
|
flags |= svc::CreateProcessFlag_DeprecatedUseSecureMemory;
|
||||||
|
@ -437,7 +437,7 @@ namespace sts::ldr {
|
||||||
R_TRY(GetCreateProcessFlags(&out->flags, meta, flags));
|
R_TRY(GetCreateProcessFlags(&out->flags, meta, flags));
|
||||||
|
|
||||||
/* 3.0.0+ System Resource Size. */
|
/* 3.0.0+ System Resource Size. */
|
||||||
if (GetRuntimeFirmwareVersion() >= FirmwareVersion_300) {
|
if (hos::GetVersion() >= hos::Version_300) {
|
||||||
/* Validate size is aligned. */
|
/* Validate size is aligned. */
|
||||||
if (meta->npdm->system_resource_size & (SystemResourceSizeAlignment - 1)) {
|
if (meta->npdm->system_resource_size & (SystemResourceSizeAlignment - 1)) {
|
||||||
return ResultLoaderInvalidSize;
|
return ResultLoaderInvalidSize;
|
||||||
|
@ -500,7 +500,7 @@ namespace sts::ldr {
|
||||||
/* Calculate ASLR. */
|
/* Calculate ASLR. */
|
||||||
uintptr_t aslr_start = 0;
|
uintptr_t aslr_start = 0;
|
||||||
uintptr_t aslr_size = 0;
|
uintptr_t aslr_size = 0;
|
||||||
if (GetRuntimeFirmwareVersion() >= FirmwareVersion_200) {
|
if (hos::GetVersion() >= hos::Version_200) {
|
||||||
switch (out_cpi->flags & svc::CreateProcessFlag_AddressSpaceMask) {
|
switch (out_cpi->flags & svc::CreateProcessFlag_AddressSpaceMask) {
|
||||||
case svc::CreateProcessFlag_AddressSpace32Bit:
|
case svc::CreateProcessFlag_AddressSpace32Bit:
|
||||||
case svc::CreateProcessFlag_AddressSpace32BitWithoutAlias:
|
case svc::CreateProcessFlag_AddressSpace32BitWithoutAlias:
|
||||||
|
@ -723,10 +723,10 @@ namespace sts::ldr {
|
||||||
R_TRY(LoadNsosIntoProcessMemory(&info, loc.title_id, nso_headers, has_nso, arg_info));
|
R_TRY(LoadNsosIntoProcessMemory(&info, loc.title_id, nso_headers, has_nso, arg_info));
|
||||||
|
|
||||||
/* Register NSOs with ro manager. */
|
/* Register NSOs with ro manager. */
|
||||||
u64 process_id;
|
os::ProcessId process_id = os::InvalidProcessId;
|
||||||
{
|
{
|
||||||
/* Nintendo doesn't validate this result, but we will. */
|
/* Nintendo doesn't validate this result, but we will. */
|
||||||
R_ASSERT(svcGetProcessId(&process_id, info.process_handle.Get()));
|
R_ASSERT(svcGetProcessId(&process_id.value, info.process_handle.Get()));
|
||||||
|
|
||||||
/* Register new process. */
|
/* Register new process. */
|
||||||
ldr::ro::RegisterProcess(pin_id, process_id, loc.title_id);
|
ldr::ro::RegisterProcess(pin_id, process_id, loc.title_id);
|
||||||
|
|
|
@ -34,7 +34,7 @@ namespace sts::ldr::ro {
|
||||||
|
|
||||||
struct ProcessInfo {
|
struct ProcessInfo {
|
||||||
PinId pin_id;
|
PinId pin_id;
|
||||||
u64 process_id;
|
os::ProcessId process_id;
|
||||||
ncm::TitleId title_id;
|
ncm::TitleId title_id;
|
||||||
ncm::TitleLocation loc;
|
ncm::TitleLocation loc;
|
||||||
ModuleInfo modules[ModuleCountMax];
|
ModuleInfo modules[ModuleCountMax];
|
||||||
|
@ -55,7 +55,7 @@ namespace sts::ldr::ro {
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
ProcessInfo *GetProcessInfo(u64 process_id) {
|
ProcessInfo *GetProcessInfo(os::ProcessId process_id) {
|
||||||
for (size_t i = 0; i < ProcessCountMax; i++) {
|
for (size_t i = 0; i < ProcessCountMax; i++) {
|
||||||
ProcessInfo *info = &g_process_infos[i];
|
ProcessInfo *info = &g_process_infos[i];
|
||||||
if (info->in_use && info->process_id == process_id) {
|
if (info->in_use && info->process_id == process_id) {
|
||||||
|
@ -116,7 +116,7 @@ namespace sts::ldr::ro {
|
||||||
return ResultSuccess;
|
return ResultSuccess;
|
||||||
}
|
}
|
||||||
|
|
||||||
Result RegisterProcess(PinId id, u64 process_id, ncm::TitleId title_id) {
|
Result RegisterProcess(PinId id, os::ProcessId process_id, ncm::TitleId title_id) {
|
||||||
ProcessInfo *info = GetProcessInfo(id);
|
ProcessInfo *info = GetProcessInfo(id);
|
||||||
if (info == nullptr) {
|
if (info == nullptr) {
|
||||||
return ResultLoaderNotPinned;
|
return ResultLoaderNotPinned;
|
||||||
|
@ -150,7 +150,7 @@ namespace sts::ldr::ro {
|
||||||
return ResultSuccess;
|
return ResultSuccess;
|
||||||
}
|
}
|
||||||
|
|
||||||
Result GetProcessModuleInfo(u32 *out_count, ldr::ModuleInfo *out, size_t max_out_count, u64 process_id) {
|
Result GetProcessModuleInfo(u32 *out_count, ldr::ModuleInfo *out, size_t max_out_count, os::ProcessId process_id) {
|
||||||
const ProcessInfo *info = GetProcessInfo(process_id);
|
const ProcessInfo *info = GetProcessInfo(process_id);
|
||||||
if (info == nullptr) {
|
if (info == nullptr) {
|
||||||
return ResultLoaderNotPinned;
|
return ResultLoaderNotPinned;
|
||||||
|
|
|
@ -25,8 +25,8 @@ namespace sts::ldr::ro {
|
||||||
Result PinTitle(PinId *out, const ncm::TitleLocation &loc);
|
Result PinTitle(PinId *out, const ncm::TitleLocation &loc);
|
||||||
Result UnpinTitle(PinId id);
|
Result UnpinTitle(PinId id);
|
||||||
Result GetTitleLocation(ncm::TitleLocation *out, PinId id);
|
Result GetTitleLocation(ncm::TitleLocation *out, PinId id);
|
||||||
Result RegisterProcess(PinId id, u64 process_id, ncm::TitleId title_id);
|
Result RegisterProcess(PinId id, os::ProcessId process_id, ncm::TitleId title_id);
|
||||||
Result RegisterModule(PinId id, const u8 *build_id, uintptr_t address, size_t size);
|
Result RegisterModule(PinId id, const u8 *build_id, uintptr_t address, size_t size);
|
||||||
Result GetProcessModuleInfo(u32 *out_count, ModuleInfo *out, size_t max_out_count, u64 process_id);
|
Result GetProcessModuleInfo(u32 *out_count, ModuleInfo *out, size_t max_out_count, os::ProcessId process_id);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue