diff --git a/compel/arch/aarch64/src/lib/cpu.c b/compel/arch/aarch64/src/lib/cpu.c index 30263b377..fca699403 100644 --- a/compel/arch/aarch64/src/lib/cpu.c +++ b/compel/arch/aarch64/src/lib/cpu.c @@ -26,3 +26,21 @@ bool compel_cpu_has_feature(unsigned int feature) } return compel_test_cpu_cap(&rt_info, feature); } + +void compel_cpu_clear_feature(unsigned int feature) +{ + if (!rt_info_done) { + compel_cpuid(&rt_info); + rt_info_done = true; + } + return compel_clear_cpu_cap(&rt_info, feature); +} + +void compel_cpu_copy_cpuinfo(compel_cpuinfo_t *c) +{ + if (!rt_info_done) { + compel_cpuid(&rt_info); + rt_info_done = true; + } + memcpy(c, &rt_info, sizeof(rt_info)); +} diff --git a/compel/arch/arm/src/lib/cpu.c b/compel/arch/arm/src/lib/cpu.c index 30263b377..fca699403 100644 --- a/compel/arch/arm/src/lib/cpu.c +++ b/compel/arch/arm/src/lib/cpu.c @@ -26,3 +26,21 @@ bool compel_cpu_has_feature(unsigned int feature) } return compel_test_cpu_cap(&rt_info, feature); } + +void compel_cpu_clear_feature(unsigned int feature) +{ + if (!rt_info_done) { + compel_cpuid(&rt_info); + rt_info_done = true; + } + return compel_clear_cpu_cap(&rt_info, feature); +} + +void compel_cpu_copy_cpuinfo(compel_cpuinfo_t *c) +{ + if (!rt_info_done) { + compel_cpuid(&rt_info); + rt_info_done = true; + } + memcpy(c, &rt_info, sizeof(rt_info)); +} diff --git a/compel/arch/ppc64/src/lib/cpu.c b/compel/arch/ppc64/src/lib/cpu.c index 24c3c0cc6..0a7adcb0b 100644 --- a/compel/arch/ppc64/src/lib/cpu.c +++ b/compel/arch/ppc64/src/lib/cpu.c @@ -40,3 +40,21 @@ bool compel_cpu_has_feature(unsigned int feature) } return compel_test_cpu_cap(&rt_info, feature); } + +void compel_cpu_clear_feature(unsigned int feature) +{ + if (!rt_info_done) { + compel_cpuid(&rt_info); + rt_info_done = true; + } + return compel_clear_cpu_cap(&rt_info, feature); +} + +void compel_cpu_copy_cpuinfo(compel_cpuinfo_t *c) +{ + if (!rt_info_done) { + compel_cpuid(&rt_info); + rt_info_done = true; + } + memcpy(c, &rt_info, sizeof(rt_info)); +} diff --git a/compel/arch/s390/src/lib/cpu.c b/compel/arch/s390/src/lib/cpu.c index b5c066c90..3f38f118d 100644 --- a/compel/arch/s390/src/lib/cpu.c +++ b/compel/arch/s390/src/lib/cpu.c @@ -40,3 +40,21 @@ bool cpu_has_feature(unsigned int feature) } return compel_test_cpu_cap(&rt_info, feature); } + +void compel_cpu_clear_feature(unsigned int feature) +{ + if (!rt_info_done) { + compel_cpuid(&rt_info); + rt_info_done = true; + } + return compel_clear_cpu_cap(&rt_info, feature); +} + +void compel_cpu_copy_cpuinfo(compel_cpuinfo_t *c) +{ + if (!rt_info_done) { + compel_cpuid(&rt_info); + rt_info_done = true; + } + memcpy(c, &rt_info, sizeof(rt_info)); +} diff --git a/compel/arch/x86/src/lib/cpu.c b/compel/arch/x86/src/lib/cpu.c index f8d5e1ba3..93e430fac 100644 --- a/compel/arch/x86/src/lib/cpu.c +++ b/compel/arch/x86/src/lib/cpu.c @@ -233,3 +233,21 @@ bool compel_cpu_has_feature(unsigned int feature) } return compel_test_cpu_cap(&rt_info, feature); } + +void compel_cpu_clear_feature(unsigned int feature) +{ + if (!rt_info_done) { + compel_cpuid(&rt_info); + rt_info_done = true; + } + return compel_clear_cpu_cap(&rt_info, feature); +} + +void compel_cpu_copy_cpuinfo(compel_cpuinfo_t *c) +{ + if (!rt_info_done) { + compel_cpuid(&rt_info); + rt_info_done = true; + } + memcpy(c, &rt_info, sizeof(rt_info)); +} diff --git a/compel/include/uapi/cpu.h b/compel/include/uapi/cpu.h index 4268b6c4f..379959585 100644 --- a/compel/include/uapi/cpu.h +++ b/compel/include/uapi/cpu.h @@ -7,5 +7,7 @@ extern int compel_cpuid(compel_cpuinfo_t *info); extern bool compel_cpu_has_feature(unsigned int feature); +extern void compel_cpu_clear_feature(unsigned int feature); +extern void compel_cpu_copy_cpuinfo(compel_cpuinfo_t *c); #endif /* UAPI_COMPEL_CPU_H__ */