diff --git a/src/kernlib/display.cpp b/src/kernlib/display.cpp index 039522a..4cf63e8 100644 --- a/src/kernlib/display.cpp +++ b/src/kernlib/display.cpp @@ -170,7 +170,7 @@ const size_t ConsoleDisplay::size = ConsoleDisplay::top - ConsoleDisplay::base; static Display *getSerialDisplay(); static SerialDisplay serialConsole; -Display *Display::instance = getSerialDisplay(); +volatile Display *Display::instance = getSerialDisplay(); Mutex Display::instanceMutex; static Display *getSerialDisplay() { return &serialConsole; } @@ -209,10 +209,10 @@ void Display::setup() { } Display *Display::getInstance() { - if (instance) return instance; + if (instance) return const_cast(instance); Mutex::CriticalLock lock(instanceMutex); if (!instance) setup(); - return instance; + return const_cast(instance); } Display::~Display() {} diff --git a/src/kernlib/include/kernlib/display.hpp b/src/kernlib/include/kernlib/display.hpp index 7392464..95407ca 100644 --- a/src/kernlib/include/kernlib/display.hpp +++ b/src/kernlib/include/kernlib/display.hpp @@ -8,7 +8,7 @@ class Display { private: static Mutex instanceMutex; - static Display *instance; + static volatile Display *instance; static void setup(); protected: Mutex mutex; diff --git a/src/platform/acpi.cpp b/src/platform/acpi.cpp index ea6dbbe..f231ef2 100644 --- a/src/platform/acpi.cpp +++ b/src/platform/acpi.cpp @@ -8,13 +8,13 @@ #include "pagetable.hpp" Mutex ACPI::controllerMutex; -ACPI* ACPI::controller = nullptr; +volatile ACPI* ACPI::controller = nullptr; ACPI* ACPI::getController() { - if (controller) return controller; + if (controller) return const_cast(controller); Mutex::CriticalLock lock(controllerMutex); if (!controller) controller = new ACPI(); - return controller; + return const_cast(controller); } ACPI::ACPI() { @@ -29,7 +29,7 @@ ACPI::ACPI() { ioApicAddr = nullptr; const uint64_t *ptr = nullptr; - if (!ptr && (ptr = static_cast(EFI::getACPI2Addr()))) { + if (nullptr != (ptr = static_cast(EFI::getACPI2Addr()))) { Pagetable::map(ptr); Pagetable::map(ptr + 1); if ((*ptr != ACPI_SIG_RTP_DSR) || !ParseRsdp(ptr)) ptr = nullptr; diff --git a/src/platform/include/acpi.hpp b/src/platform/include/acpi.hpp index 0cb529b..c0c425e 100644 --- a/src/platform/include/acpi.hpp +++ b/src/platform/include/acpi.hpp @@ -105,7 +105,7 @@ class ACPI { private: static Mutex controllerMutex; - static ACPI *controller; + static volatile ACPI *controller; char *localApicAddr, *ioApicAddr; uint8_t ioApicMaxCount; diff --git a/src/process/include/modules.hpp b/src/process/include/modules.hpp index c419012..a207fb5 100644 --- a/src/process/include/modules.hpp +++ b/src/process/include/modules.hpp @@ -12,7 +12,7 @@ class ModuleManager { char *name, *version, *description, *requirements, *developer; }; static Mutex managerMutex; - static ModuleManager* manager; + static volatile ModuleManager* manager; void parseInternal(); void parseInitRD(); void loadStream(Stream *stream); diff --git a/src/process/include/processmanager.hpp b/src/process/include/processmanager.hpp index 3e39869..298451f 100644 --- a/src/process/include/processmanager.hpp +++ b/src/process/include/processmanager.hpp @@ -16,7 +16,7 @@ class ProcessManager { }; static Mutex managerMutex; - static ProcessManager* manager; + static volatile ProcessManager* manager; ProcessManager(); QueuedThread *nextThread, *lastThread; diff --git a/src/process/modules.cpp b/src/process/modules.cpp index 16c2109..5814591 100644 --- a/src/process/modules.cpp +++ b/src/process/modules.cpp @@ -6,6 +6,7 @@ #include "readelf.hpp" #include "multiboot_info.hpp" +volatile ModuleManager* ModuleManager::manager = nullptr; Mutex ModuleManager::managerMutex; bool ModuleManager::parseModuleInfo(ModuleInfo *info, Process *process) { @@ -122,7 +123,6 @@ bool ModuleManager::bindRequirements(const char *reqs, Process *process) { return 1; } -ModuleManager* ModuleManager::manager = nullptr; void ModuleManager::loadStream(Stream *stream) { Stream *sub = stream; Process *process; @@ -190,8 +190,8 @@ void ModuleManager::init() { } ModuleManager* ModuleManager::getManager() { - if (manager) return manager; + if (manager) return const_cast(manager); Mutex::Lock lock(managerMutex); if (!manager) manager = new ModuleManager(); - return manager; + return const_cast(manager); } diff --git a/src/process/processmanager.cpp b/src/process/processmanager.cpp index e34c846..8c0c681 100644 --- a/src/process/processmanager.cpp +++ b/src/process/processmanager.cpp @@ -13,13 +13,13 @@ void __attribute((naked)) ProcessManager::process_loop() { } Mutex ProcessManager::managerMutex; -ProcessManager* ProcessManager::manager = nullptr; +volatile ProcessManager* ProcessManager::manager = nullptr; ProcessManager* ProcessManager::getManager() { - if (manager) return manager; + if (manager) return const_cast(manager); Mutex::CriticalLock lock(managerMutex); if (!manager) manager = new ProcessManager(); - return manager; + return const_cast(manager); } ProcessManager::ProcessManager() {