51 lines
1.6 KiB
C
51 lines
1.6 KiB
C
#pragma once
|
|
#include <Types.h>
|
|
#include <VM/PMM.h>
|
|
#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,
|
|
kKernelPhysBase = 0x40100000,
|
|
};
|
|
|
|
|
|
static inline Address VMKernelVirtToPhys(Address virt) {
|
|
return virt - 0xFFFFFFFF80100000 + kKernelPhysBase;
|
|
}
|
|
|
|
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);
|