os: implement MemoryHeapManager, SetMemoryAttribute

This commit is contained in:
Michael Scire 2022-06-10 22:35:57 -07:00
parent 4e112de223
commit a65b6df8d2
26 changed files with 1120 additions and 13 deletions

View file

@ -14,17 +14,47 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include <stratosphere.hpp>
#include "impl/os_memory_heap_manager.hpp"
namespace ams::os {
Result SetMemoryHeapSize(size_t size) {
/* Check pre-conditions. */
AMS_ASSERT(util::IsAligned(size, MemoryHeapUnitSize));
/* Set the heap size. */
R_RETURN(impl::GetMemoryHeapManager().SetHeapSize(size));
}
uintptr_t GetMemoryHeapAddress() {
return impl::GetMemoryHeapManager().GetHeapAddress();
}
size_t GetMemoryHeapSize() {
return impl::GetMemoryHeapManager().GetHeapSize();
}
Result AllocateMemoryBlock(uintptr_t *out_address, size_t size) {
AMS_UNUSED(out_address, size);
AMS_ABORT("Not implemented yet");
/* Check pre-conditions. */
AMS_ASSERT(size > 0);
AMS_ASSERT(util::IsAligned(size, MemoryBlockUnitSize));
/* Allocate from heap. */
R_RETURN(impl::GetMemoryHeapManager().AllocateFromHeap(out_address, size));
}
void FreeMemoryBlock(uintptr_t address, size_t size) {
AMS_UNUSED(address, size);
AMS_ABORT("Not implemented yet");
/* Get memory heap manager. */
auto &manager = impl::GetMemoryHeapManager();
/* Check pre-conditions. */
AMS_ASSERT(util::IsAligned(address, MemoryBlockUnitSize));
AMS_ASSERT(size > 0);
AMS_ASSERT(util::IsAligned(size, MemoryBlockUnitSize));
AMS_ABORT_UNLESS(manager.IsRegionInMemoryHeap(address, size));
/* Release the memory block. */
manager.ReleaseToHeap(address, size);
}
}