kern: add InfoType_IoRegionHint

This commit is contained in:
Michael Scire 2023-02-21 13:28:14 -07:00
parent adfaee0f46
commit 08672fd422
3 changed files with 27 additions and 0 deletions

View file

@ -75,6 +75,19 @@ namespace ams::kern {
constexpr ALWAYS_INLINE KPhysicalAddress GetAddress() const { return m_physical_address; }
constexpr ALWAYS_INLINE size_t GetSize() const { return m_size; }
constexpr uintptr_t GetHint() const {
/* TODO: Is this architecture specific? */
if (m_size >= 2_MB) {
return GetInteger(m_physical_address) & (2_MB - 1);
} else if (m_size >= 64_KB) {
return GetInteger(m_physical_address) & (64_KB - 1);
} else if (m_size >= 4_KB) {
return GetInteger(m_physical_address) & (4_KB - 1);
} else {
return 0;
}
}
};
}

View file

@ -297,6 +297,19 @@ namespace ams::kern::svc {
*out = GetCurrentProcess().IsPermittedSvc(static_cast<svc::SvcId>(info_subtype));
}
break;
case ams::svc::InfoType_IoRegionHint:
{
/* Verify the sub-type is valid. */
R_UNLESS(info_subtype == 0, svc::ResultInvalidCombination());
/* Get the io region from its handle. */
KScopedAutoObject io_region = GetCurrentProcess().GetHandleTable().GetObject<KIoRegion>(handle);
R_UNLESS(io_region.IsNotNull(), svc::ResultInvalidHandle());
/* Get the io region's address hint. */
*out = io_region->GetHint();
}
break;
case ams::svc::InfoType_MesosphereMeta:
{
/* Verify the handle is invalid. */

View file

@ -188,6 +188,7 @@ namespace ams::svc {
InfoType_FreeThreadCount = 24,
InfoType_ThreadTickCount = 25,
InfoType_IsSvcPermitted = 26,
InfoType_IoRegionHint = 27,
InfoType_MesosphereMeta = 65000,
InfoType_MesosphereCurrentProcess = 65001,