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 /* Some useful utilities for validator patterns. */ | |
8 | |
9 #ifndef NATIVE_CLIENT_SRC_TRUSTED_VALIDATOR_X86_NCVAL_REG_SFI_NCVALIDATE_UTILS_H
__ | |
10 #define NATIVE_CLIENT_SRC_TRUSTED_VALIDATOR_X86_NCVAL_REG_SFI_NCVALIDATE_UTILS_H
__ | |
11 | |
12 #include "native_client/src/trusted/validator/x86/decoder/ncopcode_desc.h" | |
13 | |
14 struct NaClInstState; | |
15 struct NaClExpVector; | |
16 struct NaClDecodeTables; | |
17 struct NaClValidatorState; | |
18 | |
19 /* Special flag set to find set/use of an operand. */ | |
20 extern const NaClOpFlags NaClOpSetOrUse; | |
21 | |
22 /* Returns true if the instruction is a binary operation with | |
23 * the given mnemonic name, and whose arguments are the given registers. | |
24 * | |
25 * Parameters: | |
26 * inst - The opcode corresponding to the instruction to check. | |
27 * name - The mnemonic name of the instruction. | |
28 * vector - The expression vector corresponding to the instruction to check. | |
29 * reg_1 - The register expected as the first argument | |
30 * reg_2 - The register expected as the second argument. | |
31 */ | |
32 Bool NaClIsBinaryUsingRegisters(const NaClInst* inst, | |
33 NaClMnemonic name, | |
34 struct NaClExpVector* vector, | |
35 NaClOpKind reg_1, | |
36 NaClOpKind reg_2); | |
37 | |
38 /* Returns true if the instruction corresponds to a binary operation whose | |
39 * result is put into REG_SET, and the resulst is computed using the values in | |
40 * REG_SET and REG_USE. | |
41 * | |
42 * Parameters: | |
43 * inst - The opcode corresponding to the instruction to check. | |
44 * name - The mnemonic name of the binary operation. | |
45 * vector - The expression vector corresponding to the instruction to check. | |
46 * reg_set - The register set by the binary operation. | |
47 * reg_use - The register whose value is used (along with reg_set) to generate | |
48 * the or value. | |
49 */ | |
50 Bool NaClIsBinarySetUsingRegisters(const struct NaClDecodeTables* tables, | |
51 const NaClInst* opcode, | |
52 NaClMnemonic name, | |
53 struct NaClExpVector* vector, | |
54 NaClOpKind reg_1, | |
55 NaClOpKind reg_2); | |
56 | |
57 /* Returns true if the instruction corresponds to a move from | |
58 * REG_USE to REG_SET. | |
59 * | |
60 * Parameters: | |
61 * inst - The opcode corresponding to the instruction to check. | |
62 * vector - The expression vector corresponding to the instruction to check. | |
63 * reg_set - The register set by the move. | |
64 * reg_use - The register whose value is used to define the set. | |
65 */ | |
66 Bool NaClIsMovUsingRegisters(const struct NaClDecodeTables* tables, | |
67 const NaClInst* inst, | |
68 struct NaClExpVector* vector, | |
69 NaClOpKind reg_set, | |
70 NaClOpKind reg_use); | |
71 | |
72 /* Returns true if the given instruction's first operand corresponds to | |
73 * a set of the register with the given name. | |
74 * | |
75 * Parameters: | |
76 * state - The instruction state to check. | |
77 * reg_name - The name of the register to check if set. | |
78 */ | |
79 Bool NaClOperandOneIsRegisterSet(struct NaClInstState* state, | |
80 NaClOpKind reg_name); | |
81 | |
82 /* Returns true if the given instruction's first operand corresponds to | |
83 * a 32-bit value that is zero extended. | |
84 * | |
85 * Parameters: | |
86 * state - The instruction state to check. | |
87 */ | |
88 Bool NaClOperandOneZeroExtends(struct NaClInstState* state); | |
89 | |
90 /* Applies the precondition "ZeroExtends(reg32)" to the specified instruction. | |
91 * That is, returns true if the "distance" previous instruction | |
92 * is binary where the first operand is a register set on the given register, | |
93 * and the second operand corresponds to a 32-bit value that is zero extended. | |
94 */ | |
95 Bool NaClAssignsRegisterWithZeroExtends32( | |
96 struct NaClValidatorState* state, /* Validator state associated with | |
97 * the current instruction. | |
98 */ | |
99 size_t distance, /* Number of instruction to look back for | |
100 * zero-extending instruction. | |
101 */ | |
102 NaClOpKind reg32); /* 32-bit register that gets extended | |
103 * by the specified instruction. | |
104 */ | |
105 | |
106 /* Applies the precondition "ZeroExtends(reg32)" to the specified instruction. | |
107 * That is, returns true if the "distance" previous instruction | |
108 * is binary where the first operand is the corresponding 32-bit register | |
109 * of the given 64-bit register, and the second operand corresponds to a | |
110 * 32-bit value that is zero extended. | |
111 */ | |
112 Bool NaClAssignsRegisterWithZeroExtends64( | |
113 struct NaClValidatorState* state, /* Validator state associated with | |
114 * the current instruction. | |
115 */ | |
116 size_t distance, /* Number of instruction to look back for | |
117 * zero-extending instruction. | |
118 */ | |
119 NaClOpKind reg64); /* 64-bit register that gets extended | |
120 * by the specified instruction. | |
121 */ | |
122 | |
123 #endif /* NATIVE_CLIENT_SRC_TRUSTED_VALIDATOR_X86_NCVAL_REG_SFI_NCVALIDATE_UTIL
S_H__ */ | |
OLD | NEW |