23static inline uint64_t canonical_high(uint64_t addr) {
25 if (addr & (1ULL << 47)) {
26 return addr | 0xFFFF000000000000ULL;
36 va = canonical_high(va);
37 return (uint64_t*)(uintptr_t)va;
40static inline uint64_t* pdpt_from_recursive(
size_t pml4_i) {
44 ((uint64_t)pml4_i << 12);
45 va = canonical_high(va);
46 return (uint64_t*)(uintptr_t)va;
50static inline uint64_t* pd_from_recursive(
size_t pml4_i,
size_t pdpt_i) {
53 ((uint64_t)pml4_i << 21) |
54 ((uint64_t)pdpt_i << 12);
55 va = canonical_high(va);
56 return (uint64_t*)(uintptr_t)va;
60static inline uint64_t* pt_from_recursive(
size_t pml4_i,
size_t pdpt_i,
size_t pd_i) {
62 ((uint64_t)pml4_i << 30) |
63 ((uint64_t)pdpt_i << 21) |
64 ((uint64_t)pd_i << 12);
65 va = canonical_high(va);
66 return (uint64_t*)(uintptr_t)va;
70static inline size_t get_pml4_index(uint64_t va) {
return (va >> 39) & 0x1FF; }
71static inline size_t get_pdpt_index(uint64_t va) {
return (va >> 30) & 0x1FF; }
72static inline size_t get_pd_index(uint64_t va) {
return (va >> 21) & 0x1FF; }
73static inline size_t get_pt_index(uint64_t va) {
return (va >> 12) & 0x1FF; }
96 size_t pml4_i = get_pml4_index(va);
97 size_t pdpt_i = get_pdpt_index(va);
98 size_t pd_i = get_pd_index(va);
99 size_t pt_i = get_pt_index(va);
119 uint64_t* pdpt_va = pdpt_from_recursive(pml4_i);
130 uint64_t* pd_va = pd_from_recursive(pml4_i, pdpt_i);
142 uint64_t* pt_va = pt_from_recursive(pml4_i, pdpt_i, pd_i);
143 return (
PMMPTE)&pt_va[pt_i];
153 size_t pml4_i = get_pml4_index(va);
173 return (
PMMPTE) & pml4_va[pml4_i];
183 size_t pml4_i = get_pml4_index(va);
184 size_t pdpt_i = get_pdpt_index(va);
204 uint64_t* pdpt_va = pdpt_from_recursive(pml4_i);
215 return (
PMMPTE)&pdpt_va[pdpt_i];
225 size_t pml4_i = get_pml4_index(va);
226 size_t pdpt_i = get_pdpt_index(va);
227 size_t pd_i = get_pd_index(va);
247 uint64_t* pdpt_va = pdpt_from_recursive(pml4_i);
258 uint64_t* pd_va = pd_from_recursive(pml4_i, pdpt_i);
269 return (
PMMPTE)&pd_va[pd_i];
274 IN void* VirtualAddress
363 uintptr_t p = (uintptr_t)pte;
365 size_t pml4_check = (p >> 39) & 0x1FF;
371 size_t pml4_i = (p >> 30) & 0x1FF;
372 size_t pdpt_i = (p >> 21) & 0x1FF;
373 size_t pd_i = (p >> 12) & 0x1FF;
374 size_t pt_i = (p >> 3) & 0x1FF;
376 uint64_t va = ((uint64_t)pml4_i << 39) |
377 ((uint64_t)pdpt_i << 30) |
378 ((uint64_t)pd_i << 21) |
379 ((uint64_t)pt_i << 12);
381 return canonical_high(va);
457 IN void* VirtualAddress
489 IN uintptr_t VirtualAddress
FORCEINLINE uint64_t InterlockedExchangeU64(volatile uint64_t *target, uint64_t value)
FORCEINLINE void invlpg(void *m)
FORCEINLINE void __write_cr3(uint64_t val)
FORCEINLINE uint64_t __read_cr3(void)
uintptr_t MiTranslateVirtualToPhysical(IN void *VirtualAddress)
PMMPTE MiGetPdptePointer(IN uintptr_t va)
PMMPTE MiGetPdePointer(IN uintptr_t va)
uint64_t * pml4_from_recursive(void)
bool MmIsAddressPresent(IN uintptr_t VirtualAddress)
PMMPTE MiGetPml4ePointer(IN uintptr_t va)
PAGE_INDEX MiTranslatePteToPfn(IN PMMPTE pte)
uint64_t MiTranslatePteToVa(IN PMMPTE pte)
PMMPTE MiGetPtePointer(IN uintptr_t va)
void MiInvalidateTlbForVa(IN void *VirtualAddress)
void MiUnmapPte(IN PMMPTE pte)
@ CPU_ACTION_PERFORM_TLB_SHOOTDOWN
struct _IPI_PARAMS IPI_PARAMS
#define PHYSICAL_TO_PPFN(PHYS)
#define PTE_TO_PHYSICAL(PMMPTE)
#define PPFN_TO_INDEX(PPFN)
#define VA_OFFSET(_VirtualAddress)
FORCEINLINE void * kmemset(void *dest, int64_t val, uint64_t len)
#define MI_WRITE_PTE(_PtePointer, _Va, _Pa, _Flags)
PAGE_INDEX MiRequestPhysicalPage(IN PFN_STATE ListType)
uintptr_t MmHighestUserAddress
void MhSendActionToCpusAndWait(CPU_ACTION action, IPI_PARAMS parameter)
struct _PAGE_PARAMETERS pageParams
struct _MMPTE::@172372265215056352375070220246156106027174106113::@200357034104227323320222006243127050212100105247 Hard
struct _MMPTE::@172372265215056352375070220246156106027174106113::@277354034164206104264133322054061025100052052376 Soft
uint64_t addressToInvalidate