Files
ksOS/Kernel/Include/VM/VMM.h
T

50 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,
};
static inline Address VMKernelVirtToPhys(Address virt) {
return virt - 0xFFFFFFFF80100000 + 0x40100000; // TODO: hardcode is awful
}
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);