aboutsummaryrefslogtreecommitdiff
path: root/src/cpuinfo_ppc.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/cpuinfo_ppc.c')
-rw-r--r--src/cpuinfo_ppc.c249
1 files changed, 185 insertions, 64 deletions
diff --git a/src/cpuinfo_ppc.c b/src/cpuinfo_ppc.c
index 24401f9..d6c49f8 100644
--- a/src/cpuinfo_ppc.c
+++ b/src/cpuinfo_ppc.c
@@ -12,69 +12,105 @@
// See the License for the specific language governing permissions and
// limitations under the License.
-#include "cpuinfo_ppc.h"
-
#include <assert.h>
#include <stdbool.h>
#include <string.h>
+#include "cpuinfo_ppc.h"
#include "internal/bit_utils.h"
#include "internal/filesystem.h"
#include "internal/stack_line_reader.h"
#include "internal/string_view.h"
+#include "internal/unix_features_aggregator.h"
+
+DECLARE_SETTER(PPCFeatures, ppc32)
+DECLARE_SETTER(PPCFeatures, ppc64)
+DECLARE_SETTER(PPCFeatures, ppc601)
+DECLARE_SETTER(PPCFeatures, altivec)
+DECLARE_SETTER(PPCFeatures, fpu)
+DECLARE_SETTER(PPCFeatures, mmu)
+DECLARE_SETTER(PPCFeatures, mac_4xx)
+DECLARE_SETTER(PPCFeatures, unifiedcache)
+DECLARE_SETTER(PPCFeatures, spe)
+DECLARE_SETTER(PPCFeatures, efpsingle)
+DECLARE_SETTER(PPCFeatures, efpdouble)
+DECLARE_SETTER(PPCFeatures, no_tb)
+DECLARE_SETTER(PPCFeatures, power4)
+DECLARE_SETTER(PPCFeatures, power5)
+DECLARE_SETTER(PPCFeatures, power5plus)
+DECLARE_SETTER(PPCFeatures, cell)
+DECLARE_SETTER(PPCFeatures, booke)
+DECLARE_SETTER(PPCFeatures, smt)
+DECLARE_SETTER(PPCFeatures, icachesnoop)
+DECLARE_SETTER(PPCFeatures, arch205)
+DECLARE_SETTER(PPCFeatures, pa6t)
+DECLARE_SETTER(PPCFeatures, dfp)
+DECLARE_SETTER(PPCFeatures, power6ext)
+DECLARE_SETTER(PPCFeatures, arch206)
+DECLARE_SETTER(PPCFeatures, vsx)
+DECLARE_SETTER(PPCFeatures, pseries_perfmon_compat)
+DECLARE_SETTER(PPCFeatures, truele)
+DECLARE_SETTER(PPCFeatures, ppcle)
+DECLARE_SETTER(PPCFeatures, arch207)
+DECLARE_SETTER(PPCFeatures, htm)
+DECLARE_SETTER(PPCFeatures, dscr)
+DECLARE_SETTER(PPCFeatures, ebb)
+DECLARE_SETTER(PPCFeatures, isel)
+DECLARE_SETTER(PPCFeatures, tar)
+DECLARE_SETTER(PPCFeatures, vcrypto)
+DECLARE_SETTER(PPCFeatures, htm_nosc)
+DECLARE_SETTER(PPCFeatures, arch300)
+DECLARE_SETTER(PPCFeatures, ieee128)
+DECLARE_SETTER(PPCFeatures, darn)
+DECLARE_SETTER(PPCFeatures, scv)
+DECLARE_SETTER(PPCFeatures, htm_no_suspend)
-// Generation of feature's getters/setters functions and kGetters, kSetters,
-// kCpuInfoFlags and kHardwareCapabilities global tables.
-#define DEFINE_TABLE_FEATURES \
- FEATURE(PPC_32, ppc32, "ppc32", PPC_FEATURE_32, 0) \
- FEATURE(PPC_64, ppc64, "ppc64", PPC_FEATURE_64, 0) \
- FEATURE(PPC_601_INSTR, ppc601, "ppc601", PPC_FEATURE_601_INSTR, 0) \
- FEATURE(PPC_HAS_ALTIVEC, altivec, "altivec", PPC_FEATURE_HAS_ALTIVEC, 0) \
- FEATURE(PPC_HAS_FPU, fpu, "fpu", PPC_FEATURE_HAS_FPU, 0) \
- FEATURE(PPC_HAS_MMU, mmu, "mmu", PPC_FEATURE_HAS_MMU, 0) \
- FEATURE(PPC_HAS_4xxMAC, mac_4xx, "4xxmac", PPC_FEATURE_HAS_4xxMAC, 0) \
- FEATURE(PPC_UNIFIED_CACHE, unifiedcache, "ucache", \
- PPC_FEATURE_UNIFIED_CACHE, 0) \
- FEATURE(PPC_HAS_SPE, spe, "spe", PPC_FEATURE_HAS_SPE, 0) \
- FEATURE(PPC_HAS_EFP_SINGLE, efpsingle, "efpsingle", \
- PPC_FEATURE_HAS_EFP_SINGLE, 0) \
- FEATURE(PPC_HAS_EFP_DOUBLE, efpdouble, "efpdouble", \
- PPC_FEATURE_HAS_EFP_DOUBLE, 0) \
- FEATURE(PPC_NO_TB, no_tb, "notb", PPC_FEATURE_NO_TB, 0) \
- FEATURE(PPC_POWER4, power4, "power4", PPC_FEATURE_POWER4, 0) \
- FEATURE(PPC_POWER5, power5, "power5", PPC_FEATURE_POWER5, 0) \
- FEATURE(PPC_POWER5_PLUS, power5plus, "power5+", PPC_FEATURE_POWER5_PLUS, 0) \
- FEATURE(PPC_CELL, cell, "cellbe", PPC_FEATURE_CELL, 0) \
- FEATURE(PPC_BOOKE, booke, "booke", PPC_FEATURE_BOOKE, 0) \
- FEATURE(PPC_SMT, smt, "smt", PPC_FEATURE_SMT, 0) \
- FEATURE(PPC_ICACHE_SNOOP, icachesnoop, "ic_snoop", PPC_FEATURE_ICACHE_SNOOP, \
- 0) \
- FEATURE(PPC_ARCH_2_05, arch205, "arch_2_05", PPC_FEATURE_ARCH_2_05, 0) \
- FEATURE(PPC_PA6T, pa6t, "pa6t", PPC_FEATURE_PA6T, 0) \
- FEATURE(PPC_HAS_DFP, dfp, "dfp", PPC_FEATURE_HAS_DFP, 0) \
- FEATURE(PPC_POWER6_EXT, power6ext, "power6x", PPC_FEATURE_POWER6_EXT, 0) \
- FEATURE(PPC_ARCH_2_06, arch206, "arch_2_06", PPC_FEATURE_ARCH_2_06, 0) \
- FEATURE(PPC_HAS_VSX, vsx, "vsx", PPC_FEATURE_HAS_VSX, 0) \
- FEATURE(PPC_PSERIES_PERFMON_COMPAT, pseries_perfmon_compat, "archpmu", \
- PPC_FEATURE_PSERIES_PERFMON_COMPAT, 0) \
- FEATURE(PPC_TRUE_LE, truele, "true_le", PPC_FEATURE_TRUE_LE, 0) \
- FEATURE(PPC_PPC_LE, ppcle, "ppcle", PPC_FEATURE_PPC_LE, 0) \
- FEATURE(PPC_ARCH_2_07, arch207, "arch_2_07", 0, PPC_FEATURE2_ARCH_2_07) \
- FEATURE(PPC_HTM, htm, "htm", 0, PPC_FEATURE2_HTM) \
- FEATURE(PPC_DSCR, dscr, "dscr", 0, PPC_FEATURE2_DSCR) \
- FEATURE(PPC_EBB, ebb, "ebb", 0, PPC_FEATURE2_EBB) \
- FEATURE(PPC_ISEL, isel, "isel", 0, PPC_FEATURE2_ISEL) \
- FEATURE(PPC_TAR, tar, "tar", 0, PPC_FEATURE2_TAR) \
- FEATURE(PPC_VEC_CRYPTO, vcrypto, "vcrypto", 0, PPC_FEATURE2_VEC_CRYPTO) \
- FEATURE(PPC_HTM_NOSC, htm_nosc, "htm-nosc", 0, PPC_FEATURE2_HTM_NOSC) \
- FEATURE(PPC_ARCH_3_00, arch300, "arch_3_00", 0, PPC_FEATURE2_ARCH_3_00) \
- FEATURE(PPC_HAS_IEEE128, ieee128, "ieee128", 0, PPC_FEATURE2_HAS_IEEE128) \
- FEATURE(PPC_DARN, darn, "darn", 0, PPC_FEATURE2_DARN) \
- FEATURE(PPC_SCV, scv, "scv", 0, PPC_FEATURE2_SCV) \
- FEATURE(PPC_HTM_NO_SUSPEND, htm_no_suspend, "htm-no-suspend", 0, \
- PPC_FEATURE2_HTM_NO_SUSPEND)
-#define DEFINE_TABLE_FEATURE_TYPE PPCFeatures
-#include "define_tables.h"
+static const CapabilityConfig kConfigs[] = {
+ [PPC_32] = {{PPC_FEATURE_32, 0}, "ppc32", &set_ppc32},
+ [PPC_64] = {{PPC_FEATURE_64, 0}, "ppc64", &set_ppc64},
+ [PPC_601_INSTR] = {{PPC_FEATURE_601_INSTR, 0}, "ppc601", &set_ppc601},
+ [PPC_HAS_ALTIVEC] = {{PPC_FEATURE_HAS_ALTIVEC, 0}, "altivec", &set_altivec},
+ [PPC_HAS_FPU] = {{PPC_FEATURE_HAS_FPU, 0}, "fpu", &set_fpu},
+ [PPC_HAS_MMU] = {{PPC_FEATURE_HAS_MMU, 0}, "mmu", &set_mmu},
+ [PPC_HAS_4xxMAC] = {{PPC_FEATURE_HAS_4xxMAC, 0}, "4xxmac", &set_mac_4xx},
+ [PPC_UNIFIED_CACHE] = {{PPC_FEATURE_UNIFIED_CACHE, 0}, "ucache", &set_unifiedcache},
+ [PPC_HAS_SPE] = {{PPC_FEATURE_HAS_SPE, 0}, "spe", &set_spe},
+ [PPC_HAS_EFP_SINGLE] = {{PPC_FEATURE_HAS_EFP_SINGLE, 0}, "efpsingle", &set_efpsingle},
+ [PPC_HAS_EFP_DOUBLE] = {{PPC_FEATURE_HAS_EFP_DOUBLE, 0}, "efpdouble", &set_efpdouble},
+ [PPC_NO_TB] = {{PPC_FEATURE_NO_TB, 0}, "notb", &set_no_tb},
+ [PPC_POWER4] = {{PPC_FEATURE_POWER4, 0}, "power4", &set_power4},
+ [PPC_POWER5] = {{PPC_FEATURE_POWER5, 0}, "power5", &set_power5},
+ [PPC_POWER5_PLUS] = {{PPC_FEATURE_POWER5_PLUS, 0}, "power5+", &set_power5plus},
+ [PPC_CELL] = {{PPC_FEATURE_CELL, 0}, "cellbe", &set_cell},
+ [PPC_BOOKE] = {{PPC_FEATURE_BOOKE, 0}, "booke", &set_booke},
+ [PPC_SMT] = {{PPC_FEATURE_SMT, 0}, "smt", &set_smt},
+ [PPC_ICACHE_SNOOP] = {{PPC_FEATURE_ICACHE_SNOOP, 0}, "ic_snoop", &set_icachesnoop},
+ [PPC_ARCH_2_05] = {{PPC_FEATURE_ARCH_2_05, 0}, "arch_2_05", &set_arch205},
+ [PPC_PA6T] = {{PPC_FEATURE_PA6T, 0}, "pa6t", &set_pa6t},
+ [PPC_HAS_DFP] = {{PPC_FEATURE_HAS_DFP, 0}, "dfp", &set_dfp},
+ [PPC_POWER6_EXT] = {{PPC_FEATURE_POWER6_EXT, 0}, "power6x", &set_power6ext},
+ [PPC_ARCH_2_06] = {{PPC_FEATURE_ARCH_2_06, 0}, "arch_2_06", &set_arch206},
+ [PPC_HAS_VSX] = {{PPC_FEATURE_HAS_VSX, 0}, "vsx", &set_vsx},
+ [PPC_PSERIES_PERFMON_COMPAT] = {{PPC_FEATURE_PSERIES_PERFMON_COMPAT, 0},
+ "archpmu",
+ &set_pseries_perfmon_compat},
+ [PPC_TRUE_LE] = {{PPC_FEATURE_TRUE_LE, 0}, "true_le", &set_truele},
+ [PPC_PPC_LE] = {{PPC_FEATURE_PPC_LE, 0}, "ppcle", &set_ppcle},
+ [PPC_ARCH_2_07] = {{0, PPC_FEATURE2_ARCH_2_07}, "arch_2_07", &set_arch207},
+ [PPC_HTM] = {{0, PPC_FEATURE2_HTM}, "htm", &set_htm},
+ [PPC_DSCR] = {{0, PPC_FEATURE2_DSCR}, "dscr", &set_dscr},
+ [PPC_EBB] = {{0, PPC_FEATURE2_EBB}, "ebb", &set_ebb},
+ [PPC_ISEL] = {{0, PPC_FEATURE2_ISEL}, "isel", &set_isel},
+ [PPC_TAR] = {{0, PPC_FEATURE2_TAR}, "tar", &set_tar},
+ [PPC_VEC_CRYPTO] = {{0, PPC_FEATURE2_VEC_CRYPTO}, "vcrypto", &set_vcrypto},
+ [PPC_HTM_NOSC] = {{0, PPC_FEATURE2_HTM_NOSC}, "htm-nosc", &set_htm_nosc},
+ [PPC_ARCH_3_00] = {{0, PPC_FEATURE2_ARCH_3_00}, "arch_3_00", &set_arch300},
+ [PPC_HAS_IEEE128] = {{0, PPC_FEATURE2_HAS_IEEE128}, "ieee128", &set_ieee128},
+ [PPC_DARN] = {{0, PPC_FEATURE2_DARN}, "darn", &set_darn},
+ [PPC_SCV] = {{0, PPC_FEATURE2_SCV}, "scv", &set_scv},
+ [PPC_HTM_NO_SUSPEND] = {{0, PPC_FEATURE2_HTM_NO_SUSPEND}, "htm-no-suspend", &set_htm_no_suspend},
+};
+static const size_t kConfigsSize = sizeof(kConfigs) / sizeof(CapabilityConfig);
static bool HandlePPCLine(const LineResult result,
PPCPlatformStrings* const strings) {
@@ -120,12 +156,10 @@ PPCInfo GetPPCInfo(void) {
* the auxilary vector.
*/
PPCInfo info = kEmptyPPCInfo;
- const HardwareCapabilities hwcaps = CpuFeatures_GetHardwareCapabilities();
- for (size_t i = 0; i < PPC_LAST_; ++i) {
- if (CpuFeatures_IsHwCapsSet(kHardwareCapabilities[i], hwcaps)) {
- kSetters[i](&info.features, true);
- }
- }
+
+ CpuFeatures_OverrideFromHwCaps(kConfigsSize, kConfigs,
+ CpuFeatures_GetHardwareCapabilities(),
+ &info.features);
return info;
}
@@ -144,11 +178,98 @@ PPCPlatformStrings GetPPCPlatformStrings(void) {
int GetPPCFeaturesEnumValue(const PPCFeatures* features,
PPCFeaturesEnum value) {
- if (value >= PPC_LAST_) return false;
- return kGetters[value](features);
+ switch (value) {
+ case PPC_32:
+ return features->ppc32;
+ case PPC_64:
+ return features->ppc64;
+ case PPC_601_INSTR:
+ return features->ppc601;
+ case PPC_HAS_ALTIVEC:
+ return features->altivec;
+ case PPC_HAS_FPU:
+ return features->fpu;
+ case PPC_HAS_MMU:
+ return features->mmu;
+ case PPC_HAS_4xxMAC:
+ return features->mac_4xx;
+ case PPC_UNIFIED_CACHE:
+ return features->unifiedcache;
+ case PPC_HAS_SPE:
+ return features->spe;
+ case PPC_HAS_EFP_SINGLE:
+ return features->efpsingle;
+ case PPC_HAS_EFP_DOUBLE:
+ return features->efpdouble;
+ case PPC_NO_TB:
+ return features->no_tb;
+ case PPC_POWER4:
+ return features->power4;
+ case PPC_POWER5:
+ return features->power5;
+ case PPC_POWER5_PLUS:
+ return features->power5plus;
+ case PPC_CELL:
+ return features->cell;
+ case PPC_BOOKE:
+ return features->booke;
+ case PPC_SMT:
+ return features->smt;
+ case PPC_ICACHE_SNOOP:
+ return features->icachesnoop;
+ case PPC_ARCH_2_05:
+ return features->arch205;
+ case PPC_PA6T:
+ return features->pa6t;
+ case PPC_HAS_DFP:
+ return features->dfp;
+ case PPC_POWER6_EXT:
+ return features->power6ext;
+ case PPC_ARCH_2_06:
+ return features->arch206;
+ case PPC_HAS_VSX:
+ return features->vsx;
+ case PPC_PSERIES_PERFMON_COMPAT:
+ return features->pseries_perfmon_compat;
+ case PPC_TRUE_LE:
+ return features->truele;
+ case PPC_PPC_LE:
+ return features->ppcle;
+ case PPC_ARCH_2_07:
+ return features->arch207;
+ case PPC_HTM:
+ return features->htm;
+ case PPC_DSCR:
+ return features->dscr;
+ case PPC_EBB:
+ return features->ebb;
+ case PPC_ISEL:
+ return features->isel;
+ case PPC_TAR:
+ return features->tar;
+ case PPC_VEC_CRYPTO:
+ return features->vcrypto;
+ case PPC_HTM_NOSC:
+ return features->htm_nosc;
+ case PPC_ARCH_3_00:
+ return features->arch300;
+ case PPC_HAS_IEEE128:
+ return features->ieee128;
+ case PPC_DARN:
+ return features->darn;
+ case PPC_SCV:
+ return features->scv;
+ case PPC_HTM_NO_SUSPEND:
+ return features->htm_no_suspend;
+ case PPC_LAST_:
+ break;
+ }
+ return false;
}
+/* Have used the same names as glibc */
const char* GetPPCFeaturesEnumName(PPCFeaturesEnum value) {
- if (value >= PPC_LAST_) return "unknown feature";
- return kCpuInfoFlags[value];
+ if(value >= kConfigsSize)
+ return "unknown feature";
+ return kConfigs[value].proc_cpuinfo_flag;
}