2017-12-21 07:45:38 +08:00
|
|
|
/*
|
2023-11-08 23:15:17 +08:00
|
|
|
* Copyright (C) 2018-2023 Intel Corporation
|
2017-12-21 07:45:38 +08:00
|
|
|
*
|
2018-09-26 03:44:36 +08:00
|
|
|
* SPDX-License-Identifier: MIT
|
2017-12-21 07:45:38 +08:00
|
|
|
*
|
|
|
|
*/
|
|
|
|
|
|
|
|
#pragma once
|
2020-06-05 23:26:41 +08:00
|
|
|
#include "shared/source/helpers/constants.h"
|
2020-10-15 20:09:25 +08:00
|
|
|
|
2017-12-21 07:45:38 +08:00
|
|
|
#include <cstdint>
|
2021-01-11 19:18:44 +08:00
|
|
|
#include <string>
|
2017-12-21 07:45:38 +08:00
|
|
|
|
2018-09-26 03:44:36 +08:00
|
|
|
#ifndef BIT
|
2017-12-21 07:45:38 +08:00
|
|
|
#define BIT(x) (1ull << (x))
|
2018-09-26 03:44:36 +08:00
|
|
|
#endif
|
2017-12-21 07:45:38 +08:00
|
|
|
|
2019-03-26 18:59:46 +08:00
|
|
|
namespace NEO {
|
2017-12-21 07:45:38 +08:00
|
|
|
struct CpuInfo {
|
|
|
|
static const uint64_t featureNone = 0x000000000ULL;
|
2023-12-12 19:58:56 +08:00
|
|
|
static const uint64_t featureWaitPkg = 0x000000001ULL;
|
2017-12-21 07:45:38 +08:00
|
|
|
static const uint64_t featureAvX2 = 0x000800000ULL;
|
2022-03-29 00:30:45 +08:00
|
|
|
static const uint64_t featureNeon = 0x001000000ULL;
|
2019-08-01 09:43:05 +08:00
|
|
|
static const uint64_t featureClflush = 0x2000000000ULL;
|
2017-12-21 07:45:38 +08:00
|
|
|
|
|
|
|
CpuInfo() : features(featureNone) {
|
|
|
|
}
|
|
|
|
|
|
|
|
void cpuid(
|
|
|
|
uint32_t cpuInfo[4],
|
|
|
|
uint32_t functionId) const;
|
|
|
|
|
|
|
|
void cpuidex(
|
|
|
|
uint32_t cpuInfo[4],
|
|
|
|
uint32_t functionId,
|
|
|
|
uint32_t subfunctionId) const;
|
|
|
|
|
2021-10-14 20:41:00 +08:00
|
|
|
void detect() const;
|
2017-12-21 07:45:38 +08:00
|
|
|
|
|
|
|
bool isFeatureSupported(uint64_t feature) const {
|
|
|
|
if (features == featureNone) {
|
|
|
|
detect();
|
|
|
|
}
|
|
|
|
|
|
|
|
return (features & feature) == feature;
|
|
|
|
}
|
|
|
|
|
2020-06-05 23:26:41 +08:00
|
|
|
uint32_t getVirtualAddressSize() const {
|
|
|
|
if (features == featureNone) {
|
|
|
|
detect();
|
|
|
|
}
|
|
|
|
|
|
|
|
return virtualAddressSize;
|
|
|
|
}
|
|
|
|
|
2021-01-11 19:18:44 +08:00
|
|
|
bool isCpuFlagPresent(const char *cpuFlag) const {
|
|
|
|
if (cpuFlags.empty()) {
|
|
|
|
getCpuFlagsFunc(cpuFlags);
|
|
|
|
}
|
|
|
|
|
|
|
|
return cpuFlags.find(cpuFlag) != std::string::npos;
|
|
|
|
}
|
|
|
|
|
2017-12-21 07:45:38 +08:00
|
|
|
static const CpuInfo &getInstance() {
|
|
|
|
return instance;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void (*cpuidexFunc)(int *, int, int);
|
2023-11-08 23:15:17 +08:00
|
|
|
static void (*cpuidFunc)(int *, int);
|
2021-01-11 19:18:44 +08:00
|
|
|
static void (*getCpuFlagsFunc)(std::string &);
|
2017-12-21 07:45:38 +08:00
|
|
|
|
|
|
|
protected:
|
|
|
|
mutable uint64_t features;
|
2020-06-05 23:26:41 +08:00
|
|
|
mutable uint32_t virtualAddressSize = is32bit ? 32 : 48;
|
2021-01-11 19:18:44 +08:00
|
|
|
mutable std::string cpuFlags;
|
2017-12-21 07:45:38 +08:00
|
|
|
static const CpuInfo instance;
|
|
|
|
};
|
|
|
|
|
2019-03-26 18:59:46 +08:00
|
|
|
} // namespace NEO
|