#pragma once #if !defined(BAD_APPLE_OS_OS_MEMORY_HPP_INCLUDED) #define BAD_APPLE_OS_OS_MEMORY_HPP_INCLUDED #include #include #include extern "C" int gKernelStart; extern "C" int gKernelEnd; namespace baos { struct PageTableEntry { bool present : 1; bool writable : 1; bool user : 1; bool writeThrough : 1; bool cacheDisabled : 1; bool accessed : 1; bool dirty : 1; bool pageSize : 1; bool global : 1; std::uint8_t avl : 3; std::uint64_t address : 40; std::uint16_t avl2 : 11; bool executeDisable : 1; }; enum class MemoryType { USABLE, UNUSABLE, MMIO, RESERVED }; struct MemoryRange { std::uint64_t pageBase; std::uint64_t numPages; MemoryType type = MemoryType::USABLE; MemoryRange& operator=(const MemoryRange&) noexcept = default; bool operator<(const MemoryRange& other) const noexcept { return pageBase < other.pageBase; } }; [[nodiscard]] bool setupPaging(std::span memoryRanges) noexcept; [[nodiscard]] const char* memoryTypeName(MemoryType type) noexcept; [[nodiscard]] void* allocatePages(unsigned numConsecutive) noexcept; [[nodiscard]] inline void* allocatePage() noexcept { return allocatePages(1); } void setupIdentityPaging(std::uint64_t page) noexcept; void setupIdentityPaging2M(std::uint64_t page) noexcept; void setupIdentityPaging(std::uint64_t firstPage, std::uint64_t lastPage) noexcept; inline void identityMapRegion(void* start, std::size_t bytes) noexcept { std::uint64_t firstPage = std::bit_cast(start) / 4096; std::uint64_t lastPage = std::bit_cast(static_cast(start) + bytes) / 4096 + 1; setupIdentityPaging(firstPage, lastPage); } template inline T* pageToPointer(std::uint64_t page) noexcept { return std::bit_cast(page << 12); } } void __ba_initInitialHeap() noexcept; #endif // !defined(BAD_APPLE_OS_OS_MEMORY_HPP_INCLUDED)