diff --git a/lcrash/mm/virt.c b/lcrash/mm/virt.c index c81f1d7..6b23222 100644 --- a/lcrash/mm/virt.c +++ b/lcrash/mm/virt.c @@ -6,6 +6,23 @@ u64 (*VmemOriginalPML4)[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() { // Copy control registers u64 CR3; diff --git a/lcrash/mm/virt.h b/lcrash/mm/virt.h index 2a9de51..4c176ce 100644 --- a/lcrash/mm/virt.h +++ b/lcrash/mm/virt.h @@ -2,4 +2,10 @@ #include -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); diff --git a/lcrash/pci/pci.c b/lcrash/pci/pci.c index cdd2442..fd61a90 100644 --- a/lcrash/pci/pci.c +++ b/lcrash/pci/pci.c @@ -1,5 +1,6 @@ #include +#include #include #include #include @@ -35,6 +36,12 @@ void PciInitialize() { // Take our pcie bridges s32 Length = (BridgeTable->Header.Length - 44) / 16; 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++) { PciBusses[Bus] = BridgeTable->Bridges[i].Address + (Bus - BridgeTable->Bridges[i].StartBus) * 0x100000; }