kern: implement SvcSetUnsafeLimit

This commit is contained in:
Michael Scire 2020-04-26 02:49:59 -07:00
parent 970b85bf9a
commit 71d266f867
2 changed files with 31 additions and 2 deletions

View file

@ -35,6 +35,9 @@ namespace ams::kern {
Pool_Shift = 4, Pool_Shift = 4,
Pool_Mask = (0xF << Pool_Shift), Pool_Mask = (0xF << Pool_Shift),
/* Aliases. */
Pool_Unsafe = Pool_Application,
}; };
enum Direction { enum Direction {
@ -184,6 +187,23 @@ namespace ams::kern {
address += cur_pages * PageSize; address += cur_pages * PageSize;
} }
} }
size_t GetSize() {
size_t total = 0;
for (size_t i = 0; i < this->num_managers; i++) {
total += this->managers[i].GetSize();
}
return total;
}
size_t GetSize(Pool pool) {
constexpr Direction GetSizeDirection = Direction_FromFront;
size_t total = 0;
for (auto *manager = this->GetFirstManager(pool, GetSizeDirection); manager != nullptr; manager = this->GetNextManager(manager, GetSizeDirection)) {
total += manager->GetSize();
}
return total;
}
public: public:
static size_t CalculateMetadataOverheadSize(size_t region_size) { static size_t CalculateMetadataOverheadSize(size_t region_size) {
return Impl::CalculateMetadataOverheadSize(region_size); return Impl::CalculateMetadataOverheadSize(region_size);

View file

@ -21,7 +21,16 @@ namespace ams::kern::svc {
namespace { namespace {
Result SetUnsafeLimit(size_t limit) {
/* Ensure the size is aligned. */
R_UNLESS(util::IsAligned(limit, PageSize), svc::ResultInvalidSize());
/* Ensure that the size is not bigger than we can accommodate. */
R_UNLESS(limit <= Kernel::GetMemoryManager().GetSize(KMemoryManager::Pool_Unsafe), svc::ResultOutOfRange());
/* Set the size. */
return Kernel::GetUnsafeMemory().SetLimitSize(limit);
}
} }
@ -48,7 +57,7 @@ namespace ams::kern::svc {
} }
Result SetUnsafeLimit64(ams::svc::Size limit) { Result SetUnsafeLimit64(ams::svc::Size limit) {
MESOSPHERE_PANIC("Stubbed SvcSetUnsafeLimit64 was called."); return SetUnsafeLimit(limit);
} }
/* ============================= 64From32 ABI ============================= */ /* ============================= 64From32 ABI ============================= */
@ -74,7 +83,7 @@ namespace ams::kern::svc {
} }
Result SetUnsafeLimit64From32(ams::svc::Size limit) { Result SetUnsafeLimit64From32(ams::svc::Size limit) {
MESOSPHERE_PANIC("Stubbed SvcSetUnsafeLimit64From32 was called."); return SetUnsafeLimit(limit);
} }
} }