OLD | NEW |
| (Empty) |
1 /* | |
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 | |
4 * found in the LICENSE file. | |
5 */ | |
6 | |
7 /* | |
8 * ncopcode_desc.h - Descriptors to model opcode operands. | |
9 */ | |
10 #ifndef NATIVE_CLIENT_SRC_TRUSTED_VALIDATOR_X86_DECODER_NCOPCODE_DESC_H_ | |
11 #define NATIVE_CLIENT_SRC_TRUSTED_VALIDATOR_X86_DECODER_NCOPCODE_DESC_H_ | |
12 | |
13 #include <stdio.h> | |
14 | |
15 #include "native_client/src/include/portability.h" | |
16 #include "native_client/src/shared/gio/gio.h" | |
17 #include "native_client/src/shared/utils/types.h" | |
18 #include "native_client/src/trusted/validator/x86/decoder/gen/ncopcode_prefix.h" | |
19 #include "native_client/src/trusted/validator/x86/decoder/gen/ncopcode_insts.h" | |
20 #include "native_client/src/trusted/validator/x86/decoder/gen/ncopcode_opcode_fl
ags.h" | |
21 #include "native_client/src/trusted/validator/x86/decoder/gen/ncopcode_operand_k
ind.h" | |
22 #include "native_client/src/trusted/validator/x86/decoder/gen/ncopcode_operand_f
lag.h" | |
23 #include "native_client/src/trusted/validator/x86/x86_insts.h" | |
24 | |
25 EXTERN_C_BEGIN | |
26 | |
27 struct NaClDecodeTables; | |
28 | |
29 /* Defines integer to represent sets of possible opcode (instruction) flags */ | |
30 typedef uint64_t NaClIFlags; | |
31 | |
32 /* Converts an NaClIFlagEnum to the corresponding bit in NaClIFlags. */ | |
33 #define NACL_IFLAG(x) (((NaClIFlags) 1) << (x)) | |
34 | |
35 /* Models the empty set of opcode flags. */ | |
36 #define NACL_EMPTY_IFLAGS ((NaClIFlags) 0) | |
37 | |
38 /* Prints out the set of defined instruction flags. */ | |
39 void NaClIFlagsPrint(struct Gio* out, NaClIFlags flags); | |
40 | |
41 /* Defines integer to represent sets of possible operand flags. */ | |
42 typedef uint32_t NaClOpFlags; | |
43 | |
44 /* Converts an NaClOpFlag enum to the corresponding bit in NaClOpFlags. */ | |
45 #define NACL_OPFLAG(x) (((NaClOpFlags) 1) << x) | |
46 | |
47 /* Models the empty set of operand flags. */ | |
48 #define NACL_EMPTY_OPFLAGS ((NaClOpFlags) 0) | |
49 | |
50 /* Prints out the set of defined OPerand flags. */ | |
51 void NaClOpFlagsPrint(struct Gio* out, NaClOpFlags flags); | |
52 | |
53 /* Defines integer to represent sets of possible instruction disallow | |
54 * flags. | |
55 */ | |
56 typedef uint16_t NaClDisallowsFlags; | |
57 | |
58 /* Converts a NaClDisallowsFlag to the corresponding bit | |
59 * in NaClDisallowsFlags. | |
60 */ | |
61 #define NACL_DISALLOWS_FLAG(x) (((NaClDisallowsFlags) 1) << (x)) | |
62 | |
63 /* Models the empty set of instruction disallows flags. */ | |
64 #define NACL_EMPTY_DISALLOWS_FLAGS ((NaClDisallowsFlags) 0) | |
65 | |
66 /* Metadata about an instruction operand. */ | |
67 typedef struct NaClOp { | |
68 /* The kind of the operand (i.e. kind of data modeled by the operand).*/ | |
69 NaClOpKind kind; | |
70 /* Flags defining additional facts about the operand. */ | |
71 NaClOpFlags flags; | |
72 /* Printing format string for operand. */ | |
73 const char* format_string; | |
74 } NaClOp; | |
75 | |
76 /* Maxmimum number of opcode bytes per instruction. */ | |
77 #define NACL_MAX_OPCODE_BYTES 3 | |
78 | |
79 /* Maximum number of opcode bytes used to model an instruction. Include | |
80 * opcodes in the modrm byte, and register values encoded in the opcode. | |
81 */ | |
82 #define NACL_MAX_ALL_OPCODE_BYTES 4 | |
83 | |
84 /* Metadata about an instruction, defining a pattern. Note: Since the same | |
85 * sequence of opcode bytes may define more than one pattern (depending on | |
86 * other bytes in the parsed instruction), the patterns are | |
87 * modeled using a singly linked list. | |
88 */ | |
89 typedef struct NaClInst { | |
90 /* Defines the origin of this instruction. */ | |
91 NaClInstType insttype; | |
92 /* Flags defining additional facts about the instruction. */ | |
93 NaClIFlags flags; | |
94 /* The instruction that this instruction implements. */ | |
95 NaClMnemonic name; | |
96 /* Defines opcode extentions, which encodes values for OpcodeInModRm, | |
97 * OpcodePlusR, and OpcodeInModRmRm. Note: to fit the possible 9 | |
98 * bits of information in 8 bits, we assume that OpcodeInModRm | |
99 * and OpcodePlusR do not happen in the same instruction. | |
100 */ | |
101 uint8_t opcode_ext; | |
102 /* The number of operands modeled for this instruction. */ | |
103 uint8_t num_operands; | |
104 /* The corresponding models of the operands. */ | |
105 uint16_t operands_offset; | |
106 /* Pointer to the next pattern to try and match for the | |
107 * given sequence of opcode bytes. | |
108 */ | |
109 uint16_t next_rule; | |
110 } NaClInst; | |
111 | |
112 /* Returns the OpcodeInModRm value in the opcode_ext field. */ | |
113 uint8_t NaClGetOpcodeInModRm(uint8_t opcode_ext); | |
114 | |
115 /* Returns the OpcodeInModRmRm value in the opcode_ext field. */ | |
116 uint8_t NaClGetOpcodeInModRmRm(uint8_t opcode_ext); | |
117 | |
118 /* Returns the OpcodePlusR value in the opcode_ext field. */ | |
119 uint8_t NaClGetOpcodePlusR(uint8_t opcode_ext); | |
120 | |
121 /* Implements trie nodes for selecting instructions that must match | |
122 * a specific sequence of bytes. Used to handle NOP cases. | |
123 */ | |
124 typedef struct NaClInstNode { | |
125 /* The matching byte for the trie node. */ | |
126 const uint8_t matching_byte; | |
127 /* The matching modeled instruction, if byte matched. */ | |
128 const uint16_t matching_inst; | |
129 /* Node to match remaining bytes if matching_byte matches. */ | |
130 const struct NaClInstNode* success; | |
131 /* Node to try next if match_byte doesn't match. Note: | |
132 * The trie is generated in such a way that if the next input | |
133 * byte is > matching_byte, no node in the fail subtree will | |
134 * match the current input. That is, nodes in the trie are | |
135 * sorted by the sequence of matching bytes. | |
136 */ | |
137 const struct NaClInstNode* fail; | |
138 } NaClInstNode; | |
139 | |
140 /* Returns the number of logical operands an instruction has. That is, | |
141 * returns field num_operands unless the first operand is | |
142 * a special encoding that extends the opcode. | |
143 */ | |
144 uint8_t NaClGetInstNumberOperands(const NaClInst* inst); | |
145 | |
146 /* Returns the indexed logical operand for the instruction. That is, | |
147 * returns the index-th operand unless the first operand is | |
148 * a special encoding that extends the opcode. In the latter | |
149 * case, the (index+1)-th operand is returned. | |
150 */ | |
151 const NaClOp* NaClGetInstOperand(const struct NaClDecodeTables* tables, | |
152 const NaClInst* inst, | |
153 uint8_t index); | |
154 | |
155 /* Print out the given operand structure to the given file. */ | |
156 void NaClOpPrint(struct Gio* f, const NaClOp* operand); | |
157 | |
158 /* Returns a string defining bytes of the given prefix that are considered | |
159 * prefix bytes, independent of the opcode. | |
160 */ | |
161 const char* OpcodePrefixBytes(NaClInstPrefix prefix); | |
162 | |
163 /* Print out the given instruction to the given file. However, always | |
164 * print the value NULL for next_rule, even if the value is non-null. This | |
165 * function should be used to print out an individual opcode (instruction) | |
166 * pattern. | |
167 */ | |
168 void NaClInstPrint(struct Gio* f, | |
169 const struct NaClDecodeTables* tables, | |
170 const NaClInst* inst); | |
171 | |
172 EXTERN_C_END | |
173 | |
174 #endif /* NATIVE_CLIENT_SRC_TRUSTED_VALIDATOR_X86_DECODER_NCOPCODE_DESC_H_ */ | |
OLD | NEW |