[lcrash] ADD: Virtual memory manager
This commit is contained in:
parent
aa0ed9df08
commit
1ab0e55277
@ -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;
|
||||||
|
@ -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);
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user