diff options
Diffstat (limited to 'src/cpuinfo_mips.c')
-rw-r--r-- | src/cpuinfo_mips.c | 52 |
1 files changed, 26 insertions, 26 deletions
diff --git a/src/cpuinfo_mips.c b/src/cpuinfo_mips.c index 0564bb8..83e959f 100644 --- a/src/cpuinfo_mips.c +++ b/src/cpuinfo_mips.c @@ -1,4 +1,4 @@ -// Copyright 2017 Google Inc. +// Copyright 2017 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -14,23 +14,21 @@ #include "cpuinfo_mips.h" +#include <assert.h> + #include "internal/filesystem.h" +#include "internal/hwcaps.h" #include "internal/stack_line_reader.h" #include "internal/string_view.h" -#include "internal/unix_features_aggregator.h" - -#include <assert.h> - -DECLARE_SETTER_AND_GETTER(MipsFeatures, msa) -DECLARE_SETTER_AND_GETTER(MipsFeatures, eva) -DECLARE_SETTER_AND_GETTER(MipsFeatures, r6) -static const CapabilityConfig kConfigs[] = { - [MIPS_MSA] = {{MIPS_HWCAP_MSA, 0}, "msa", &set_msa, &get_msa}, // - [MIPS_EVA] = {{0, 0}, "eva", &set_eva, &get_eva}, // - [MIPS_R6] = {{MIPS_HWCAP_R6, 0}, "r6", &set_r6, &get_r6}, // -}; -static const size_t kConfigsSize = sizeof(kConfigs) / sizeof(CapabilityConfig); +// Generation of feature's getters/setters functions and kGetters, kSetters, +// kCpuInfoFlags and kHardwareCapabilities global tables. +#define DEFINE_TABLE_FEATURES \ + FEATURE(MIPS_MSA, msa, "msa", MIPS_HWCAP_MSA, 0) \ + FEATURE(MIPS_EVA, eva, "eva", 0, 0) \ + FEATURE(MIPS_R6, r6, "r6", MIPS_HWCAP_R6, 0) +#define DEFINE_TABLE_FEATURE_TYPE MipsFeatures +#include "define_tables.h" static bool HandleMipsLine(const LineResult result, MipsFeatures* const features) { @@ -38,7 +36,10 @@ static bool HandleMipsLine(const LineResult result, // See tests for an example. if (CpuFeatures_StringView_GetAttributeKeyValue(result.line, &key, &value)) { if (CpuFeatures_StringView_IsEquals(key, str("ASEs implemented"))) { - CpuFeatures_SetFromFlags(kConfigsSize, kConfigs, value, features); + for (size_t i = 0; i < MIPS_LAST_; ++i) { + kSetters[i](features, + CpuFeatures_StringView_HasWord(value, kCpuInfoFlags[i])); + } } } return !result.eof; @@ -61,17 +62,18 @@ static void FillProcCpuInfoData(MipsFeatures* const features) { static const MipsInfo kEmptyMipsInfo; MipsInfo GetMipsInfo(void) { - assert(kConfigsSize == MIPS_LAST_); - // capabilities are fetched from both getauxval and /proc/cpuinfo so we can // have some information if the executable is sandboxed (aka no access to // /proc/cpuinfo). MipsInfo info = kEmptyMipsInfo; FillProcCpuInfoData(&info.features); - CpuFeatures_OverrideFromHwCaps(kConfigsSize, kConfigs, - CpuFeatures_GetHardwareCapabilities(), - &info.features); + const HardwareCapabilities hwcaps = CpuFeatures_GetHardwareCapabilities(); + for (size_t i = 0; i < MIPS_LAST_; ++i) { + if (CpuFeatures_IsHwCapsSet(kHardwareCapabilities[i], hwcaps)) { + kSetters[i](&info.features, true); + } + } return info; } @@ -80,13 +82,11 @@ MipsInfo GetMipsInfo(void) { int GetMipsFeaturesEnumValue(const MipsFeatures* features, MipsFeaturesEnum value) { - if(value >= kConfigsSize) - return false; - return kConfigs[value].get_bit((MipsFeatures*)features); + if (value >= MIPS_LAST_) return false; + return kGetters[value](features); } const char* GetMipsFeaturesEnumName(MipsFeaturesEnum value) { - if(value >= kConfigsSize) - return "unknown feature"; - return kConfigs[value].proc_cpuinfo_flag; + if (value >= MIPS_LAST_) return "unknown feature"; + return kCpuInfoFlags[value]; } |