OLD | NEW |
1 /* | 1 /* |
2 * Copyright (c) 2011 The Native Client Authors. All rights reserved. | 2 * Copyright (c) 2011 The Native Client Authors. All rights reserved. |
3 * Use of this source code is governed by a BSD-style license that can be | 3 * Use of this source code is governed by a BSD-style license that can be |
4 * found in the LICENSE file. | 4 * found in the LICENSE file. |
5 */ | 5 */ |
6 | 6 |
7 /* | 7 /* |
8 * Internal implementation of the state associated with matching instructions. | 8 * Internal implementation of the state associated with matching instructions. |
9 */ | 9 */ |
10 | 10 |
11 #ifndef NATIVE_CLIENT_SRC_TRUSTED_VALIDATOR_X86_NC_INST_STATE_INTERNAL_H_ | 11 #ifndef NATIVE_CLIENT_SRC_TRUSTED_VALIDATOR_X86_NC_INST_STATE_INTERNAL_H_ |
12 #define NATIVE_CLIENT_SRC_TRUSTED_VALIDATOR_X86_NC_INST_STATE_INTERNAL_H_ | 12 #define NATIVE_CLIENT_SRC_TRUSTED_VALIDATOR_X86_NC_INST_STATE_INTERNAL_H_ |
13 | 13 |
14 #include "native_client/src/shared/utils/types.h" | 14 #include "native_client/src/shared/utils/types.h" |
15 #include "native_client/src/trusted/validator_x86/ncop_exps.h" | 15 #include "native_client/src/trusted/validator_x86/ncop_exps.h" |
16 | 16 |
| 17 EXTERN_C_BEGIN |
| 18 |
17 /* The meta model of an x86 opcode instruction. */ | 19 /* The meta model of an x86 opcode instruction. */ |
18 struct NaClInst; | 20 struct NaClInst; |
19 | 21 |
20 /* Model of a code segment. */ | 22 /* Model of a code segment. */ |
21 struct NaClSegment; | 23 struct NaClSegment; |
22 | 24 |
23 /* Defines the type used to align OpExprNodes when memory allocating. */ | 25 /* Defines the type used to align OpExprNodes when memory allocating. */ |
24 typedef uint64_t NaClOpExpElement; | 26 typedef uint64_t NaClOpExpElement; |
25 | 27 |
26 /* Model data needed to decode an x86 instruction. */ | 28 /* Model data needed to decode an x86 instruction. */ |
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
100 NaClMemorySize inst_count; | 102 NaClMemorySize inst_count; |
101 /* The following fields define a ring buffer, where buffer_index | 103 /* The following fields define a ring buffer, where buffer_index |
102 * is the index of the current instruction in the buffer, and | 104 * is the index of the current instruction in the buffer, and |
103 * buffer_size is the number of iterator states in the buffer. | 105 * buffer_size is the number of iterator states in the buffer. |
104 */ | 106 */ |
105 size_t buffer_size; | 107 size_t buffer_size; |
106 size_t buffer_index; | 108 size_t buffer_index; |
107 struct NaClInstState* buffer; | 109 struct NaClInstState* buffer; |
108 }; | 110 }; |
109 | 111 |
| 112 /* Structure holding the results of consuming the opcode bytes of the |
| 113 * instruction. |
| 114 */ |
| 115 typedef struct { |
| 116 /* The (last) byte of the matched opcode. */ |
| 117 uint8_t opcode_byte; |
| 118 /* The most specific prefix that the opcode bytes can match |
| 119 * (or OpcodePrefixEnumSize if no such patterns exist). |
| 120 */ |
| 121 NaClInstPrefix matched_prefix; |
| 122 /* The number of bytes to subtract from the instruction length, |
| 123 * the next time GetNextNaClInstCandidates is called. |
| 124 */ |
| 125 uint8_t next_length_adjustment; |
| 126 } NaClInstPrefixDescriptor; |
| 127 |
110 /* Given the current location of the (relative) pc of the given instruction | 128 /* Given the current location of the (relative) pc of the given instruction |
111 * iterator, update the given state to hold the matched opcode | 129 * iterator, update the given state to hold the matched opcode |
112 * (instruction) pattern. If no matching pattern exists, set the state | 130 * (instruction) pattern. If no matching pattern exists, set the state |
113 * to a matched undefined opcode (instruction) pattern. In all cases, | 131 * to a matched undefined opcode (instruction) pattern. In all cases, |
114 * update the state to hold all information on the matched bytes of the | 132 * update the state to hold all information on the matched bytes of the |
115 * instruction. | 133 * instruction. |
116 */ | 134 */ |
117 void NaClDecodeInst(struct NaClInstIter* iter, struct NaClInstState* state); | 135 void NaClDecodeInst(struct NaClInstIter* iter, struct NaClInstState* state); |
118 | 136 |
| 137 /* Returns the (undecoded) instruction state of the iterator. Should only |
| 138 * be used for testing. |
| 139 */ |
| 140 |
| 141 struct NaClInstState* NaClInstIterGetUndecodedState(struct NaClInstIter* iter); |
| 142 |
| 143 EXTERN_C_END |
| 144 |
119 #endif /* NATIVE_CLIENT_SRC_TRUSTED_VALIDATOR_X86_NC_INST_STATE_INTERNAL_H_ */ | 145 #endif /* NATIVE_CLIENT_SRC_TRUSTED_VALIDATOR_X86_NC_INST_STATE_INTERNAL_H_ */ |
OLD | NEW |