mirror of
https://github.com/xmrig/xmrig.git
synced 2025-01-09 12:29:24 +00:00
Added DMI reader (Windows only).
This commit is contained in:
parent
ea367da064
commit
11e0d3de3a
13 changed files with 825 additions and 0 deletions
|
@ -26,6 +26,7 @@ option(WITH_PROFILING "Enable profiling for developers" OFF)
|
||||||
option(WITH_SSE4_1 "Enable SSE 4.1 for Blake2" ON)
|
option(WITH_SSE4_1 "Enable SSE 4.1 for Blake2" ON)
|
||||||
option(WITH_BENCHMARK "Enable builtin RandomX benchmark and stress test" ON)
|
option(WITH_BENCHMARK "Enable builtin RandomX benchmark and stress test" ON)
|
||||||
option(WITH_SECURE_JIT "Enable secure access to JIT memory" OFF)
|
option(WITH_SECURE_JIT "Enable secure access to JIT memory" OFF)
|
||||||
|
option(WITH_DMI "Enable DMI reader" OFF)
|
||||||
|
|
||||||
option(BUILD_STATIC "Build static binary" OFF)
|
option(BUILD_STATIC "Build static binary" OFF)
|
||||||
option(ARM_TARGET "Force use specific ARM target 8 or 7" 0)
|
option(ARM_TARGET "Force use specific ARM target 8 or 7" 0)
|
||||||
|
@ -197,6 +198,8 @@ if (WITH_EMBEDDED_CONFIG)
|
||||||
add_definitions(/DXMRIG_FEATURE_EMBEDDED_CONFIG)
|
add_definitions(/DXMRIG_FEATURE_EMBEDDED_CONFIG)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
include (src/hw/dmi/dmi.cmake)
|
||||||
|
|
||||||
include_directories(src)
|
include_directories(src)
|
||||||
include_directories(src/3rdparty)
|
include_directories(src/3rdparty)
|
||||||
include_directories(${UV_INCLUDE_DIR})
|
include_directories(${UV_INCLUDE_DIR})
|
||||||
|
|
|
@ -39,6 +39,11 @@
|
||||||
#include "version.h"
|
#include "version.h"
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef XMRIG_FEATURE_DMI
|
||||||
|
# include "hw/dmi/DmiReader.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
#ifdef XMRIG_ALGO_RANDOMX
|
#ifdef XMRIG_ALGO_RANDOMX
|
||||||
# include "crypto/rx/RxConfig.h"
|
# include "crypto/rx/RxConfig.h"
|
||||||
#endif
|
#endif
|
||||||
|
@ -130,6 +135,31 @@ static void print_memory()
|
||||||
totalMem / oneGiB,
|
totalMem / oneGiB,
|
||||||
percent
|
percent
|
||||||
);
|
);
|
||||||
|
|
||||||
|
# ifdef XMRIG_FEATURE_DMI
|
||||||
|
DmiReader reader;
|
||||||
|
if (!reader.read()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (const auto &memory : reader.memory()) {
|
||||||
|
if (!memory.isValid()) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!memory.size()) {
|
||||||
|
Log::print(WHITE_BOLD(" %-13s") WHITE_BOLD("%s: ") BLACK_BOLD("<empty>"), "", memory.slot().data());
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
Log::print(WHITE_BOLD(" %-13s") WHITE_BOLD("%s: ") CYAN_BOLD("%" PRIu64 " GB ") WHITE_BOLD("%s @ %" PRIu64 " MHz ") BLACK_BOLD("%s"),
|
||||||
|
"", memory.slot().data(), memory.size() / oneGiB, memory.type(), memory.speed() / 1000000ULL, memory.product().data());
|
||||||
|
}
|
||||||
|
|
||||||
|
if (reader.board().isValid()) {
|
||||||
|
Log::print(GREEN_BOLD(" * ") WHITE_BOLD("%-13s") WHITE_BOLD("%s") " - " WHITE_BOLD("%s"), "MOTHERBOARD", reader.board().vendor().data(), reader.board().product().data());
|
||||||
|
}
|
||||||
|
# endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
35
src/hw/dmi/DmiBoard.cpp
Normal file
35
src/hw/dmi/DmiBoard.cpp
Normal file
|
@ -0,0 +1,35 @@
|
||||||
|
/* XMRig
|
||||||
|
* Copyright (c) 2000-2002 Alan Cox <alan@redhat.com>
|
||||||
|
* Copyright (c) 2005-2020 Jean Delvare <jdelvare@suse.de>
|
||||||
|
* Copyright (c) 2018-2021 SChernykh <https://github.com/SChernykh>
|
||||||
|
* Copyright (c) 2016-2021 XMRig <https://github.com/xmrig>, <support@xmrig.com>
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#include "hw/dmi/DmiBoard.h"
|
||||||
|
#include "hw/dmi/DmiTools.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void xmrig::DmiBoard::decode(dmi_header *h)
|
||||||
|
{
|
||||||
|
if (h->length < 0x08) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
m_vendor = dmi_string(h, 0x04);
|
||||||
|
m_product = dmi_string(h, 0x05);
|
||||||
|
}
|
54
src/hw/dmi/DmiBoard.h
Normal file
54
src/hw/dmi/DmiBoard.h
Normal file
|
@ -0,0 +1,54 @@
|
||||||
|
/* XMRig
|
||||||
|
* Copyright (c) 2000-2002 Alan Cox <alan@redhat.com>
|
||||||
|
* Copyright (c) 2005-2020 Jean Delvare <jdelvare@suse.de>
|
||||||
|
* Copyright (c) 2018-2021 SChernykh <https://github.com/SChernykh>
|
||||||
|
* Copyright (c) 2016-2021 XMRig <https://github.com/xmrig>, <support@xmrig.com>
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef XMRIG_DMIBOARD_H
|
||||||
|
#define XMRIG_DMIBOARD_H
|
||||||
|
|
||||||
|
|
||||||
|
#include "base/tools/String.h"
|
||||||
|
|
||||||
|
|
||||||
|
namespace xmrig {
|
||||||
|
|
||||||
|
|
||||||
|
struct dmi_header;
|
||||||
|
|
||||||
|
|
||||||
|
class DmiBoard
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
DmiBoard() = default;
|
||||||
|
|
||||||
|
inline const String &product() const { return m_product; }
|
||||||
|
inline const String &vendor() const { return m_vendor; }
|
||||||
|
inline bool isValid() const { return !m_product.isEmpty() && !m_vendor.isEmpty(); }
|
||||||
|
|
||||||
|
void decode(dmi_header *h);
|
||||||
|
|
||||||
|
private:
|
||||||
|
String m_product;
|
||||||
|
String m_vendor;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
} /* namespace xmrig */
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* XMRIG_DMIBOARD_H */
|
192
src/hw/dmi/DmiMemory.cpp
Normal file
192
src/hw/dmi/DmiMemory.cpp
Normal file
|
@ -0,0 +1,192 @@
|
||||||
|
/* XMRig
|
||||||
|
* Copyright (c) 2000-2002 Alan Cox <alan@redhat.com>
|
||||||
|
* Copyright (c) 2005-2020 Jean Delvare <jdelvare@suse.de>
|
||||||
|
* Copyright (c) 2018-2021 SChernykh <https://github.com/SChernykh>
|
||||||
|
* Copyright (c) 2016-2021 XMRig <https://github.com/xmrig>, <support@xmrig.com>
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#include "hw/dmi/DmiMemory.h"
|
||||||
|
#include "hw/dmi/DmiTools.h"
|
||||||
|
|
||||||
|
|
||||||
|
#include <algorithm>
|
||||||
|
#include <array>
|
||||||
|
|
||||||
|
|
||||||
|
namespace xmrig {
|
||||||
|
|
||||||
|
|
||||||
|
static inline uint16_t dmi_memory_device_width(uint16_t code)
|
||||||
|
{
|
||||||
|
return (code == 0xFFFF || code == 0) ? 0 : code;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static const char *dmi_memory_device_form_factor(uint8_t code)
|
||||||
|
{
|
||||||
|
static const std::array<const char *, 0x10> form_factor
|
||||||
|
{
|
||||||
|
"Other",
|
||||||
|
"Unknown",
|
||||||
|
"SIMM",
|
||||||
|
"SIP",
|
||||||
|
"Chip",
|
||||||
|
"DIP",
|
||||||
|
"ZIP",
|
||||||
|
"Proprietary Card",
|
||||||
|
"DIMM",
|
||||||
|
"TSOP",
|
||||||
|
"Row Of Chips",
|
||||||
|
"RIMM",
|
||||||
|
"SODIMM",
|
||||||
|
"SRIMM",
|
||||||
|
"FB-DIMM",
|
||||||
|
"Die"
|
||||||
|
};
|
||||||
|
|
||||||
|
if (code >= 0x01 && code <= form_factor.size()) {
|
||||||
|
return form_factor[code - 0x01];
|
||||||
|
}
|
||||||
|
|
||||||
|
return form_factor[1];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static const char *dmi_memory_device_type(uint8_t code)
|
||||||
|
{
|
||||||
|
static const std::array<const char *, 0x23> type
|
||||||
|
{
|
||||||
|
"Other", /* 0x01 */
|
||||||
|
"Unknown",
|
||||||
|
"DRAM",
|
||||||
|
"EDRAM",
|
||||||
|
"VRAM",
|
||||||
|
"SRAM",
|
||||||
|
"RAM",
|
||||||
|
"ROM",
|
||||||
|
"Flash",
|
||||||
|
"EEPROM",
|
||||||
|
"FEPROM",
|
||||||
|
"EPROM",
|
||||||
|
"CDRAM",
|
||||||
|
"3DRAM",
|
||||||
|
"SDRAM",
|
||||||
|
"SGRAM",
|
||||||
|
"RDRAM",
|
||||||
|
"DDR",
|
||||||
|
"DDR2",
|
||||||
|
"DDR2 FB-DIMM",
|
||||||
|
"Reserved",
|
||||||
|
"Reserved",
|
||||||
|
"Reserved",
|
||||||
|
"DDR3",
|
||||||
|
"FBD2",
|
||||||
|
"DDR4",
|
||||||
|
"LPDDR",
|
||||||
|
"LPDDR2",
|
||||||
|
"LPDDR3",
|
||||||
|
"LPDDR4",
|
||||||
|
"Logical non-volatile device",
|
||||||
|
"HBM",
|
||||||
|
"HBM2",
|
||||||
|
"DDR5",
|
||||||
|
"LPDDR5"
|
||||||
|
};
|
||||||
|
|
||||||
|
if (code >= 0x01 && code <= type.size()) {
|
||||||
|
return type[code - 0x01];
|
||||||
|
}
|
||||||
|
|
||||||
|
return type[1];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static uint64_t dmi_memory_device_speed(uint16_t code1, uint32_t code2)
|
||||||
|
{
|
||||||
|
return (code1 == 0xFFFF) ? code2 : code1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
} // namespace xmrig
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
xmrig::DmiMemory::DmiMemory(dmi_header *h)
|
||||||
|
{
|
||||||
|
if (h->length < 0x15) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
m_totalWidth = dmi_memory_device_width(dmi_get<uint16_t>(h, 0x08));
|
||||||
|
m_width = dmi_memory_device_width(dmi_get<uint16_t>(h, 0x0A));
|
||||||
|
|
||||||
|
auto size = dmi_get<uint16_t>(h, 0x0C);
|
||||||
|
if (h->length >= 0x20 && size == 0x7FFF) {
|
||||||
|
m_size = (dmi_get<uint32_t>(h, 0x1C) & 0x7FFFFFFFUL) * 1024ULL * 1024ULL;
|
||||||
|
}
|
||||||
|
else if (size) {
|
||||||
|
m_size = (1024ULL * (size & 0x7FFF) * ((size & 0x8000) ? 1 : 1024ULL));
|
||||||
|
}
|
||||||
|
|
||||||
|
m_formFactor = h->data[0x0E];
|
||||||
|
m_slot = dmi_string(h, 0x10);
|
||||||
|
m_bank = dmi_string(h, 0x11);
|
||||||
|
m_type = h->data[0x12];
|
||||||
|
|
||||||
|
if (!m_size || h->length < 0x17) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
m_speed = dmi_memory_device_speed(dmi_get<uint16_t>(h, 0x15), h->length >= 0x5C ? dmi_get<uint32_t>(h, 0x54) : 0) * 1000000ULL;
|
||||||
|
|
||||||
|
if (h->length < 0x1B) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
m_vendor = dmi_string(h, 0x17);
|
||||||
|
m_product = dmi_string(h, 0x1A);
|
||||||
|
|
||||||
|
if (h->length < 0x1C) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
m_rank = h->data[0x1B] & 0x0F;
|
||||||
|
|
||||||
|
if (h->length < 0x22) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
m_speed = std::max(m_speed, dmi_memory_device_speed(dmi_get<uint16_t>(h, 0x20), h->length >= 0x5C ? dmi_get<uint32_t>(h, 0x58) : 0) * 1000000ULL);
|
||||||
|
|
||||||
|
if (h->length < 0x28) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
m_voltage = dmi_get<uint16_t>(h, 0x26);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
const char *xmrig::DmiMemory::formFactor() const
|
||||||
|
{
|
||||||
|
return dmi_memory_device_form_factor(m_formFactor);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
const char *xmrig::DmiMemory::type() const
|
||||||
|
{
|
||||||
|
return dmi_memory_device_type(m_type);
|
||||||
|
}
|
74
src/hw/dmi/DmiMemory.h
Normal file
74
src/hw/dmi/DmiMemory.h
Normal file
|
@ -0,0 +1,74 @@
|
||||||
|
/* XMRig
|
||||||
|
* Copyright (c) 2000-2002 Alan Cox <alan@redhat.com>
|
||||||
|
* Copyright (c) 2005-2020 Jean Delvare <jdelvare@suse.de>
|
||||||
|
* Copyright (c) 2018-2021 SChernykh <https://github.com/SChernykh>
|
||||||
|
* Copyright (c) 2016-2021 XMRig <https://github.com/xmrig>, <support@xmrig.com>
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef XMRIG_DMIMEMORY_H
|
||||||
|
#define XMRIG_DMIMEMORY_H
|
||||||
|
|
||||||
|
|
||||||
|
#include "base/tools/String.h"
|
||||||
|
|
||||||
|
|
||||||
|
namespace xmrig {
|
||||||
|
|
||||||
|
|
||||||
|
struct dmi_header;
|
||||||
|
|
||||||
|
|
||||||
|
class DmiMemory
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
DmiMemory() = default;
|
||||||
|
DmiMemory(dmi_header *h);
|
||||||
|
|
||||||
|
inline bool isValid() const { return !m_slot.isEmpty(); }
|
||||||
|
inline const String &bank() const { return m_bank; }
|
||||||
|
inline const String &product() const { return m_product; }
|
||||||
|
inline const String &slot() const { return m_slot; }
|
||||||
|
inline const String &vendor() const { return m_vendor; }
|
||||||
|
inline uint16_t totalWidth() const { return m_totalWidth; }
|
||||||
|
inline uint16_t voltage() const { return m_voltage; }
|
||||||
|
inline uint16_t width() const { return m_width; }
|
||||||
|
inline uint64_t size() const { return m_size; }
|
||||||
|
inline uint64_t speed() const { return m_speed; }
|
||||||
|
inline uint8_t rank() const { return m_rank; }
|
||||||
|
|
||||||
|
const char *formFactor() const;
|
||||||
|
const char *type() const;
|
||||||
|
|
||||||
|
private:
|
||||||
|
String m_bank;
|
||||||
|
String m_product;
|
||||||
|
String m_slot;
|
||||||
|
String m_vendor;
|
||||||
|
uint16_t m_totalWidth = 0;
|
||||||
|
uint16_t m_voltage = 0;
|
||||||
|
uint16_t m_width = 0;
|
||||||
|
uint64_t m_size = 0;
|
||||||
|
uint64_t m_speed = 0;
|
||||||
|
uint8_t m_formFactor = 0;
|
||||||
|
uint8_t m_rank = 0;
|
||||||
|
uint8_t m_type = 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
} /* namespace xmrig */
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* XMRIG_DMIMEMORY_H */
|
87
src/hw/dmi/DmiReader.cpp
Normal file
87
src/hw/dmi/DmiReader.cpp
Normal file
|
@ -0,0 +1,87 @@
|
||||||
|
/* XMRig
|
||||||
|
* Copyright (c) 2000-2002 Alan Cox <alan@redhat.com>
|
||||||
|
* Copyright (c) 2005-2020 Jean Delvare <jdelvare@suse.de>
|
||||||
|
* Copyright (c) 2018-2021 SChernykh <https://github.com/SChernykh>
|
||||||
|
* Copyright (c) 2016-2021 XMRig <https://github.com/xmrig>, <support@xmrig.com>
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#include "hw/dmi/DmiReader.h"
|
||||||
|
#include "hw/dmi/DmiTools.h"
|
||||||
|
|
||||||
|
|
||||||
|
namespace xmrig {
|
||||||
|
|
||||||
|
|
||||||
|
static void dmi_get_header(dmi_header *h, uint8_t *data)
|
||||||
|
{
|
||||||
|
h->type = data[0];
|
||||||
|
h->length = data[1];
|
||||||
|
h->handle = dmi_get<uint16_t>(data + 2);
|
||||||
|
h->data = data;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
} // namespace xmrig
|
||||||
|
|
||||||
|
|
||||||
|
bool xmrig::DmiReader::decode(uint8_t *buf)
|
||||||
|
{
|
||||||
|
if (!buf || !m_count) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t *data = buf;
|
||||||
|
int i = 0;
|
||||||
|
|
||||||
|
while ((i < m_count || !m_count) && data + 4 <= buf + m_size) {
|
||||||
|
dmi_header h{};
|
||||||
|
dmi_get_header(&h, data);
|
||||||
|
|
||||||
|
if (h.length < 4 || h.type == 127) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
i++;
|
||||||
|
|
||||||
|
uint8_t *next = data + h.length;
|
||||||
|
while (static_cast<uint32_t>(next - buf + 1) < m_size && (next[0] != 0 || next[1] != 0)) {
|
||||||
|
next++;
|
||||||
|
}
|
||||||
|
next += 2;
|
||||||
|
|
||||||
|
if (static_cast<uint32_t>(next - buf) > m_size) {
|
||||||
|
data = next;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (h.type) {
|
||||||
|
case 2:
|
||||||
|
m_board.decode(&h);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 17:
|
||||||
|
m_memory.emplace_back(&h);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
data = next;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
59
src/hw/dmi/DmiReader.h
Normal file
59
src/hw/dmi/DmiReader.h
Normal file
|
@ -0,0 +1,59 @@
|
||||||
|
/* XMRig
|
||||||
|
* Copyright (c) 2000-2002 Alan Cox <alan@redhat.com>
|
||||||
|
* Copyright (c) 2005-2020 Jean Delvare <jdelvare@suse.de>
|
||||||
|
* Copyright (c) 2018-2021 SChernykh <https://github.com/SChernykh>
|
||||||
|
* Copyright (c) 2016-2021 XMRig <https://github.com/xmrig>, <support@xmrig.com>
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef XMRIG_DMIREADER_H
|
||||||
|
#define XMRIG_DMIREADER_H
|
||||||
|
|
||||||
|
|
||||||
|
#include "hw/dmi/DmiBoard.h"
|
||||||
|
#include "hw/dmi/DmiMemory.h"
|
||||||
|
|
||||||
|
|
||||||
|
namespace xmrig {
|
||||||
|
|
||||||
|
|
||||||
|
class DmiReader
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
DmiReader() = default;
|
||||||
|
|
||||||
|
inline const DmiBoard &board() const { return m_board; }
|
||||||
|
inline const std::vector<DmiMemory> &memory() const { return m_memory; }
|
||||||
|
inline uint16_t count() const { return m_count; }
|
||||||
|
inline uint32_t size() const { return m_size; }
|
||||||
|
inline uint32_t version() const { return m_version; }
|
||||||
|
|
||||||
|
bool read();
|
||||||
|
|
||||||
|
private:
|
||||||
|
bool decode(uint8_t *buf);
|
||||||
|
|
||||||
|
DmiBoard m_board;
|
||||||
|
uint16_t m_count = 0;
|
||||||
|
uint32_t m_size = 0;
|
||||||
|
uint32_t m_version = 0;
|
||||||
|
std::vector<DmiMemory> m_memory;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
} /* namespace xmrig */
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* XMRIG_DMIREADER_H */
|
26
src/hw/dmi/DmiReader_unix.cpp
Normal file
26
src/hw/dmi/DmiReader_unix.cpp
Normal file
|
@ -0,0 +1,26 @@
|
||||||
|
/* XMRig
|
||||||
|
* Copyright (c) 2018-2021 SChernykh <https://github.com/SChernykh>
|
||||||
|
* Copyright (c) 2016-2021 XMRig <https://github.com/xmrig>, <support@xmrig.com>
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#include "hw/dmi/DmiReader.h"
|
||||||
|
|
||||||
|
|
||||||
|
bool xmrig::DmiReader::read()
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
112
src/hw/dmi/DmiReader_win.cpp
Normal file
112
src/hw/dmi/DmiReader_win.cpp
Normal file
|
@ -0,0 +1,112 @@
|
||||||
|
/* XMRig
|
||||||
|
* Copyright (c) 2002-2006 Hugo Weber <address@hidden>
|
||||||
|
* Copyright (c) 2018-2021 SChernykh <https://github.com/SChernykh>
|
||||||
|
* Copyright (c) 2016-2021 XMRig <https://github.com/xmrig>, <support@xmrig.com>
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#include "hw/dmi/DmiReader.h"
|
||||||
|
#include "hw/dmi/DmiTools.h"
|
||||||
|
|
||||||
|
|
||||||
|
#include <windows.h>
|
||||||
|
|
||||||
|
|
||||||
|
namespace xmrig {
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Struct needed to get the SMBIOS table using GetSystemFirmwareTable API.
|
||||||
|
*/
|
||||||
|
struct RawSMBIOSData {
|
||||||
|
uint8_t Used20CallingMethod;
|
||||||
|
uint8_t SMBIOSMajorVersion;
|
||||||
|
uint8_t SMBIOSMinorVersion;
|
||||||
|
uint8_t DmiRevision;
|
||||||
|
uint32_t Length;
|
||||||
|
uint8_t SMBIOSTableData[];
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Counts the number of SMBIOS structures present in
|
||||||
|
* the SMBIOS table.
|
||||||
|
*
|
||||||
|
* buf - Pointer that receives the SMBIOS Table address.
|
||||||
|
* This will be the address of the BYTE array from
|
||||||
|
* the RawSMBIOSData struct.
|
||||||
|
*
|
||||||
|
* len - The length of the SMBIOS Table pointed by buff.
|
||||||
|
*
|
||||||
|
* return - The number of SMBIOS strutctures.
|
||||||
|
*
|
||||||
|
* Remarks:
|
||||||
|
* The SMBIOS Table Entry Point has this information,
|
||||||
|
* however the GetSystemFirmwareTable API doesn't
|
||||||
|
* return all fields from the Entry Point, and
|
||||||
|
* DMIDECODE uses this value as a parameter for
|
||||||
|
* dmi_table function. This is the reason why
|
||||||
|
* this function was make.
|
||||||
|
*
|
||||||
|
* Hugo Weber address@hidden
|
||||||
|
*/
|
||||||
|
uint16_t count_smbios_structures(const uint8_t *buf, uint32_t len)
|
||||||
|
{
|
||||||
|
uint16_t count = 0;
|
||||||
|
uint32_t offset = 0;
|
||||||
|
|
||||||
|
while (offset < len) {
|
||||||
|
offset += reinterpret_cast<const dmi_header *>(buf + offset)->length;
|
||||||
|
count++;
|
||||||
|
|
||||||
|
while ((*reinterpret_cast<const uint16_t *>(buf + offset) != 0) && (offset < len)) {
|
||||||
|
offset++;
|
||||||
|
}
|
||||||
|
|
||||||
|
offset += 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
return count;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
} // namespace xmrig
|
||||||
|
|
||||||
|
|
||||||
|
bool xmrig::DmiReader::read()
|
||||||
|
{
|
||||||
|
const uint32_t size = GetSystemFirmwareTable('RSMB', 0, nullptr, 0);
|
||||||
|
auto smb = reinterpret_cast<RawSMBIOSData *>(HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, size));
|
||||||
|
|
||||||
|
if (!smb) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (GetSystemFirmwareTable('RSMB', 0, smb, size) != size) {
|
||||||
|
HeapFree(GetProcessHeap(), 0, smb);
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
m_version = (smb->SMBIOSMajorVersion << 16) + (smb->SMBIOSMinorVersion << 8) + smb->DmiRevision;
|
||||||
|
m_size = smb->Length;
|
||||||
|
m_count = count_smbios_structures(smb->SMBIOSTableData, m_size);
|
||||||
|
|
||||||
|
const bool rc = decode(smb->SMBIOSTableData);
|
||||||
|
HeapFree(GetProcessHeap(), 0, smb);
|
||||||
|
|
||||||
|
return rc;
|
||||||
|
}
|
75
src/hw/dmi/DmiTools.cpp
Normal file
75
src/hw/dmi/DmiTools.cpp
Normal file
|
@ -0,0 +1,75 @@
|
||||||
|
/* XMRig
|
||||||
|
* Copyright (c) 2000-2002 Alan Cox <alan@redhat.com>
|
||||||
|
* Copyright (c) 2005-2020 Jean Delvare <jdelvare@suse.de>
|
||||||
|
* Copyright (c) 2018-2021 SChernykh <https://github.com/SChernykh>
|
||||||
|
* Copyright (c) 2016-2021 XMRig <https://github.com/xmrig>, <support@xmrig.com>
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#include "hw/dmi/DmiTools.h"
|
||||||
|
|
||||||
|
|
||||||
|
#include <cstring>
|
||||||
|
|
||||||
|
|
||||||
|
namespace xmrig {
|
||||||
|
|
||||||
|
|
||||||
|
/* Replace non-ASCII characters with dots */
|
||||||
|
static void ascii_filter(char *bp, size_t len)
|
||||||
|
{
|
||||||
|
for (size_t i = 0; i < len; i++) {
|
||||||
|
if (bp[i] < 32 || bp[i] >= 127) {
|
||||||
|
bp[i] = '.';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static char *_dmi_string(dmi_header *dm, uint8_t s, bool filter)
|
||||||
|
{
|
||||||
|
char *bp = reinterpret_cast<char *>(dm->data);
|
||||||
|
|
||||||
|
bp += dm->length;
|
||||||
|
while (s > 1 && *bp) {
|
||||||
|
bp += strlen(bp);
|
||||||
|
bp++;
|
||||||
|
s--;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!*bp) {
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (filter) {
|
||||||
|
ascii_filter(bp, strlen(bp));
|
||||||
|
}
|
||||||
|
|
||||||
|
return bp;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
const char *dmi_string(dmi_header *dm, size_t offset)
|
||||||
|
{
|
||||||
|
if (offset < 4) {
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
return _dmi_string(dm, dm->data[offset], true);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
} // namespace xmrig
|
53
src/hw/dmi/DmiTools.h
Normal file
53
src/hw/dmi/DmiTools.h
Normal file
|
@ -0,0 +1,53 @@
|
||||||
|
/* XMRig
|
||||||
|
* Copyright (c) 2000-2002 Alan Cox <alan@redhat.com>
|
||||||
|
* Copyright (c) 2005-2020 Jean Delvare <jdelvare@suse.de>
|
||||||
|
* Copyright (c) 2018-2021 SChernykh <https://github.com/SChernykh>
|
||||||
|
* Copyright (c) 2016-2021 XMRig <https://github.com/xmrig>, <support@xmrig.com>
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef XMRIG_DMITOOLS_H
|
||||||
|
#define XMRIG_DMITOOLS_H
|
||||||
|
|
||||||
|
|
||||||
|
#include <cstdint>
|
||||||
|
|
||||||
|
|
||||||
|
namespace xmrig {
|
||||||
|
|
||||||
|
|
||||||
|
struct dmi_header
|
||||||
|
{
|
||||||
|
uint8_t type;
|
||||||
|
uint8_t length;
|
||||||
|
uint16_t handle;
|
||||||
|
uint8_t *data;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
inline T dmi_get(const uint8_t *data) { return *reinterpret_cast<const T *>(data); }
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
inline T dmi_get(const dmi_header *h, size_t offset) { return *reinterpret_cast<const T *>(h->data + offset); }
|
||||||
|
|
||||||
|
|
||||||
|
const char *dmi_string(dmi_header *dm, size_t offset);
|
||||||
|
|
||||||
|
|
||||||
|
} /* namespace xmrig */
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* XMRIG_DMITOOLS_H */
|
25
src/hw/dmi/dmi.cmake
Normal file
25
src/hw/dmi/dmi.cmake
Normal file
|
@ -0,0 +1,25 @@
|
||||||
|
if (WITH_DMI)
|
||||||
|
add_definitions(/DXMRIG_FEATURE_DMI)
|
||||||
|
|
||||||
|
list(APPEND HEADERS
|
||||||
|
src/hw/dmi/DmiBoard.h
|
||||||
|
src/hw/dmi/DmiMemory.h
|
||||||
|
src/hw/dmi/DmiReader.h
|
||||||
|
src/hw/dmi/DmiTools.h
|
||||||
|
)
|
||||||
|
|
||||||
|
list(APPEND SOURCES
|
||||||
|
src/hw/dmi/DmiBoard.cpp
|
||||||
|
src/hw/dmi/DmiMemory.cpp
|
||||||
|
src/hw/dmi/DmiReader.cpp
|
||||||
|
src/hw/dmi/DmiTools.cpp
|
||||||
|
)
|
||||||
|
|
||||||
|
if (XMRIG_OS_WIN)
|
||||||
|
list(APPEND SOURCES src/hw/dmi/DmiReader_win.cpp)
|
||||||
|
elseif(XMRIG_OS_LINUX)
|
||||||
|
list(APPEND SOURCES src/hw/dmi/DmiReader_unix.cpp)
|
||||||
|
endif()
|
||||||
|
else()
|
||||||
|
remove_definitions(/DXMRIG_FEATURE_DMI)
|
||||||
|
endif()
|
Loading…
Reference in a new issue