mirror of
https://github.com/skyline-emu/skyline.git
synced 2024-06-02 01:38:43 +02:00
fe5061a8e0
This addresses all CR comments including more codebase-wide changes arising from certain review comments like proper usage of its/it's and consistent contraction of it is into it's. An overhaul was made to the presentation and formatting of `KThread.h` and `LoadBalance` works has been superseded by `GetOptimalCoreForThread` which can be used alongside `InsertThread` or `MigrateToCore`. It makes the API far more atomic and neater. This was a major point of contention for the design prior, it's simplified some code and potentially improved performance.
82 lines
3.9 KiB
C++
82 lines
3.9 KiB
C++
// SPDX-License-Identifier: MPL-2.0
|
|
// Copyright © 2020 Skyline Team and Contributors (https://github.com/skyline-emu/)
|
|
|
|
#include <kernel/types/KThread.h>
|
|
#include "npdm.h"
|
|
|
|
namespace skyline::vfs {
|
|
constexpr u32 MetaMagic{util::MakeMagic<u32>("META")};
|
|
|
|
NPDM::NPDM() {
|
|
constexpr i8 DefaultPriority{44}; // The default priority of an HOS process
|
|
constexpr i8 DefaultCore{0}; // The default core for an HOS process
|
|
constexpr u64 DefaultStackSize{0x200000}; //!< The default amount of stack: 2 MiB
|
|
constexpr u64 DefaultSystemResourceSize{0x1FE00000}; //!< The amount of memory reserved for system resources, it's the maximum at 510 MiB
|
|
meta = {
|
|
.magic = MetaMagic,
|
|
.flags = {
|
|
{
|
|
.is64Bit = true,
|
|
.type = memory::AddressSpaceType::AddressSpace39Bit,
|
|
.optimizeMemoryAllocation = false,
|
|
}
|
|
},
|
|
.mainThreadPriority = DefaultPriority,
|
|
.idealCore = DefaultCore,
|
|
.mainThreadStackSize = DefaultStackSize,
|
|
.systemResourceSize = DefaultSystemResourceSize,
|
|
.name = "Application",
|
|
};
|
|
aci0 = {
|
|
.magic = MetaMagic,
|
|
};
|
|
threadInfo = {
|
|
.coreMask = 0b0111,
|
|
.priority = {0, 59},
|
|
};
|
|
}
|
|
|
|
NPDM::NPDM(const std::shared_ptr<vfs::Backing> &backing, const DeviceState &state) {
|
|
meta = backing->Read<NpdmMeta>();
|
|
if (meta.magic != MetaMagic)
|
|
throw exception("NPDM Meta Magic isn't correct: 0x{:X} (\"META\" = 0x{:X})", meta.magic, MetaMagic);
|
|
if (!util::PageAligned(meta.mainThreadStackSize))
|
|
throw exception("NPDM Main Thread Stack isn't page aligned: 0x{:X}", meta.mainThreadStackSize);
|
|
|
|
aci0 = meta.aci0.Read<NpdmAci0>(backing);
|
|
constexpr u32 Aci0Magic{util::MakeMagic<u32>("ACI0")};
|
|
if (aci0.magic != Aci0Magic)
|
|
throw exception("NPDM ACI0 Magic isn't correct: 0x{:X} (\"ACI0\" = 0x{:X})", aci0.magic, Aci0Magic);
|
|
|
|
std::vector<NpdmKernelCapability> capabilities(aci0.kernelCapability.size / sizeof(NpdmKernelCapability));
|
|
backing->Read(span(capabilities), meta.aci0.offset + aci0.kernelCapability.offset);
|
|
for (auto capability : capabilities) {
|
|
auto trailingOnes{std::countr_zero(~capability.raw)};
|
|
switch (trailingOnes) {
|
|
case 3:
|
|
threadInfo.priority = kernel::Priority{capability.threadInfo.highestPriority, capability.threadInfo.lowestPriority};
|
|
|
|
threadInfo.coreMask = {};
|
|
for (u8 core{capability.threadInfo.minCoreId}; core <= capability.threadInfo.maxCoreId; core++)
|
|
threadInfo.coreMask.set(core);
|
|
break;
|
|
|
|
case 14:
|
|
kernelVersion.minorVersion = capability.kernelVersion.minorVersion;
|
|
kernelVersion.majorVersion = capability.kernelVersion.majorVersion;
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (!threadInfo.priority.Valid(meta.mainThreadPriority))
|
|
throw exception("NPDM Main Thread Priority isn't valid: {} ({} - {})", meta.mainThreadPriority, threadInfo.priority.min, threadInfo.priority.max);
|
|
if (!threadInfo.coreMask.test(meta.idealCore))
|
|
throw exception("NPDM Ideal Core isn't valid: {} ({})", meta.idealCore, threadInfo.coreMask);
|
|
|
|
state.logger->Debug("NPDM Metadata:\nTitle: ID: {:X}, Version: {}\nMain Thread: Priority: {}, Stack Size: 0x{:X}\nScheduler: Ideal Core: {}, Core Mask: {}, Priority: {} - {}\nKernel Version: v{}.{}", aci0.programId, meta.version, meta.mainThreadPriority, meta.mainThreadStackSize, meta.idealCore, threadInfo.coreMask, threadInfo.priority.min, threadInfo.priority.max, kernelVersion.majorVersion, kernelVersion.minorVersion);
|
|
}
|
|
}
|