mirror of
https://github.com/Fennix-Project/Kernel.git
synced 2025-05-27 23:14:38 +00:00
Fix wrong driver conflict detection
This commit is contained in:
parent
ce13f5ea82
commit
3b1efa2ed3
@ -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);
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
|
@ -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)
|
||||||
|
@ -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
|
||||||
|
Loading…
x
Reference in New Issue
Block a user