| OLD | NEW |
| (Empty) |
| 1 /* | |
| 2 * Copyright (c) 2012 The Native Client Authors. All rights reserved. | |
| 3 * Use of this source code is governed by a BSD-style license that can be | |
| 4 * found in the LICENSE file. | |
| 5 */ | |
| 6 | |
| 7 #include "native_client/src/trusted/validator/x86/ncval_reg_sfi/nc_postconds.h" | |
| 8 | |
| 9 #include "native_client/src/include/portability_io.h" | |
| 10 #include "native_client/src/shared/platform/nacl_log.h" | |
| 11 #include "native_client/src/trusted/validator/x86/decoder/ncop_exps.h" | |
| 12 #include "native_client/src/trusted/validator/x86/decoder/nc_inst_state.h" | |
| 13 #include "native_client/src/trusted/validator/x86/decoder/nc_inst_trans.h" | |
| 14 #include "native_client/src/trusted/validator/x86/ncval_reg_sfi/ncvalidate_iter.
h" | |
| 15 #include "native_client/src/trusted/validator/x86/ncval_reg_sfi/ncvalidate_iter_
internal.h" | |
| 16 #include "native_client/src/trusted/validator/x86/ncval_reg_sfi/ncvalidate_utils
.h" | |
| 17 #include "native_client/src/trusted/validator/x86/ncval_reg_sfi/nc_memory_protec
t.h" | |
| 18 | |
| 19 /* To turn on debugging of instruction decoding, change value of | |
| 20 * DEBUGGING to 1. | |
| 21 */ | |
| 22 #define DEBUGGING 0 | |
| 23 | |
| 24 #include "native_client/src/shared/utils/debugging.h" | |
| 25 | |
| 26 #include "native_client/src/trusted/validator/x86/decoder/ncop_exps_inl.c" | |
| 27 | |
| 28 /* Maximum character buffer size to use for generating messages. */ | |
| 29 static const size_t kMaxBufferSize = 1024; | |
| 30 | |
| 31 #ifdef NCVAL_TESTING | |
| 32 void NaClAddAssignsRegisterWithZeroExtendsPostconds( | |
| 33 struct NaClValidatorState* state) { | |
| 34 uint32_t i; | |
| 35 NaClExpVector* vector = state->cur_inst_vector; | |
| 36 | |
| 37 DEBUG(NaClValidatorInstMessage( | |
| 38 LOG_INFO, state, state->cur_inst_state, | |
| 39 "-> Checking ZeroExtends postconditions...\n")); | |
| 40 | |
| 41 /* Look for assignments to 32-bit registers for instructions that | |
| 42 * zero extend. | |
| 43 */ | |
| 44 for (i = 0; i < vector->number_expr_nodes; ++i) { | |
| 45 NaClExp* node = &vector->node[i]; | |
| 46 NaClOpKind node_reg; | |
| 47 if (ExprRegister != node->kind) continue; | |
| 48 if (!NaClHasBit(node->flags, NACL_EFLAG(ExprSet))) continue; | |
| 49 if (!NaClHasBit(node->flags, NACL_EFLAG(ExprSize32))) continue; | |
| 50 node_reg = NaClGetExpRegisterInline(node); | |
| 51 if (node_reg == RegUnknown) continue; | |
| 52 if (NaClAssignsRegisterWithZeroExtends32(state, 0, node_reg)) { | |
| 53 char* buffer; | |
| 54 size_t buffer_size; | |
| 55 char reg_name[kMaxBufferSize]; | |
| 56 NaClOpRegName(node_reg, reg_name, kMaxBufferSize); | |
| 57 NaClConditionAppend(state->postcond, &buffer, &buffer_size); | |
| 58 SNPRINTF(buffer, buffer_size, "ZeroExtends(%s)", reg_name); | |
| 59 } | |
| 60 } | |
| 61 DEBUG(NaClValidatorMessage( | |
| 62 LOG_INFO, state, "<- Finished ZeroExtends postconditions...\n")); | |
| 63 } | |
| 64 | |
| 65 void NaClAddLeaSafeAddressPostconds( | |
| 66 struct NaClValidatorState* state) { | |
| 67 uint32_t i; | |
| 68 NaClExpVector* vector = state->cur_inst_vector; | |
| 69 DEBUG(NaClValidatorInstMessage( | |
| 70 LOG_INFO, state, state->cur_inst_state, | |
| 71 "Checking SafeAddress postconditions...\n")); | |
| 72 | |
| 73 /* Look for assignments to registers. */ | |
| 74 for (i = 0; i < vector->number_expr_nodes; ++i) { | |
| 75 NaClOpKind reg; | |
| 76 NaClExp* node = &vector->node[i]; | |
| 77 if (ExprRegister != node->kind) continue; | |
| 78 if (!NaClHasBit(node->flags, NACL_EFLAG(ExprSet))) continue; | |
| 79 if (!NaClHasBit(node->flags, NACL_EFLAG(ExprSize64))) continue; | |
| 80 reg = NaClGetExpRegisterInline(node); | |
| 81 if (RegUnknown == reg) continue; | |
| 82 if ((reg == RegRSP) || (reg == RegRBP)) { | |
| 83 /* Note: Do not need to check safe addresses computed | |
| 84 * by "LEA Rsp/Rbp ...". Currently, these two registers | |
| 85 * are already checked.. See NaClCheckRspAssignments and | |
| 86 * NaClCheckRbpAssignments in nc_protect_base.c for more | |
| 87 * information on how such LEA instructions are checked. | |
| 88 */ | |
| 89 if (InstLea != NaClInstStateInst(state->cur_inst_state)->name) { | |
| 90 NaClAcceptLeaWithMoveLea32To64(state, reg); | |
| 91 } | |
| 92 } else if (NaClAcceptLeaSafeAddress(state)) { | |
| 93 char* buffer; | |
| 94 size_t buffer_size; | |
| 95 char reg_name[kMaxBufferSize]; | |
| 96 NaClOpRegName(reg, reg_name, kMaxBufferSize); | |
| 97 NaClConditionAppend(state->postcond, &buffer, &buffer_size); | |
| 98 SNPRINTF(buffer, buffer_size, "SafeAddress(%s)", reg_name); | |
| 99 } | |
| 100 } | |
| 101 DEBUG(NaClValidatorMessage( | |
| 102 LOG_INFO, state, "Finished SafeAddress postconditions...\n")); | |
| 103 } | |
| 104 | |
| 105 #endif | |
| OLD | NEW |