aboutsummaryrefslogtreecommitdiffstats
path: root/src/utils
diff options
context:
space:
mode:
authorlloyd <[email protected]>2009-10-06 01:24:05 +0000
committerlloyd <[email protected]>2009-10-06 01:24:05 +0000
commit0e754f618419f586d8e56bd7632328390eff4b55 (patch)
tree6a7d375a3d0785bfe3159b5715d68fd49d6a2016 /src/utils
parent59b4eb0bd2d1b9d65c3921f5205a012f1a98fdf8 (diff)
Clean up cpuid calling
Diffstat (limited to 'src/utils')
-rw-r--r--src/utils/cpuid.cpp58
1 files changed, 26 insertions, 32 deletions
diff --git a/src/utils/cpuid.cpp b/src/utils/cpuid.cpp
index eb50dee98..ae82bdac8 100644
--- a/src/utils/cpuid.cpp
+++ b/src/utils/cpuid.cpp
@@ -10,39 +10,34 @@
#include <botan/loadstor.h>
#include <botan/mem_ops.h>
-#include <stdio.h>
+#if defined(BOTAN_TARGET_ARCH_IS_X86) || defined(BOTAN_TARGET_ARCH_IS_AMD64)
-#if defined(_MSC_VER)
- #include <intrin.h>
-#endif
-
-namespace Botan {
+#if defined(BOTAN_BUILD_COMPILER_IS_MSVC)
-namespace {
-
-void x86_cpuid(u32bit type, u32bit out[4])
- {
- out[0] = out[1] = out[2] = out[3] = 0;
+ #include <intrin.h>
+ #define CALL_CPUID(type, out) do { __cpuid(out, type) } while(0)
-#if defined(BOTAN_BUILD_COMPILER_IS_GCC)
+#elif defined(BOTAN_BUILD_COMPILER_IS_ICC)
-#if defined(BOTAN_TARGET_ARCH_IS_X86)
+ #include <ia32intrin.h>
+ #define CALL_CPUID(type, out) do { __cpuid(out, type) } while(0);
- asm("pushq %%ebx; cpuid; mov %%ebx, %%edi; popq %%ebx"
- : "=a" (out[0]), "=D" (out[1]), "=c" (out[2]), "=d" (out[3])
- : "0" (type));
+#elif defined(BOTAN_BUILD_COMPILER_IS_GCC)
-#elif defined(BOTAN_TARGET_ARCH_IS_AMD64)
+ #include <cpuid.h>
+ #define CALL_CPUID(type, out) \
+ do { __get_cpuid(type, out, out+1, out+2, out+3); } while(0);
- asm("pushq %%rbx; cpuid; mov %%ebx, %%edi; popq %%rbx"
- : "=a" (out[0]), "=D" (out[1]), "=c" (out[2]), "=d" (out[3])
- : "0" (type));
#endif
-#elif defined(BOTAN_BUILD_COMPILER_IS_MSVC)
- __cpuid(out, type);
+#else
+ // In all other cases, just zeroize the supposed cpuid output
+ #define CALL_CPUID(type, out) out[0] = out[1] = out[2] = out[3] = 0;
#endif
- }
+
+namespace Botan {
+
+namespace {
u32bit get_x86_cache_line_size()
{
@@ -50,21 +45,20 @@ u32bit get_x86_cache_line_size()
const u32bit AMD_CPUID[3] = { 0x68747541, 0x444D4163, 0x69746E65 };
u32bit cpuid[4] = { 0 };
- x86_cpuid(0, cpuid);
+ CALL_CPUID(0, cpuid);
- if(same_mem(cpuid + 1, INTEL_CPUID, 3) && cpuid[0] > 2)
+ if(same_mem(cpuid + 1, INTEL_CPUID, 3))
{
- x86_cpuid(1, cpuid);
+ CALL_CPUID(1, cpuid);
return 8 * get_byte(2, cpuid[1]);
}
-
- if(same_mem(cpuid + 1, AMD_CPUID, 3))
+ else if(same_mem(cpuid + 1, AMD_CPUID, 3))
{
- x86_cpuid(0x80000005, cpuid);
+ CALL_CPUID(0x80000005, cpuid);
return get_byte(3, cpuid[2]);
}
-
- return 32; // default cache line guess
+ else
+ return 32; // default cache line guess
}
}
@@ -81,7 +75,7 @@ u64bit CPUID::x86_processor_flags()
return proc_flags;
u32bit cpuid[4] = { 0 };
- x86_cpuid(1, cpuid);
+ CALL_CPUID(1, cpuid);
// Set the FPU bit on to force caching in proc_flags
proc_flags = ((u64bit)cpuid[2] << 32) | cpuid[3] | 1;