diff --git a/Core/Driver/Driver.cpp b/Core/Driver/Driver.cpp index 9a767c2..01b8048 100644 --- a/Core/Driver/Driver.cpp +++ b/Core/Driver/Driver.cpp @@ -30,9 +30,10 @@ namespace Driver void Driver::UnloadAllDrivers() { - debug("%ld drivers loaded, [DUIDs: %ld]", Drivers.size(), DriverUIDs); - debug("driver size %ld", Drivers.size()); - for (size_t i = 0; i < Drivers.size(); i++) + size_t DriversNum = Drivers.size(); + debug("%ld drivers loaded, [DUIDs: %ld]", DriversNum, DriverUIDs); + debug("driver size %ld", DriversNum); + for (size_t i = 0; i < DriversNum; i++) { DriverFile *drv = Drivers[i]; KernelCallback callback; @@ -41,11 +42,11 @@ namespace Driver DriverManager->IOCB(drv->DriverUID, (void *)&callback); delete drv->MemTrk; - for (size_t i = 0; i < sizeof(drv->InterruptHook) / sizeof(drv->InterruptHook[0]); i++) + for (size_t j = 0; j < sizeof(drv->InterruptHook) / sizeof(drv->InterruptHook[0]); j++) { - if (!drv->InterruptHook[i]) + if (!drv->InterruptHook[j]) continue; - delete drv->InterruptHook[i]; + delete drv->InterruptHook[j]; } Drivers.remove(i); } diff --git a/Core/Driver/DriverLoading/BindInterrupt.cpp b/Core/Driver/DriverLoading/BindInterrupt.cpp index 0ffcee9..8f5f6f6 100644 --- a/Core/Driver/DriverLoading/BindInterrupt.cpp +++ b/Core/Driver/DriverLoading/BindInterrupt.cpp @@ -24,8 +24,12 @@ namespace Driver foreach (auto Drv in Drivers) { FexExtended *fe = ((FexExtended *)((uintptr_t)Drv->Address + EXTENDED_SECTION_ADDRESS)); + + debug("Driver %s is conflicting with %s", fe->Driver.Name, fexExtended->Driver.Name); if (fe->Driver.OverrideOnConflict) return DriverCode::DRIVER_CONFLICT; + + DriversToRemove.push_back(Drv->DriverUID); } foreach (auto DrvID in DriversToRemove) @@ -37,6 +41,17 @@ namespace Driver } } } + else + { + foreach (auto Drv in Drivers) + { + FexExtended *fe = ((FexExtended *)((uintptr_t)Drv->Address + EXTENDED_SECTION_ADDRESS)); + + debug("Driver %s is conflicting with %s", fe->Driver.Name, fexExtended->Driver.Name); + if (fe->Driver.OverrideOnConflict) + return DriverCode::DRIVER_CONFLICT; + } + } fixme("Generic driver: %s", fexExtended->Driver.Name); DriverFile *DrvFile = new DriverFile; @@ -58,8 +73,12 @@ namespace Driver foreach (auto Drv in Drivers) { FexExtended *fe = ((FexExtended *)((uintptr_t)Drv->Address + EXTENDED_SECTION_ADDRESS)); + + debug("Driver %s is conflicting with %s", fe->Driver.Name, fexExtended->Driver.Name); if (fe->Driver.OverrideOnConflict) return DriverCode::DRIVER_CONFLICT; + + DriversToRemove.push_back(Drv->DriverUID); } foreach (auto DrvID in DriversToRemove) @@ -71,6 +90,17 @@ namespace Driver } } } + else + { + foreach (auto Drv in Drivers) + { + FexExtended *fe = ((FexExtended *)((uintptr_t)Drv->Address + EXTENDED_SECTION_ADDRESS)); + + debug("Driver %s is conflicting with %s", fe->Driver.Name, fexExtended->Driver.Name); + if (fe->Driver.OverrideOnConflict) + return DriverCode::DRIVER_CONFLICT; + } + } fixme("Display driver: %s", fexExtended->Driver.Name); delete mem; @@ -87,8 +117,12 @@ namespace Driver foreach (auto Drv in Drivers) { FexExtended *fe = ((FexExtended *)((uintptr_t)Drv->Address + EXTENDED_SECTION_ADDRESS)); + + debug("Driver %s is conflicting with %s", fe->Driver.Name, fexExtended->Driver.Name); if (fe->Driver.OverrideOnConflict) return DriverCode::DRIVER_CONFLICT; + + DriversToRemove.push_back(Drv->DriverUID); } foreach (auto DrvID in DriversToRemove) @@ -100,6 +134,17 @@ namespace Driver } } } + else + { + foreach (auto Drv in Drivers) + { + FexExtended *fe = ((FexExtended *)((uintptr_t)Drv->Address + EXTENDED_SECTION_ADDRESS)); + + debug("Driver %s is conflicting with %s", fe->Driver.Name, fexExtended->Driver.Name); + if (fe->Driver.OverrideOnConflict) + return DriverCode::DRIVER_CONFLICT; + } + } fixme("Network driver: %s", fexExtended->Driver.Name); delete mem; @@ -118,8 +163,12 @@ namespace Driver foreach (auto Drv in Drivers) { FexExtended *fe = ((FexExtended *)((uintptr_t)Drv->Address + EXTENDED_SECTION_ADDRESS)); + + debug("Driver %s is conflicting with %s", fe->Driver.Name, fexExtended->Driver.Name); if (fe->Driver.OverrideOnConflict) return DriverCode::DRIVER_CONFLICT; + + DriversToRemove.push_back(Drv->DriverUID); } foreach (auto DrvID in DriversToRemove) @@ -131,6 +180,17 @@ namespace Driver } } } + else + { + foreach (auto Drv in Drivers) + { + FexExtended *fe = ((FexExtended *)((uintptr_t)Drv->Address + EXTENDED_SECTION_ADDRESS)); + + debug("Driver %s is conflicting with %s", fe->Driver.Name, fexExtended->Driver.Name); + if (fe->Driver.OverrideOnConflict) + return DriverCode::DRIVER_CONFLICT; + } + } KernelCallback *KCallback = (KernelCallback *)mem->RequestPages(TO_PAGES(sizeof(KernelCallback))); UNUSED(KCallback); // Shut up clang @@ -177,8 +237,12 @@ namespace Driver foreach (auto Drv in Drivers) { FexExtended *fe = ((FexExtended *)((uintptr_t)Drv->Address + EXTENDED_SECTION_ADDRESS)); + + debug("Driver %s is conflicting with %s", fe->Driver.Name, fexExtended->Driver.Name); if (fe->Driver.OverrideOnConflict) return DriverCode::DRIVER_CONFLICT; + + DriversToRemove.push_back(Drv->DriverUID); } foreach (auto DrvID in DriversToRemove) @@ -190,6 +254,17 @@ namespace Driver } } } + else + { + foreach (auto Drv in Drivers) + { + FexExtended *fe = ((FexExtended *)((uintptr_t)Drv->Address + EXTENDED_SECTION_ADDRESS)); + + debug("Driver %s is conflicting with %s", fe->Driver.Name, fexExtended->Driver.Name); + if (fe->Driver.OverrideOnConflict) + return DriverCode::DRIVER_CONFLICT; + } + } fixme("Filesystem driver: %s", fexExtended->Driver.Name); delete mem; @@ -200,23 +275,24 @@ namespace Driver { FexExtended *fexExtended = (FexExtended *)((uintptr_t)fex + EXTENDED_SECTION_ADDRESS); + debug("Searching for conflicting drivers..."); if (fexExtended->Driver.OverrideOnConflict) { - debug("Searching for conflicting drivers..."); Vector DriversToRemove = Vector(); foreach (auto Drv in Drivers) { FexExtended *fe = ((FexExtended *)((uintptr_t)Drv->Address + EXTENDED_SECTION_ADDRESS)); - if (fe->Driver.OverrideOnConflict) - return DriverCode::DRIVER_CONFLICT; if ((fe->Driver.TypeFlags & FexDriverInputTypes_Mouse && fexExtended->Driver.TypeFlags & FexDriverInputTypes_Mouse) || (fe->Driver.TypeFlags & FexDriverInputTypes_Keyboard && fexExtended->Driver.TypeFlags & FexDriverInputTypes_Keyboard)) { - DriversToRemove.push_back(Drv->DriverUID); debug("Driver %s is conflicting with %s", fe->Driver.Name, fexExtended->Driver.Name); + if (fe->Driver.OverrideOnConflict) + return DriverCode::DRIVER_CONFLICT; + + DriversToRemove.push_back(Drv->DriverUID); } } @@ -229,6 +305,23 @@ namespace Driver } } } + else + { + foreach (auto Drv in Drivers) + { + FexExtended *fe = ((FexExtended *)((uintptr_t)Drv->Address + EXTENDED_SECTION_ADDRESS)); + + if ((fe->Driver.TypeFlags & FexDriverInputTypes_Mouse && + fexExtended->Driver.TypeFlags & FexDriverInputTypes_Mouse) || + (fe->Driver.TypeFlags & FexDriverInputTypes_Keyboard && + fexExtended->Driver.TypeFlags & FexDriverInputTypes_Keyboard)) + { + debug("Driver %s is conflicting with %s", fe->Driver.Name, fexExtended->Driver.Name); + if (fe->Driver.OverrideOnConflict) + return DriverCode::DRIVER_CONFLICT; + } + } + } KernelCallback *KCallback = (KernelCallback *)mem->RequestPages(TO_PAGES(sizeof(KernelCallback))); @@ -289,8 +382,12 @@ namespace Driver foreach (auto Drv in Drivers) { FexExtended *fe = ((FexExtended *)((uintptr_t)Drv->Address + EXTENDED_SECTION_ADDRESS)); + + debug("Driver %s is conflicting with %s", fe->Driver.Name, fexExtended->Driver.Name); if (fe->Driver.OverrideOnConflict) return DriverCode::DRIVER_CONFLICT; + + DriversToRemove.push_back(Drv->DriverUID); } foreach (auto DrvID in DriversToRemove) @@ -302,6 +399,17 @@ namespace Driver } } } + else + { + foreach (auto Drv in Drivers) + { + FexExtended *fe = ((FexExtended *)((uintptr_t)Drv->Address + EXTENDED_SECTION_ADDRESS)); + + debug("Driver %s is conflicting with %s", fe->Driver.Name, fexExtended->Driver.Name); + if (fe->Driver.OverrideOnConflict) + return DriverCode::DRIVER_CONFLICT; + } + } fixme("Audio driver: %s", fexExtended->Driver.Name); delete mem; diff --git a/Core/Driver/DriverLoading/BindPCI.cpp b/Core/Driver/DriverLoading/BindPCI.cpp index c67fd77..c600793 100644 --- a/Core/Driver/DriverLoading/BindPCI.cpp +++ b/Core/Driver/DriverLoading/BindPCI.cpp @@ -137,8 +137,12 @@ namespace Driver foreach (auto Drv in Drivers) { FexExtended *fe = ((FexExtended *)((uintptr_t)Drv->Address + EXTENDED_SECTION_ADDRESS)); + + debug("Driver %s is conflicting with %s", fe->Driver.Name, fexExtended->Driver.Name); if (fe->Driver.OverrideOnConflict) return DriverCode::DRIVER_CONFLICT; + + DriversToRemove.push_back(Drv->DriverUID); } foreach (auto DrvID in DriversToRemove) @@ -150,6 +154,17 @@ namespace Driver } } } + else + { + foreach (auto Drv in Drivers) + { + FexExtended *fe = ((FexExtended *)((uintptr_t)Drv->Address + EXTENDED_SECTION_ADDRESS)); + + debug("Driver %s is conflicting with %s", fe->Driver.Name, fexExtended->Driver.Name); + if (fe->Driver.OverrideOnConflict) + return DriverCode::DRIVER_CONFLICT; + } + } fixme("Generic driver: %s", fexExtended->Driver.Name); delete mem; @@ -166,8 +181,12 @@ namespace Driver foreach (auto Drv in Drivers) { FexExtended *fe = ((FexExtended *)((uintptr_t)Drv->Address + EXTENDED_SECTION_ADDRESS)); + + debug("Driver %s is conflicting with %s", fe->Driver.Name, fexExtended->Driver.Name); if (fe->Driver.OverrideOnConflict) return DriverCode::DRIVER_CONFLICT; + + DriversToRemove.push_back(Drv->DriverUID); } foreach (auto DrvID in DriversToRemove) @@ -179,6 +198,17 @@ namespace Driver } } } + else + { + foreach (auto Drv in Drivers) + { + FexExtended *fe = ((FexExtended *)((uintptr_t)Drv->Address + EXTENDED_SECTION_ADDRESS)); + + debug("Driver %s is conflicting with %s", fe->Driver.Name, fexExtended->Driver.Name); + if (fe->Driver.OverrideOnConflict) + return DriverCode::DRIVER_CONFLICT; + } + } fixme("Display driver: %s", fexExtended->Driver.Name); delete mem; @@ -195,8 +225,12 @@ namespace Driver foreach (auto Drv in Drivers) { FexExtended *fe = ((FexExtended *)((uintptr_t)Drv->Address + EXTENDED_SECTION_ADDRESS)); + + debug("Driver %s is conflicting with %s", fe->Driver.Name, fexExtended->Driver.Name); if (fe->Driver.OverrideOnConflict) return DriverCode::DRIVER_CONFLICT; + + DriversToRemove.push_back(Drv->DriverUID); } foreach (auto DrvID in DriversToRemove) @@ -208,6 +242,17 @@ namespace Driver } } } + else + { + foreach (auto Drv in Drivers) + { + FexExtended *fe = ((FexExtended *)((uintptr_t)Drv->Address + EXTENDED_SECTION_ADDRESS)); + + debug("Driver %s is conflicting with %s", fe->Driver.Name, fexExtended->Driver.Name); + if (fe->Driver.OverrideOnConflict) + return DriverCode::DRIVER_CONFLICT; + } + } KernelCallback *KCallback = (KernelCallback *)mem->RequestPages(TO_PAGES(sizeof(KernelCallback))); @@ -258,8 +303,12 @@ namespace Driver foreach (auto Drv in Drivers) { FexExtended *fe = ((FexExtended *)((uintptr_t)Drv->Address + EXTENDED_SECTION_ADDRESS)); + + debug("Driver %s is conflicting with %s", fe->Driver.Name, fexExtended->Driver.Name); if (fe->Driver.OverrideOnConflict) return DriverCode::DRIVER_CONFLICT; + + DriversToRemove.push_back(Drv->DriverUID); } foreach (auto DrvID in DriversToRemove) @@ -271,6 +320,17 @@ namespace Driver } } } + else + { + foreach (auto Drv in Drivers) + { + FexExtended *fe = ((FexExtended *)((uintptr_t)Drv->Address + EXTENDED_SECTION_ADDRESS)); + + debug("Driver %s is conflicting with %s", fe->Driver.Name, fexExtended->Driver.Name); + if (fe->Driver.OverrideOnConflict) + return DriverCode::DRIVER_CONFLICT; + } + } KernelCallback *KCallback = (KernelCallback *)mem->RequestPages(TO_PAGES(sizeof(KernelCallback))); @@ -312,8 +372,12 @@ namespace Driver foreach (auto Drv in Drivers) { FexExtended *fe = ((FexExtended *)((uintptr_t)Drv->Address + EXTENDED_SECTION_ADDRESS)); + + debug("Driver %s is conflicting with %s", fe->Driver.Name, fexExtended->Driver.Name); if (fe->Driver.OverrideOnConflict) return DriverCode::DRIVER_CONFLICT; + + DriversToRemove.push_back(Drv->DriverUID); } foreach (auto DrvID in DriversToRemove) @@ -325,6 +389,17 @@ namespace Driver } } } + else + { + foreach (auto Drv in Drivers) + { + FexExtended *fe = ((FexExtended *)((uintptr_t)Drv->Address + EXTENDED_SECTION_ADDRESS)); + + debug("Driver %s is conflicting with %s", fe->Driver.Name, fexExtended->Driver.Name); + if (fe->Driver.OverrideOnConflict) + return DriverCode::DRIVER_CONFLICT; + } + } fixme("Filesystem driver: %s", fexExtended->Driver.Name); delete mem; @@ -341,8 +416,12 @@ namespace Driver foreach (auto Drv in Drivers) { FexExtended *fe = ((FexExtended *)((uintptr_t)Drv->Address + EXTENDED_SECTION_ADDRESS)); + + debug("Driver %s is conflicting with %s", fe->Driver.Name, fexExtended->Driver.Name); if (fe->Driver.OverrideOnConflict) return DriverCode::DRIVER_CONFLICT; + + DriversToRemove.push_back(Drv->DriverUID); } foreach (auto DrvID in DriversToRemove) @@ -354,6 +433,17 @@ namespace Driver } } } + else + { + foreach (auto Drv in Drivers) + { + FexExtended *fe = ((FexExtended *)((uintptr_t)Drv->Address + EXTENDED_SECTION_ADDRESS)); + + debug("Driver %s is conflicting with %s", fe->Driver.Name, fexExtended->Driver.Name); + if (fe->Driver.OverrideOnConflict) + return DriverCode::DRIVER_CONFLICT; + } + } fixme("Input driver: %s", fexExtended->Driver.Name); delete mem; @@ -370,8 +460,12 @@ namespace Driver foreach (auto Drv in Drivers) { FexExtended *fe = ((FexExtended *)((uintptr_t)Drv->Address + EXTENDED_SECTION_ADDRESS)); + + debug("Driver %s is conflicting with %s", fe->Driver.Name, fexExtended->Driver.Name); if (fe->Driver.OverrideOnConflict) return DriverCode::DRIVER_CONFLICT; + + DriversToRemove.push_back(Drv->DriverUID); } foreach (auto DrvID in DriversToRemove) @@ -383,10 +477,50 @@ namespace Driver } } } + else + { + foreach (auto Drv in Drivers) + { + FexExtended *fe = ((FexExtended *)((uintptr_t)Drv->Address + EXTENDED_SECTION_ADDRESS)); - fixme("Audio driver: %s", fexExtended->Driver.Name); - delete mem; - return DriverCode::NOT_IMPLEMENTED; + debug("Driver %s is conflicting with %s", fe->Driver.Name, fexExtended->Driver.Name); + if (fe->Driver.OverrideOnConflict) + return DriverCode::DRIVER_CONFLICT; + } + } + + KernelCallback *KCallback = (KernelCallback *)mem->RequestPages(TO_PAGES(sizeof(KernelCallback))); + + DriverInterruptHook *InterruptHook = new DriverInterruptHook(((int)((PCI::PCIHeader0 *)PCIDevice)->InterruptLine) + 32, // x86 + (void *)((uintptr_t)fexExtended->Driver.Callback + (uintptr_t)fex), + KCallback); + + KCallback->RawPtr = PCIDevice; + KCallback->Reason = CallbackReason::ConfigurationReason; + int CallbackRet = ((int (*)(KernelCallback *))((uintptr_t)fexExtended->Driver.Callback + (uintptr_t)fex))(KCallback); + if (CallbackRet == DriverReturnCode::NOT_IMPLEMENTED) + { + error("Driver %s is not implemented", fexExtended->Driver.Name); + delete mem; + return DriverCode::NOT_IMPLEMENTED; + } + else if (CallbackRet == DriverReturnCode::OK) + trace("Device found for driver: %s", fexExtended->Driver.Name); + else + { + error("Driver %s returned error %d", fexExtended->Driver.Name, CallbackRet); + delete mem; + return DriverCode::DRIVER_RETURNED_ERROR; + } + + DriverFile *DrvFile = new DriverFile; + DrvFile->Enabled = true; + DrvFile->DriverUID = this->DriverUIDs - 1; + DrvFile->Address = (void *)fex; + DrvFile->MemTrk = mem; + DrvFile->InterruptHook[0] = InterruptHook; + Drivers.push_back(DrvFile); + return DriverCode::OK; } DriverCode Driver::DriverLoadBindPCI(void *DrvExtHdr, uintptr_t DriverAddress, size_t Size, bool IsElf) diff --git a/Kernel.cpp b/Kernel.cpp index 9ee5b62..e47aaf8 100644 --- a/Kernel.cpp +++ b/Kernel.cpp @@ -95,6 +95,12 @@ * https://wiki.osdev.org/PCI * https://en.wikipedia.org/wiki/PCI_configuration_space * + * - Audio: + * https://trac.ffmpeg.org/wiki/audio%20types + * https://wiki.osdev.org/AC97 + * https://github.com/LemonOSProject/LemonOS + * https://inst.eecs.berkeley.edu//~cs150/Documents/ac97_r23.pdf + * */ #ifdef a64