From 3b8d081c8c63c717dc366f17fad861b75cea45c7 Mon Sep 17 00:00:00 2001 From: XMRig Date: Mon, 18 Jan 2021 22:56:57 +0700 Subject: [PATCH] Add support for older DMI formats on Linux. --- src/Summary.cpp | 6 ++-- src/hw/dmi/DmiReader.cpp | 10 ++++++ src/hw/dmi/DmiReader.h | 6 ++++ src/hw/dmi/DmiReader_unix.cpp | 57 ++++++++++++++++++++++++++++++----- src/hw/dmi/DmiReader_win.cpp | 7 ++--- 5 files changed, 72 insertions(+), 14 deletions(-) diff --git a/src/Summary.cpp b/src/Summary.cpp index 345ed48e..b925232f 100644 --- a/src/Summary.cpp +++ b/src/Summary.cpp @@ -129,7 +129,7 @@ static void print_memory() const double percent = freeMem > 0 ? ((totalMem - freeMem) / totalMem * 100.0) : 100.0; - Log::print(GREEN_BOLD(" * ") WHITE_BOLD("%-13s") CYAN_BOLD("%.1f/%.1f GB") BLACK_BOLD(" (%.0f%%)"), + Log::print(GREEN_BOLD(" * ") WHITE_BOLD("%-13s") CYAN_BOLD("%.1f/%.1f") CYAN(" GB") BLACK_BOLD(" (%.0f%%)"), "MEMORY", (totalMem - freeMem) / oneGiB, totalMem / oneGiB, @@ -148,11 +148,11 @@ static void print_memory() } if (!memory.size()) { - Log::print(WHITE_BOLD(" %-13s") WHITE_BOLD("%s: ") BLACK_BOLD(""), "", memory.slot().data()); + Log::print(WHITE_BOLD(" %-13s") "%s: " BLACK_BOLD(""), "", memory.slot().data()); continue; } - Log::print(WHITE_BOLD(" %-13s") WHITE_BOLD("%s: ") CYAN_BOLD("%" PRIu64 " GB ") WHITE_BOLD("%s @ %" PRIu64 " MHz ") BLACK_BOLD("%s"), + Log::print(WHITE_BOLD(" %-13s") "%s: " CYAN_BOLD("%" PRIu64) CYAN(" GB ") WHITE_BOLD("%s @ %" PRIu64 " MHz ") BLACK_BOLD("%s"), "", memory.slot().data(), memory.size() / oneGiB, memory.type(), memory.speed() / 1000000ULL, memory.product().data()); } diff --git a/src/hw/dmi/DmiReader.cpp b/src/hw/dmi/DmiReader.cpp index 66f1dd5f..8993531a 100644 --- a/src/hw/dmi/DmiReader.cpp +++ b/src/hw/dmi/DmiReader.cpp @@ -38,6 +38,16 @@ static void dmi_get_header(dmi_header *h, uint8_t *data) } // namespace xmrig +bool xmrig::DmiReader::decode(uint8_t *buf, const Cleanup &cleanup) +{ + const bool rc = decode(buf); + + cleanup(); + + return rc; +} + + bool xmrig::DmiReader::decode(uint8_t *buf) { if (!buf) { diff --git a/src/hw/dmi/DmiReader.h b/src/hw/dmi/DmiReader.h index 243b5164..f140f867 100644 --- a/src/hw/dmi/DmiReader.h +++ b/src/hw/dmi/DmiReader.h @@ -26,6 +26,9 @@ #include "hw/dmi/DmiMemory.h" +#include + + namespace xmrig { @@ -42,6 +45,9 @@ public: bool read(); private: + using Cleanup = std::function; + + bool decode(uint8_t *buf, const Cleanup &cleanup); bool decode(uint8_t *buf); DmiBoard m_board; diff --git a/src/hw/dmi/DmiReader_unix.cpp b/src/hw/dmi/DmiReader_unix.cpp index e9b25abc..db516012 100644 --- a/src/hw/dmi/DmiReader_unix.cpp +++ b/src/hw/dmi/DmiReader_unix.cpp @@ -157,7 +157,46 @@ static uint8_t *smbios3_decode(uint8_t *buf, const char *devmem, uint32_t &size, size = dmi_get(buf + 0x0C); const u64 offset = dmi_get(buf + 0x10); - return dmi_table(((off_t)offset.h << 32) | offset.l, size, devmem, flags);; + return dmi_table(((off_t)offset.h << 32) | offset.l, size, devmem, flags); +} + + +static uint8_t *smbios_decode(uint8_t *buf, const char *devmem, uint32_t &size, uint32_t &version, uint32_t flags) +{ + if (buf[0x05] > 0x20 || !checksum(buf, buf[0x05]) || memcmp(buf + 0x10, "_DMI_", 5) != 0 || !checksum(buf + 0x10, 0x0F)) { + return nullptr; + } + + version = (buf[0x06] << 8) + buf[0x07]; + + switch (version) { + case 0x021F: + case 0x0221: + version = 0x0203; + break; + + case 0x0233: + version = 0x0206; + break; + } + + version = version << 8; + size = dmi_get(buf + 0x16); + + return dmi_table(dmi_get(buf + 0x18), size, devmem, flags); +} + + +static uint8_t *legacy_decode(uint8_t *buf, const char *devmem, uint32_t &size, uint32_t &version, uint32_t flags) +{ + if (!checksum(buf, 0x0F)) { + return nullptr; + } + + version = ((buf[0x0E] & 0xF0) << 12) + ((buf[0x0E] & 0x0F) << 8); + size = dmi_get(buf + 0x06); + + return dmi_table(dmi_get(buf + 0x08), size, devmem, flags); } @@ -175,14 +214,18 @@ bool xmrig::DmiReader::read() if (size >= 24 && memcmp(buf, "_SM3_", 5) == 0) { smb = smbios3_decode(buf, kSysTableFile, m_size, m_version, FLAG_NO_FILE_OFFSET); } + else if (size >= 31 && memcmp(buf, "_SM_", 4) == 0) { + smb = smbios_decode(buf, kSysTableFile, m_size, m_version, FLAG_NO_FILE_OFFSET); + } + else if (size >= 15 && memcmp(buf, "_DMI_", 5) == 0) { + smb = legacy_decode(buf, kSysTableFile, m_size, m_version, FLAG_NO_FILE_OFFSET); + } if (smb) { - decode(smb); - - free(smb); - free(buf); - - return true; + return decode(smb, [smb, buf]() { + free(smb); + free(buf); + }); } } diff --git a/src/hw/dmi/DmiReader_win.cpp b/src/hw/dmi/DmiReader_win.cpp index b79f952a..837bdb7b 100644 --- a/src/hw/dmi/DmiReader_win.cpp +++ b/src/hw/dmi/DmiReader_win.cpp @@ -62,8 +62,7 @@ bool xmrig::DmiReader::read() m_version = (smb->SMBIOSMajorVersion << 16) + (smb->SMBIOSMinorVersion << 8) + smb->DmiRevision; m_size = smb->Length; - const bool rc = decode(smb->SMBIOSTableData); - HeapFree(GetProcessHeap(), 0, smb); - - return rc; + return decode(smb->SMBIOSTableData, [smb]() { + HeapFree(GetProcessHeap(), 0, smb); + }); }