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

Side by Side Diff: src/trusted/validator_ragel/gen/validator_x86_32.c

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 7 years, 9 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 /* native_client/src/trusted/validator_ragel/gen/validator_x86_32.c 1 /* native_client/src/trusted/validator_ragel/gen/validator_x86_32.c
2 * THIS FILE IS AUTO-GENERATED. DO NOT EDIT. 2 * THIS FILE IS AUTO-GENERATED. DO NOT EDIT.
3 * Compiled for ia32 mode. 3 * Compiled for ia32 mode.
4 */ 4 */
5 5
6 /* 6 /*
7 * This is the core of ia32-mode validator. Please note that this file 7 * This is the core of ia32-mode validator. Please note that this file
8 * combines ragel machine description and C language actions. Please read 8 * combines ragel machine description and C language actions. Please read
9 * validator_internals.html first to understand how the whole thing is built: 9 * validator_internals.html first to understand how the whole thing is built:
10 * it explains how the byte sequences are constructed, what constructs like 10 * it explains how the byte sequences are constructed, what constructs like
11 * "@{}" or "REX_WRX?" mean, etc. 11 * "@{}" or "REX_WRX?" mean, etc.
12 */ 12 */
13 13
14 #include <assert.h> 14 #include <assert.h>
15 #include <errno.h> 15 #include <errno.h>
16 #include <stddef.h> 16 #include <stddef.h>
17 #include <stdio.h> 17 #include <stdio.h>
18 #include <stdlib.h> 18 #include <stdlib.h>
19 #include <string.h> 19 #include <string.h>
20 20
21 #include "native_client/src/trusted/validator_ragel/bitmap.h" 21 #include "native_client/src/trusted/validator_ragel/bitmap.h"
22 #include "native_client/src/trusted/validator_ragel/unreviewed/validator_interna l.h" 22 #include "native_client/src/trusted/validator_ragel/validator_internal.h"
23 23
24 /* Ignore this information: it's not used by security model in IA32 mode. */ 24 /* Ignore this information: it's not used by security model in IA32 mode. */
25 #undef GET_VEX_PREFIX3 25 #undef GET_VEX_PREFIX3
26 #define GET_VEX_PREFIX3 0 26 #define GET_VEX_PREFIX3 0
27 #undef SET_VEX_PREFIX3 27 #undef SET_VEX_PREFIX3
28 #define SET_VEX_PREFIX3(P) 28 #define SET_VEX_PREFIX3(P)
29 29
30 30
31 31
32 32
33 /*
34 * The "write data" statement causes Ragel to emit the constant static data
35 * needed by the ragel machine.
36 */
33 37
34 static const int x86_32_validator_start = 233; 38 static const int x86_32_validator_start = 233;
35 static const int x86_32_validator_first_final = 233; 39 static const int x86_32_validator_first_final = 233;
36 static const int x86_32_validator_error = 0; 40 static const int x86_32_validator_error = 0;
37 41
38 static const int x86_32_validator_en_main = 233; 42 static const int x86_32_validator_en_main = 233;
39 43
40 44
41 45
42
43 Bool ValidateChunkIA32(const uint8_t *data, size_t size, 46 Bool ValidateChunkIA32(const uint8_t *data, size_t size,
44 uint32_t options, 47 uint32_t options,
45 const NaClCPUFeaturesX86 *cpu_features, 48 const NaClCPUFeaturesX86 *cpu_features,
46 ValidationCallbackFunc user_callback, 49 ValidationCallbackFunc user_callback,
47 void *callback_data) { 50 void *callback_data) {
48 bitmap_word valid_targets_small; 51 bitmap_word valid_targets_small;
49 bitmap_word jump_dests_small; 52 bitmap_word jump_dests_small;
50 bitmap_word *valid_targets; 53 bitmap_word *valid_targets;
51 bitmap_word *jump_dests; 54 bitmap_word *jump_dests;
52 const uint8_t *current_position; 55 const uint8_t *current_position;
(...skipping 16 matching lines...) Expand all
69 free(jump_dests); 72 free(jump_dests);
70 free(valid_targets); 73 free(valid_targets);
71 errno = ENOMEM; 74 errno = ENOMEM;
72 return FALSE; 75 return FALSE;
73 } 76 }
74 } 77 }
75 78
76 /* 79 /*
77 * This option is usually used in tests: we will process the whole chunk 80 * This option is usually used in tests: we will process the whole chunk
78 * in one pass. Usually each bundle is processed separately which means 81 * in one pass. Usually each bundle is processed separately which means
79 * instructions (and super-instructions) can not cross borders of the bundle. 82 * instructions (and "superinstructions") can not cross borders of the bundle.
80 */ 83 */
81 if (options & PROCESS_CHUNK_AS_A_CONTIGUOUS_STREAM) 84 if (options & PROCESS_CHUNK_AS_A_CONTIGUOUS_STREAM)
82 end_of_bundle = data + size; 85 end_of_bundle = data + size;
83 else 86 else
84 end_of_bundle = data + kBundleSize; 87 end_of_bundle = data + kBundleSize;
85 88
86 /* 89 /*
87 * Main loop. Here we process the data array bundle-after-bundle. 90 * Main loop. Here we process the data array bundle-after-bundle.
88 * Ragel-produced DFA does all the checks with one exception: direct jumps. 91 * Ragel-produced DFA does all the checks with one exception: direct jumps.
89 * It collects the two arrays: valid_targets and jump_dests which are used 92 * It collects the two arrays: valid_targets and jump_dests which are used
90 * to test direct jumps later. 93 * to test direct jumps later.
91 */ 94 */
92 for (current_position = data; 95 for (current_position = data;
93 current_position < data + size; 96 current_position < data + size;
94 current_position = end_of_bundle, 97 current_position = end_of_bundle,
95 end_of_bundle = current_position + kBundleSize) { 98 end_of_bundle = current_position + kBundleSize) {
96 /* Start of the instruction being processed. */ 99 /* Start of the instruction being processed. */
97 const uint8_t *instruction_begin = current_position; 100 const uint8_t *instruction_begin = current_position;
98 /* Only used locally in the end_of_instruction_cleanup action. */ 101 /* Only used locally in the end_of_instruction_cleanup action. */
99 const uint8_t *instruction_end; 102 const uint8_t *instruction_end;
100 uint32_t instruction_info_collected = 0; 103 uint32_t instruction_info_collected = 0;
101 int current_state; 104 int current_state;
102 105
106 /*
107 * The "write init" statement causes Ragel to emit initialization code.
108 * This should be executed once before the ragel machine is started.
109 */
103 110
104 { 111 {
105 ( current_state) = x86_32_validator_start; 112 ( current_state) = x86_32_validator_start;
106 } 113 }
107 114
115 /*
116 * The "write exec" statement causes Ragel to emit the ragel machine's
117 * execution code.
118 */
108 119
109 { 120 {
110 if ( ( current_position) == ( end_of_bundle) ) 121 if ( ( current_position) == ( end_of_bundle) )
111 goto _test_eof; 122 goto _test_eof;
112 switch ( ( current_state) ) 123 switch ( ( current_state) )
113 { 124 {
114 tr0: 125 tr0:
115 { 126 {
116 /* Mark start of this instruction as a valid target for jump. */ 127 /* Mark start of this instruction as a valid target for jump. */
117 MarkValidJumpTarget(instruction_begin - data, valid_targets); 128 MarkValidJumpTarget(instruction_begin - data, valid_targets);
(...skipping 9514 matching lines...) Expand 10 before | Expand all | Expand 10 after
9632 */ 9643 */
9633 result &= ProcessInvalidJumpTargets(data, size, valid_targets, jump_dests, 9644 result &= ProcessInvalidJumpTargets(data, size, valid_targets, jump_dests,
9634 user_callback, callback_data); 9645 user_callback, callback_data);
9635 9646
9636 /* We only use malloc for a large code sequences */ 9647 /* We only use malloc for a large code sequences */
9637 if (jump_dests != &jump_dests_small) free(jump_dests); 9648 if (jump_dests != &jump_dests_small) free(jump_dests);
9638 if (valid_targets != &valid_targets_small) free(valid_targets); 9649 if (valid_targets != &valid_targets_small) free(valid_targets);
9639 if (!result) errno = EINVAL; 9650 if (!result) errno = EINVAL;
9640 return result; 9651 return result;
9641 } 9652 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698