diff --git a/lcrash/mm/virt.c b/lcrash/mm/virt.c index 5ad1a6c..c81f1d7 100644 --- a/lcrash/mm/virt.c +++ b/lcrash/mm/virt.c @@ -26,32 +26,37 @@ void VmemInitialize() { for (int j = 0; j < 512; j++) { if ((*OriginalPDPT)[j] & 1) { - u64 (*OriginalPD)[512] = (u64(*)[512])(((*OriginalPDPT)[j] & 0x000ffffffffff000)); - u64 (*NewPD)[512] = KernelHeapAlloc(sizeof(u64) * 512, 0x1000, 0); + if ((*OriginalPDPT)[j] & 128) { + (*NewPDPT)[j] = (*OriginalPDPT)[j]; + } else { + u64 (*OriginalPD)[512] = (u64(*)[512])(((*OriginalPDPT)[j] & 0x000ffffffffff000)); + u64 (*NewPD)[512] = KernelHeapAlloc(sizeof(u64) * 512, 0x1000, 0); - for (int k = 0; k < 512; k++) { - if ((*OriginalPD)[k] & 1) { - u64 (*OriginalPT)[512] = (u64(*)[512])(((*OriginalPD)[k] & 0x000ffffffffff000)); - u64 (*NewPT)[512] = KernelHeapAlloc(sizeof(u64) * 512, 0x1000, 0); + for (int k = 0; k < 512; k++) { + if ((*OriginalPD)[k] & 1) { + if ((*OriginalPD)[k] & 128) { + (*NewPD)[k] = (*OriginalPD)[k]; + } else { + u64 (*OriginalPT)[512] = (u64(*)[512])(((*OriginalPD)[k] & 0x000ffffffffff000)); + u64 (*NewPT)[512] = KernelHeapAlloc(sizeof(u64) * 512, 0x1000, 0); - if ((s64)NewPT <= 0) Panic("Failed to allocate memory"); + if ((s64)NewPT <= 0) Panic("Failed to allocate memory"); - for (int l = 0; l < 512; l++) { - //if ((*OriginalPT)[l] & 1) { - // (*NewPT)[l] = (*OriginalPT)[l]; - //} else (*NewPT)[l] = 0;* - (*NewPT)[l] = (*OriginalPT)[l] | 0x87; - } + for (int l = 0; l < 512; l++) { + (*NewPT)[l] = (*OriginalPT)[l]; + } - NewPT = (void*)((u64)OriginalPT | 0x87); + NewPT = (void*)((u64)OriginalPT | (((*OriginalPD)[k] & ~0x000ffffffffff000))); - (*NewPD)[k] = (u64)NewPT; - } else (*NewPD)[k] = 0; + (*NewPD)[k] = (u64)NewPT; + } + } else (*NewPD)[k] = 0; + } + + NewPD = (void*)((uptr)NewPD | (((*OriginalPDPT)[j]) & ~0x0007fffffffff000)); + + (*NewPDPT)[j] = (u64)NewPD; } - - NewPD = (void*)((uptr)NewPD | (((*OriginalPDPT)[j]) & ~0x0007fffffffff000)); - - (*NewPDPT)[j] = (u64)NewPD; } else (*NewPDPT)[j] = 0; } @@ -69,6 +74,4 @@ void VmemInitialize() { CR3 ^= (u64)VmemOriginalPML4; CR3 |= ((u64)VmemPML4) & 0x0007fffffffff000; asm volatile ("mov %q0, %%cr3" : : "r" (CR3)); - - Panic("FUCK"); }