Index: src/trusted/validator/x86/ncval_reg_sfi/nc_cpu_checks.c |
diff --git a/src/trusted/validator/x86/ncval_reg_sfi/nc_cpu_checks.c b/src/trusted/validator/x86/ncval_reg_sfi/nc_cpu_checks.c |
deleted file mode 100644 |
index f754c3cc46694f2d79153175f648706f4ed4adde..0000000000000000000000000000000000000000 |
--- a/src/trusted/validator/x86/ncval_reg_sfi/nc_cpu_checks.c |
+++ /dev/null |
@@ -1,179 +0,0 @@ |
-/* |
- * Copyright (c) 2012 The Native Client Authors. All rights reserved. |
- * Use of this source code is governed by a BSD-style license that can be |
- * found in the LICENSE file. |
- */ |
- |
-/* |
- * Checks that CPU ID features match instructions found in executable. |
- */ |
- |
-#include <stdlib.h> |
-#include <string.h> |
- |
-#include "native_client/src/trusted/validator/x86/ncval_reg_sfi/nc_cpu_checks.h" |
- |
-#include "native_client/src/shared/platform/nacl_log.h" |
-#include "native_client/src/trusted/validator/x86/decoder/nc_inst_state.h" |
-#include "native_client/src/trusted/validator/x86/decoder/nc_inst_state_internal.h" |
-#include "native_client/src/trusted/validator/x86/ncval_reg_sfi/ncvalidate_iter.h" |
-#include "native_client/src/trusted/validator/x86/ncval_reg_sfi/ncvalidate_iter_internal.h" |
-#include "native_client/src/trusted/validator/x86/nc_segment.h" |
- |
-#include "native_client/src/trusted/validator/x86/decoder/nc_inst_iter_inl.c" |
- |
-void NaClCpuCheckMemoryInitialize(NaClValidatorState* state) { |
- NaClClearCPUFeaturesX86(&state->cpu_checks.cpu_features); |
- state->cpu_checks.f_CMOV_and_x87 = FALSE; |
- state->cpu_checks.f_MMX_or_SSE2 = FALSE; |
-} |
- |
-/* Helper function to report unsupported features */ |
-static INLINE void NaClCheckFeature(NaClCPUFeatureX86ID feature, |
- struct NaClValidatorState* vstate, |
- Bool* squash_me) { |
- if (!NaClGetCPUFeatureX86(&vstate->cpu_features, feature)) { |
- if (!NaClGetCPUFeatureX86(&vstate->cpu_checks.cpu_features, feature)) { |
- NaClValidatorInstMessage( |
- LOG_WARNING, vstate, vstate->cur_inst_state, |
- "CPU model does not support %s instructions.\n", |
- NaClGetCPUFeatureX86Name(feature)); |
- NaClSetCPUFeatureX86(&vstate->cpu_checks.cpu_features, feature, TRUE); |
- } |
- *squash_me = TRUE; |
- } |
-} |
- |
-void NaClCpuCheck(struct NaClValidatorState* state, |
- struct NaClInstIter* iter) { |
- Bool squash_me = FALSE; |
- switch (state->cur_inst->insttype) { |
- case NACLi_X87: |
- case NACLi_X87_FSINCOS: |
- NaClCheckFeature(NaClCPUFeatureX86_x87, state, &squash_me); |
- break; |
- case NACLi_SFENCE_CLFLUSH: |
- /* TODO(bradchen): distinguish between SFENCE and CLFLUSH */ |
- NaClCheckFeature(NaClCPUFeatureX86_CLFLUSH, state, &squash_me); |
- NaClCheckFeature(NaClCPUFeatureX86_FXSR, state, &squash_me); |
- break; |
- case NACLi_LAHF: |
- if (NACL_ARCH(NACL_BUILD_ARCH) == NACL_x86 && NACL_TARGET_SUBARCH == 64) |
- NaClCheckFeature(NaClCPUFeatureX86_LAHF, state, &squash_me); |
- break; |
- case NACLi_CMPXCHG8B: |
- NaClCheckFeature(NaClCPUFeatureX86_CX8, state, &squash_me); |
- break; |
- case NACLi_CMPXCHG16B: |
- NaClCheckFeature(NaClCPUFeatureX86_CX16, state, &squash_me); |
- break; |
- case NACLi_CMOV: |
- NaClCheckFeature(NaClCPUFeatureX86_CMOV, state, &squash_me); |
- break; |
- case NACLi_FCMOV: |
- if (!(NaClGetCPUFeatureX86(&state->cpu_features, |
- NaClCPUFeatureX86_CMOV) && |
- NaClGetCPUFeatureX86(&state->cpu_features, |
- NaClCPUFeatureX86_x87))) { |
- if (!state->cpu_checks.f_CMOV_and_x87) { |
- NaClValidatorInstMessage( |
- LOG_WARNING, state, state->cur_inst_state, |
- "CPU model does not support CMOV and x87 instructions.\n"); |
- state->cpu_checks.f_CMOV_and_x87 = TRUE; |
- } |
- squash_me = TRUE; |
- } |
- break; |
- case NACLi_RDTSC: |
- NaClCheckFeature(NaClCPUFeatureX86_TSC, state, &squash_me); |
- break; |
- case NACLi_MMX: |
- NaClCheckFeature(NaClCPUFeatureX86_MMX, state, &squash_me); |
- break; |
- case NACLi_MMXSSE2: |
- /* Note: We accept these instructions if either MMX or SSE2 bits */ |
- /* are set, in case MMX instructions go away someday... */ |
- if (!(NaClGetCPUFeatureX86(&state->cpu_features, |
- NaClCPUFeatureX86_MMX) || |
- NaClGetCPUFeatureX86(&state->cpu_features, |
- NaClCPUFeatureX86_SSE2))) { |
- if (!state->cpu_checks.f_MMX_or_SSE2) { |
- NaClValidatorInstMessage( |
- LOG_WARNING, state, state->cur_inst_state, |
- "CPU model does not support MMX or SSE2 instructions.\n"); |
- state->cpu_checks.f_MMX_or_SSE2 = TRUE; |
- } |
- } |
- squash_me = TRUE; |
- break; |
- case NACLi_SSE: |
- NaClCheckFeature(NaClCPUFeatureX86_SSE, state, &squash_me); |
- break; |
- case NACLi_SSE2: |
- NaClCheckFeature(NaClCPUFeatureX86_SSE2, state, &squash_me); |
- break; |
- case NACLi_SSE3: |
- NaClCheckFeature(NaClCPUFeatureX86_SSE3, state, &squash_me); |
- break; |
- case NACLi_SSE4A: |
- NaClCheckFeature(NaClCPUFeatureX86_SSE4A, state, &squash_me); |
- break; |
- case NACLi_SSE41: |
- NaClCheckFeature(NaClCPUFeatureX86_SSE41, state, &squash_me); |
- break; |
- case NACLi_SSE42: |
- NaClCheckFeature(NaClCPUFeatureX86_SSE42, state, &squash_me); |
- break; |
- case NACLi_MOVBE: |
- NaClCheckFeature(NaClCPUFeatureX86_MOVBE, state, &squash_me); |
- break; |
- case NACLi_POPCNT: |
- NaClCheckFeature(NaClCPUFeatureX86_POPCNT, state, &squash_me); |
- break; |
- case NACLi_LZCNT: |
- NaClCheckFeature(NaClCPUFeatureX86_LZCNT, state, &squash_me); |
- break; |
- case NACLi_SSSE3: |
- NaClCheckFeature(NaClCPUFeatureX86_SSSE3, state, &squash_me); |
- break; |
- case NACLi_3DNOW: |
- NaClCheckFeature(NaClCPUFeatureX86_3DNOW, state, &squash_me); |
- break; |
- case NACLi_E3DNOW: |
- NaClCheckFeature(NaClCPUFeatureX86_E3DNOW, state, &squash_me); |
- break; |
- case NACLi_LONGMODE: |
- /* TODO(karl): Remove this when NACLi_LONGMODE is no longer needed */ |
- NaClCheckFeature(NaClCPUFeatureX86_LM, state, &squash_me); |
- break; |
- case NACLi_SSE2x: |
- /* This case requires CPUID checking code */ |
- /* DATA16 prefix required */ |
- if (!(state->cur_inst_state->prefix_mask & kPrefixDATA16)) { |
- NaClValidatorInstMessage( |
- LOG_ERROR, state, state->cur_inst_state, |
- "SSEx instruction must use prefix 0x66.\n"); |
- } |
- NaClCheckFeature(NaClCPUFeatureX86_SSE2, state, &squash_me); |
- break; |
- default: |
- /* This instruction could be either legal or illegal, but if we |
- * get here it is not CPU-dependent. |
- */ |
- break; |
- } |
- if (state->cur_inst->flags & NACL_IFLAG(LongMode)) { |
- NaClCheckFeature(NaClCPUFeatureX86_LM, state, &squash_me); |
- } |
- if (squash_me) { |
- if (state->readonly_text) { |
- NaClValidatorInstMessage( |
- LOG_ERROR, state, state->cur_inst_state, |
- "Read-only text: cannot squash unsupported instruction.\n"); |
- } else { |
- /* Replace all bytes of the instruction with the HLT instruction. */ |
- NCStubOutMem(state, NaClInstIterGetInstMemoryInline(iter), |
- NaClInstStateLength(state->cur_inst_state)); |
- } |
- } |
-} |