mirror of
https://github.com/Fennix-Project/Kernel.git
synced 2025-05-28 15:34:33 +00:00
Unhook interrupts from every driver on crash
This commit is contained in:
parent
93afcd2210
commit
98677c7b5b
@ -917,7 +917,7 @@ namespace CrashHandler
|
|||||||
ExceptionOccurred = true;
|
ExceptionOccurred = true;
|
||||||
|
|
||||||
if (DriverManager)
|
if (DriverManager)
|
||||||
DriverManager->UnloadAllDrivers();
|
DriverManager->Panic();
|
||||||
|
|
||||||
debug("Reading control registers...");
|
debug("Reading control registers...");
|
||||||
crashdata.Frame = Frame;
|
crashdata.Frame = Frame;
|
||||||
|
@ -29,6 +29,28 @@ namespace Driver
|
|||||||
"Input",
|
"Input",
|
||||||
"Audio"};
|
"Audio"};
|
||||||
|
|
||||||
|
void Driver::Panic()
|
||||||
|
{
|
||||||
|
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;
|
||||||
|
callback.Reason = StopReason;
|
||||||
|
debug("Removing interrupt hook for %ld [%#lx]", drv.DriverUID, drv.Address);
|
||||||
|
DriverManager->IOCB(drv.DriverUID, (void *)&callback);
|
||||||
|
|
||||||
|
for (size_t j = 0; j < sizeof(drv.InterruptHook) / sizeof(drv.InterruptHook[0]); j++)
|
||||||
|
{
|
||||||
|
if (!drv.InterruptHook[j])
|
||||||
|
continue;
|
||||||
|
delete drv.InterruptHook[j], drv.InterruptHook[j] = nullptr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void Driver::UnloadAllDrivers()
|
void Driver::UnloadAllDrivers()
|
||||||
{
|
{
|
||||||
size_t DriversNum = Drivers.size();
|
size_t DriversNum = Drivers.size();
|
||||||
|
@ -102,6 +102,7 @@ namespace Driver
|
|||||||
|
|
||||||
public:
|
public:
|
||||||
std::vector<DriverFile> GetDrivers() { return Drivers; }
|
std::vector<DriverFile> GetDrivers() { return Drivers; }
|
||||||
|
void Panic();
|
||||||
void UnloadAllDrivers();
|
void UnloadAllDrivers();
|
||||||
bool UnloadDriver(unsigned long DUID);
|
bool UnloadDriver(unsigned long DUID);
|
||||||
int IOCB(unsigned long DUID, /* KernelCallback */ void *KCB);
|
int IOCB(unsigned long DUID, /* KernelCallback */ void *KCB);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user