Exemplo n.º 1
0
int main(void) {
    NaClCPUFeaturesX86 fv;
    NaClCPUData cpu_data;
    int feature_id;
    NaClCPUDataGet(&cpu_data);

    NaClGetCurrentCPUFeaturesX86((NaClCPUFeatures *) &fv);
    if (NaClArchSupportedX86(&fv)) {
        printf("This is a native client %d-bit %s compatible computer\n",
               NACL_TARGET_SUBARCH, GetCPUIDString(&cpu_data));
    } else {
        if (!NaClGetCPUFeatureX86(&fv, NaClCPUFeatureX86_CPUIDSupported)) {
            printf("Computer doesn't support CPUID\n");
        }
        if (!NaClGetCPUFeatureX86(&fv, NaClCPUFeatureX86_CPUSupported)) {
            printf("Computer id %s is not supported\n", GetCPUIDString(&cpu_data));
        }
    }

    printf("This processor has:\n");
    for (feature_id = 0; feature_id < NaClCPUFeatureX86_Max; ++feature_id) {
        if (NaClGetCPUFeatureX86(&fv, feature_id))
            printf("        %s\n", NaClGetCPUFeatureX86Name(feature_id));
    }
    return 0;
}
Bool NaClInstValidates(uint8_t* mbase,
                       uint8_t size,
                       NaClPcAddress vbase,
                       NaClInstStruct* inst) {
  NaClSegment segment;
  NaClValidatorState* state;
  Bool validates = FALSE;
  NaClCPUFeaturesX86 cpu_features;

  NaClGetCurrentCPUFeaturesX86((NaClCPUFeatures *) &cpu_features);
  NACL_FLAGS_unsafe_single_inst_mode = TRUE;
  state = NaClValidatorStateCreate(vbase, (NaClMemorySize) size, RegR15, FALSE,
                                   &cpu_features);
  do {
    NaClSegmentInitialize(mbase, vbase, (NaClMemorySize) size, &segment);
    NaClBaseRegisterMemoryInitialize(state);
    state->cur_iter = NaClInstIterCreate(kNaClDecoderTables, &segment);
    if (NULL == state->cur_iter) break;
    state->cur_inst_state = NaClInstIterGetState(state->cur_iter);
    state->cur_inst = NaClInstStateInst(state->cur_inst_state);
    state->cur_inst_vector = NaClInstStateExpVector(state->cur_inst_state);
    NaClValidateInstructionLegal(state);
    NaClBaseRegisterValidator(state);
    /* induce call to NaClMaybeReportPreviousBad() */
    NaClBaseRegisterSummarize(state);
    NaClMemoryReferenceValidator(state);
    NaClJumpValidator(state);
    validates = NaClValidatesOk(state);
    NaClInstIterDestroy(state->cur_iter);
    state->cur_iter = NULL;
    state->cur_inst_state = NULL;
    state->cur_inst = NULL;
    state->cur_inst_vector = NULL;
  } while(0);
  NaClValidatorStateDestroy(state);
  /* Strictly speaking this shouldn't be necessary, as the mode */
  /* should only be used from tests. Disabling it here as a     */
  /* defensive tactic. */
  NACL_FLAGS_unsafe_single_inst_mode = FALSE;
  return validates;
}