mirror of
https://github.com/matrix-construct/construct
synced 2024-09-27 19:28:52 +02:00
ircd::info: Query cpuid features on init.
This commit is contained in:
parent
04959d946c
commit
9e61cf7bc0
3 changed files with 92 additions and 2 deletions
|
@ -750,6 +750,7 @@ RB_CHK_SYSHEADER(iphlpapi.h, [IPHLPAPI_H])
|
||||||
|
|
||||||
dnl x86 platform
|
dnl x86 platform
|
||||||
RB_CHK_SYSHEADER(x86intrin.h, [X86INTRIN_H])
|
RB_CHK_SYSHEADER(x86intrin.h, [X86INTRIN_H])
|
||||||
|
RB_CHK_SYSHEADER(cpuid.h, [CPUID_H])
|
||||||
|
|
||||||
dnl experimental
|
dnl experimental
|
||||||
RB_CHK_SYSHEADER(experimental/string_view, [EXPERIMENTAL_STRING_VIEW])
|
RB_CHK_SYSHEADER(experimental/string_view, [EXPERIMENTAL_STRING_VIEW])
|
||||||
|
|
|
@ -32,11 +32,15 @@ namespace ircd::info
|
||||||
extern const string_view compiled;
|
extern const string_view compiled;
|
||||||
extern const string_view startup;
|
extern const string_view startup;
|
||||||
|
|
||||||
// System information
|
// Platform information
|
||||||
extern const size_t max_align;
|
extern const size_t max_align;
|
||||||
extern const size_t hardware_concurrency;
|
extern const size_t hardware_concurrency;
|
||||||
extern const size_t destructive_interference;
|
extern const size_t destructive_interference;
|
||||||
extern const size_t constructive_interference;
|
extern const size_t constructive_interference;
|
||||||
|
extern const uint128_t cpuid[8];
|
||||||
|
extern const string_view cpuvendor;
|
||||||
|
|
||||||
|
// System information
|
||||||
extern const size_t page_size;
|
extern const size_t page_size;
|
||||||
extern const size_t iov_max;
|
extern const size_t iov_max;
|
||||||
extern const size_t aio_max;
|
extern const size_t aio_max;
|
||||||
|
|
87
ircd/info.cc
87
ircd/info.cc
|
@ -10,6 +10,7 @@
|
||||||
|
|
||||||
#include <RB_INC_SYS_RESOURCE_H
|
#include <RB_INC_SYS_RESOURCE_H
|
||||||
#include <RB_INC_UNISTD_H
|
#include <RB_INC_UNISTD_H
|
||||||
|
#include <RB_INC_CPUID_H
|
||||||
|
|
||||||
void
|
void
|
||||||
ircd::info::init()
|
ircd::info::init()
|
||||||
|
@ -66,7 +67,8 @@ ircd::info::dump()
|
||||||
// IRCd is compiled for and running on.
|
// IRCd is compiled for and running on.
|
||||||
log::debug
|
log::debug
|
||||||
{
|
{
|
||||||
"page_size=%zu max_align=%zu hw_conc=%zu d_inter=%zu c_inter=%zu",
|
"cpu[%s] page_size=%zu max_align=%zu hw_conc=%zu d_inter=%zu c_inter=%zu",
|
||||||
|
cpuvendor,
|
||||||
page_size,
|
page_size,
|
||||||
max_align,
|
max_align,
|
||||||
hardware_concurrency,
|
hardware_concurrency,
|
||||||
|
@ -332,6 +334,89 @@ ircd::info::page_size
|
||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
|
//
|
||||||
|
// Platform information
|
||||||
|
//
|
||||||
|
|
||||||
|
#ifdef HAVE_CPUID_H
|
||||||
|
static ircd::uint128_t
|
||||||
|
get_cpuid(const uint &leaf,
|
||||||
|
const uint &subleaf)
|
||||||
|
{
|
||||||
|
using ircd::uint128_t;
|
||||||
|
|
||||||
|
uint32_t reg[4];
|
||||||
|
asm volatile
|
||||||
|
(
|
||||||
|
"cpuid" "\n\t"
|
||||||
|
: "=a" (reg[0]),
|
||||||
|
"=b" (reg[1]),
|
||||||
|
"=c" (reg[2]),
|
||||||
|
"=d" (reg[3])
|
||||||
|
: "0" (leaf),
|
||||||
|
"2" (subleaf)
|
||||||
|
);
|
||||||
|
|
||||||
|
return uint128_t
|
||||||
|
{
|
||||||
|
(uint128_t(reg[3]) << 96) | // edx
|
||||||
|
(uint128_t(reg[2]) << 64) | // ecx
|
||||||
|
(uint128_t(reg[1]) << 32) | // ebx
|
||||||
|
(uint128_t(reg[0]) << 0) // eax
|
||||||
|
};
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
static ircd::uint128_t
|
||||||
|
get_cpuid(const uint &leaf,
|
||||||
|
const uint &subleaf)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
decltype(ircd::info::cpuid)
|
||||||
|
ircd::info::cpuid
|
||||||
|
{
|
||||||
|
get_cpuid(0x00000000U, 0),
|
||||||
|
get_cpuid(0x00000001U, 0),
|
||||||
|
get_cpuid(0x00000002U, 0),
|
||||||
|
get_cpuid(0x00000004U, 0),
|
||||||
|
get_cpuid(0x80000000U, 0),
|
||||||
|
0UL,
|
||||||
|
0UL,
|
||||||
|
0UL,
|
||||||
|
};
|
||||||
|
|
||||||
|
char
|
||||||
|
_cpuvendor_[16];
|
||||||
|
|
||||||
|
decltype(ircd::info::cpuvendor)
|
||||||
|
ircd::info::cpuvendor{[&]
|
||||||
|
{
|
||||||
|
const auto b
|
||||||
|
{
|
||||||
|
reinterpret_cast<const uint8_t *>(cpuid + 0)
|
||||||
|
};
|
||||||
|
|
||||||
|
_cpuvendor_[0] = b[4];
|
||||||
|
_cpuvendor_[1] = b[5];
|
||||||
|
_cpuvendor_[2] = b[6];
|
||||||
|
_cpuvendor_[3] = b[7];
|
||||||
|
_cpuvendor_[4] = b[12];
|
||||||
|
_cpuvendor_[5] = b[13];
|
||||||
|
_cpuvendor_[6] = b[14];
|
||||||
|
_cpuvendor_[7] = b[15];
|
||||||
|
_cpuvendor_[8] = b[8];
|
||||||
|
_cpuvendor_[9] = b[9];
|
||||||
|
_cpuvendor_[10] = b[10];
|
||||||
|
_cpuvendor_[11] = b[11];
|
||||||
|
|
||||||
|
return string_view
|
||||||
|
{
|
||||||
|
_cpuvendor_, sizeof(_cpuvendor_)
|
||||||
|
};
|
||||||
|
}()};
|
||||||
|
|
||||||
decltype(ircd::info::constructive_interference)
|
decltype(ircd::info::constructive_interference)
|
||||||
ircd::info::constructive_interference
|
ircd::info::constructive_interference
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in a new issue