| Index: src/trusted/validator/x86/testing/enuminsts/ragel_tester.c
|
| diff --git a/src/trusted/validator/x86/testing/enuminsts/ragel_tester.c b/src/trusted/validator/x86/testing/enuminsts/ragel_tester.c
|
| deleted file mode 100644
|
| index 14c52a48d9f94a318ddf0b1fdcb228c34faeaf81..0000000000000000000000000000000000000000
|
| --- a/src/trusted/validator/x86/testing/enuminsts/ragel_tester.c
|
| +++ /dev/null
|
| @@ -1,177 +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.
|
| - */
|
| -
|
| -/*
|
| - * ragel_tester.c
|
| - * Implements a ragel decoder that can be used as a NaClEnumeratorDecoder.
|
| - */
|
| -#ifndef NACL_TRUSTED_BUT_NOT_TCB
|
| -#error("This file is not meant for use in the TCB.")
|
| -#endif
|
| -
|
| -#include "native_client/src/trusted/validator/x86/testing/enuminsts/enuminsts.h"
|
| -
|
| -#include <string.h>
|
| -#include "native_client/src/trusted/validator/types_memory_model.h"
|
| -#include "native_client/src/trusted/validator/x86/ncinstbuffer.h"
|
| -#include "native_client/src/trusted/validator/x86/testing/enuminsts/str_utils.h"
|
| -#include "native_client/src/trusted/validator_ragel/validator.h"
|
| -
|
| -#define kBufferSize 1024
|
| -
|
| -/* Defines the virtual table for the ragel decoder. */
|
| -struct {
|
| - /* The virtual table that implements this decoder. */
|
| - NaClEnumeratorDecoder _base;
|
| -} ragel_decoder;
|
| -
|
| -/* Initialize ragel state before we try to decode anything. */
|
| -static void RagelSetup(void) {
|
| -}
|
| -
|
| -struct RagelDecodeState {
|
| - const uint8_t *inst_offset;
|
| - uint8_t inst_num_bytes;
|
| - uint8_t first_call;
|
| - const char *inst_name;
|
| - int inst_is_legal; /* legal means decodes correctly */
|
| - int inst_is_valid; /* valid means validator is happy */
|
| -};
|
| -struct RagelDecodeState RState;
|
| -
|
| -static const char* RGetInstMnemonic(const NaClEnumerator* enumerator) {
|
| - UNREFERENCED_PARAMETER(enumerator);
|
| - return RState.inst_name;
|
| -}
|
| -
|
| -static void RagelPrintInst(void) {
|
| - int i;
|
| - int print_num_bytes = RState.inst_num_bytes;
|
| -
|
| - if (print_num_bytes == 0) print_num_bytes = 4;
|
| - for (i = 0; i < print_num_bytes; i++) {
|
| - printf("%02x ", RState.inst_offset[i]);
|
| - }
|
| - printf("\n");
|
| -}
|
| -
|
| -
|
| -Bool RagelInstruction(const uint8_t *begin, const uint8_t *end,
|
| - uint32_t info, void *userdata) {
|
| - struct RagelDecodeState *rstate = (struct RagelDecodeState *)userdata;
|
| -
|
| - /* Only look at the first instruction. */
|
| - if (rstate->first_call) {
|
| - int restricted_register =
|
| - (info & RESTRICTED_REGISTER_MASK) >> RESTRICTED_REGISTER_SHIFT;
|
| - rstate->inst_num_bytes = (uint8_t)(end - begin);
|
| -
|
| - rstate->inst_is_valid =
|
| - !(info & (VALIDATION_ERRORS_MASK & ~DIRECT_JUMP_OUT_OF_RANGE)) &&
|
| - restricted_register != REG_RSP &&
|
| - restricted_register != REG_RBP;
|
| - rstate->inst_is_legal = rstate->inst_is_valid;
|
| - rstate->first_call = 0;
|
| - }
|
| -
|
| - if (info & (VALIDATION_ERRORS_MASK | BAD_JUMP_TARGET))
|
| - return FALSE;
|
| - else
|
| - return TRUE;
|
| -}
|
| -
|
| -static void InitializeRagelDecodeState(struct RagelDecodeState *rs,
|
| - const uint8_t *itext) {
|
| - rs->first_call = 1;
|
| - rs->inst_offset = itext;
|
| - rs->inst_num_bytes = 0;
|
| - rs->inst_is_legal = 0;
|
| - rs->inst_is_valid = 0;
|
| - rs->inst_name = "undefined";
|
| -}
|
| -
|
| -/* Defines the function to parse the first instruction. Note RState.ready */
|
| -/* mechanism forces parsing of at most one instruction. */
|
| -static void RParseInst(const NaClEnumerator* enumerator, const int pc_address) {
|
| - uint8_t chunk[(NACL_ENUM_MAX_INSTRUCTION_BYTES + kBundleMask) &
|
| - ~kBundleMask];
|
| -
|
| - UNREFERENCED_PARAMETER(pc_address);
|
| - InitializeRagelDecodeState(&RState, enumerator->_itext);
|
| -
|
| -#if NACL_ARCH(NACL_BUILD_ARCH) == NACL_x86 && NACL_TARGET_SUBARCH == 64
|
| -#define ValidateChunkArch ValidateChunkAMD64
|
| -#elif NACL_ARCH(NACL_BUILD_ARCH) == NACL_x86 && NACL_TARGET_SUBARCH == 32
|
| -#define ValidateChunkArch ValidateChunkIA32
|
| -#else
|
| -#error("Unsupported architecture")
|
| -#endif
|
| -
|
| - /* Copy the command. */
|
| - memcpy(chunk, enumerator->_itext, sizeof enumerator->_itext);
|
| - /* Fill the rest with HLTs. */
|
| - memset(chunk + sizeof enumerator->_itext, 0xf4,
|
| - sizeof chunk - sizeof enumerator->_itext);
|
| - ValidateChunkArch(chunk, sizeof(chunk),
|
| - CALL_USER_CALLBACK_ON_EACH_INSTRUCTION,
|
| - &kFullCPUIDFeatures,
|
| - RagelInstruction, &RState);
|
| -
|
| -#undef ValidateChunkArch
|
| -}
|
| -
|
| -/* Returns true if the instruction parsed a legal instruction. */
|
| -static Bool RIsInstLegal(const NaClEnumerator* enumerator) {
|
| - UNREFERENCED_PARAMETER(enumerator);
|
| - return RState.inst_is_legal;
|
| -}
|
| -
|
| -/* Returns true if the instruction parsed a legal instruction. */
|
| -static Bool RIsInstValid(const NaClEnumerator* enumerator) {
|
| - UNREFERENCED_PARAMETER(enumerator);
|
| - return RState.inst_is_valid;
|
| -}
|
| -
|
| -/* Prints out the disassembled instruction. */
|
| -static void RPrintInst(const NaClEnumerator* enumerator) {
|
| - UNREFERENCED_PARAMETER(enumerator);
|
| - printf("Ragel: ");
|
| - RagelPrintInst();
|
| -}
|
| -
|
| -static size_t RInstLength(const NaClEnumerator* enumerator) {
|
| - UNREFERENCED_PARAMETER(enumerator);
|
| - return (size_t)RState.inst_num_bytes;
|
| -}
|
| -
|
| -static void InstallFlag(const NaClEnumerator* enumerator,
|
| - const char* flag_name,
|
| - const void* flag_address) {
|
| - UNREFERENCED_PARAMETER(enumerator);
|
| - UNREFERENCED_PARAMETER(flag_name);
|
| - UNREFERENCED_PARAMETER(flag_address);
|
| -}
|
| -
|
| -/* Defines the registry function that creates a ragel decoder, and returns
|
| - * the decoder to be registered.
|
| - */
|
| -NaClEnumeratorDecoder* RegisterRagelDecoder(void) {
|
| - RagelSetup();
|
| - ragel_decoder._base._id_name = "ragel";
|
| - ragel_decoder._base._parse_inst_fn = RParseInst;
|
| - ragel_decoder._base._inst_length_fn = RInstLength;
|
| - ragel_decoder._base._print_inst_fn = RPrintInst;
|
| - ragel_decoder._base._is_inst_legal_fn = RIsInstLegal;
|
| - ragel_decoder._base._install_flag_fn = InstallFlag;
|
| - ragel_decoder._base._get_inst_mnemonic_fn = RGetInstMnemonic;
|
| - ragel_decoder._base._get_inst_num_operands_fn = NULL;
|
| - ragel_decoder._base._get_inst_operands_text_fn = NULL;
|
| - ragel_decoder._base._writes_to_reserved_reg_fn = NULL;
|
| - ragel_decoder._base._maybe_inst_validates_fn = RIsInstValid;
|
| - ragel_decoder._base._segment_validates_fn = NULL;
|
| - ragel_decoder._base._usage_message = "Runs ragel to decode instructions.";
|
| - return &ragel_decoder._base;
|
| -}
|
|
|