diff --git a/src/backend/cpu/interfaces/ICpuInfo.h b/src/backend/cpu/interfaces/ICpuInfo.h index f7e9fcfa..a272d3cd 100644 --- a/src/backend/cpu/interfaces/ICpuInfo.h +++ b/src/backend/cpu/interfaces/ICpuInfo.h @@ -47,6 +47,7 @@ public: MSR_MOD_NONE, MSR_MOD_RYZEN, MSR_MOD_INTEL, + MSR_MOD_BULLDOZER, MSR_MOD_CUSTOM, MSR_MOD_MAX }; diff --git a/src/backend/cpu/platform/AdvancedCpuInfo.cpp b/src/backend/cpu/platform/AdvancedCpuInfo.cpp index 20496ff1..85bf9207 100644 --- a/src/backend/cpu/platform/AdvancedCpuInfo.cpp +++ b/src/backend/cpu/platform/AdvancedCpuInfo.cpp @@ -145,6 +145,9 @@ xmrig::AdvancedCpuInfo::AdvancedCpuInfo() : } else { m_assembly = Assembly::BULLDOZER; + if (family == 21) { + m_msrMod = MSR_MOD_BULLDOZER; + } } } else if (m_vendor == VENDOR_INTEL) { diff --git a/src/backend/cpu/platform/BasicCpuInfo.cpp b/src/backend/cpu/platform/BasicCpuInfo.cpp index 1dfede21..24f9c012 100644 --- a/src/backend/cpu/platform/BasicCpuInfo.cpp +++ b/src/backend/cpu/platform/BasicCpuInfo.cpp @@ -181,6 +181,9 @@ xmrig::BasicCpuInfo::BasicCpuInfo() : } else { m_assembly = Assembly::BULLDOZER; + if (family == 21) { + m_msrMod = MSR_MOD_BULLDOZER; + } } } else if (memcmp(vendor, "GenuineIntel", 12) == 0) { diff --git a/src/crypto/rx/RxConfig.cpp b/src/crypto/rx/RxConfig.cpp index 2ec568f9..d62189d5 100644 --- a/src/crypto/rx/RxConfig.cpp +++ b/src/crypto/rx/RxConfig.cpp @@ -60,16 +60,17 @@ static const std::array modeNames = { "auto", " #ifdef XMRIG_FEATURE_MSR -constexpr size_t kMsrArraySize = 4; +constexpr size_t kMsrArraySize = 5; static const std::array msrPresets = { MsrItems(), MsrItems{{ 0xC0011020, 0x0 }, { 0xC0011021, 0x40, ~0x20ULL }, { 0xC0011022, 0x510000 }, { 0xC001102b, 0x1808cc16 }}, MsrItems{{ 0x1a4, 0xf }}, + MsrItems{{ 0xc0011022, 0x2010, 0x2010 }, { 0xc001102b, 0x70000, 0x770000 }}, MsrItems() }; -static const std::array modNames = { "none", "ryzen", "intel", "custom" }; +static const std::array modNames = { "none", "ryzen", "intel", "bulldozer", "custom" }; static_assert (kMsrArraySize == ICpuInfo::MSR_MOD_MAX, "kMsrArraySize and MSR_MOD_MAX mismatch"); #endif diff --git a/src/crypto/rx/Rx_linux.cpp b/src/crypto/rx/Rx_linux.cpp index c98510bd..ab41693e 100644 --- a/src/crypto/rx/Rx_linux.cpp +++ b/src/crypto/rx/Rx_linux.cpp @@ -91,13 +91,19 @@ static MsrItem rdmsr(uint32_t reg) } +static uint64_t get_masked_value(uint64_t old_value, uint64_t new_value, uint64_t mask) +{ + return (new_value & mask) | (old_value & ~mask); +} + + static bool wrmsr_on_cpu(uint32_t reg, uint32_t cpu, uint64_t value, uint64_t mask) { // If a bit in mask is set to 1, use new value, otherwise use old value if (mask != MsrItem::kNoMask) { uint64_t old_value; if (rdmsr_on_cpu(reg, cpu, old_value)) { - value = (value & mask) | (old_value & ~mask); + value = get_masked_value(old_value, value, mask); } } @@ -162,7 +168,7 @@ static bool wrmsr(const MsrItems &preset, bool save) if (save) { for (const auto &i : preset) { auto item = rdmsr(i.reg()); - LOG_VERBOSE(CLEAR "%s" CYAN_BOLD("0x%08" PRIx32) CYAN(":0x%016" PRIx64) CYAN_BOLD(" -> 0x%016" PRIx64), tag, i.reg(), item.value(), i.value()); + LOG_VERBOSE(CLEAR "%s" CYAN_BOLD("0x%08" PRIx32) CYAN(":0x%016" PRIx64) CYAN_BOLD(" -> 0x%016" PRIx64), tag, i.reg(), item.value(), get_masked_value(item.value(), i.value(), i.mask())); if (item.isValid()) { savedState.emplace_back(item); diff --git a/src/crypto/rx/Rx_win.cpp b/src/crypto/rx/Rx_win.cpp index acfb7f01..cf9613f7 100644 --- a/src/crypto/rx/Rx_win.cpp +++ b/src/crypto/rx/Rx_win.cpp @@ -217,6 +217,12 @@ static MsrItem rdmsr(HANDLE driver, uint32_t reg) } +static uint64_t get_masked_value(uint64_t old_value, uint64_t new_value, uint64_t mask) +{ + return (new_value & mask) | (old_value & ~mask); +} + + static bool wrmsr(HANDLE driver, uint32_t reg, uint64_t value, uint64_t mask) { struct { @@ -230,7 +236,7 @@ static bool wrmsr(HANDLE driver, uint32_t reg, uint64_t value, uint64_t mask) if (mask != MsrItem::kNoMask) { uint64_t old_value; if (rdmsr(driver, reg, old_value)) { - value = (value & mask) | (old_value & ~mask); + value = get_masked_value(old_value, value, mask); } } @@ -268,7 +274,7 @@ static bool wrmsr(const MsrItems &preset, bool save) if (save) { for (const auto &i : preset) { auto item = rdmsr(driver, i.reg()); - LOG_VERBOSE(CLEAR "%s" CYAN_BOLD("0x%08" PRIx32) CYAN(":0x%016" PRIx64) CYAN_BOLD(" -> 0x%016" PRIx64), tag, i.reg(), item.value(), i.value()); + LOG_VERBOSE(CLEAR "%s" CYAN_BOLD("0x%08" PRIx32) CYAN(":0x%016" PRIx64) CYAN_BOLD(" -> 0x%016" PRIx64), tag, i.reg(), item.value(), get_masked_value(item.value(), i.value(), i.mask())); if (item.isValid()) { savedState.emplace_back(item);