diff --git a/Kernel/E1000NetworkAdapter.cpp b/Kernel/E1000NetworkAdapter.cpp index 2f04d572bc..ede54a650f 100644 --- a/Kernel/E1000NetworkAdapter.cpp +++ b/Kernel/E1000NetworkAdapter.cpp @@ -108,6 +108,9 @@ E1000NetworkAdapter::E1000NetworkAdapter(PCI::Address pci_address, byte irq) { s_the = this; kprintf("E1000: Found at PCI address %b:%b:%b\n", pci_address.bus(), pci_address.slot(), pci_address.function()); + + enable_bus_mastering(m_pci_address); + m_mmio_base = PhysicalAddress(PCI::get_BAR0(m_pci_address)); MM.map_for_kernel(LinearAddress(m_mmio_base.get()), m_mmio_base); MM.map_for_kernel(LinearAddress(m_mmio_base.offset(4096).get()), m_mmio_base.offset(4096)); diff --git a/Kernel/MemoryManager.cpp b/Kernel/MemoryManager.cpp index bbd81491b5..1ce601bcc8 100644 --- a/Kernel/MemoryManager.cpp +++ b/Kernel/MemoryManager.cpp @@ -56,6 +56,9 @@ void MemoryManager::populate_page_directory(PageDirectory& page_directory) { page_directory.m_directory_page = allocate_supervisor_physical_page(); page_directory.entries()[0] = kernel_page_directory().entries()[0]; + // Defer to the kernel page tables for 0xC0000000-0xFFFFFFFF + for (int i = 768; i < 1024; ++i) + page_directory.entries()[i] = kernel_page_directory().entries()[i]; } void MemoryManager::initialize_paging() diff --git a/Kernel/PCI.cpp b/Kernel/PCI.cpp index 685db03658..2b22cf75c6 100644 --- a/Kernel/PCI.cpp +++ b/Kernel/PCI.cpp @@ -103,6 +103,14 @@ dword get_BAR3(Address address) { return read_field(address, PCI_BAR3); } dword get_BAR4(Address address) { return read_field(address, PCI_BAR4); } dword get_BAR5(Address address) { return read_field(address, PCI_BAR5); } +void enable_bus_mastering(Address address) +{ + auto value = read_field(address, PCI_COMMAND); + value |= (1 << 2); + value |= (1 << 0); + write_field(address, PCI_COMMAND, value); +} + void enumerate_all(Function callback) { // Single PCI host controller. diff --git a/Kernel/PCI.h b/Kernel/PCI.h index bb2950a049..e8330d4245 100644 --- a/Kernel/PCI.h +++ b/Kernel/PCI.h @@ -47,5 +47,6 @@ dword get_BAR2(Address); dword get_BAR3(Address); dword get_BAR4(Address); dword get_BAR5(Address); +void enable_bus_mastering(Address); }