[lcrash] ADD: Virtual memory manager

This commit is contained in:
xwashere 2024-04-22 09:04:33 -04:00
parent aa0ed9df08
commit 1ab0e55277
Signed by: XWasHere
GPG Key ID: 042F8BFA1B0EF93B
3 changed files with 31 additions and 1 deletions

View File

@ -6,6 +6,23 @@
u64 (*VmemOriginalPML4)[512] = 0; u64 (*VmemOriginalPML4)[512] = 0;
u64 (*VmemPML4)[512] = 0; u64 (*VmemPML4)[512] = 0;
void VmemMapMemory(void* Phys, void* Virt, u64 Size) {
u64 PhysStart = (u64)Phys;
u64 VirtStart = (u64)Virt;
if ((PhysStart | VirtStart | Size) & 0xfff) Panic("VmemMapMemory: Addresses not page aligned");
for (u64 Offset4 = VirtStart; Offset4 < VirtStart + Size; Offset4 += 0x8000000000) {
for (u64 Offset3 = Offset4; Offset3 < VirtStart + Size && Offset3 < Offset4 + 0x8000000000; Offset3 += 0x40000000) {
for (u64 Offset2 = Offset3; Offset2 < VirtStart + Size && Offset2 < Offset3 + 0x40000000; Offset2 += 0x200000) {
for (u64 Offset1 = Offset2; Offset2 < VirtStart + Size && Offset1 < Offset2 + 0x200000; Offset1 += 0x1000) {
}
}
}
}
}
void VmemInitialize() { void VmemInitialize() {
// Copy control registers // Copy control registers
u64 CR3; u64 CR3;

View File

@ -2,4 +2,10 @@
#include <lcrash/types.h> #include <lcrash/types.h>
void VmemInitialize(); void VmemInitialize();
/**
* Map a range of physical addresses to a range of virtual addresses
* Must be page-aligned
*/
void VmemMapMemory(void* PhysStart, void* VirtStart, u64 Size);

View File

@ -1,5 +1,6 @@
#include <lcrash/pci/pci.h> #include <lcrash/pci/pci.h>
#include <lcrash/mm/virt.h>
#include <lcrash/acpi/acpi.h> #include <lcrash/acpi/acpi.h>
#include <lcrash/debug/debug.h> #include <lcrash/debug/debug.h>
#include <lcrash/driver/sysbus.h> #include <lcrash/driver/sysbus.h>
@ -35,6 +36,12 @@ void PciInitialize() {
// Take our pcie bridges // Take our pcie bridges
s32 Length = (BridgeTable->Header.Length - 44) / 16; s32 Length = (BridgeTable->Header.Length - 44) / 16;
for (int i = 0; i < Length; i++) { for (int i = 0; i < Length; i++) {
// Identity map our busses because linux doesn't do it for us
VmemMapMemory(
BridgeTable->Bridges[i].Address, BridgeTable->Bridges[i].Address,
(BridgeTable->Bridges[i].EndBus - BridgeTable->Bridges[i].StartBus) * 0x100000
);
for (int Bus = BridgeTable->Bridges[i].StartBus; Bus < BridgeTable->Bridges[i].EndBus; Bus++) { for (int Bus = BridgeTable->Bridges[i].StartBus; Bus < BridgeTable->Bridges[i].EndBus; Bus++) {
PciBusses[Bus] = BridgeTable->Bridges[i].Address + (Bus - BridgeTable->Bridges[i].StartBus) * 0x100000; PciBusses[Bus] = BridgeTable->Bridges[i].Address + (Bus - BridgeTable->Bridges[i].StartBus) * 0x100000;
} }