| Index: src/trusted/validator/x86/ncval_seg_sfi/ncvalidate_detailed.c
|
| diff --git a/src/trusted/validator/x86/ncval_seg_sfi/ncvalidate_detailed.c b/src/trusted/validator/x86/ncval_seg_sfi/ncvalidate_detailed.c
|
| deleted file mode 100644
|
| index 0f2c941f0eb11559b1321a92b92a26bdb5136273..0000000000000000000000000000000000000000
|
| --- a/src/trusted/validator/x86/ncval_seg_sfi/ncvalidate_detailed.c
|
| +++ /dev/null
|
| @@ -1,172 +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.
|
| - */
|
| -
|
| -/*
|
| - * ncvalidate_details.c
|
| - * Attach detailed error reporter to the NaCl validator. Does a second
|
| - * walk of the instructions to find instructions that explicitly branch
|
| - * to illegal addresses.
|
| - *
|
| - * See function NCJumpSummarize in ncvalidate.c for a the terse version
|
| - * which doesn't require a second pass.
|
| - */
|
| -
|
| -#include "native_client/src/trusted/validator/x86/ncval_seg_sfi/ncvalidate_detailed.h"
|
| -
|
| -#include "native_client/src/trusted/validator/x86/ncval_seg_sfi/ncdecode.h"
|
| -#include "native_client/src/trusted/validator/x86/ncval_seg_sfi/ncvalidate_internaltypes.h"
|
| -
|
| -static void NCJumpSummarizeDetailed(struct NCValidatorState* vstate);
|
| -
|
| -
|
| -/* Null method for decoder state. */
|
| -static void NCNullDecoderStateMethod(struct NCValidatorState* vstate) {
|
| -}
|
| -
|
| -/* Detailed (summary) error check on target value, defined in the given decoder
|
| - * instruction.
|
| - */
|
| -static void NCJumpCheck(struct NCValidatorState* vstate,
|
| - const NCDecoderInst* dinst,
|
| - int32_t jump_offset) {
|
| - NaClPcAddress target = (dinst->inst_addr + dinst->inst.bytes.length
|
| - + jump_offset);
|
| -
|
| - if (target < vstate->codesize && !NCGetAdrTable(target, vstate->vttable)) {
|
| - if (NCGetAdrTable(target, vstate->pattern_nonfirst_insts_table)) {
|
| - NCBadInstructionError(dinst, "Jumps into middle of nacl pattern");
|
| - } else {
|
| - NCBadInstructionError(dinst, "Doesn't jump to instruction address");
|
| - }
|
| - NCStatsBadTarget(vstate);
|
| - }
|
| -}
|
| -
|
| -/* Detailed (summary) error check for a byte jump instruction.
|
| - * Note: This code should match the corresponding validator check
|
| - * function ValidateJmp8 in ncvalidate.c.
|
| - */
|
| -static void NCInstCheckJmp8(const NCDecoderInst* dinst) {
|
| - int8_t offset = NCInstBytesByte(&dinst->inst_bytes,
|
| - dinst->inst.prefixbytes+1);
|
| - struct NCValidatorState* vstate = NCVALIDATOR_STATE_DOWNCAST(dinst->dstate);
|
| - NCJumpCheck(vstate, dinst, offset);
|
| -}
|
| -
|
| -/* Detailed (summary) error check for a jump condition instruction.
|
| - * Note: This code should match the corresponding validator check
|
| - * function ValidateJmpz in ncvalidate.c.
|
| - */
|
| -static void NCInstCheckJmpz(const NCDecoderInst* dinst) {
|
| - NCInstBytesPtr opcode;
|
| - uint8_t opcode0;
|
| - int32_t offset;
|
| - NCValidatorState* vstate = NCVALIDATOR_STATE_DOWNCAST(dinst->dstate);
|
| - NCInstBytesPtrInitInc(&opcode, &dinst->inst_bytes,
|
| - dinst->inst.prefixbytes);
|
| - opcode0 = NCInstBytesByte(&opcode, 0);
|
| - if (opcode0 == 0x0f) {
|
| - /* Multbyte opcode. Intruction is of form:
|
| - * 0F80 .. 0F8F: jCC $Jz
|
| - */
|
| - NCInstBytesPtr opcode_2;
|
| - NCInstBytesPtrInitInc(&opcode_2, &opcode, 2);
|
| - offset = NCInstBytesInt32(&opcode_2, dinst->inst.immbytes);
|
| - } else {
|
| - /* Single byte opcode. Must be one of:
|
| - * E8: call $Jz
|
| - * E9: jmp $Jx
|
| - */
|
| - NCInstBytesPtr opcode_1;
|
| - NCInstBytesPtrInitInc(&opcode_1, &opcode, 1);
|
| - offset = NCInstBytesInt32(&opcode_1, dinst->inst.immbytes);
|
| - }
|
| - NCJumpCheck(vstate, dinst, offset);
|
| -}
|
| -
|
| -/* Decoder action to perform to detect bad jumps during detailed
|
| - * (summarization) error checking.
|
| - */
|
| -static Bool NCInstLayoutCheck(const NCDecoderInst* dinst) {
|
| - NCValidatorState* vstate;
|
| - NaClPcAddress start;
|
| - NaClPcAddress end;
|
| - NaClPcAddress i;
|
| - if (dinst == NULL) return TRUE;
|
| - vstate = NCVALIDATOR_STATE_DOWNCAST(dinst->dstate);
|
| -
|
| - /* Check that if first instruction is a basic block, it isn't in the middle
|
| - * of a pattern.
|
| - */
|
| - start = dinst->inst_addr;
|
| - if ((0 == (start % vstate->bundle_size)) &&
|
| - NCGetAdrTable(start, vstate->pattern_nonfirst_insts_table)) {
|
| - NCBadInstructionError(
|
| - dinst,
|
| - "Instruction begins basic block, but in middle of nacl pattern\n");
|
| - NCStatsBadAlignment(vstate);
|
| - }
|
| -
|
| - /* Check that instruction doesn't cross block boundaries. */
|
| - end = start + NCInstBytesLength(&dinst->inst_bytes);
|
| - for (i = start + 1; i < end; ++i) {
|
| - if (0 == (i % vstate->bundle_size)) {
|
| - NCBadInstructionError(dinst, "Instruction crosses basic block alignment");
|
| - NCStatsBadAlignment(vstate);
|
| - }
|
| - }
|
| -
|
| - /* Check jump targets. */
|
| - switch (dinst->opinfo->insttype) {
|
| - case NACLi_JMP8:
|
| - NCInstCheckJmp8(dinst);
|
| - break;
|
| - case NACLi_JMPZ:
|
| - NCInstCheckJmpz(dinst);
|
| - break;
|
| - default:
|
| - break;
|
| - }
|
| - return TRUE;
|
| -}
|
| -
|
| -/* Detailed (summary) error reporting. Rather than looking at summary
|
| - * information collected during the first pass, this code rewalks the
|
| - * instructions are reports each instruction that causes a problem.
|
| - */
|
| -static void NCJumpSummarizeDetailed(struct NCValidatorState* vstate) {
|
| - /* Rewalk the code to find instructions that break rules. */
|
| - NCDecoderState* dstate = &vstate->dstate;
|
| - NaClErrorReporter* reporter = dstate->error_reporter;
|
| - NCDecoderStateConstruct(dstate, dstate->mbase, dstate->vbase, dstate->size,
|
| - vstate->inst_buffer, kNCValidatorInstBufferSize);
|
| - dstate->action_fn = NCInstLayoutCheck;
|
| - dstate->new_segment_fn = (NCDecoderStateMethod) NCNullDecoderStateMethod;
|
| - dstate->internal_error_fn = (NCDecoderStateMethod) NCNullDecoderStateMethod;
|
| - dstate->internal_error_fn = (NCDecoderStateMethod) NCStatsInternalError;
|
| - NCDecoderStateSetErrorReporter(dstate, reporter);
|
| - NCDecoderStateDecode(dstate);
|
| -}
|
| -
|
| -struct NCValidatorState *NCValidateInitDetailed(
|
| - const NaClPcAddress vbase,
|
| - const NaClMemorySize codesize,
|
| - const NaClCPUFeaturesX86 *features) {
|
| - struct NCValidatorState *vstate = NCValidateInit(vbase, codesize,
|
| - FALSE, features);
|
| - if (NULL != vstate) {
|
| - vstate->summarize_fn = NCJumpSummarizeDetailed;
|
| - vstate->pattern_nonfirst_insts_table =
|
| - (uint8_t *)calloc(NCIATOffset(codesize) + 1, 1);
|
| - if (NULL == vstate->pattern_nonfirst_insts_table) {
|
| - if (NULL != vstate->kttable) free(vstate->kttable);
|
| - if (NULL != vstate->vttable) free(vstate->vttable);
|
| - free(vstate);
|
| - return NULL;
|
| - }
|
| - }
|
| - return vstate;
|
| -}
|
|
|