diff --git a/Source/sys-clk/sysmodule/src/clock_manager.cpp b/Source/sys-clk/sysmodule/src/clock_manager.cpp index ce456d7f..b3fc65a3 100644 --- a/Source/sys-clk/sysmodule/src/clock_manager.cpp +++ b/Source/sys-clk/sysmodule/src/clock_manager.cpp @@ -597,6 +597,7 @@ void ClockManager::SetKipData() { // I know this is very hacky, but the config system in the sysmodule doesn't really support writing void ClockManager::GetKipData() { + this->config->Refresh(); std::scoped_lock lock{this->contextMutex}; const char* kip; if(this->config->GetConfigValue(HocClkConfigValue_KipFileName)) diff --git a/Source/sys-clk/sysmodule/src/config.cpp b/Source/sys-clk/sysmodule/src/config.cpp index 37918716..f9a57f66 100644 --- a/Source/sys-clk/sysmodule/src/config.cpp +++ b/Source/sys-clk/sysmodule/src/config.cpp @@ -1,3 +1,4 @@ + /* * Copyright (c) Souldbminer and Horizon OC Contributors * @@ -15,7 +16,8 @@ * */ -/* -------------------------------------------------------------------------- +/* + * -------------------------------------------------------------------------- * "THE BEER-WARE LICENSE" (Revision 42): * , , * wrote this file. As long as you retain this notice you can do whatever you @@ -24,7 +26,6 @@ * -------------------------------------------------------------------------- */ - #include "config.h" #include #include @@ -197,17 +198,24 @@ bool Config::SetProfiles(std::uint64_t tid, SysClkTitleProfileList* profiles, bo std::scoped_lock lock{this->configMutex}; uint8_t numProfiles = 0; + // String pointer array passed to ini + char* iniKeys[SysClkProfile_EnumMax * SysClkModule_EnumMax + 1]; + char* iniValues[SysClkProfile_EnumMax * SysClkModule_EnumMax + 1]; + + // Char arrays to build strings + char keysStr[SysClkProfile_EnumMax * SysClkModule_EnumMax * 0x40]; + char valuesStr[SysClkProfile_EnumMax * SysClkModule_EnumMax * 0x10]; char section[17] = {0}; - snprintf(section, sizeof(section), "%016lX", tid); - - // Use dynamic allocation - std::vector keys; - std::vector values; - keys.reserve(SysClkProfile_EnumMax * SysClkModule_EnumMax); - values.reserve(SysClkProfile_EnumMax * SysClkModule_EnumMax); + // Iteration pointers + char** ik = &iniKeys[0]; + char** iv = &iniValues[0]; + char* sk = &keysStr[0]; + char* sv = &valuesStr[0]; std::uint32_t* mhz = &profiles->mhz[0]; + snprintf(section, sizeof(section), "%016lX", tid); + for(unsigned int profile = 0; profile < SysClkProfile_EnumMax; profile++) { for(unsigned int module = 0; module < SysClkModule_EnumMax; module++) @@ -216,38 +224,34 @@ bool Config::SetProfiles(std::uint64_t tid, SysClkTitleProfileList* profiles, bo { numProfiles++; - // Build key and value strings - std::string key = std::string(Board::GetProfileName((SysClkProfile)profile, false)) + - "_" + - Board::GetModuleName((SysClkModule)module, false); - std::string value = std::to_string(*mhz); + // Put key and value as string + snprintf(sk, 0x40, "%s_%s", Board::GetProfileName((SysClkProfile)profile, false), Board::GetModuleName((SysClkModule)module, false)); + snprintf(sv, 0x10, "%d", *mhz); - keys.push_back(key); - values.push_back(value); + // Add them to the ini key/value str arrays + *ik = sk; + *iv = sv; + ik++; + iv++; + + // We used those chars, get to the next ones + sk += 0x40; + sv += 0x10; } + mhz++; } } - // Build pointer arrays - std::vector keyPointers; - std::vector valuePointers; - keyPointers.reserve(keys.size() + 1); - valuePointers.reserve(values.size() + 1); + *ik = NULL; + *iv = NULL; - for(size_t i = 0; i < keys.size(); i++) { - keyPointers.push_back(keys[i].c_str()); - valuePointers.push_back(values[i].c_str()); - } - keyPointers.push_back(NULL); - valuePointers.push_back(NULL); - - if(!ini_putsection(section, keyPointers.data(), valuePointers.data(), this->path.c_str())) + if(!ini_putsection(section, (const char**)iniKeys, (const char**)iniValues, this->path.c_str())) { return false; } - // Only actually apply changes in memory after a successful save + // Only actually apply changes in memory after a succesful save if(immediate) { mhz = &profiles->mhz[0]; @@ -428,42 +432,46 @@ bool Config::SetConfigValues(SysClkConfigValueList* configValues, bool immediate { std::scoped_lock lock{this->configMutex}; - std::vector iniKeys; - std::vector iniValues; - - iniKeys.reserve(SysClkConfigValue_EnumMax + 1); - iniValues.reserve(SysClkConfigValue_EnumMax); + // String pointer array passed to ini + const char* iniKeys[SysClkConfigValue_EnumMax + 1]; + char* iniValues[SysClkConfigValue_EnumMax + 1]; + + // char arrays to build strings + char valuesStr[SysClkConfigValue_EnumMax * 0x20]; + + // Iteration pointers + char* sv = &valuesStr[0]; + const char** ik = &iniKeys[0]; + char** iv = &iniValues[0]; for(unsigned int kval = 0; kval < SysClkConfigValue_EnumMax; kval++) { - if(!sysclkValidConfigValue((SysClkConfigValue)kval, configValues->values[kval]) || - configValues->values[kval] == sysclkDefaultConfigValue((SysClkConfigValue)kval)) + if(!sysclkValidConfigValue((SysClkConfigValue)kval, configValues->values[kval]) || configValues->values[kval] == sysclkDefaultConfigValue((SysClkConfigValue)kval)) { continue; } - // Store as string in vector (automatically managed memory) - iniValues.push_back(std::to_string(configValues->values[kval])); - iniKeys.push_back(sysclkFormatConfigValue((SysClkConfigValue)kval, false)); + // Put key and value as string + // And add them to the ini key/value str arrays + snprintf(sv, 0x20, "%ld", configValues->values[kval]); + *ik = sysclkFormatConfigValue((SysClkConfigValue)kval, false); + *iv = sv; + + // We used those chars, get to the next ones + sv += 0x20; + ik++; + iv++; } - // Null terminate - iniKeys.push_back(NULL); + *ik = NULL; + *iv = NULL; - // Build pointer array for ini function - std::vector valuePointers; - valuePointers.reserve(iniValues.size() + 1); - for(const auto& val : iniValues) { - valuePointers.push_back(val.c_str()); - } - valuePointers.push_back(NULL); - - if(!ini_putsection(CONFIG_VAL_SECTION, iniKeys.data(), valuePointers.data(), this->path.c_str())) + if(!ini_putsection(CONFIG_VAL_SECTION, (const char**)iniKeys, (const char**)iniValues, this->path.c_str())) { return false; } - // Only actually apply changes in memory after a successful save + // Only actually apply changes in memory after a succesful save if(immediate) { for(unsigned int kval = 0; kval < SysClkConfigValue_EnumMax; kval++) @@ -479,53 +487,5 @@ bool Config::SetConfigValues(SysClkConfigValueList* configValues, bool immediate } } - return true; -} - -bool Config::ResetConfigValue(SysClkConfigValue kval) -{ - // Check enum validity BEFORE acquiring lock - if (!SYSCLK_ENUM_VALID(SysClkConfigValue, kval)) { - FileUtils::LogLine("[cfg] Invalid SysClkConfigValue: %u", kval); - return false; - } - - std::scoped_lock lock{this->configMutex}; - - std::uint64_t defaultValue = sysclkDefaultConfigValue(kval); - - // Build key-value pair for INI file (empty value to remove) - std::vector iniKeys; - std::vector iniValues; - - iniKeys.reserve(2); // key + NULL terminator - iniValues.reserve(1); - - const char* keyStr = sysclkFormatConfigValue(kval, false); - - iniKeys.push_back(keyStr); - iniValues.push_back(""); // Empty string to remove the key - - // Null terminate keys - iniKeys.push_back(NULL); - - // Build value pointers array - std::vector valuePointers; - valuePointers.reserve(iniValues.size() + 1); - for (const auto& val : iniValues) { - valuePointers.push_back(val.c_str()); - } - valuePointers.push_back(NULL); - - // Write to INI file - if (!ini_putsection(CONFIG_VAL_SECTION, iniKeys.data(), valuePointers.data(), this->path.c_str())) { - FileUtils::LogLine("[cfg] Failed to reset config value %u in INI", kval); - return false; - } - - // Apply default value in memory - this->configValues[kval] = defaultValue; - FileUtils::LogLine("[cfg] Reset config value %u to default: %llu", kval, defaultValue); - return true; } \ No newline at end of file diff --git a/Source/sys-clk/sysmodule/src/config.h b/Source/sys-clk/sysmodule/src/config.h index 4718d356..41d18458 100644 --- a/Source/sys-clk/sysmodule/src/config.h +++ b/Source/sys-clk/sysmodule/src/config.h @@ -15,7 +15,9 @@ * */ -/* -------------------------------------------------------------------------- + +/* + * -------------------------------------------------------------------------- * "THE BEER-WARE LICENSE" (Revision 42): * , , * wrote this file. As long as you retain this notice you can do whatever you @@ -24,7 +26,6 @@ * -------------------------------------------------------------------------- */ - #pragma once #include #include @@ -65,7 +66,6 @@ class Config const char* GetConfigValueName(SysClkConfigValue val, bool pretty); void GetConfigValues(SysClkConfigValueList* out_configValues); bool SetConfigValues(SysClkConfigValueList* configValues, bool immediate); - bool ResetConfigValue(SysClkConfigValue kval); protected: void Load(); void Close(); @@ -85,4 +85,4 @@ class Config std::atomic_bool enabled; std::uint32_t overrideFreqs[SysClkModule_EnumMax]; std::uint64_t configValues[SysClkConfigValue_EnumMax]; -}; +}; \ No newline at end of file