Fix wrong driver conflict detection

This commit is contained in:
Alex 2023-03-09 06:46:09 +02:00
parent ce13f5ea82
commit 3b1efa2ed3
Signed by untrusted user who does not match committer: enderice2
GPG Key ID: EACC3AD603BAB4DD
4 changed files with 262 additions and 13 deletions

View File

@ -30,9 +30,10 @@ namespace Driver
void Driver::UnloadAllDrivers() void Driver::UnloadAllDrivers()
{ {
debug("%ld drivers loaded, [DUIDs: %ld]", Drivers.size(), DriverUIDs); size_t DriversNum = Drivers.size();
debug("driver size %ld", Drivers.size()); debug("%ld drivers loaded, [DUIDs: %ld]", DriversNum, DriverUIDs);
for (size_t i = 0; i < Drivers.size(); i++) debug("driver size %ld", DriversNum);
for (size_t i = 0; i < DriversNum; i++)
{ {
DriverFile *drv = Drivers[i]; DriverFile *drv = Drivers[i];
KernelCallback callback; KernelCallback callback;
@ -41,11 +42,11 @@ namespace Driver
DriverManager->IOCB(drv->DriverUID, (void *)&callback); DriverManager->IOCB(drv->DriverUID, (void *)&callback);
delete drv->MemTrk; 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; continue;
delete drv->InterruptHook[i]; delete drv->InterruptHook[j];
} }
Drivers.remove(i); Drivers.remove(i);
} }

View File

@ -24,8 +24,12 @@ namespace Driver
foreach (auto Drv in Drivers) 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));
debug("Driver %s is conflicting with %s", fe->Driver.Name, fexExtended->Driver.Name);
if (fe->Driver.OverrideOnConflict) if (fe->Driver.OverrideOnConflict)
return DriverCode::DRIVER_CONFLICT; return DriverCode::DRIVER_CONFLICT;
DriversToRemove.push_back(Drv->DriverUID);
} }
foreach (auto DrvID in DriversToRemove) 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); fixme("Generic driver: %s", fexExtended->Driver.Name);
DriverFile *DrvFile = new DriverFile; DriverFile *DrvFile = new DriverFile;
@ -58,8 +73,12 @@ namespace Driver
foreach (auto Drv in Drivers) 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));
debug("Driver %s is conflicting with %s", fe->Driver.Name, fexExtended->Driver.Name);
if (fe->Driver.OverrideOnConflict) if (fe->Driver.OverrideOnConflict)
return DriverCode::DRIVER_CONFLICT; return DriverCode::DRIVER_CONFLICT;
DriversToRemove.push_back(Drv->DriverUID);
} }
foreach (auto DrvID in DriversToRemove) 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); fixme("Display driver: %s", fexExtended->Driver.Name);
delete mem; delete mem;
@ -87,8 +117,12 @@ namespace Driver
foreach (auto Drv in Drivers) 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));
debug("Driver %s is conflicting with %s", fe->Driver.Name, fexExtended->Driver.Name);
if (fe->Driver.OverrideOnConflict) if (fe->Driver.OverrideOnConflict)
return DriverCode::DRIVER_CONFLICT; return DriverCode::DRIVER_CONFLICT;
DriversToRemove.push_back(Drv->DriverUID);
} }
foreach (auto DrvID in DriversToRemove) 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); fixme("Network driver: %s", fexExtended->Driver.Name);
delete mem; delete mem;
@ -118,8 +163,12 @@ namespace Driver
foreach (auto Drv in Drivers) 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));
debug("Driver %s is conflicting with %s", fe->Driver.Name, fexExtended->Driver.Name);
if (fe->Driver.OverrideOnConflict) if (fe->Driver.OverrideOnConflict)
return DriverCode::DRIVER_CONFLICT; return DriverCode::DRIVER_CONFLICT;
DriversToRemove.push_back(Drv->DriverUID);
} }
foreach (auto DrvID in DriversToRemove) 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))); KernelCallback *KCallback = (KernelCallback *)mem->RequestPages(TO_PAGES(sizeof(KernelCallback)));
UNUSED(KCallback); // Shut up clang UNUSED(KCallback); // Shut up clang
@ -177,8 +237,12 @@ namespace Driver
foreach (auto Drv in Drivers) 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));
debug("Driver %s is conflicting with %s", fe->Driver.Name, fexExtended->Driver.Name);
if (fe->Driver.OverrideOnConflict) if (fe->Driver.OverrideOnConflict)
return DriverCode::DRIVER_CONFLICT; return DriverCode::DRIVER_CONFLICT;
DriversToRemove.push_back(Drv->DriverUID);
} }
foreach (auto DrvID in DriversToRemove) 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); fixme("Filesystem driver: %s", fexExtended->Driver.Name);
delete mem; delete mem;
@ -200,23 +275,24 @@ namespace Driver
{ {
FexExtended *fexExtended = (FexExtended *)((uintptr_t)fex + EXTENDED_SECTION_ADDRESS); FexExtended *fexExtended = (FexExtended *)((uintptr_t)fex + EXTENDED_SECTION_ADDRESS);
debug("Searching for conflicting drivers...");
if (fexExtended->Driver.OverrideOnConflict) if (fexExtended->Driver.OverrideOnConflict)
{ {
debug("Searching for conflicting drivers...");
Vector<int> DriversToRemove = Vector<int>(); Vector<int> DriversToRemove = Vector<int>();
foreach (auto Drv in Drivers) 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)
return DriverCode::DRIVER_CONFLICT;
if ((fe->Driver.TypeFlags & FexDriverInputTypes_Mouse && if ((fe->Driver.TypeFlags & FexDriverInputTypes_Mouse &&
fexExtended->Driver.TypeFlags & FexDriverInputTypes_Mouse) || fexExtended->Driver.TypeFlags & FexDriverInputTypes_Mouse) ||
(fe->Driver.TypeFlags & FexDriverInputTypes_Keyboard && (fe->Driver.TypeFlags & FexDriverInputTypes_Keyboard &&
fexExtended->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); 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))); KernelCallback *KCallback = (KernelCallback *)mem->RequestPages(TO_PAGES(sizeof(KernelCallback)));
@ -289,8 +382,12 @@ namespace Driver
foreach (auto Drv in Drivers) 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));
debug("Driver %s is conflicting with %s", fe->Driver.Name, fexExtended->Driver.Name);
if (fe->Driver.OverrideOnConflict) if (fe->Driver.OverrideOnConflict)
return DriverCode::DRIVER_CONFLICT; return DriverCode::DRIVER_CONFLICT;
DriversToRemove.push_back(Drv->DriverUID);
} }
foreach (auto DrvID in DriversToRemove) 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); fixme("Audio driver: %s", fexExtended->Driver.Name);
delete mem; delete mem;

View File

@ -137,8 +137,12 @@ namespace Driver
foreach (auto Drv in Drivers) 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));
debug("Driver %s is conflicting with %s", fe->Driver.Name, fexExtended->Driver.Name);
if (fe->Driver.OverrideOnConflict) if (fe->Driver.OverrideOnConflict)
return DriverCode::DRIVER_CONFLICT; return DriverCode::DRIVER_CONFLICT;
DriversToRemove.push_back(Drv->DriverUID);
} }
foreach (auto DrvID in DriversToRemove) 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); fixme("Generic driver: %s", fexExtended->Driver.Name);
delete mem; delete mem;
@ -166,8 +181,12 @@ namespace Driver
foreach (auto Drv in Drivers) 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));
debug("Driver %s is conflicting with %s", fe->Driver.Name, fexExtended->Driver.Name);
if (fe->Driver.OverrideOnConflict) if (fe->Driver.OverrideOnConflict)
return DriverCode::DRIVER_CONFLICT; return DriverCode::DRIVER_CONFLICT;
DriversToRemove.push_back(Drv->DriverUID);
} }
foreach (auto DrvID in DriversToRemove) 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); fixme("Display driver: %s", fexExtended->Driver.Name);
delete mem; delete mem;
@ -195,8 +225,12 @@ namespace Driver
foreach (auto Drv in Drivers) 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));
debug("Driver %s is conflicting with %s", fe->Driver.Name, fexExtended->Driver.Name);
if (fe->Driver.OverrideOnConflict) if (fe->Driver.OverrideOnConflict)
return DriverCode::DRIVER_CONFLICT; return DriverCode::DRIVER_CONFLICT;
DriversToRemove.push_back(Drv->DriverUID);
} }
foreach (auto DrvID in DriversToRemove) 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))); KernelCallback *KCallback = (KernelCallback *)mem->RequestPages(TO_PAGES(sizeof(KernelCallback)));
@ -258,8 +303,12 @@ namespace Driver
foreach (auto Drv in Drivers) 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));
debug("Driver %s is conflicting with %s", fe->Driver.Name, fexExtended->Driver.Name);
if (fe->Driver.OverrideOnConflict) if (fe->Driver.OverrideOnConflict)
return DriverCode::DRIVER_CONFLICT; return DriverCode::DRIVER_CONFLICT;
DriversToRemove.push_back(Drv->DriverUID);
} }
foreach (auto DrvID in DriversToRemove) 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))); KernelCallback *KCallback = (KernelCallback *)mem->RequestPages(TO_PAGES(sizeof(KernelCallback)));
@ -312,8 +372,12 @@ namespace Driver
foreach (auto Drv in Drivers) 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));
debug("Driver %s is conflicting with %s", fe->Driver.Name, fexExtended->Driver.Name);
if (fe->Driver.OverrideOnConflict) if (fe->Driver.OverrideOnConflict)
return DriverCode::DRIVER_CONFLICT; return DriverCode::DRIVER_CONFLICT;
DriversToRemove.push_back(Drv->DriverUID);
} }
foreach (auto DrvID in DriversToRemove) 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); fixme("Filesystem driver: %s", fexExtended->Driver.Name);
delete mem; delete mem;
@ -341,8 +416,12 @@ namespace Driver
foreach (auto Drv in Drivers) 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));
debug("Driver %s is conflicting with %s", fe->Driver.Name, fexExtended->Driver.Name);
if (fe->Driver.OverrideOnConflict) if (fe->Driver.OverrideOnConflict)
return DriverCode::DRIVER_CONFLICT; return DriverCode::DRIVER_CONFLICT;
DriversToRemove.push_back(Drv->DriverUID);
} }
foreach (auto DrvID in DriversToRemove) 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); fixme("Input driver: %s", fexExtended->Driver.Name);
delete mem; delete mem;
@ -370,8 +460,12 @@ namespace Driver
foreach (auto Drv in Drivers) 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));
debug("Driver %s is conflicting with %s", fe->Driver.Name, fexExtended->Driver.Name);
if (fe->Driver.OverrideOnConflict) if (fe->Driver.OverrideOnConflict)
return DriverCode::DRIVER_CONFLICT; return DriverCode::DRIVER_CONFLICT;
DriversToRemove.push_back(Drv->DriverUID);
} }
foreach (auto DrvID in DriversToRemove) 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); debug("Driver %s is conflicting with %s", fe->Driver.Name, fexExtended->Driver.Name);
delete mem; if (fe->Driver.OverrideOnConflict)
return DriverCode::NOT_IMPLEMENTED; 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) DriverCode Driver::DriverLoadBindPCI(void *DrvExtHdr, uintptr_t DriverAddress, size_t Size, bool IsElf)

View File

@ -95,6 +95,12 @@
* https://wiki.osdev.org/PCI * https://wiki.osdev.org/PCI
* https://en.wikipedia.org/wiki/PCI_configuration_space * 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 #ifdef a64