mirror of
https://github.com/Fennix-Project/Kernel.git
synced 2025-07-11 15:29:18 +00:00
Optimize memory usage
This commit is contained in:
@ -836,9 +836,12 @@ namespace CrashHandler
|
||||
CPUData *data = GetCurrentCPU();
|
||||
if (data)
|
||||
{
|
||||
if (!data->CurrentThread->Security.IsCritical)
|
||||
if (data->CurrentThread)
|
||||
{
|
||||
fixme("Exception in non-critical thread (kernel mode)");
|
||||
if (!data->CurrentThread->Security.IsCritical)
|
||||
{
|
||||
fixme("Exception in non-critical thread (kernel mode)");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -30,7 +30,7 @@ namespace Disk
|
||||
{
|
||||
KernelCallback callback{};
|
||||
callback.Reason = FetchReason;
|
||||
DriverManager->IOCB(DriverUID, (void *)&callback);
|
||||
DriverManager->IOCB(DriverUID, &callback);
|
||||
this->AvailablePorts = callback.DiskCallback.Fetch.Ports;
|
||||
this->BytesPerSector = callback.DiskCallback.Fetch.BytesPerSector;
|
||||
debug("AvailablePorts:%ld BytesPerSector:%ld", this->AvailablePorts, this->BytesPerSector);
|
||||
@ -57,7 +57,7 @@ namespace Disk
|
||||
.Buffer = RWBuffer,
|
||||
.Write = false,
|
||||
};
|
||||
DriverManager->IOCB(DriverUID, (void *)&callback);
|
||||
DriverManager->IOCB(DriverUID, &callback);
|
||||
memcpy(&drive.Table, RWBuffer, sizeof(PartitionTable));
|
||||
|
||||
/*
|
||||
@ -80,7 +80,7 @@ namespace Disk
|
||||
.Buffer = RWBuffer,
|
||||
.Write = false,
|
||||
};
|
||||
DriverManager->IOCB(DriverUID, (void *)&callback);
|
||||
DriverManager->IOCB(DriverUID, &callback);
|
||||
|
||||
for (uint32_t e = 0; e < Entries; e++)
|
||||
{
|
||||
|
@ -48,74 +48,78 @@ namespace Driver
|
||||
|
||||
void Driver::Panic()
|
||||
{
|
||||
#ifdef DEBUG
|
||||
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++)
|
||||
#endif
|
||||
|
||||
foreach (auto drv in Drivers)
|
||||
{
|
||||
DriverFile drv = Drivers[i];
|
||||
KernelCallback callback;
|
||||
KernelCallback callback{};
|
||||
callback.Reason = StopReason;
|
||||
debug("Removing interrupt hook for %ld [%#lx]", drv.DriverUID, drv.Address);
|
||||
DriverManager->IOCB(drv.DriverUID, (void *)&callback);
|
||||
DriverManager->IOCB(drv.DriverUID, &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;
|
||||
drv.InterruptHook[j]->Disable();
|
||||
debug("Interrupt hook %#lx disabled", drv.InterruptHook[j]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void Driver::UnloadAllDrivers()
|
||||
{
|
||||
#ifdef DEBUG
|
||||
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++)
|
||||
#endif
|
||||
|
||||
foreach (auto drv in Drivers)
|
||||
{
|
||||
DriverFile drv = Drivers[i];
|
||||
KernelCallback callback;
|
||||
KernelCallback callback{};
|
||||
callback.Reason = StopReason;
|
||||
debug("Stopping & unloading driver %ld [%#lx]", drv.DriverUID, drv.Address);
|
||||
DriverManager->IOCB(drv.DriverUID, (void *)&callback);
|
||||
DriverManager->IOCB(drv.DriverUID, &callback);
|
||||
|
||||
for (size_t j = 0; j < sizeof(drv.InterruptHook) / sizeof(drv.InterruptHook[0]); j++)
|
||||
{
|
||||
if (!drv.InterruptHook[j])
|
||||
break;
|
||||
continue;
|
||||
debug("Interrupt hook %#lx", drv.InterruptHook[j]);
|
||||
delete drv.InterruptHook[j], drv.InterruptHook[j] = nullptr;
|
||||
}
|
||||
if (drv.MemTrk)
|
||||
delete drv.MemTrk, drv.MemTrk = nullptr;
|
||||
Drivers.remove(i);
|
||||
Drivers.remove(drv);
|
||||
}
|
||||
}
|
||||
|
||||
bool Driver::UnloadDriver(unsigned long DUID)
|
||||
{
|
||||
debug("Searching for driver %ld", DUID);
|
||||
for (size_t i = 0; i < Drivers.size(); i++)
|
||||
|
||||
foreach (auto drv in Drivers)
|
||||
{
|
||||
DriverFile drv = Drivers[i];
|
||||
if (drv.DriverUID == DUID)
|
||||
{
|
||||
KernelCallback callback;
|
||||
KernelCallback callback{};
|
||||
callback.Reason = StopReason;
|
||||
debug("Stopping and unloading driver %ld [%#lx]", drv.DriverUID, drv.Address);
|
||||
this->IOCB(drv.DriverUID, (void *)&callback);
|
||||
this->IOCB(drv.DriverUID, &callback);
|
||||
|
||||
for (size_t j = 0; j < sizeof(drv.InterruptHook) / sizeof(drv.InterruptHook[0]); j++)
|
||||
{
|
||||
if (!drv.InterruptHook[j])
|
||||
break;
|
||||
continue;
|
||||
debug("Interrupt hook %#lx", drv.InterruptHook[j]);
|
||||
delete drv.InterruptHook[j], drv.InterruptHook[j] = nullptr;
|
||||
}
|
||||
delete drv.MemTrk, drv.MemTrk = nullptr;
|
||||
Drivers.remove(i);
|
||||
Drivers.remove(drv);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@ -274,6 +278,9 @@ namespace Driver
|
||||
#endif
|
||||
{
|
||||
SmartLock(DriverInterruptLock); /* Lock in case of multiple interrupts firing at the same time */
|
||||
if (!this->Enabled)
|
||||
return;
|
||||
|
||||
if (!Handle.InterruptCallback)
|
||||
{
|
||||
#if defined(a86)
|
||||
|
Reference in New Issue
Block a user