Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(185)

Side by Side Diff: src/trusted/validator_ragel/decoder.h

Issue 11000033: Move validator_x86_XX.rl out of unreviewed. (Closed) Base URL: svn://svn.chromium.org/native_client/trunk/src/native_client/
Patch Set: Created 8 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 /* 1 /*
2 * Copyright (c) 2012 The Native Client Authors. All rights reserved. 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 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 #ifndef NATIVE_CLIENT_SRC_TRUSTED_VALIDATOR_RAGEL_DECODER_H_ 7 #ifndef NATIVE_CLIENT_SRC_TRUSTED_VALIDATOR_RAGEL_DECODER_H_
8 #define NATIVE_CLIENT_SRC_TRUSTED_VALIDATOR_RAGEL_DECODER_H_ 8 #define NATIVE_CLIENT_SRC_TRUSTED_VALIDATOR_RAGEL_DECODER_H_
9 9
10 #include "native_client/src/shared/utils/types.h" 10 #include "native_client/src/shared/utils/types.h"
11 #include "native_client/src/trusted/validator/x86/nacl_cpuid.h" 11 #include "native_client/src/trusted/validator/x86/nacl_cpuid.h"
12 12
13 EXTERN_C_BEGIN 13 EXTERN_C_BEGIN
14 14
15 enum operand_type { 15 enum operand_type {
16 16
17 /* 17 /*
18 * These are for general-purpose registers, memory access and immediates. 18 * These are for general-purpose registers, memory access and immediates.
19 * They are not used for XMM, MMX etc. 19 * They are not used for XMM, MMX etc.
20 */ 20 */
21 OPERAND_SIZE_2_BIT, /* See VPERMIL2Px instruction for description. */ 21 OPERAND_SIZE_2_BIT, /* See VPERMIL2Px instruction for description. */
Brad Chen 2012/09/28 19:38:34 Could you make it clear in the comment that it onl
khim 2012/09/28 23:22:06 Done.
22 OPERAND_SIZE_8_BIT, 22 OPERAND_SIZE_8_BIT,
23 OPERAND_SIZE_16_BIT, 23 OPERAND_SIZE_16_BIT,
24 OPERAND_SIZE_32_BIT, 24 OPERAND_SIZE_32_BIT,
25 OPERAND_SIZE_64_BIT, 25 OPERAND_SIZE_64_BIT,
Brad Chen 2012/09/28 19:38:34 Are there other 64-bit operand_types below? In tha
khim 2012/09/28 20:26:26 Operand can only use one items from a list. But GE
Brad Chen 2012/09/28 20:41:01 ... then it would make sense to maybe use more of
khim 2012/09/28 23:22:06 Done.
26 OPERAND_SIZE_128_BIT, 26 OPERAND_SIZE_128_BIT,
27 OPERAND_SIZE_256_BIT, 27 OPERAND_SIZE_256_BIT,
28 28
29 /* OPERAND_FLOAT_SIZE_*_BIT are used for in-memory operands. */ 29 /* OPERAND_FLOAT_SIZE_*_BIT are used for in-memory operands. */
30 OPERAND_FLOAT_SIZE_16_BIT, 30 OPERAND_FLOAT_SIZE_16_BIT,
31 OPERAND_FLOAT_SIZE_32_BIT, 31 OPERAND_FLOAT_SIZE_32_BIT,
32 OPERAND_FLOAT_SIZE_64_BIT, 32 OPERAND_FLOAT_SIZE_64_BIT,
33 OPERAND_FLOAT_SIZE_80_BIT, 33 OPERAND_FLOAT_SIZE_80_BIT,
34 34
35 /* OPERAND_X87_SIZE_64_BIT are signed integers in memory.*/ 35 /* OPERAND_X87_SIZE_64_BIT are signed integers in memory.*/
36 OPERAND_X87_SIZE_16_BIT, 36 OPERAND_X87_SIZE_16_BIT,
37 OPERAND_X87_SIZE_32_BIT, 37 OPERAND_X87_SIZE_32_BIT,
38 OPERAND_X87_SIZE_64_BIT, 38 OPERAND_X87_SIZE_64_BIT,
39 39
40 40
41 OPERAND_X87_BCD, /* 10-byte packed BCD value in memory. */ 41 OPERAND_X87_BCD, /* 10-byte packed BCD value in memory. */
42 OPERAND_X87_ENV, /* A 14-byte or 28-byte x87 environment. */ 42 OPERAND_X87_ENV, /* A 14-byte or 28-byte x87 environment. */
43 OPERAND_X87_STATE, /* A 94-byte or 108-byte x87 state. */ 43 OPERAND_X87_STATE, /* A 94-byte or 108-byte x87 state. */
44 OPERAND_X87_MMX_MM_STATE, /* A 512-byte extended x87/MMX/XMM state. */ 44 OPERAND_X87_MMX_MM_STATE, /* A 512-byte extended x87/MMX/XMM state. */
45 OPERAND_SELECTOR, /* Operand is 6/10 bytes selector in memory. */ 45 OPERAND_SELECTOR, /* Operand is 6/10 bytes selector in memory. */
46 OPERAND_FAR_PTR, /* Operand is 6/10 bytes far pointer in memory. */ 46 OPERAND_FAR_PTR, /* Operand is 6/10 bytes far pointer in memory. */
47 47
48 OPERAND_ST, /* Any X87 register. */ 48 OPERAND_ST, /* Any X87 register. */
49 OPERAND_SEGMENT_REGISTER, /* Operand is segment register: %{e,c,s,d,f,g}s. */ 49 OPERAND_SEGMENT_REGISTER, /* Operand is segment register: %{e,c,s,d,f,g}s. */
50 OPERAND_CONTROL_REGISTER, /* Operand is control register: %crX. */ 50 OPERAND_CONTROL_REGISTER, /* Operand is control register: %crX. */
51 OPERAND_DEBUG_REGISTER, /* Operand is debug register: %drX. */ 51 OPERAND_DEBUG_REGISTER, /* Operand is debug register: %drX. */
52 OPERAND_MMX, 52 OPERAND_MMX,
53 OPERAND_XMM, 53 OPERAND_XMM,
54 OPERAND_YMM 54 OPERAND_YMM
Brad Chen 2012/09/28 19:38:34 For my gratification, are there other operand_size
khim 2012/09/28 20:26:26 There are some for AVX2. AVX is currently supporte
55 }; 55 };
56 56
57 enum register_name { 57 enum register_name {
58 /* First 16 registers are compatible with encoding of registers in x86 ABI. */ 58 /* First 16 registers are compatible with encoding of registers in x86 ABI. */
59 REG_RAX, 59 REG_RAX,
60 REG_RCX, 60 REG_RCX,
61 REG_RDX, 61 REG_RDX,
62 REG_RBX, 62 REG_RBX,
63 REG_RSP, 63 REG_RSP,
64 REG_RBP, 64 REG_RBP,
65 REG_RSI, 65 REG_RSI,
66 REG_RDI, 66 REG_RDI,
67 REG_R8, 67 REG_R8,
68 REG_R9, 68 REG_R9,
69 REG_R10, 69 REG_R10,
70 REG_R11, 70 REG_R11,
71 REG_R12, 71 REG_R12,
72 REG_R13, 72 REG_R13,
73 REG_R14, 73 REG_R14,
74 REG_R15, 74 REG_R15,
75 /* These are pseudo-registers used in special cases. */ 75 /* These are pseudo-registers used in special cases. */
Brad Chen 2012/09/28 20:41:01 Q: Why are these better here rather than as a sepa
khim 2012/09/28 23:22:06 They are here to simplify the operations with oper
76 REG_RM, /* Address in memory via rm field. */ 76 REG_RM, /* Address in memory via rm field. */
77 REG_RIP, /* RIP - used as base in x86-64 mode. */ 77 REG_RIP, /* RIP - used as base in x86-64 mode. */
78 REG_RIZ, /* EIZ/RIZ - used as "always zero index" register. */ 78 REG_RIZ, /* EIZ/RIZ - used as "always zero index" register. */
79 REG_IMM, /* Fixed value in imm field. */ 79 REG_IMM, /* Fixed value in imm field. */
80 REG_IMM2, /* Fixed value in second imm field. */ 80 REG_IMM2, /* Fixed value in second imm field. */
81 REG_DS_RBX, /* Fox xlat: %ds(%rbx). */ 81 REG_DS_RBX, /* Fox xlat: %ds(%rbx). */
82 REG_ES_RDI, /* For string instructions: %es:(%rsi). */ 82 REG_ES_RDI, /* For string instructions: %es:(%rsi). */
83 REG_DS_RSI, /* For string instructions: %ds:(%rdi). */ 83 REG_DS_RSI, /* For string instructions: %ds:(%rdi). */
84 REG_PORT_DX, /* 16-bit DX: for in/out instructions. */ 84 REG_PORT_DX, /* 16-bit DX: for in/out instructions. */
85 NO_REG, /* For modrm: both index and base can be absent. */ 85 NO_REG, /* For modrm: both index and base can be absent. */
86 REG_ST, /* For x87 instructions: implicit %st. */ 86 REG_ST, /* For x87 instructions: implicit %st. */
87 JMP_TO /* Operand is jump target address: usually %rip+offset. */ 87 JMP_TO /* Operand is jump target address: usually %rip+offset. */
88 }; 88 };
89 89
90 /* 90 /*
91 * This enum extends NaClCPUFeatureID to cover instructions not recognized in 91 * This enum extends NaClCPUFeatureID to cover instructions not recognized in
Brad Chen 2012/09/28 20:41:01 Something missing here?
khim 2012/09/28 23:22:06 Yeah. CPUID support for decoder. Looks like we are
92 * 92 *
93 * / 93 * /
94 enum DecoderCPUFeatures { 94 enum DecoderCPUFeatures {
95 }; 95 };
96 */ 96 */
97 97
98 enum disp_mode { 98 enum disp_mode {
Brad Chen 2012/09/28 20:41:01 Comment this enum please.
khim 2012/09/28 23:22:06 Done.
99 DISPNONE, 99 DISPNONE,
100 DISP8, 100 DISP8,
101 DISP16, 101 DISP16,
102 DISP32, 102 DISP32,
103 DISP64, 103 DISP64,
104 }; 104 };
105 105
106 struct instruction { 106 struct instruction {
Brad Chen 2012/09/28 20:41:01 Every non-trival type really merits a comment. Whi
khim 2012/09/28 23:22:06 Done.
107 const char *name; 107 const char *name;
108 unsigned char operands_count; 108 unsigned char operands_count;
109 struct { 109 struct {
110 unsigned char rex; /* Mostly to distingush cases like %ah vs %spl. */ 110 unsigned char rex; /* Mostly to distingush cases like %ah vs %spl. */
111 #ifdef _MSC_VER 111 #ifdef _MSC_VER
Brad Chen 2012/09/28 20:41:01 Yuck. I'm not liking the nearly-identical code her
khim 2012/09/28 23:22:06 Unfortunately we already have Bool in NaCl codebas
112 Bool data16:1; /* "Normal", non-rex prefixes. */ 112 Bool data16:1; /* "Normal", non-rex prefixes. */
113 Bool lock:1; 113 Bool lock:1;
114 Bool repnz:1; 114 Bool repnz:1;
115 Bool repz:1; 115 Bool repz:1;
116 Bool branch_not_taken:1; 116 Bool branch_not_taken:1;
117 Bool branch_taken:1; 117 Bool branch_taken:1;
118 #else 118 #else
119 _Bool data16:1; /* "Normal", non-rex prefixes. */ 119 _Bool data16:1; /* "Normal", non-rex prefixes. */
120 _Bool lock:1; 120 _Bool lock:1;
121 _Bool repnz:1; 121 _Bool repnz:1;
(...skipping 17 matching lines...) Expand all
139 }; 139 };
140 140
141 typedef void (*process_instruction_func) (const uint8_t *begin, 141 typedef void (*process_instruction_func) (const uint8_t *begin,
142 const uint8_t *end, 142 const uint8_t *end,
143 struct instruction *instruction, 143 struct instruction *instruction,
144 void *userdata); 144 void *userdata);
145 145
146 typedef void (*process_decoding_error_func) (const uint8_t *ptr, 146 typedef void (*process_decoding_error_func) (const uint8_t *ptr,
147 void *userdata); 147 void *userdata);
148 148
149 /* All possible CPUID features enabled. */ 149 /* All possible CPUID features enabled. */
Brad Chen 2012/09/28 20:41:01 This comment is too terse. Please mention full_cpu
khim 2012/09/28 23:22:06 Done.
150 extern const NaClCPUFeaturesX86 full_cpuid_features; 150 extern const NaClCPUFeaturesX86 full_cpuid_features;
151 151
152 int DecodeChunkAMD64(const uint8_t *data, size_t size, 152 int DecodeChunkAMD64(const uint8_t *data, size_t size,
153 process_instruction_func process_instruction, 153 process_instruction_func process_instruction,
154 process_decoding_error_func process_error, void *userdata); 154 process_decoding_error_func process_error, void *userdata);
155 155
156 int DecodeChunkIA32(const uint8_t *data, size_t size, 156 int DecodeChunkIA32(const uint8_t *data, size_t size,
157 process_instruction_func process_instruction, 157 process_instruction_func process_instruction,
158 process_decoding_error_func process_error, void *userdata); 158 process_decoding_error_func process_error, void *userdata);
159 159
160 EXTERN_C_END 160 EXTERN_C_END
161 161
162 #endif /* NATIVE_CLIENT_SRC_TRUSTED_VALIDATOR_RAGEL_DECODER_H_ */ 162 #endif /* NATIVE_CLIENT_SRC_TRUSTED_VALIDATOR_RAGEL_DECODER_H_ */
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698