Optimize memory usage

This commit is contained in:
Alex 2023-04-11 12:06:32 +03:00
parent c563bb395e
commit 411b468f71
Signed by untrusted user who does not match committer: enderice2
GPG Key ID: EACC3AD603BAB4DD
10 changed files with 71 additions and 54 deletions

View File

@ -836,9 +836,12 @@ namespace CrashHandler
CPUData *data = GetCurrentCPU(); CPUData *data = GetCurrentCPU();
if (data) 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)");
}
} }
} }

View File

@ -30,7 +30,7 @@ namespace Disk
{ {
KernelCallback callback{}; KernelCallback callback{};
callback.Reason = FetchReason; callback.Reason = FetchReason;
DriverManager->IOCB(DriverUID, (void *)&callback); DriverManager->IOCB(DriverUID, &callback);
this->AvailablePorts = callback.DiskCallback.Fetch.Ports; this->AvailablePorts = callback.DiskCallback.Fetch.Ports;
this->BytesPerSector = callback.DiskCallback.Fetch.BytesPerSector; this->BytesPerSector = callback.DiskCallback.Fetch.BytesPerSector;
debug("AvailablePorts:%ld BytesPerSector:%ld", this->AvailablePorts, this->BytesPerSector); debug("AvailablePorts:%ld BytesPerSector:%ld", this->AvailablePorts, this->BytesPerSector);
@ -57,7 +57,7 @@ namespace Disk
.Buffer = RWBuffer, .Buffer = RWBuffer,
.Write = false, .Write = false,
}; };
DriverManager->IOCB(DriverUID, (void *)&callback); DriverManager->IOCB(DriverUID, &callback);
memcpy(&drive.Table, RWBuffer, sizeof(PartitionTable)); memcpy(&drive.Table, RWBuffer, sizeof(PartitionTable));
/* /*
@ -80,7 +80,7 @@ namespace Disk
.Buffer = RWBuffer, .Buffer = RWBuffer,
.Write = false, .Write = false,
}; };
DriverManager->IOCB(DriverUID, (void *)&callback); DriverManager->IOCB(DriverUID, &callback);
for (uint32_t e = 0; e < Entries; e++) for (uint32_t e = 0; e < Entries; e++)
{ {

View File

@ -48,74 +48,78 @@ namespace Driver
void Driver::Panic() void Driver::Panic()
{ {
#ifdef DEBUG
size_t DriversNum = Drivers.size(); size_t DriversNum = Drivers.size();
debug("%ld drivers loaded, [DUIDs: %ld]", DriversNum, DriverUIDs); debug("%ld drivers loaded, [DUIDs: %ld]", DriversNum, DriverUIDs);
debug("driver size %ld", DriversNum); 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; callback.Reason = StopReason;
debug("Removing interrupt hook for %ld [%#lx]", drv.DriverUID, drv.Address); DriverManager->IOCB(drv.DriverUID, &callback);
DriverManager->IOCB(drv.DriverUID, (void *)&callback);
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; continue;
delete drv.InterruptHook[j], drv.InterruptHook[j] = nullptr; drv.InterruptHook[j]->Disable();
debug("Interrupt hook %#lx disabled", drv.InterruptHook[j]);
} }
} }
} }
void Driver::UnloadAllDrivers() void Driver::UnloadAllDrivers()
{ {
#ifdef DEBUG
size_t DriversNum = Drivers.size(); size_t DriversNum = Drivers.size();
debug("%ld drivers loaded, [DUIDs: %ld]", DriversNum, DriverUIDs); debug("%ld drivers loaded, [DUIDs: %ld]", DriversNum, DriverUIDs);
debug("driver size %ld", DriversNum); 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; callback.Reason = StopReason;
debug("Stopping & unloading driver %ld [%#lx]", drv.DriverUID, drv.Address); 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++) for (size_t j = 0; j < sizeof(drv.InterruptHook) / sizeof(drv.InterruptHook[0]); j++)
{ {
if (!drv.InterruptHook[j]) if (!drv.InterruptHook[j])
break; continue;
debug("Interrupt hook %#lx", drv.InterruptHook[j]); debug("Interrupt hook %#lx", drv.InterruptHook[j]);
delete drv.InterruptHook[j], drv.InterruptHook[j] = nullptr; delete drv.InterruptHook[j], drv.InterruptHook[j] = nullptr;
} }
if (drv.MemTrk) if (drv.MemTrk)
delete drv.MemTrk, drv.MemTrk = nullptr; delete drv.MemTrk, drv.MemTrk = nullptr;
Drivers.remove(i); Drivers.remove(drv);
} }
} }
bool Driver::UnloadDriver(unsigned long DUID) bool Driver::UnloadDriver(unsigned long DUID)
{ {
debug("Searching for driver %ld", 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) if (drv.DriverUID == DUID)
{ {
KernelCallback callback; KernelCallback callback{};
callback.Reason = StopReason; callback.Reason = StopReason;
debug("Stopping and unloading driver %ld [%#lx]", drv.DriverUID, drv.Address); 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++) for (size_t j = 0; j < sizeof(drv.InterruptHook) / sizeof(drv.InterruptHook[0]); j++)
{ {
if (!drv.InterruptHook[j]) if (!drv.InterruptHook[j])
break; continue;
debug("Interrupt hook %#lx", drv.InterruptHook[j]); debug("Interrupt hook %#lx", drv.InterruptHook[j]);
delete drv.InterruptHook[j], drv.InterruptHook[j] = nullptr; delete drv.InterruptHook[j], drv.InterruptHook[j] = nullptr;
} }
delete drv.MemTrk, drv.MemTrk = nullptr; delete drv.MemTrk, drv.MemTrk = nullptr;
Drivers.remove(i); Drivers.remove(drv);
return true; return true;
} }
} }
@ -274,6 +278,9 @@ namespace Driver
#endif #endif
{ {
SmartLock(DriverInterruptLock); /* Lock in case of multiple interrupts firing at the same time */ SmartLock(DriverInterruptLock); /* Lock in case of multiple interrupts firing at the same time */
if (!this->Enabled)
return;
if (!Handle.InterruptCallback) if (!Handle.InterruptCallback)
{ {
#if defined(a86) #if defined(a86)

View File

@ -122,7 +122,6 @@ namespace Execute
{ {
ELFInterpreterIPCThread(InterpreterTargetProcess, (char *)InterpreterTargetPath->c_str(), InterpreterMemoryImage, InterpreterElfFile, InterpreterNeededLibraries); ELFInterpreterIPCThread(InterpreterTargetProcess, (char *)InterpreterTargetPath->c_str(), InterpreterMemoryImage, InterpreterElfFile, InterpreterNeededLibraries);
delete InterpreterTargetPath, InterpreterTargetPath = nullptr; delete InterpreterTargetPath, InterpreterTargetPath = nullptr;
return;
} }
ELFBaseLoad ELFLoad(char *Path, const char **argv, const char **envp, Tasking::TaskCompatibility Compatibility) ELFBaseLoad ELFLoad(char *Path, const char **argv, const char **envp, Tasking::TaskCompatibility Compatibility)

View File

@ -51,9 +51,9 @@ namespace GraphicalUserInterface
if (!once++) if (!once++)
debug("Found mouse driver %ld", Driver.DriverUID); debug("Found mouse driver %ld", Driver.DriverUID);
#endif #endif
KernelCallback callback; KernelCallback callback{};
callback.Reason = FetchReason; callback.Reason = FetchReason;
DriverManager->IOCB(Driver.DriverUID, (void *)&callback); DriverManager->IOCB(Driver.DriverUID, &callback);
Mouse.X = callback.InputCallback.Mouse.X; Mouse.X = callback.InputCallback.Mouse.X;
Mouse.Y = callback.InputCallback.Mouse.Y; Mouse.Y = callback.InputCallback.Mouse.Y;
Mouse.Z = callback.InputCallback.Mouse.Z; Mouse.Z = callback.InputCallback.Mouse.Z;

View File

@ -332,7 +332,7 @@ void KernelMainThread()
KPrint("Loading Drivers..."); KPrint("Loading Drivers...");
DriverManager = new Driver::Driver; DriverManager = new Driver::Driver;
KST_Shutdown();
KPrint("Fetching Disks..."); KPrint("Fetching Disks...");
if (DriverManager->GetDrivers().size() > 0) if (DriverManager->GetDrivers().size() > 0)
{ {

View File

@ -62,22 +62,29 @@ namespace NetworkInterfaceManager
for (size_t i = 0; i < RegisteredEvents.size(); i++) for (size_t i = 0; i < RegisteredEvents.size(); i++)
RegisteredEvents.remove(i); RegisteredEvents.remove(i);
foreach (auto inf in Interfaces)
{
if (inf)
{
Interfaces.remove(inf);
delete inf, inf = nullptr;
}
}
// Delete all interfaces and their callbacks and free the memory // Delete all interfaces and their callbacks and free the memory
delete mem, mem = nullptr; delete mem, mem = nullptr;
} }
void NetworkInterface::FetchNetworkCards(unsigned long DriverUID) void NetworkInterface::FetchNetworkCards(unsigned long DriverUID)
{ {
KernelCallback *cb = (KernelCallback *)mem->RequestPages(TO_PAGES(sizeof(KernelCallback) + 1)); KernelCallback cb{};
memset(cb, 0, sizeof(KernelCallback)); cb.Reason = FetchReason;
cb->Reason = FetchReason; DriverManager->IOCB(DriverUID, &cb);
DriverManager->IOCB(DriverUID, (void *)cb);
DeviceInterface *Iface = (DeviceInterface *)mem->RequestPages(TO_PAGES(sizeof(DeviceInterface) + 1)); DeviceInterface *Iface = (DeviceInterface *)mem->RequestPages(TO_PAGES(sizeof(DeviceInterface) + 1));
strcpy(Iface->Name, cb->NetworkCallback.Fetch.Name); strcpy(Iface->Name, cb.NetworkCallback.Fetch.Name);
Iface->ID = this->CardIDs++; Iface->ID = this->CardIDs++;
Iface->MAC.FromHex(cb->NetworkCallback.Fetch.MAC); Iface->MAC.FromHex(cb.NetworkCallback.Fetch.MAC);
Iface->DriverCallBackAddress = cb;
Iface->DriverID = DriverUID; Iface->DriverID = DriverUID;
Interfaces.push_back(Iface); Interfaces.push_back(Iface);
@ -98,7 +105,7 @@ namespace NetworkInterfaceManager
TaskManager->GetCurrentThread()->SetPriority(Tasking::TaskPriority::Critical); TaskManager->GetCurrentThread()->SetPriority(Tasking::TaskPriority::Critical);
DeviceInterface *DefaultDevice = nullptr; DeviceInterface *DefaultDevice = nullptr;
foreach (auto inf in Interfaces) foreach (auto inf in Interfaces)
if (inf && inf->DriverCallBackAddress) if (inf)
{ {
DefaultDevice = inf; DefaultDevice = inf;
break; break;
@ -201,13 +208,11 @@ namespace NetworkInterfaceManager
void *DataToBeSent = mem->RequestPages(TO_PAGES(Length + 1)); void *DataToBeSent = mem->RequestPages(TO_PAGES(Length + 1));
memcpy(DataToBeSent, Data, Length); memcpy(DataToBeSent, Data, Length);
KernelCallback *cb = (KernelCallback *)Interface->DriverCallBackAddress; KernelCallback cb{};
cb.Reason = SendReason;
memset(cb, 0, sizeof(KernelCallback)); cb.NetworkCallback.Send.Data = (uint8_t *)DataToBeSent;
cb->Reason = SendReason; cb.NetworkCallback.Send.Length = Length;
cb->NetworkCallback.Send.Data = (uint8_t *)DataToBeSent; DriverManager->IOCB(Interface->DriverID, &cb);
cb->NetworkCallback.Send.Length = Length;
DriverManager->IOCB(Interface->DriverID, (void *)cb);
mem->FreePages(DataToBeSent, TO_PAGES(Length + 1)); mem->FreePages(DataToBeSent, TO_PAGES(Length + 1));
foreach (auto var in RegisteredEvents) foreach (auto var in RegisteredEvents)

View File

@ -81,13 +81,12 @@ namespace Recovery
void *PCMRaw = KernelAllocator.RequestPages(TO_PAGES(pcm->node->Length + 1)); void *PCMRaw = KernelAllocator.RequestPages(TO_PAGES(pcm->node->Length + 1));
memcpy(PCMRaw, (void *)pcm->node->Address, pcm->node->Length); memcpy(PCMRaw, (void *)pcm->node->Address, pcm->node->Length);
KernelCallback callback; KernelCallback callback{};
memset(&callback, 0, sizeof(KernelCallback));
callback.Reason = SendReason; callback.Reason = SendReason;
callback.AudioCallback.Send.Data = (uint8_t *)PCMRaw; callback.AudioCallback.Send.Data = (uint8_t *)PCMRaw;
callback.AudioCallback.Send.Length = pcm->node->Length; callback.AudioCallback.Send.Length = pcm->node->Length;
debug("Playing audio..."); debug("Playing audio...");
int status = DriverManager->IOCB(AudioDrv.DriverUID, (void *)&callback); int status = DriverManager->IOCB(AudioDrv.DriverUID, &callback);
debug("Audio played! %d", status); debug("Audio played! %d", status);
KernelAllocator.FreePages((void *)PCMRaw, TO_PAGES(pcm->node->Length + 1)); KernelAllocator.FreePages((void *)PCMRaw, TO_PAGES(pcm->node->Length + 1));
vfs->Close(pcm); vfs->Close(pcm);
@ -115,12 +114,11 @@ namespace Recovery
return; return;
} }
KernelCallback callback; KernelCallback callback{};
memset(&callback, 0, sizeof(KernelCallback));
callback.Reason = AdjustReason; callback.Reason = AdjustReason;
callback.AudioCallback.Adjust._SampleRate = true; callback.AudioCallback.Adjust._SampleRate = true;
callback.AudioCallback.Adjust.SampleRate = SR; callback.AudioCallback.Adjust.SampleRate = SR;
int status = DriverManager->IOCB(AudioDrv.DriverUID, (void *)&callback); int status = DriverManager->IOCB(AudioDrv.DriverUID, &callback);
debug("Sample rate changed! %d", status); debug("Sample rate changed! %d", status);
} }
@ -153,12 +151,11 @@ namespace Recovery
return; return;
} }
KernelCallback callback; KernelCallback callback{};
memset(&callback, 0, sizeof(KernelCallback));
callback.Reason = AdjustReason; callback.Reason = AdjustReason;
callback.AudioCallback.Adjust._Volume = true; callback.AudioCallback.Adjust._Volume = true;
callback.AudioCallback.Adjust.Volume = percentage; callback.AudioCallback.Adjust.Volume = percentage;
int status = DriverManager->IOCB(AudioDrv.DriverUID, (void *)&callback); int status = DriverManager->IOCB(AudioDrv.DriverUID, &callback);
debug("Volume changed! %d", status); debug("Volume changed! %d", status);
} }

View File

@ -53,12 +53,18 @@ namespace Driver
void *InterruptCallback = nullptr; void *InterruptCallback = nullptr;
Memory::MemMgr *MemTrk = nullptr; Memory::MemMgr *MemTrk = nullptr;
DriverInterruptHook *InterruptHook[16]{}; DriverInterruptHook *InterruptHook[16]{};
bool operator==(const DriverFile &Other) const
{
return DriverUID == Other.DriverUID;
}
}; };
class DriverInterruptHook : public Interrupts::Handler class DriverInterruptHook : public Interrupts::Handler
{ {
private: private:
DriverFile Handle; DriverFile Handle;
bool Enabled = true;
#if defined(a64) #if defined(a64)
void OnInterruptReceived(CPU::x64::TrapFrame *Frame); void OnInterruptReceived(CPU::x64::TrapFrame *Frame);
@ -69,6 +75,9 @@ namespace Driver
#endif #endif
public: public:
void Enable() { Enabled = true; }
void Disable() { Enabled = false; }
bool IsEnabled() { return Enabled; }
DriverInterruptHook(int Interrupt, DriverFile Handle); DriverInterruptHook(int Interrupt, DriverFile Handle);
virtual ~DriverInterruptHook() = default; virtual ~DriverInterruptHook() = default;
}; };

View File

@ -41,9 +41,6 @@ namespace NetworkInterfaceManager
/** @brief Device interface IP address (Big-endian) */ /** @brief Device interface IP address (Big-endian) */
InternetProtocol IP; InternetProtocol IP;
/** @brief Reserved */
void *DriverCallBackAddress;
/** @brief Reserved */ /** @brief Reserved */
unsigned long DriverID; unsigned long DriverID;
}; };