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 * API to compressing tables of modeled instructions. | |
9 */ | |
10 | |
11 #ifndef NATIVE_CLIENT_SRC_TRUSTED_VALIDATOR_X86_DECODER_GENERATOR_NC_COMPRESS_H_
_ | |
12 #define NATIVE_CLIENT_SRC_TRUSTED_VALIDATOR_X86_DECODER_GENERATOR_NC_COMPRESS_H_
_ | |
13 | |
14 #include "native_client/src/trusted/validator/x86/decoder/generator/ncdecode_tab
legen.h" | |
15 #include "native_client/src/trusted/validator/x86/decoder/nc_decode_tables.h" | |
16 | |
17 /* Define the maximum number of instruction operands (over | |
18 * all instructions) we will allow. Note: before compression, | |
19 * there should a little less than 3000 operands. Hence, | |
20 * 10000 is a (very) safe value to use as a limit, and should | |
21 * not need to be changed. Also, the table generator will | |
22 * complain (and then fail) if this number is exceeded. If that | |
23 * happens, update this constant as is appropriate. | |
24 */ | |
25 #define NACL_MAX_OPERANDS_TOTAL 10000 | |
26 | |
27 /* Define the maximum number of instructions we will allow. | |
28 * Note: before compression there should be less than 3000 | |
29 * instructions. Hence, 10000 is a (very) safe value to use | |
30 * as a limit, and should not need to be changed. Also, the | |
31 * table generator will complain (and then fail) if this number | |
32 * is exceeded. If that happens, update this constant as | |
33 * is appropriate. | |
34 */ | |
35 #define NACL_MAX_INSTRUCTIONS_TOTAL 10000 | |
36 | |
37 /* Define the maximum number of prefix/opcode entries that | |
38 * we will allow. Note: before compression there are | |
39 * 256 * NaClInstPrefixEnumSize(19) = 4864 entries. | |
40 * Hence, 100000 is a (very) safe value to use as a limit, | |
41 * and should not need to be changed. Also, the | |
42 * table generator will complain (and then fail) if this number | |
43 * is exceeded. If that happens, update this constant as | |
44 * is appropriate. | |
45 */ | |
46 #define NACL_MAX_PREFIX_OPCODE_ENTRIES 10000 | |
47 | |
48 /* The type for the array used to look up instructions, based on matched | |
49 * prefix selector and the corresponding (first) opcode byte. | |
50 */ | |
51 typedef NaClModeledInst* | |
52 NaclModeledInstTableType[NCDTABLESIZE][NaClInstPrefixEnumSize]; | |
53 | |
54 /* The type for the array of compressed instructions. */ | |
55 typedef NaClModeledInst* | |
56 NaclCompressedTableType[NACL_MAX_INSTRUCTIONS_TOTAL]; | |
57 | |
58 /* The type for the array of opcode lookup entries. */ | |
59 typedef NaClPrefixOpcodeArrayOffset | |
60 NaClCompressedOpcodeLookupType[NACL_MAX_PREFIX_OPCODE_ENTRIES]; | |
61 | |
62 /* Models the arrays used in table generation, and the corresponding | |
63 * tables used to model the compressed data. | |
64 */ | |
65 typedef struct NaClInstTables { | |
66 /* The lookup table of posssible instructions, based on opcode and | |
67 * prefix selector. | |
68 */ | |
69 NaClModeledInst* inst_table[NCDTABLESIZE][NaClInstPrefixEnumSize]; | |
70 /* The root of the hard coded instructions. */ | |
71 NaClModeledInstNode* inst_node_root; | |
72 /* The array of modeled set of operands defined for instructions. */ | |
73 NaClOp operands[NACL_MAX_OPERANDS_TOTAL]; | |
74 /* The number of operands in nacl_operands. */ | |
75 size_t operands_size; | |
76 /* The instruction that models an undefined instruction. */ | |
77 NaClModeledInst* undefined_inst; | |
78 /* The generated array of compressed operands. */ | |
79 NaClOp ops_compressed[NACL_MAX_OPERANDS_TOTAL]; | |
80 /* The number of compressed operands added to ops_compressed. */ | |
81 size_t ops_compressed_size; | |
82 /* The generated array of compressed instructions. */ | |
83 NaClModeledInst* inst_compressed[NACL_MAX_INSTRUCTIONS_TOTAL]; | |
84 /* The number of compressed instructions added to inst_compressed. */ | |
85 size_t inst_compressed_size; | |
86 /* The generated table of opcode lookup indicies. */ | |
87 NaClOpcodeArrayOffset opcode_lookup[NACL_MAX_PREFIX_OPCODE_ENTRIES]; | |
88 /* The size of array opcode_lookup. */ | |
89 size_t opcode_lookup_size; | |
90 /* The generated table of entry points into opcode_lookup, for each | |
91 * possible prefix. | |
92 */ | |
93 NaClPrefixOpcodeArrayOffset opcode_lookup_entry[NaClInstPrefixEnumSize]; | |
94 /* The first non-null opcode value stored in the generated | |
95 * table opcode_lookup, for each possible prefix. | |
96 */ | |
97 uint8_t opcode_lookup_first[NaClInstPrefixEnumSize]; | |
98 /* The last non-null opcode vlaue stored in the generated | |
99 * table opcode_lookupk, for each possible prefix. | |
100 */ | |
101 uint8_t opcode_lookup_last[NaClInstPrefixEnumSize]; | |
102 } NaClInstTables; | |
103 | |
104 /* Given the tables passed in, compresses instructions, operands, | |
105 * and prefix/opcode lookup tables. | |
106 */ | |
107 void NaClOpCompress(NaClInstTables* inst_tables); | |
108 | |
109 /* Given the tables passed in, return the index (in the compressed instruction | |
110 * array) associated with the given instruction. | |
111 */ | |
112 NaClOpcodeArrayOffset NaClFindInstIndex(NaClInstTables* inst_tables, | |
113 const NaClModeledInst* inst); | |
114 | |
115 #endif /* NATIVE_CLIENT_SRC_TRUSTED_VALIDATOR_X86_DECODER_GENERATOR_NC_COMPRESS
_H__ */ | |
OLD | NEW |