mirror of
https://github.com/Atmosphere-NX/Atmosphere
synced 2024-12-23 04:41:12 +00:00
kern: implement SvcSetUnsafeLimit
This commit is contained in:
parent
970b85bf9a
commit
71d266f867
2 changed files with 31 additions and 2 deletions
|
@ -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);
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue