[lcrash] ADD: Virtual memory manager
This commit is contained in:
parent
4334e21878
commit
aa0ed9df08
@ -26,32 +26,37 @@ void VmemInitialize() {
|
|||||||
|
|
||||||
for (int j = 0; j < 512; j++) {
|
for (int j = 0; j < 512; j++) {
|
||||||
if ((*OriginalPDPT)[j] & 1) {
|
if ((*OriginalPDPT)[j] & 1) {
|
||||||
u64 (*OriginalPD)[512] = (u64(*)[512])(((*OriginalPDPT)[j] & 0x000ffffffffff000));
|
if ((*OriginalPDPT)[j] & 128) {
|
||||||
u64 (*NewPD)[512] = KernelHeapAlloc(sizeof(u64) * 512, 0x1000, 0);
|
(*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++) {
|
for (int k = 0; k < 512; k++) {
|
||||||
if ((*OriginalPD)[k] & 1) {
|
if ((*OriginalPD)[k] & 1) {
|
||||||
u64 (*OriginalPT)[512] = (u64(*)[512])(((*OriginalPD)[k] & 0x000ffffffffff000));
|
if ((*OriginalPD)[k] & 128) {
|
||||||
u64 (*NewPT)[512] = KernelHeapAlloc(sizeof(u64) * 512, 0x1000, 0);
|
(*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++) {
|
for (int l = 0; l < 512; l++) {
|
||||||
//if ((*OriginalPT)[l] & 1) {
|
(*NewPT)[l] = (*OriginalPT)[l];
|
||||||
// (*NewPT)[l] = (*OriginalPT)[l];
|
}
|
||||||
//} else (*NewPT)[l] = 0;*
|
|
||||||
(*NewPT)[l] = (*OriginalPT)[l] | 0x87;
|
|
||||||
}
|
|
||||||
|
|
||||||
NewPT = (void*)((u64)OriginalPT | 0x87);
|
NewPT = (void*)((u64)OriginalPT | (((*OriginalPD)[k] & ~0x000ffffffffff000)));
|
||||||
|
|
||||||
(*NewPD)[k] = (u64)NewPT;
|
(*NewPD)[k] = (u64)NewPT;
|
||||||
} else (*NewPD)[k] = 0;
|
}
|
||||||
|
} 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;
|
} else (*NewPDPT)[j] = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -69,6 +74,4 @@ void VmemInitialize() {
|
|||||||
CR3 ^= (u64)VmemOriginalPML4;
|
CR3 ^= (u64)VmemOriginalPML4;
|
||||||
CR3 |= ((u64)VmemPML4) & 0x0007fffffffff000;
|
CR3 |= ((u64)VmemPML4) & 0x0007fffffffff000;
|
||||||
asm volatile ("mov %q0, %%cr3" : : "r" (CR3));
|
asm volatile ("mov %q0, %%cr3" : : "r" (CR3));
|
||||||
|
|
||||||
Panic("FUCK");
|
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user