| http://code.google.com/p/stressapptest/issues/detail?id=26 |
| |
| --- a/src/os.cc |
| +++ b/src/os.cc |
| @@ -149,7 +149,16 @@ void OsLayer::GetFeatures() { |
| // http://www.sandpile.org/ia32/cpuid.htm |
| int ax, bx, cx, dx; |
| __asm__ __volatile__ ( |
| - "cpuid": "=a" (ax), "=b" (bx), "=c" (cx), "=d" (dx) : "a" (1)); |
| +# if defined(STRESSAPPTEST_CPU_I686) && defined(__PIC__) |
| + "xchg %%ebx, %%esi;" |
| + "cpuid;" |
| + "xchg %%esi, %%ebx;" |
| + : "=S" (bx), |
| +# else |
| + "cpuid;" |
| + : "=b" (bx), |
| +# endif |
| + "=a" (ax), "=c" (cx), "=d" (dx) : "a" (1)); |
| has_clflush_ = (dx >> 19) & 1; |
| has_sse2_ = (dx >> 26) & 1; |
| |
| --- a/src/worker.cc |
| +++ b/src/worker.cc |
| @@ -85,7 +85,17 @@ namespace { |
| inline int apicid(void) { |
| int cpu; |
| #if defined(STRESSAPPTEST_CPU_X86_64) || defined(STRESSAPPTEST_CPU_I686) |
| - __asm __volatile("cpuid" : "=b" (cpu) : "a" (1) : "cx", "dx"); |
| + __asm__ __volatile__ ( |
| +# if defined(STRESSAPPTEST_CPU_I686) && defined(__PIC__) |
| + "xchg %%ebx, %%esi;" |
| + "cpuid;" |
| + "xchg %%esi, %%ebx;" |
| + : "=S" (cpu) |
| +# else |
| + "cpuid;" |
| + : "=b" (cpu) |
| +# endif |
| + : "a" (1) : "cx", "dx"); |
| #elif defined(STRESSAPPTEST_CPU_ARMV7A) |
| #warning "Unsupported CPU type ARMV7A: unable to determine core ID." |
| cpu = 0; |