diff --git a/Core/Crash/CrashHandler.cpp b/Core/Crash/CrashHandler.cpp index 8f71db1..c5fb24c 100644 --- a/Core/Crash/CrashHandler.cpp +++ b/Core/Crash/CrashHandler.cpp @@ -792,6 +792,7 @@ namespace CrashHandler SBIdx = 255; CHArchTrapFrame *Frame = (CHArchTrapFrame *)Data; #if defined(a64) + error("-----------------------------------------------------------------------------------"); error("An exception occurred!"); error("Exception: %#llx", Frame->InterruptNumber); for (size_t i = 0; i < INT_FRAMES_MAX; i++) diff --git a/Core/Driver/Driver.cpp b/Core/Driver/Driver.cpp index a5840d3..675c644 100644 --- a/Core/Driver/Driver.cpp +++ b/Core/Driver/Driver.cpp @@ -36,20 +36,20 @@ namespace Driver debug("driver size %ld", DriversNum); for (size_t i = 0; i < DriversNum; i++) { - DriverFile *drv = Drivers[i]; + DriverFile drv = Drivers[i]; KernelCallback callback; callback.Reason = StopReason; - debug("Stopping & unloading driver %ld [%#lx]", drv->DriverUID, drv->Address); - DriverManager->IOCB(drv->DriverUID, (void *)&callback); + debug("Stopping & unloading driver %ld [%#lx]", drv.DriverUID, drv.Address); + DriverManager->IOCB(drv.DriverUID, (void *)&callback); - delete drv->MemTrk, drv->MemTrk = nullptr; - for (size_t j = 0; j < sizeof(drv->InterruptHook) / sizeof(drv->InterruptHook[0]); j++) + for (size_t j = 0; j < sizeof(drv.InterruptHook) / sizeof(drv.InterruptHook[0]); j++) { - if (!drv->InterruptHook[j]) + if (!drv.InterruptHook[j]) continue; - delete drv->InterruptHook[j], drv->InterruptHook[j] = nullptr; + delete drv.InterruptHook[j], drv.InterruptHook[j] = nullptr; } - delete drv, drv = nullptr; + if (drv.MemTrk) + delete drv.MemTrk, drv.MemTrk = nullptr; Drivers.remove(i); } } @@ -59,22 +59,21 @@ namespace Driver debug("Searching for driver %ld", DUID); for (size_t i = 0; i < Drivers.size(); i++) { - DriverFile *drv = Drivers[i]; - if (drv->DriverUID == DUID) + DriverFile drv = Drivers[i]; + if (drv.DriverUID == DUID) { KernelCallback callback; callback.Reason = StopReason; - debug("Stopping and unloading driver %ld [%#lx]", drv->DriverUID, drv->Address); - this->IOCB(drv->DriverUID, (void *)&callback); + debug("Stopping and unloading driver %ld [%#lx]", drv.DriverUID, drv.Address); + this->IOCB(drv.DriverUID, (void *)&callback); - delete drv->MemTrk, drv->MemTrk = nullptr; - for (size_t i = 0; i < sizeof(drv->InterruptHook) / sizeof(drv->InterruptHook[0]); i++) + for (size_t i = 0; i < sizeof(drv.InterruptHook) / sizeof(drv.InterruptHook[0]); i++) { - if (!drv->InterruptHook[i]) + if (!drv.InterruptHook[i]) continue; - delete drv->InterruptHook[i], drv->InterruptHook[i] = nullptr; + delete drv.InterruptHook[i], drv.InterruptHook[i] = nullptr; } - delete drv, drv = nullptr; + delete drv.MemTrk, drv.MemTrk = nullptr; Drivers.remove(i); return true; } @@ -86,10 +85,10 @@ namespace Driver { foreach (auto Drv in Drivers) { - if (Drv->DriverUID == DUID) + if (Drv.DriverUID == DUID) { - FexExtended *DrvExtHdr = (FexExtended *)((uintptr_t)Drv->Address + EXTENDED_SECTION_ADDRESS); - int ret = ((int (*)(void *))((uintptr_t)DrvExtHdr->Driver.Callback + (uintptr_t)Drv->Address))(KCB); + FexExtended *DrvExtHdr = (FexExtended *)((uintptr_t)Drv.Address + EXTENDED_SECTION_ADDRESS); + int ret = ((int (*)(void *))((uintptr_t)DrvExtHdr->Driver.Callback + (uintptr_t)Drv.Address))(KCB); __sync; return ret; } @@ -233,14 +232,14 @@ namespace Driver #endif { SmartLock(DriverInterruptLock); /* Lock in case of multiple interrupts firing at the same time */ - if (!Handle->InterruptCallback) + if (!Handle.InterruptCallback) { #if defined(a64) || defined(a32) int IntNum = Frame->InterruptNumber - 32; #elif defined(aa64) int IntNum = Frame->InterruptNumber; #endif - warn("Interrupt callback for %ld is not set for driver %ld!", IntNum, Handle->DriverUID); + warn("Interrupt callback for %ld is not set for driver %ld!", IntNum, Handle.DriverUID); return; } CPURegisters regs; @@ -287,15 +286,15 @@ namespace Driver regs.ss = Frame->ss; #elif defined(aa64) #endif - ((int (*)(void *))(Handle->InterruptCallback))(®s); + ((int (*)(void *))(Handle.InterruptCallback))(®s); UNUSED(Frame); } - DriverInterruptHook::DriverInterruptHook(int Interrupt, DriverFile *Handle) : Interrupts::Handler(Interrupt) + DriverInterruptHook::DriverInterruptHook(int Interrupt, DriverFile Handle) : Interrupts::Handler(Interrupt) { this->Handle = Handle; #if defined(a64) || defined(a32) - trace("Interrupt %d hooked to driver %ld", Interrupt, Handle->DriverUID); + trace("Interrupt %d hooked to driver %ld", Interrupt, Handle.DriverUID); #elif defined(aa64) trace("Interrupt %d hooked to driver %ld", Interrupt, Handle->DriverUID); #endif diff --git a/Core/Driver/DriverLoading/BindInput.cpp b/Core/Driver/DriverLoading/BindInput.cpp index 7710635..491ee70 100644 --- a/Core/Driver/DriverLoading/BindInput.cpp +++ b/Core/Driver/DriverLoading/BindInput.cpp @@ -63,12 +63,12 @@ namespace Driver fixme("Input driver: %s", fexExtended->Driver.Name); - DriverFile *DrvFile = new DriverFile; - DrvFile->Enabled = true; - DrvFile->DriverUID = this->DriverUIDs - 1; - DrvFile->Address = (void *)fex; - DrvFile->MemTrk = mem; - DrvFile->InterruptHook[0] = nullptr; + DriverFile DrvFile = { + .Enabled = true, + .DriverUID = this->DriverUIDs - 1, + .Address = (void *)fex, + .MemTrk = mem, + }; Drivers.push_back(DrvFile); return DriverCode::OK; } diff --git a/Core/Driver/DriverLoading/BindInterrupt.cpp b/Core/Driver/DriverLoading/BindInterrupt.cpp index 0451c88..8ad8272 100644 --- a/Core/Driver/DriverLoading/BindInterrupt.cpp +++ b/Core/Driver/DriverLoading/BindInterrupt.cpp @@ -23,7 +23,7 @@ namespace Driver std::vector DriversToRemove = std::vector(); foreach (auto Drv in Drivers) { - FexExtended *fe = ((FexExtended *)((uintptr_t)Drv->Address + EXTENDED_SECTION_ADDRESS)); + FexExtended *fe = ((FexExtended *)((uintptr_t)Drv.Address + EXTENDED_SECTION_ADDRESS)); if (fe->Driver.OverrideOnConflict) { @@ -31,7 +31,7 @@ namespace Driver return DriverCode::DRIVER_CONFLICT; } - DriversToRemove.push_back(Drv->DriverUID); + DriversToRemove.push_back(Drv.DriverUID); } foreach (auto DrvID in DriversToRemove) @@ -47,7 +47,7 @@ namespace Driver { foreach (auto Drv in Drivers) { - FexExtended *fe = ((FexExtended *)((uintptr_t)Drv->Address + EXTENDED_SECTION_ADDRESS)); + FexExtended *fe = ((FexExtended *)((uintptr_t)Drv.Address + EXTENDED_SECTION_ADDRESS)); if (fe->Driver.OverrideOnConflict) { @@ -58,12 +58,13 @@ namespace Driver } fixme("Generic driver: %s", fexExtended->Driver.Name); - DriverFile *DrvFile = new DriverFile; - DrvFile->Enabled = true; - DrvFile->DriverUID = this->DriverUIDs - 1; - DrvFile->Address = (void *)fex; - DrvFile->InterruptCallback = (void *)((uintptr_t)fex + (uintptr_t)fexExtended->Driver.InterruptCallback); - DrvFile->MemTrk = mem; + DriverFile DrvFile = { + .Enabled = true, + .DriverUID = this->DriverUIDs - 1, + .Address = (void *)fex, + .InterruptCallback = (void *)((uintptr_t)fex + (uintptr_t)fexExtended->Driver.InterruptCallback), + .MemTrk = mem, + }; Drivers.push_back(DrvFile); return DriverCode::OK; } @@ -77,7 +78,7 @@ namespace Driver std::vector DriversToRemove = std::vector(); foreach (auto Drv in Drivers) { - FexExtended *fe = ((FexExtended *)((uintptr_t)Drv->Address + EXTENDED_SECTION_ADDRESS)); + FexExtended *fe = ((FexExtended *)((uintptr_t)Drv.Address + EXTENDED_SECTION_ADDRESS)); if (fe->Driver.OverrideOnConflict) { @@ -85,7 +86,7 @@ namespace Driver return DriverCode::DRIVER_CONFLICT; } - DriversToRemove.push_back(Drv->DriverUID); + DriversToRemove.push_back(Drv.DriverUID); } foreach (auto DrvID in DriversToRemove) @@ -101,7 +102,7 @@ namespace Driver { foreach (auto Drv in Drivers) { - FexExtended *fe = ((FexExtended *)((uintptr_t)Drv->Address + EXTENDED_SECTION_ADDRESS)); + FexExtended *fe = ((FexExtended *)((uintptr_t)Drv.Address + EXTENDED_SECTION_ADDRESS)); if (fe->Driver.OverrideOnConflict) { @@ -125,7 +126,7 @@ namespace Driver std::vector DriversToRemove = std::vector(); foreach (auto Drv in Drivers) { - FexExtended *fe = ((FexExtended *)((uintptr_t)Drv->Address + EXTENDED_SECTION_ADDRESS)); + FexExtended *fe = ((FexExtended *)((uintptr_t)Drv.Address + EXTENDED_SECTION_ADDRESS)); if (fe->Driver.OverrideOnConflict) { @@ -133,7 +134,7 @@ namespace Driver return DriverCode::DRIVER_CONFLICT; } - DriversToRemove.push_back(Drv->DriverUID); + DriversToRemove.push_back(Drv.DriverUID); } foreach (auto DrvID in DriversToRemove) @@ -149,7 +150,7 @@ namespace Driver { foreach (auto Drv in Drivers) { - FexExtended *fe = ((FexExtended *)((uintptr_t)Drv->Address + EXTENDED_SECTION_ADDRESS)); + FexExtended *fe = ((FexExtended *)((uintptr_t)Drv.Address + EXTENDED_SECTION_ADDRESS)); if (fe->Driver.OverrideOnConflict) { @@ -174,7 +175,7 @@ namespace Driver std::vector DriversToRemove = std::vector(); foreach (auto Drv in Drivers) { - FexExtended *fe = ((FexExtended *)((uintptr_t)Drv->Address + EXTENDED_SECTION_ADDRESS)); + FexExtended *fe = ((FexExtended *)((uintptr_t)Drv.Address + EXTENDED_SECTION_ADDRESS)); if (fe->Driver.OverrideOnConflict) { @@ -182,7 +183,7 @@ namespace Driver return DriverCode::DRIVER_CONFLICT; } - DriversToRemove.push_back(Drv->DriverUID); + DriversToRemove.push_back(Drv.DriverUID); } foreach (auto DrvID in DriversToRemove) @@ -198,7 +199,7 @@ namespace Driver { foreach (auto Drv in Drivers) { - FexExtended *fe = ((FexExtended *)((uintptr_t)Drv->Address + EXTENDED_SECTION_ADDRESS)); + FexExtended *fe = ((FexExtended *)((uintptr_t)Drv.Address + EXTENDED_SECTION_ADDRESS)); if (fe->Driver.OverrideOnConflict) { @@ -207,20 +208,20 @@ namespace Driver } } } - - DriverFile *DrvFile = new DriverFile; - DrvFile->Enabled = true; - DrvFile->DriverUID = this->DriverUIDs - 1; - DrvFile->Address = (void *)fex; - DrvFile->InterruptCallback = (void *)((uintptr_t)fex + (uintptr_t)fexExtended->Driver.InterruptCallback); - DrvFile->MemTrk = mem; + DriverFile DrvFile = { + .Enabled = true, + .DriverUID = this->DriverUIDs - 1, + .Address = (void *)fex, + .InterruptCallback = (void *)((uintptr_t)fex + (uintptr_t)fexExtended->Driver.InterruptCallback), + .MemTrk = mem, + }; if (fexExtended->Driver.InterruptCallback) { for (unsigned long i = 0; i < sizeof(fexExtended->Driver.Bind.Interrupt.Vector) / sizeof(fexExtended->Driver.Bind.Interrupt.Vector[0]); i++) { if (fexExtended->Driver.Bind.Interrupt.Vector[i] == 0) break; - DrvFile->InterruptHook[i] = new DriverInterruptHook(fexExtended->Driver.Bind.Interrupt.Vector[i], DrvFile); + DrvFile.InterruptHook[i] = new DriverInterruptHook(fexExtended->Driver.Bind.Interrupt.Vector[i], DrvFile); } } @@ -232,14 +233,12 @@ namespace Driver if (CallbackRet == DriverReturnCode::NOT_IMPLEMENTED) { error("Driver %s is not implemented", fexExtended->Driver.Name); - delete DrvFile, DrvFile = nullptr; delete mem, mem = nullptr; return DriverCode::NOT_IMPLEMENTED; } else if (CallbackRet != DriverReturnCode::OK) { error("Driver %s returned error %d", fexExtended->Driver.Name, CallbackRet); - delete DrvFile, DrvFile = nullptr; delete mem, mem = nullptr; return DriverCode::DRIVER_RETURNED_ERROR; } @@ -257,7 +256,7 @@ namespace Driver std::vector DriversToRemove = std::vector(); foreach (auto Drv in Drivers) { - FexExtended *fe = ((FexExtended *)((uintptr_t)Drv->Address + EXTENDED_SECTION_ADDRESS)); + FexExtended *fe = ((FexExtended *)((uintptr_t)Drv.Address + EXTENDED_SECTION_ADDRESS)); if (fe->Driver.OverrideOnConflict) { @@ -265,7 +264,7 @@ namespace Driver return DriverCode::DRIVER_CONFLICT; } - DriversToRemove.push_back(Drv->DriverUID); + DriversToRemove.push_back(Drv.DriverUID); } foreach (auto DrvID in DriversToRemove) @@ -281,7 +280,7 @@ namespace Driver { foreach (auto Drv in Drivers) { - FexExtended *fe = ((FexExtended *)((uintptr_t)Drv->Address + EXTENDED_SECTION_ADDRESS)); + FexExtended *fe = ((FexExtended *)((uintptr_t)Drv.Address + EXTENDED_SECTION_ADDRESS)); if (fe->Driver.OverrideOnConflict) { @@ -306,7 +305,7 @@ namespace Driver std::vector DriversToRemove = std::vector(); foreach (auto Drv in Drivers) { - FexExtended *fe = ((FexExtended *)((uintptr_t)Drv->Address + EXTENDED_SECTION_ADDRESS)); + FexExtended *fe = ((FexExtended *)((uintptr_t)Drv.Address + EXTENDED_SECTION_ADDRESS)); if ((fe->Driver.TypeFlags & FexDriverInputTypes_Mouse && fexExtended->Driver.TypeFlags & FexDriverInputTypes_Mouse) || @@ -317,7 +316,7 @@ namespace Driver if (fe->Driver.OverrideOnConflict) return DriverCode::DRIVER_CONFLICT; - DriversToRemove.push_back(Drv->DriverUID); + DriversToRemove.push_back(Drv.DriverUID); } } @@ -334,7 +333,7 @@ namespace Driver { foreach (auto Drv in Drivers) { - FexExtended *fe = ((FexExtended *)((uintptr_t)Drv->Address + EXTENDED_SECTION_ADDRESS)); + FexExtended *fe = ((FexExtended *)((uintptr_t)Drv.Address + EXTENDED_SECTION_ADDRESS)); if ((fe->Driver.TypeFlags & FexDriverInputTypes_Mouse && fexExtended->Driver.TypeFlags & FexDriverInputTypes_Mouse) || @@ -348,19 +347,20 @@ namespace Driver } } - DriverFile *DrvFile = new DriverFile; - DrvFile->Enabled = true; - DrvFile->DriverUID = this->DriverUIDs - 1; - DrvFile->Address = (void *)fex; - DrvFile->InterruptCallback = (void *)((uintptr_t)fex + (uintptr_t)fexExtended->Driver.InterruptCallback); - DrvFile->MemTrk = mem; + DriverFile DrvFile = { + .Enabled = true, + .DriverUID = this->DriverUIDs - 1, + .Address = (void *)fex, + .InterruptCallback = (void *)((uintptr_t)fex + (uintptr_t)fexExtended->Driver.InterruptCallback), + .MemTrk = mem, + }; if (fexExtended->Driver.InterruptCallback) { for (unsigned long i = 0; i < sizeof(fexExtended->Driver.Bind.Interrupt.Vector) / sizeof(fexExtended->Driver.Bind.Interrupt.Vector[0]); i++) { if (fexExtended->Driver.Bind.Interrupt.Vector[i] == 0) break; - DrvFile->InterruptHook[i] = new DriverInterruptHook(fexExtended->Driver.Bind.Interrupt.Vector[i], DrvFile); + DrvFile.InterruptHook[i] = new DriverInterruptHook(fexExtended->Driver.Bind.Interrupt.Vector[i], DrvFile); } } @@ -372,14 +372,12 @@ namespace Driver if (CallbackRet == DriverReturnCode::NOT_IMPLEMENTED) { error("Driver %s is not implemented", fexExtended->Driver.Name); - delete DrvFile, DrvFile = nullptr; delete mem, mem = nullptr; return DriverCode::NOT_IMPLEMENTED; } else if (CallbackRet != DriverReturnCode::OK) { error("Driver %s returned error %d", fexExtended->Driver.Name, CallbackRet); - delete DrvFile, DrvFile = nullptr; delete mem, mem = nullptr; return DriverCode::DRIVER_RETURNED_ERROR; } @@ -397,7 +395,7 @@ namespace Driver std::vector DriversToRemove = std::vector(); foreach (auto Drv in Drivers) { - FexExtended *fe = ((FexExtended *)((uintptr_t)Drv->Address + EXTENDED_SECTION_ADDRESS)); + FexExtended *fe = ((FexExtended *)((uintptr_t)Drv.Address + EXTENDED_SECTION_ADDRESS)); if (fe->Driver.OverrideOnConflict) { @@ -405,7 +403,7 @@ namespace Driver return DriverCode::DRIVER_CONFLICT; } - DriversToRemove.push_back(Drv->DriverUID); + DriversToRemove.push_back(Drv.DriverUID); } foreach (auto DrvID in DriversToRemove) @@ -421,7 +419,7 @@ namespace Driver { foreach (auto Drv in Drivers) { - FexExtended *fe = ((FexExtended *)((uintptr_t)Drv->Address + EXTENDED_SECTION_ADDRESS)); + FexExtended *fe = ((FexExtended *)((uintptr_t)Drv.Address + EXTENDED_SECTION_ADDRESS)); if (fe->Driver.OverrideOnConflict) { diff --git a/Core/Driver/DriverLoading/BindPCI.cpp b/Core/Driver/DriverLoading/BindPCI.cpp index 851c124..11a8f18 100644 --- a/Core/Driver/DriverLoading/BindPCI.cpp +++ b/Core/Driver/DriverLoading/BindPCI.cpp @@ -136,7 +136,7 @@ namespace Driver std::vector DriversToRemove = std::vector(); foreach (auto Drv in Drivers) { - FexExtended *fe = ((FexExtended *)((uintptr_t)Drv->Address + EXTENDED_SECTION_ADDRESS)); + FexExtended *fe = ((FexExtended *)((uintptr_t)Drv.Address + EXTENDED_SECTION_ADDRESS)); if (fe->Driver.OverrideOnConflict) { @@ -144,7 +144,7 @@ namespace Driver return DriverCode::DRIVER_CONFLICT; } - DriversToRemove.push_back(Drv->DriverUID); + DriversToRemove.push_back(Drv.DriverUID); } foreach (auto DrvID in DriversToRemove) @@ -160,7 +160,7 @@ namespace Driver { foreach (auto Drv in Drivers) { - FexExtended *fe = ((FexExtended *)((uintptr_t)Drv->Address + EXTENDED_SECTION_ADDRESS)); + FexExtended *fe = ((FexExtended *)((uintptr_t)Drv.Address + EXTENDED_SECTION_ADDRESS)); if (fe->Driver.OverrideOnConflict) { @@ -184,7 +184,7 @@ namespace Driver std::vector DriversToRemove = std::vector(); foreach (auto Drv in Drivers) { - FexExtended *fe = ((FexExtended *)((uintptr_t)Drv->Address + EXTENDED_SECTION_ADDRESS)); + FexExtended *fe = ((FexExtended *)((uintptr_t)Drv.Address + EXTENDED_SECTION_ADDRESS)); if (fe->Driver.OverrideOnConflict) { @@ -192,7 +192,7 @@ namespace Driver return DriverCode::DRIVER_CONFLICT; } - DriversToRemove.push_back(Drv->DriverUID); + DriversToRemove.push_back(Drv.DriverUID); } foreach (auto DrvID in DriversToRemove) @@ -208,7 +208,7 @@ namespace Driver { foreach (auto Drv in Drivers) { - FexExtended *fe = ((FexExtended *)((uintptr_t)Drv->Address + EXTENDED_SECTION_ADDRESS)); + FexExtended *fe = ((FexExtended *)((uintptr_t)Drv.Address + EXTENDED_SECTION_ADDRESS)); if (fe->Driver.OverrideOnConflict) { @@ -232,7 +232,7 @@ namespace Driver std::vector DriversToRemove = std::vector(); foreach (auto Drv in Drivers) { - FexExtended *fe = ((FexExtended *)((uintptr_t)Drv->Address + EXTENDED_SECTION_ADDRESS)); + FexExtended *fe = ((FexExtended *)((uintptr_t)Drv.Address + EXTENDED_SECTION_ADDRESS)); if (fe->Driver.OverrideOnConflict) { @@ -240,7 +240,7 @@ namespace Driver return DriverCode::DRIVER_CONFLICT; } - DriversToRemove.push_back(Drv->DriverUID); + DriversToRemove.push_back(Drv.DriverUID); } foreach (auto DrvID in DriversToRemove) @@ -256,7 +256,7 @@ namespace Driver { foreach (auto Drv in Drivers) { - FexExtended *fe = ((FexExtended *)((uintptr_t)Drv->Address + EXTENDED_SECTION_ADDRESS)); + FexExtended *fe = ((FexExtended *)((uintptr_t)Drv.Address + EXTENDED_SECTION_ADDRESS)); if (fe->Driver.OverrideOnConflict) { @@ -266,14 +266,15 @@ namespace Driver } } - DriverFile *DrvFile = new DriverFile; - DrvFile->Enabled = true; - DrvFile->DriverUID = this->DriverUIDs - 1; - DrvFile->Address = (void *)fex; - DrvFile->InterruptCallback = (void *)((uintptr_t)fex + (uintptr_t)fexExtended->Driver.InterruptCallback); - DrvFile->MemTrk = mem; + DriverFile DrvFile = { + .Enabled = true, + .DriverUID = this->DriverUIDs - 1, + .Address = (void *)fex, + .InterruptCallback = (void *)((uintptr_t)fex + (uintptr_t)fexExtended->Driver.InterruptCallback), + .MemTrk = mem, + }; if (fexExtended->Driver.InterruptCallback) - DrvFile->InterruptHook[0] = new DriverInterruptHook(((int)((PCI::PCIHeader0 *)PCIDevice)->InterruptLine), DrvFile); + DrvFile.InterruptHook[0] = new DriverInterruptHook(((int)((PCI::PCIHeader0 *)PCIDevice)->InterruptLine), DrvFile); KernelCallback KCallback = {.raw = 0}; KCallback.RawPtr = PCIDevice; @@ -283,7 +284,6 @@ namespace Driver if (CallbackRet == DriverReturnCode::NOT_IMPLEMENTED) { error("Driver %s is not implemented", fexExtended->Driver.Name); - delete DrvFile, DrvFile = nullptr; delete mem, mem = nullptr; return DriverCode::NOT_IMPLEMENTED; } @@ -292,7 +292,6 @@ namespace Driver else { error("Driver %s returned error %d", fexExtended->Driver.Name, CallbackRet); - delete DrvFile, DrvFile = nullptr; delete mem, mem = nullptr; return DriverCode::DRIVER_RETURNED_ERROR; } @@ -310,7 +309,7 @@ namespace Driver std::vector DriversToRemove = std::vector(); foreach (auto Drv in Drivers) { - FexExtended *fe = ((FexExtended *)((uintptr_t)Drv->Address + EXTENDED_SECTION_ADDRESS)); + FexExtended *fe = ((FexExtended *)((uintptr_t)Drv.Address + EXTENDED_SECTION_ADDRESS)); if (fe->Driver.OverrideOnConflict) { @@ -318,7 +317,7 @@ namespace Driver return DriverCode::DRIVER_CONFLICT; } - DriversToRemove.push_back(Drv->DriverUID); + DriversToRemove.push_back(Drv.DriverUID); } foreach (auto DrvID in DriversToRemove) @@ -334,7 +333,7 @@ namespace Driver { foreach (auto Drv in Drivers) { - FexExtended *fe = ((FexExtended *)((uintptr_t)Drv->Address + EXTENDED_SECTION_ADDRESS)); + FexExtended *fe = ((FexExtended *)((uintptr_t)Drv.Address + EXTENDED_SECTION_ADDRESS)); if (fe->Driver.OverrideOnConflict) { @@ -344,14 +343,15 @@ namespace Driver } } - DriverFile *DrvFile = new DriverFile; - DrvFile->Enabled = true; - DrvFile->DriverUID = this->DriverUIDs - 1; - DrvFile->Address = (void *)fex; - DrvFile->InterruptCallback = (void *)((uintptr_t)fex + (uintptr_t)fexExtended->Driver.InterruptCallback); - DrvFile->MemTrk = mem; + DriverFile DrvFile = { + .Enabled = true, + .DriverUID = this->DriverUIDs - 1, + .Address = (void *)fex, + .InterruptCallback = (void *)((uintptr_t)fex + (uintptr_t)fexExtended->Driver.InterruptCallback), + .MemTrk = mem, + }; if (fexExtended->Driver.InterruptCallback) - DrvFile->InterruptHook[0] = new DriverInterruptHook(((int)((PCI::PCIHeader0 *)PCIDevice)->InterruptLine), DrvFile); + DrvFile.InterruptHook[0] = new DriverInterruptHook(((int)((PCI::PCIHeader0 *)PCIDevice)->InterruptLine), DrvFile); KernelCallback KCallback = {.raw = 0}; KCallback.RawPtr = PCIDevice; @@ -361,7 +361,6 @@ namespace Driver if (CallbackRet == DriverReturnCode::NOT_IMPLEMENTED) { error("Driver %s is not implemented", fexExtended->Driver.Name); - delete DrvFile, DrvFile = nullptr; delete mem, mem = nullptr; return DriverCode::NOT_IMPLEMENTED; } @@ -370,7 +369,6 @@ namespace Driver else { error("Driver %s returned error %d", fexExtended->Driver.Name, CallbackRet); - delete DrvFile, DrvFile = nullptr; delete mem, mem = nullptr; return DriverCode::DRIVER_RETURNED_ERROR; } @@ -388,7 +386,7 @@ namespace Driver std::vector DriversToRemove = std::vector(); foreach (auto Drv in Drivers) { - FexExtended *fe = ((FexExtended *)((uintptr_t)Drv->Address + EXTENDED_SECTION_ADDRESS)); + FexExtended *fe = ((FexExtended *)((uintptr_t)Drv.Address + EXTENDED_SECTION_ADDRESS)); if (fe->Driver.OverrideOnConflict) { @@ -396,7 +394,7 @@ namespace Driver return DriverCode::DRIVER_CONFLICT; } - DriversToRemove.push_back(Drv->DriverUID); + DriversToRemove.push_back(Drv.DriverUID); } foreach (auto DrvID in DriversToRemove) @@ -412,7 +410,7 @@ namespace Driver { foreach (auto Drv in Drivers) { - FexExtended *fe = ((FexExtended *)((uintptr_t)Drv->Address + EXTENDED_SECTION_ADDRESS)); + FexExtended *fe = ((FexExtended *)((uintptr_t)Drv.Address + EXTENDED_SECTION_ADDRESS)); if (fe->Driver.OverrideOnConflict) { @@ -436,7 +434,7 @@ namespace Driver std::vector DriversToRemove = std::vector(); foreach (auto Drv in Drivers) { - FexExtended *fe = ((FexExtended *)((uintptr_t)Drv->Address + EXTENDED_SECTION_ADDRESS)); + FexExtended *fe = ((FexExtended *)((uintptr_t)Drv.Address + EXTENDED_SECTION_ADDRESS)); if (fe->Driver.OverrideOnConflict) { @@ -444,7 +442,7 @@ namespace Driver return DriverCode::DRIVER_CONFLICT; } - DriversToRemove.push_back(Drv->DriverUID); + DriversToRemove.push_back(Drv.DriverUID); } foreach (auto DrvID in DriversToRemove) @@ -460,7 +458,7 @@ namespace Driver { foreach (auto Drv in Drivers) { - FexExtended *fe = ((FexExtended *)((uintptr_t)Drv->Address + EXTENDED_SECTION_ADDRESS)); + FexExtended *fe = ((FexExtended *)((uintptr_t)Drv.Address + EXTENDED_SECTION_ADDRESS)); if (fe->Driver.OverrideOnConflict) { @@ -484,7 +482,7 @@ namespace Driver std::vector DriversToRemove = std::vector(); foreach (auto Drv in Drivers) { - FexExtended *fe = ((FexExtended *)((uintptr_t)Drv->Address + EXTENDED_SECTION_ADDRESS)); + FexExtended *fe = ((FexExtended *)((uintptr_t)Drv.Address + EXTENDED_SECTION_ADDRESS)); if (fe->Driver.OverrideOnConflict) { @@ -492,7 +490,7 @@ namespace Driver return DriverCode::DRIVER_CONFLICT; } - DriversToRemove.push_back(Drv->DriverUID); + DriversToRemove.push_back(Drv.DriverUID); } foreach (auto DrvID in DriversToRemove) @@ -508,7 +506,7 @@ namespace Driver { foreach (auto Drv in Drivers) { - FexExtended *fe = ((FexExtended *)((uintptr_t)Drv->Address + EXTENDED_SECTION_ADDRESS)); + FexExtended *fe = ((FexExtended *)((uintptr_t)Drv.Address + EXTENDED_SECTION_ADDRESS)); if (fe->Driver.OverrideOnConflict) { @@ -518,14 +516,15 @@ namespace Driver } } - DriverFile *DrvFile = new DriverFile; - DrvFile->Enabled = true; - DrvFile->DriverUID = this->DriverUIDs - 1; - DrvFile->Address = (void *)fex; - DrvFile->InterruptCallback = (void *)((uintptr_t)fex + (uintptr_t)fexExtended->Driver.InterruptCallback); - DrvFile->MemTrk = mem; + DriverFile DrvFile = { + .Enabled = true, + .DriverUID = this->DriverUIDs - 1, + .Address = (void *)fex, + .InterruptCallback = (void *)((uintptr_t)fex + (uintptr_t)fexExtended->Driver.InterruptCallback), + .MemTrk = mem, + }; if (fexExtended->Driver.InterruptCallback) - DrvFile->InterruptHook[0] = new DriverInterruptHook(((int)((PCI::PCIHeader0 *)PCIDevice)->InterruptLine), DrvFile); + DrvFile.InterruptHook[0] = new DriverInterruptHook(((int)((PCI::PCIHeader0 *)PCIDevice)->InterruptLine), DrvFile); KernelCallback KCallback = {.raw = 0}; KCallback.RawPtr = PCIDevice; @@ -535,7 +534,6 @@ namespace Driver if (CallbackRet == DriverReturnCode::NOT_IMPLEMENTED) { error("Driver %s is not implemented", fexExtended->Driver.Name); - delete DrvFile, DrvFile = nullptr; delete mem, mem = nullptr; return DriverCode::NOT_IMPLEMENTED; } @@ -544,7 +542,6 @@ namespace Driver else { error("Driver %s returned error %d", fexExtended->Driver.Name, CallbackRet); - delete DrvFile, DrvFile = nullptr; delete mem, mem = nullptr; return DriverCode::DRIVER_RETURNED_ERROR; } diff --git a/GUI/GraphicalUserInterface.cpp b/GUI/GraphicalUserInterface.cpp index 9d26948..e352cd2 100644 --- a/GUI/GraphicalUserInterface.cpp +++ b/GUI/GraphicalUserInterface.cpp @@ -26,17 +26,17 @@ namespace GraphicalUserInterface { foreach (auto Driver in DriverManager->GetDrivers()) { - if (((FexExtended *)((uintptr_t)Driver->Address + EXTENDED_SECTION_ADDRESS))->Driver.Type == FexDriverType::FexDriverType_Input && - ((FexExtended *)((uintptr_t)Driver->Address + EXTENDED_SECTION_ADDRESS))->Driver.TypeFlags & FexDriverInputTypes::FexDriverInputTypes_Mouse) + if (((FexExtended *)((uintptr_t)Driver.Address + EXTENDED_SECTION_ADDRESS))->Driver.Type == FexDriverType::FexDriverType_Input && + ((FexExtended *)((uintptr_t)Driver.Address + EXTENDED_SECTION_ADDRESS))->Driver.TypeFlags & FexDriverInputTypes::FexDriverInputTypes_Mouse) { #ifdef DEBUG static int once = 0; if (!once++) - debug("Found mouse driver %ld", Driver->DriverUID); + debug("Found mouse driver %ld", Driver.DriverUID); #endif KernelCallback callback; callback.Reason = FetchReason; - DriverManager->IOCB(Driver->DriverUID, (void *)&callback); + DriverManager->IOCB(Driver.DriverUID, (void *)&callback); Mouse.X = callback.InputCallback.Mouse.X; Mouse.Y = callback.InputCallback.Mouse.Y; Mouse.Z = callback.InputCallback.Mouse.Z; diff --git a/KThread.cpp b/KThread.cpp index b10c9e6..0a83940 100644 --- a/KThread.cpp +++ b/KThread.cpp @@ -226,43 +226,6 @@ void ExitLogoAnimationThread() uint32_t DispX = Display->GetBuffer(1)->Width; uint32_t DispY = Display->GetBuffer(1)->Height; - // for (size_t i = 26; i > 0; i--) - // { - // int x, y, channels; - - // if (!stbi_info_from_memory((uint8_t *)Frames[i], FrameSizes[i], &x, &y, &channels)) - // continue; - - // uint8_t *img = stbi_load_from_memory((uint8_t *)Frames[i], FrameSizes[i], &x, &y, &channels, 4); - - // if (img == NULL) - // continue; - - // int offsetX = DispX / 2 - x / 2; - // int offsetY = DispY / 2 - y / 2; - - // for (int i = 0; i < x * y; i++) - // { - // uint32_t pixel = ((uint32_t *)img)[i]; - // uint8_t r = (pixel >> 16) & 0xFF; - // uint8_t g = (pixel >> 8) & 0xFF; - // uint8_t b = (pixel >> 0) & 0xFF; - // uint8_t a = (pixel >> 24) & 0xFF; - - // if (a != 0xFF) - // { - // r = (r * a) / 0xFF; - // g = (g * a) / 0xFF; - // b = (b * a) / 0xFF; - // } - - // Display->SetPixel((i % x) + offsetX, (i / x) + offsetY, (r << 16) | (g << 8) | (b << 0), 1); - // } - - // free(img); - // Display->SetBuffer(1); - // } - for (size_t i = 40; i > 25; i--) { int x, y, channels; @@ -342,8 +305,8 @@ void KernelMainThread() if (DriverManager->GetDrivers().size() > 0) { foreach (auto Driver in DriverManager->GetDrivers()) - if (((FexExtended *)((uintptr_t)Driver->Address + EXTENDED_SECTION_ADDRESS))->Driver.Type == FexDriverType::FexDriverType_Storage) - DiskManager->FetchDisks(Driver->DriverUID); + if (((FexExtended *)((uintptr_t)Driver.Address + EXTENDED_SECTION_ADDRESS))->Driver.Type == FexDriverType::FexDriverType_Storage) + DiskManager->FetchDisks(Driver.DriverUID); } else KPrint("\eE85230No disk drivers found! Cannot fetch disks!"); diff --git a/Network/NetworkController.cpp b/Network/NetworkController.cpp index 8403cc7..26f8376 100644 --- a/Network/NetworkController.cpp +++ b/Network/NetworkController.cpp @@ -25,8 +25,8 @@ namespace NetworkInterfaceManager if (DriverManager->GetDrivers().size() > 0) { foreach (auto Driver in DriverManager->GetDrivers()) - if (((FexExtended *)((uintptr_t)Driver->Address + EXTENDED_SECTION_ADDRESS))->Driver.Type == FexDriverType::FexDriverType_Network) - this->FetchNetworkCards(Driver->DriverUID); + if (((FexExtended *)((uintptr_t)Driver.Address + EXTENDED_SECTION_ADDRESS))->Driver.Type == FexDriverType::FexDriverType_Network) + this->FetchNetworkCards(Driver.DriverUID); } else KPrint("\eE85230No network drivers found! Cannot fetch network cards!"); diff --git a/Recovery/RecoveryMain.cpp b/Recovery/RecoveryMain.cpp index 925decd..f884044 100644 --- a/Recovery/RecoveryMain.cpp +++ b/Recovery/RecoveryMain.cpp @@ -35,18 +35,18 @@ namespace Recovery void PlayAudio() { SmartLock(PlayAudioLock); - Driver::DriverFile *AudioDrv = nullptr; + Driver::DriverFile AudioDrv; foreach (auto Driver in DriverManager->GetDrivers()) { - if (((FexExtended *)((uintptr_t)Driver->Address + EXTENDED_SECTION_ADDRESS))->Driver.Type == FexDriverType::FexDriverType_Audio) + if (((FexExtended *)((uintptr_t)Driver.Address + EXTENDED_SECTION_ADDRESS))->Driver.Type == FexDriverType::FexDriverType_Audio) { AudioDrv = Driver; break; } } - if (AudioDrv == nullptr) + if (!AudioDrv.Enabled) { error("No audio drivers found! Cannot play audio!"); return; @@ -69,7 +69,7 @@ namespace Recovery callback.AudioCallback.Send.Data = (uint8_t *)PCMRaw; callback.AudioCallback.Send.Length = pcm->node->Length; debug("Playing audio..."); - int status = DriverManager->IOCB(AudioDrv->DriverUID, (void *)&callback); + int status = DriverManager->IOCB(AudioDrv.DriverUID, (void *)&callback); debug("Audio played! %d", status); KernelAllocator.FreePages((void *)PCMRaw, TO_PAGES(pcm->node->Length)); vfs->Close(pcm); @@ -79,18 +79,18 @@ namespace Recovery void ChangeSampleRate(char SR) { - Driver::DriverFile *AudioDrv = nullptr; + Driver::DriverFile AudioDrv; foreach (auto Driver in DriverManager->GetDrivers()) { - if (((FexExtended *)((uintptr_t)Driver->Address + EXTENDED_SECTION_ADDRESS))->Driver.Type == FexDriverType::FexDriverType_Audio) + if (((FexExtended *)((uintptr_t)Driver.Address + EXTENDED_SECTION_ADDRESS))->Driver.Type == FexDriverType::FexDriverType_Audio) { AudioDrv = Driver; break; } } - if (AudioDrv == nullptr) + if (!AudioDrv.Enabled) { error("No audio drivers found! Cannot play audio!"); return; @@ -101,7 +101,7 @@ namespace Recovery callback.Reason = AdjustReason; callback.AudioCallback.Adjust._SampleRate = true; callback.AudioCallback.Adjust.SampleRate = SR; - int status = DriverManager->IOCB(AudioDrv->DriverUID, (void *)&callback); + int status = DriverManager->IOCB(AudioDrv.DriverUID, (void *)&callback); debug("Sample rate changed! %d", status); } @@ -117,18 +117,18 @@ namespace Recovery void ChangeVolume(int percentage) { - Driver::DriverFile *AudioDrv = nullptr; + Driver::DriverFile AudioDrv; foreach (auto Driver in DriverManager->GetDrivers()) { - if (((FexExtended *)((uintptr_t)Driver->Address + EXTENDED_SECTION_ADDRESS))->Driver.Type == FexDriverType::FexDriverType_Audio) + if (((FexExtended *)((uintptr_t)Driver.Address + EXTENDED_SECTION_ADDRESS))->Driver.Type == FexDriverType::FexDriverType_Audio) { AudioDrv = Driver; break; } } - if (AudioDrv == nullptr) + if (!AudioDrv.Enabled) { error("No audio drivers found! Cannot play audio!"); return; @@ -139,7 +139,7 @@ namespace Recovery callback.Reason = AdjustReason; callback.AudioCallback.Adjust._Volume = true; callback.AudioCallback.Adjust.Volume = percentage; - int status = DriverManager->IOCB(AudioDrv->DriverUID, (void *)&callback); + int status = DriverManager->IOCB(AudioDrv.DriverUID, (void *)&callback); debug("Volume changed! %d", status); } diff --git a/include/driver.hpp b/include/driver.hpp index dede248..69e2bee 100644 --- a/include/driver.hpp +++ b/include/driver.hpp @@ -30,18 +30,18 @@ namespace Driver class DriverInterruptHook; struct DriverFile { - bool Enabled; - unsigned long DriverUID; - void *Address; - void *InterruptCallback; - Memory::MemMgr *MemTrk; - DriverInterruptHook *InterruptHook[16]; + bool Enabled = false; + unsigned long DriverUID = 0; + void *Address = nullptr; + void *InterruptCallback = nullptr; + Memory::MemMgr *MemTrk = nullptr; + DriverInterruptHook *InterruptHook[16] = {nullptr}; }; class DriverInterruptHook : public Interrupts::Handler { private: - DriverFile *Handle; + DriverFile Handle; #if defined(a64) void OnInterruptReceived(CPU::x64::TrapFrame *Frame); @@ -52,14 +52,14 @@ namespace Driver #endif public: - DriverInterruptHook(int Interrupt, DriverFile *Handle); + DriverInterruptHook(int Interrupt, DriverFile Handle); virtual ~DriverInterruptHook() = default; }; class Driver { private: - std::vector Drivers; + std::vector Drivers; unsigned long DriverUIDs = 0; DriverCode CallDriverEntryPoint(void *fex, void *KAPIAddress); @@ -101,7 +101,7 @@ namespace Driver DriverCode DriverLoadBindProcess(void *DrvExtHdr, uintptr_t DriverAddress, size_t Size, bool IsElf = false); public: - std::vector GetDrivers() { return Drivers; } + std::vector GetDrivers() { return Drivers; } void UnloadAllDrivers(); bool UnloadDriver(unsigned long DUID); int IOCB(unsigned long DUID, /* KernelCallback */ void *KCB);