mirror of
https://github.com/google/cpu_features.git
synced 2025-06-30 21:02:34 +02:00
Add support for FreeBSD on x86 (#163)
This commit is contained in:

committed by
GitHub

parent
06fdc0aa1d
commit
119943707c
@ -98,7 +98,8 @@
|
||||
// microarchitectures.
|
||||
#if defined(CPU_FEATURES_OS_WINDOWS)
|
||||
#include <windows.h> // IsProcessorFeaturePresent
|
||||
#elif defined(CPU_FEATURES_OS_LINUX_OR_ANDROID)
|
||||
#elif defined(CPU_FEATURES_OS_LINUX_OR_ANDROID) || \
|
||||
defined(CPU_FEATURES_OS_FREEBSD)
|
||||
#include "internal/filesystem.h" // Needed to parse /proc/cpuinfo
|
||||
#include "internal/stack_line_reader.h" // Needed to parse /proc/cpuinfo
|
||||
#include "internal/string_view.h" // Needed to parse /proc/cpuinfo
|
||||
@ -1330,6 +1331,45 @@ static void ParseCpuId(const uint32_t max_cpuid_leaf, X86Info* info,
|
||||
features->ssse3 = GetDarwinSysCtlByName("hw.optional.supplementalsse3");
|
||||
features->sse4_1 = GetDarwinSysCtlByName("hw.optional.sse4_1");
|
||||
features->sse4_2 = GetDarwinSysCtlByName("hw.optional.sse4_2");
|
||||
#elif defined(CPU_FEATURES_OS_FREEBSD)
|
||||
// Handling FreeBSD platform through parsing /var/run/dmesg.boot.
|
||||
const int fd = CpuFeatures_OpenFile("/var/run/dmesg.boot");
|
||||
if (fd >= 0) {
|
||||
StackLineReader reader;
|
||||
StackLineReader_Initialize(&reader, fd);
|
||||
for (;;) {
|
||||
const LineResult result = StackLineReader_NextLine(&reader);
|
||||
const StringView line = result.line;
|
||||
const bool is_feature =
|
||||
CpuFeatures_StringView_StartsWith(line, str(" Features="));
|
||||
const bool is_feature2 =
|
||||
CpuFeatures_StringView_StartsWith(line, str(" Features2="));
|
||||
if (is_feature || is_feature2) {
|
||||
// Lines of interests are of the following form:
|
||||
// " Features=0x1783fbff<PSE36,MMX,FXSR,SSE,SSE2,HTT>"
|
||||
// We replace '<', '>' and ',' with space so we can search by
|
||||
// whitespace separated word.
|
||||
// TODO: Fix CpuFeatures_StringView_HasWord to allow for different
|
||||
// separators.
|
||||
for (size_t i = 0; i < line.size; ++i) {
|
||||
char* c = (char*)(&(line.ptr[i]));
|
||||
if (*c == '<' || *c == '>' || *c == ',') *c = ' ';
|
||||
}
|
||||
if (is_feature) {
|
||||
features->sse = CpuFeatures_StringView_HasWord(line, "SSE");
|
||||
features->sse2 = CpuFeatures_StringView_HasWord(line, "SSE2");
|
||||
}
|
||||
if (is_feature2) {
|
||||
features->sse3 = CpuFeatures_StringView_HasWord(line, "SSE3");
|
||||
features->ssse3 = CpuFeatures_StringView_HasWord(line, "SSSE3");
|
||||
features->sse4_1 = CpuFeatures_StringView_HasWord(line, "SSE4.1");
|
||||
features->sse4_2 = CpuFeatures_StringView_HasWord(line, "SSE4.2");
|
||||
}
|
||||
}
|
||||
if (result.eof) break;
|
||||
}
|
||||
CpuFeatures_CloseFile(fd);
|
||||
}
|
||||
#elif defined(CPU_FEATURES_OS_LINUX_OR_ANDROID)
|
||||
// Handling Linux platform through /proc/cpuinfo.
|
||||
const int fd = CpuFeatures_OpenFile("/proc/cpuinfo");
|
||||
|
Reference in New Issue
Block a user