| Index: src/trusted/platform_qualify/arch/x86/vcpuid.c
|
| diff --git a/src/trusted/platform_qualify/arch/x86/vcpuid.c b/src/trusted/platform_qualify/arch/x86/vcpuid.c
|
| index 9d123062bbedd88c67bd8fa76ee27f8f7b592002..b7258e1977c5c6750b901f0f6a1ac729e0bae56c 100644
|
| --- a/src/trusted/platform_qualify/arch/x86/vcpuid.c
|
| +++ b/src/trusted/platform_qualify/arch/x86/vcpuid.c
|
| @@ -490,6 +490,12 @@ static int DoTest(int (*thetest)(void), const char *s) {
|
| # error Please specify platform as NACL_LINUX, NACL_OSX or NACL_WINDOWS
|
| #endif
|
|
|
| +#if NACL_WINDOWS && (NACL_BUILD_SUBARCH == 64)
|
| +static int CheckCPUFeatureDetection(NaClCPUFeaturesX86* cpuf) {
|
| + /* Unfortunately the asm_ tests will not work on 64-bit Windows */
|
| + return 0;
|
| +}
|
| +#else
|
| static int DoCPUFeatureTest(NaClCPUFeaturesX86 *features,
|
| NaClCPUFeatureX86ID id,
|
| int (*thetest)(void)) {
|
| @@ -499,12 +505,52 @@ static int DoCPUFeatureTest(NaClCPUFeaturesX86 *features,
|
| return 0;
|
| }
|
|
|
| +/*
|
| + * Check if CPU feature detection is self-consistent.
|
| + * Returns 0 on success and non-0 else.
|
| + */
|
| +static int CheckCPUFeatureDetection(NaClCPUFeaturesX86* cpuf) {
|
| + int rcode = 0;
|
| + rcode |= DoCPUFeatureTest(cpuf, NaClCPUFeatureX86_x87, asm_HasX87);
|
| + rcode |= DoCPUFeatureTest(cpuf, NaClCPUFeatureX86_MMX, asm_HasMMX);
|
| + rcode |= DoCPUFeatureTest(cpuf, NaClCPUFeatureX86_SSE, asm_HasSSE);
|
| + rcode |= DoCPUFeatureTest(cpuf, NaClCPUFeatureX86_SSE2, asm_HasSSE2);
|
| + rcode |= DoCPUFeatureTest(cpuf, NaClCPUFeatureX86_3DNOW, asm_Has3DNow);
|
| + rcode |= DoCPUFeatureTest(cpuf, NaClCPUFeatureX86_SSE3, asm_HasSSE3);
|
| + rcode |= DoCPUFeatureTest(cpuf, NaClCPUFeatureX86_SSSE3, asm_HasSSSE3);
|
| + rcode |= DoCPUFeatureTest(cpuf, NaClCPUFeatureX86_SSE41, asm_HasSSE41);
|
| + rcode |= DoCPUFeatureTest(cpuf, NaClCPUFeatureX86_SSE42, asm_HasSSE42);
|
| + rcode |= DoCPUFeatureTest(cpuf, NaClCPUFeatureX86_POPCNT, asm_HasPOPCNT);
|
| + rcode |= DoCPUFeatureTest(cpuf, NaClCPUFeatureX86_CMOV, asm_HasCMOV);
|
| + rcode |= DoCPUFeatureTest(cpuf, NaClCPUFeatureX86_TSC, asm_HasTSC);
|
| +
|
| +#define TEST_NEGATIVE_CASE 0
|
| +#if TEST_NEGATIVE_CASE
|
| + printf("TESTING: simulating invalid CPUID implementation\n");
|
| + rcode |= DoTest(asm_HasSSSE3, "SSSE3");
|
| + rcode |= DoTest(asm_HasSSE41, "SSE41");
|
| + rcode |= DoTest(asm_HasSSE42, "SSE42");
|
| + rcode |= DoTest(asm_HasPOPCNT, "POPCNT");
|
| + rcode |= DoTest(asm_HasCMOV, "CMOV");
|
| +#endif
|
| + /*
|
| + * TODO(brad): implement the rest of these tests
|
| + * rcode |= DoCPUFeatureTest(&cpuf, NaClCPUFeatureX86_CX8, asm_HasCX8);
|
| + * rcode |= DoCPUFeatureTest(&cpuf, NaClCPUFeatureX86_CX16, asm_HasCX16);
|
| + * DoTest(asm_HasSSE4a, "SSE4a");
|
| + * DoTest(asm_HasEMMX, "EMMX");
|
| + * DoTest(asm_HasE3DNow, "E3DNow");
|
| + * what about LZCNT?
|
| + */
|
| + return rcode;
|
| +}
|
| +#endif /* 64-bit Windows */
|
| +
|
| static void PrintFail(const char *why) {
|
| fprintf(stderr, "ERROR: %s.\n", why);
|
| fprintf(stderr, "Google Native Client cannot continue.\n");
|
| }
|
|
|
| -#define TEST_NEGATIVE_CASE 0
|
| int CPUIDImplIsValid(void) {
|
| NaClCPUFeaturesX86 cpuf;
|
| NaClGetCurrentCPUFeaturesX86((NaClCPUFeatures *) &cpuf);
|
| @@ -517,47 +563,10 @@ int CPUIDImplIsValid(void) {
|
| PrintFail("CPU not supported");
|
| return 0;
|
| }
|
| -
|
| - /* Unfortunately the asm_ tests will not work on 64-bit Windows */
|
| -#if !(NACL_WINDOWS && (NACL_BUILD_SUBARCH == 64))
|
| - {
|
| - int rcode = 0;
|
| - rcode |= DoCPUFeatureTest(&cpuf, NaClCPUFeatureX86_x87, asm_HasX87);
|
| - rcode |= DoCPUFeatureTest(&cpuf, NaClCPUFeatureX86_MMX, asm_HasMMX);
|
| - rcode |= DoCPUFeatureTest(&cpuf, NaClCPUFeatureX86_SSE, asm_HasSSE);
|
| - rcode |= DoCPUFeatureTest(&cpuf, NaClCPUFeatureX86_SSE2, asm_HasSSE2);
|
| - rcode |= DoCPUFeatureTest(&cpuf, NaClCPUFeatureX86_3DNOW, asm_Has3DNow);
|
| - rcode |= DoCPUFeatureTest(&cpuf, NaClCPUFeatureX86_SSE3, asm_HasSSE3);
|
| - rcode |= DoCPUFeatureTest(&cpuf, NaClCPUFeatureX86_SSSE3, asm_HasSSSE3);
|
| - rcode |= DoCPUFeatureTest(&cpuf, NaClCPUFeatureX86_SSE41, asm_HasSSE41);
|
| - rcode |= DoCPUFeatureTest(&cpuf, NaClCPUFeatureX86_SSE42, asm_HasSSE42);
|
| - rcode |= DoCPUFeatureTest(&cpuf, NaClCPUFeatureX86_POPCNT, asm_HasPOPCNT);
|
| - rcode |= DoCPUFeatureTest(&cpuf, NaClCPUFeatureX86_CMOV, asm_HasCMOV);
|
| - rcode |= DoCPUFeatureTest(&cpuf, NaClCPUFeatureX86_TSC, asm_HasTSC);
|
| -
|
| -#if TEST_NEGATIVE_CASE
|
| - printf("TESTING: simulating invalid CPUID implementation\n");
|
| - rcode |= DoTest(asm_HasSSSE3, "SSSE3");
|
| - rcode |= DoTest(asm_HasSSE41, "SSE41");
|
| - rcode |= DoTest(asm_HasSSE42, "SSE42");
|
| - rcode |= DoTest(asm_HasPOPCNT, "POPCNT");
|
| - rcode |= DoTest(asm_HasCMOV, "CMOV");
|
| -#endif
|
| - /*
|
| - * TODO(brad): implement the rest of these tests
|
| - * rcode |= DoCPUFeatureTest(&cpuf, NaClCPUFeatureX86_CX8, asm_HasCX8);
|
| - * rcode |= DoCPUFeatureTest(&cpuf, NaClCPUFeatureX86_CX16, asm_HasCX16);
|
| - * DoTest(asm_HasSSE4a, "SSE4a");
|
| - * DoTest(asm_HasEMMX, "EMMX");
|
| - * DoTest(asm_HasE3DNow, "E3DNow");
|
| - * what about LZCNT?
|
| - */
|
| - if (rcode != 0) {
|
| - PrintFail("CPUID not implemented correctly.");
|
| - return 0;
|
| - }
|
| + if (CheckCPUFeatureDetection(&cpuf) != 0) {
|
| + PrintFail("CPUID not implemented correctly.");
|
| + return 0;
|
| }
|
| -#endif /* 64-bit Windows */
|
|
|
| printf("[CPUID implementation looks okay]\n");
|
| return 1;
|
|
|