#pragma once #include #include #include "../Common/bootinfo.h" enum VMPTEFlags { kPTEValid = (1ULL << 0), // 1 = Present (Will page fault if 0) kPTETable = (1ULL << 1), // 1 = Valid for L0/L1/L2 Directory kPTEPage = (1ULL << 1), // 1 = Valid for L3 Page (Same bit) kPTENormalMem = (0ULL << 2), // Cached, Normal RAM kPTEDeviceMem = (1ULL << 2), // Uncached, MMIO Device kPTEAccessRW = (0ULL << 6), // Read/Write kPTEAccessRO = (1ULL << 6), // Read-Only kPTEUser = (1ULL << 7), // 1 = EL0, 0 = EL1 kPTEInnerShare = (3ULL << 8), // Inner Shareable (SMP safe) kPTEAccessFlag = (1ULL << 10), // CPU access tracking (MUST be 1 to avoid faults) kPTEPrivNX = (1ULL << 53), // PXN: Privileged Execute Never kPTEUserNX = (1ULL << 54) // UXN: Unprivileged Execute Never }; enum { kVMKernelVMA = 0xFFFFFFFF80000000, kHHDMOffset = 0xFFFF888000000000, kVMFbVirtBase = 0xFFFFFFFFFC000000, }; static inline Address VMKernelVirtToPhys(Address virt) { return virt - kVMKernelVMA; } static inline Address VMPhysToHHDM(Address phys) { return phys + kHHDMOffset; } static inline Address VMHHDMToPhys(Address virt) { return virt - kHHDMOffset; } extern Address* gVMKernelL0Table; extern Address gVMKernelL0Physical; Address* VMMMapPage(Address* l0Table, Address phys, Address virt, UInt64 flags); void VMMUnmapPage(Address* l0Table, Address virt); Pointer VMMGetOrAllocatePage(Address* l0Table, Address virt, UInt64 flags); void VMMInitialize(VMBootMemoryMap* bootMap, Bootinfo* info);